Add warning about timestamp non-monotonicity in the frame buffer.
BUG=None
Review-Url: https://codereview.webrtc.org/2844643002
Cr-Original-Commit-Position: refs/heads/master@{#17910}
Cr-Mirrored-From: https://chromium.googlesource.com/external/webrtc
Cr-Mirrored-Commit: 9078d8cf05f6307db640509ab9950592d3956e20
diff --git a/modules/video_coding/frame_buffer2.cc b/modules/video_coding/frame_buffer2.cc
index acc1bb8..280dc5a 100644
--- a/modules/video_coding/frame_buffer2.cc
+++ b/modules/video_coding/frame_buffer2.cc
@@ -141,8 +141,35 @@
}
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);