Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(350)

Unified Diff: webrtc/modules/video_coding/rtp_frame_reference_finder.cc

Issue 2708593003: Advance picture id of keyframe if the stream has been continuous without a new keyframe for a while. (Closed)
Patch Set: . Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/modules/video_coding/rtp_frame_reference_finder.cc
diff --git a/webrtc/modules/video_coding/rtp_frame_reference_finder.cc b/webrtc/modules/video_coding/rtp_frame_reference_finder.cc
index 3d5283378fb57911df9d2b1b636bb0d045233040..e49a81d7588227f58f113ac886033f360a08a194 100644
--- a/webrtc/modules/video_coding/rtp_frame_reference_finder.cc
+++ b/webrtc/modules/video_coding/rtp_frame_reference_finder.cc
@@ -112,6 +112,16 @@ void RtpFrameReferenceFinder::UpdateLastPictureIdWithPadding(uint16_t seq_num) {
++next_seq_num_with_padding;
padding_seq_num_it = stashed_padding_.erase(padding_seq_num_it);
}
+
+ // In the case where the stream has been continuous without any new keyframes
+ // for a while there is a risk that new frames will appear to be older than
+ // the keyframe they belong to due to wrapping sequence number. In order
+ // to prevent this we advance the picture id of the keyframe every so often.
+ if (ForwardDiff(gop_seq_num_it->first, seq_num) > 10000) {
+ RTC_DCHECK_EQ(1ul, last_seq_num_gop_.size());
+ last_seq_num_gop_[seq_num] = gop_seq_num_it->second;
+ last_seq_num_gop_.erase(gop_seq_num_it);
+ }
}
void RtpFrameReferenceFinder::RetryStashedFrames() {
@@ -164,8 +174,10 @@ void RtpFrameReferenceFinder::ManageFrameGeneric(
// Clean up info for old keyframes but make sure to keep info
// for the last keyframe.
auto clean_to = last_seq_num_gop_.lower_bound(frame->last_seq_num() - 100);
- if (clean_to != last_seq_num_gop_.end())
- last_seq_num_gop_.erase(last_seq_num_gop_.begin(), clean_to);
+ for (auto it = last_seq_num_gop_.begin();
+ it != clean_to && last_seq_num_gop_.size() > 1;) {
+ it = last_seq_num_gop_.erase(it);
+ }
// Find the last sequence number of the last frame for the keyframe
// that this frame indirectly references.
@@ -173,7 +185,7 @@ void RtpFrameReferenceFinder::ManageFrameGeneric(
if (seq_num_it == last_seq_num_gop_.begin()) {
LOG(LS_WARNING) << "Generic frame with packet range ["
<< frame->first_seq_num() << ", " << frame->last_seq_num()
- << "] has no Gop, dropping frame.";
+ << "] has no GoP, dropping frame.";
return;
}
seq_num_it--;

Powered by Google App Engine
This is Rietveld 408576698