| 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..b20a18f6ed3dd93bc9f4fc131aed5daa6ae7feec 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),
|
| @@ -91,17 +92,32 @@ void VCMTiming::ResetDecodeTime() {
|
| codec_timer_.reset(new VCMCodecTimer());
|
| }
|
|
|
| -void VCMTiming::set_render_delay(uint32_t render_delay_ms) {
|
| +void VCMTiming::set_render_delay(int render_delay_ms) {
|
| CriticalSectionScoped cs(crit_sect_);
|
| render_delay_ms_ = render_delay_ms;
|
| }
|
|
|
| -void VCMTiming::set_min_playout_delay(uint32_t min_playout_delay_ms) {
|
| +void VCMTiming::set_min_playout_delay(int min_playout_delay_ms) {
|
| CriticalSectionScoped cs(crit_sect_);
|
| min_playout_delay_ms_ = min_playout_delay_ms;
|
| }
|
|
|
| -void VCMTiming::SetJitterDelay(uint32_t jitter_delay_ms) {
|
| +int VCMTiming::min_playout_delay() {
|
| + CriticalSectionScoped cs(crit_sect_);
|
| + return min_playout_delay_ms_;
|
| +}
|
| +
|
| +void VCMTiming::set_max_playout_delay(int max_playout_delay_ms) {
|
| + CriticalSectionScoped cs(crit_sect_);
|
| + max_playout_delay_ms_ = max_playout_delay_ms;
|
| +}
|
| +
|
| +int VCMTiming::max_playout_delay() {
|
| + CriticalSectionScoped cs(crit_sect_);
|
| + return max_playout_delay_ms_;
|
| +}
|
| +
|
| +void VCMTiming::SetJitterDelay(int jitter_delay_ms) {
|
| CriticalSectionScoped cs(crit_sect_);
|
| if (jitter_delay_ms != jitter_delay_ms_) {
|
| jitter_delay_ms_ = jitter_delay_ms;
|
| @@ -114,7 +130,7 @@ void VCMTiming::SetJitterDelay(uint32_t jitter_delay_ms) {
|
|
|
| void VCMTiming::UpdateCurrentDelay(uint32_t frame_timestamp) {
|
| CriticalSectionScoped cs(crit_sect_);
|
| - uint32_t target_delay_ms = TargetDelayInternal();
|
| + int target_delay_ms = TargetDelayInternal();
|
|
|
| if (current_delay_ms_ == 0) {
|
| // Not initialized, set current delay to target.
|
| @@ -147,7 +163,7 @@ void VCMTiming::UpdateCurrentDelay(uint32_t frame_timestamp) {
|
| delay_diff_ms = std::max(delay_diff_ms, -max_change_ms);
|
| delay_diff_ms = std::min(delay_diff_ms, max_change_ms);
|
|
|
| - current_delay_ms_ = current_delay_ms_ + static_cast<int32_t>(delay_diff_ms);
|
| + current_delay_ms_ = current_delay_ms_ + delay_diff_ms;
|
| }
|
| prev_frame_timestamp_ = frame_timestamp;
|
| }
|
| @@ -163,7 +179,7 @@ void VCMTiming::UpdateCurrentDelay(int64_t render_time_ms,
|
| return;
|
| }
|
| if (current_delay_ms_ + delayed_ms <= target_delay_ms) {
|
| - current_delay_ms_ += static_cast<uint32_t>(delayed_ms);
|
| + current_delay_ms_ += delayed_ms;
|
| } else {
|
| current_delay_ms_ = target_delay_ms;
|
| }
|
| @@ -211,14 +227,21 @@ int64_t VCMTiming::RenderTimeMsInternal(uint32_t frame_timestamp,
|
| estimated_complete_time_ms = now_ms;
|
| }
|
|
|
| - // Make sure that we have at least the playout delay.
|
| - uint32_t actual_delay = std::max(current_delay_ms_, min_playout_delay_ms_);
|
| + 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_|.
|
| + int 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;
|
| }
|
|
|
| // Must be called from inside a critical section.
|
| -int64_t VCMTiming::RequiredDecodeTimeMs() const {
|
| - const int64_t decode_time_ms = codec_timer_->RequiredDecodeTimeMs();
|
| +int VCMTiming::RequiredDecodeTimeMs() const {
|
| + const int decode_time_ms = codec_timer_->RequiredDecodeTimeMs();
|
| assert(decode_time_ms >= 0);
|
| return decode_time_ms;
|
| }
|
| @@ -254,16 +277,14 @@ bool VCMTiming::EnoughTimeToDecode(
|
| 0;
|
| }
|
|
|
| -uint32_t VCMTiming::TargetVideoDelay() const {
|
| +int VCMTiming::TargetVideoDelay() const {
|
| CriticalSectionScoped cs(crit_sect_);
|
| return TargetDelayInternal();
|
| }
|
|
|
| -uint32_t VCMTiming::TargetDelayInternal() const {
|
| +int VCMTiming::TargetDelayInternal() const {
|
| return std::max(min_playout_delay_ms_,
|
| - jitter_delay_ms_ +
|
| - static_cast<uint32_t>(RequiredDecodeTimeMs()) +
|
| - render_delay_ms_);
|
| + jitter_delay_ms_ + RequiredDecodeTimeMs() + render_delay_ms_);
|
| }
|
|
|
| void VCMTiming::GetTimings(int* decode_ms,
|
| @@ -275,7 +296,7 @@ void VCMTiming::GetTimings(int* decode_ms,
|
| int* render_delay_ms) const {
|
| CriticalSectionScoped cs(crit_sect_);
|
| *decode_ms = last_decode_ms_;
|
| - *max_decode_ms = static_cast<int>(RequiredDecodeTimeMs());
|
| + *max_decode_ms = RequiredDecodeTimeMs();
|
| *current_delay_ms = current_delay_ms_;
|
| *target_delay_ms = TargetDelayInternal();
|
| *jitter_buffer_ms = jitter_delay_ms_;
|
|
|