| 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 acc1bb83c5a0e448e030d42b98eab5d25315b0a1..280dc5a0b08dee456ccfb867b5652130062f654e 100644
|
| --- a/webrtc/modules/video_coding/frame_buffer2.cc
|
| +++ b/webrtc/modules/video_coding/frame_buffer2.cc
|
| @@ -141,8 +141,35 @@ FrameBuffer::ReturnReason FrameBuffer::NextFrame(
|
| }
|
|
|
| UpdateJitterDelay();
|
| -
|
| PropagateDecodability(next_frame_it_->second);
|
| +
|
| + // Sanity check for RTP timestamp monotonicity.
|
| + if (last_decoded_frame_it_ != frames_.end()) {
|
| + const FrameKey& last_decoded_frame_key = last_decoded_frame_it_->first;
|
| + const FrameKey& frame_key = next_frame_it_->first;
|
| +
|
| + const bool frame_is_higher_spatial_layer_of_last_decoded_frame =
|
| + last_decoded_frame_timestamp_ == frame->timestamp &&
|
| + last_decoded_frame_key.picture_id == frame_key.picture_id &&
|
| + last_decoded_frame_key.spatial_layer < frame_key.spatial_layer;
|
| +
|
| + if (AheadOrAt(last_decoded_frame_timestamp_, frame->timestamp) &&
|
| + !frame_is_higher_spatial_layer_of_last_decoded_frame) {
|
| + // TODO(brandtr): Consider clearing the entire buffer when we hit
|
| + // these conditions.
|
| + LOG(LS_WARNING) << "Frame with (timestamp:picture_id:spatial_id) ("
|
| + << frame->timestamp << ":" << frame->picture_id << ":"
|
| + << static_cast<int>(frame->spatial_layer) << ")"
|
| + << " sent to decoder after frame with"
|
| + << " (timestamp:picture_id:spatial_id) ("
|
| + << last_decoded_frame_timestamp_ << ":"
|
| + << last_decoded_frame_key.picture_id << ":"
|
| + << static_cast<int>(
|
| + last_decoded_frame_key.spatial_layer)
|
| + << ").";
|
| + }
|
| + }
|
| +
|
| AdvanceLastDecodedFrame(next_frame_it_);
|
| last_decoded_frame_timestamp_ = frame->timestamp;
|
| *frame_out = std::move(frame);
|
|
|