Index: webrtc/modules/video_coding/frame_buffer2.cc |
diff --git a/webrtc/modules/video_coding/frame_buffer2.cc b/webrtc/modules/video_coding/frame_buffer2.cc |
index fcd523820f0ef7825b7edaacb63b7e33460e8d2c..acc1bb83c5a0e448e030d42b98eab5d25315b0a1 100644 |
--- a/webrtc/modules/video_coding/frame_buffer2.cc |
+++ b/webrtc/modules/video_coding/frame_buffer2.cc |
@@ -93,7 +93,8 @@ FrameBuffer::ReturnReason FrameBuffer::NextFrame( |
if (continuous_end_it != frames_.end()) |
++continuous_end_it; |
- for (; frame_it != continuous_end_it; ++frame_it) { |
+ for (; frame_it != continuous_end_it && frame_it != frames_.end(); |
+ ++frame_it) { |
if (!frame_it->second.continuous || |
frame_it->second.num_missing_decodable > 0) { |
continue; |
@@ -233,6 +234,17 @@ int FrameBuffer::InsertFrame(std::unique_ptr<FrameObject> frame) { |
} |
} |
+ // Test if inserting this frame would cause the order of the frames to become |
+ // ambiguous (covering more than half the interval of 2^16). This can happen |
+ // when the picture id make large jumps mid stream. |
+ if (!frames_.empty() && |
+ key < frames_.begin()->first && |
+ frames_.rbegin()->first < key) { |
+ LOG(LS_WARNING) << "A jump in picture id was detected, clearing buffer."; |
+ ClearFramesAndHistory(); |
+ last_continuous_picture_id = -1; |
+ } |
+ |
auto info = frames_.insert(std::make_pair(key, FrameInfo())).first; |
if (info->second.frame) { |