Index: webrtc/modules/video_coding/timing.cc |
diff --git a/webrtc/modules/video_coding/timing.cc b/webrtc/modules/video_coding/timing.cc |
index 6542ef5b1526e1f8b4fc1c5c65c64a112d8d7f7e..85636855e40861091a30732765c35da73caa5f13 100644 |
--- a/webrtc/modules/video_coding/timing.cc |
+++ b/webrtc/modules/video_coding/timing.cc |
@@ -28,6 +28,7 @@ VCMTiming::VCMTiming(Clock* clock, VCMTiming* master_timing) |
codec_timer_(new VCMCodecTimer()), |
render_delay_ms_(kDefaultRenderDelayMs), |
min_playout_delay_ms_(0), |
+ max_playout_delay_ms_(10000), |
jitter_delay_ms_(0), |
current_delay_ms_(0), |
last_decode_ms_(0), |
@@ -101,6 +102,21 @@ void VCMTiming::set_min_playout_delay(uint32_t min_playout_delay_ms) { |
min_playout_delay_ms_ = min_playout_delay_ms; |
} |
+uint32_t VCMTiming::min_playout_delay() { |
+ CriticalSectionScoped cs(crit_sect_); |
+ return min_playout_delay_ms_; |
+} |
+ |
+void VCMTiming::set_max_playout_delay(uint32_t max_playout_delay_ms) { |
+ CriticalSectionScoped cs(crit_sect_); |
+ max_playout_delay_ms_ = max_playout_delay_ms; |
+} |
+ |
+uint32_t VCMTiming::max_playout_delay() { |
+ CriticalSectionScoped cs(crit_sect_); |
+ return max_playout_delay_ms_; |
+} |
+ |
void VCMTiming::SetJitterDelay(uint32_t jitter_delay_ms) { |
CriticalSectionScoped cs(crit_sect_); |
if (jitter_delay_ms != jitter_delay_ms_) { |
@@ -211,8 +227,15 @@ int64_t VCMTiming::RenderTimeMsInternal(uint32_t frame_timestamp, |
estimated_complete_time_ms = now_ms; |
} |
- // Make sure that we have at least the playout delay. |
+ if (min_playout_delay_ms_ == 0 && max_playout_delay_ms_ == 0) { |
+ // Render as soon as possible |
+ return now_ms; |
+ } |
+ |
+ // Make sure the actual delay stays in the range of |min_playout_delay_ms_| |
+ // and |max_playout_delay_ms_|. |
uint32_t actual_delay = std::max(current_delay_ms_, min_playout_delay_ms_); |
+ actual_delay = std::min(actual_delay, max_playout_delay_ms_); |
return estimated_complete_time_ms + actual_delay; |
} |