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 dcbcb1f9bdfd56b1f8cc3c3caa1904d4dfe1dc82..8736567f8d2dc6dc78f457a00ac0762a3e77268a 100644 |
--- a/webrtc/modules/video_coding/frame_buffer2.cc |
+++ b/webrtc/modules/video_coding/frame_buffer2.cc |
@@ -90,7 +90,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; |
@@ -222,6 +223,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) { |