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 584c2f03c4c2af81505023e2c70fa5d4b66bf232..6c7c72821150b604d5a7b563ec115346a6742ef1 100644 |
--- a/webrtc/modules/video_coding/frame_buffer2.cc |
+++ b/webrtc/modules/video_coding/frame_buffer2.cc |
@@ -141,6 +141,12 @@ FrameBuffer::ReturnReason FrameBuffer::NextFrame( |
timing_->UpdateCurrentDelay(frame->RenderTime(), now_ms); |
} |
+ // Gracefully handle bad RTP timestamps and render time issues. |
+ if (HasBadRenderTiming(*frame, now_ms)) { |
+ jitter_estimator_->Reset(); |
+ timing_->Reset(); |
+ frame->SetRenderTime(timing_->RenderTimeMs(frame->timestamp, now_ms)); |
+ } |
philipel
2017/05/23 10:32:44
Nit: add newline after 149 :)
stefan-webrtc
2017/05/23 15:21:46
Done.
|
UpdateJitterDelay(); |
PropagateDecodability(next_frame_it_->second); |
@@ -189,6 +195,28 @@ FrameBuffer::ReturnReason FrameBuffer::NextFrame( |
return kTimeout; |
} |
+bool FrameBuffer::HasBadRenderTiming(const FrameObject& frame, int64_t now_ms) { |
+ bool timing_error = false; |
philipel
2017/05/23 10:32:44
Remove |timing_error| and just "return true" inste
stefan-webrtc
2017/05/23 15:21:46
Done.
|
+ // Assume that render timing errors are due to changes in the video stream. |
+ int64_t render_time_ms = frame.RenderTimeMs(); |
+ const int64_t kMaxVideoDelayMs = 10000; |
+ if (render_time_ms < 0) { |
+ timing_error = true; |
+ } else if (std::abs(render_time_ms - now_ms) > kMaxVideoDelayMs) { |
+ int frame_delay = static_cast<int>(std::abs(render_time_ms - now_ms)); |
+ LOG(LS_WARNING) << "A frame about to be decoded is out of the configured " |
+ << "delay bounds (" << frame_delay << " > " |
+ << kMaxVideoDelayMs |
+ << "). Resetting the video jitter buffer."; |
philipel
2017/05/23 10:32:44
Remove "Resetting the video jitter buffer." from t
stefan-webrtc
2017/05/23 15:21:47
Done.
|
+ timing_error = true; |
+ } else if (static_cast<int>(timing_->TargetVideoDelay()) > kMaxVideoDelayMs) { |
+ LOG(LS_WARNING) << "The video target delay has grown larger than " |
+ << kMaxVideoDelayMs << " ms. Resetting jitter buffer."; |
+ timing_error = true; |
+ } |
+ return timing_error; |
+} |
+ |
void FrameBuffer::SetProtectionMode(VCMVideoProtection mode) { |
TRACE_EVENT0("webrtc", "FrameBuffer::SetProtectionMode"); |
rtc::CritScope lock(&crit_); |