diff --git a/modules/video_coding/timing.cc b/modules/video_coding/timing.cc index f1c66b89c9..eddac4f5de 100644 --- a/modules/video_coding/timing.cc +++ b/modules/video_coding/timing.cc @@ -21,11 +21,11 @@ namespace webrtc { -VCMTiming::VCMTiming(Clock* clock, VCMTiming* master_timing) +VCMTiming::VCMTiming(Clock* clock) : clock_(clock), - master_(false), - ts_extrapolator_(), - codec_timer_(new VCMCodecTimer()), + ts_extrapolator_(std::make_unique( + clock_->TimeInMilliseconds())), + codec_timer_(std::make_unique()), render_delay_ms_(kDefaultRenderDelayMs), min_playout_delay_ms_(0), max_playout_delay_ms_(10000), @@ -37,24 +37,12 @@ VCMTiming::VCMTiming(Clock* clock, VCMTiming* master_timing) low_latency_renderer_enabled_("enabled", true) { ParseFieldTrial({&low_latency_renderer_enabled_}, field_trial::FindFullName("WebRTC-LowLatencyRenderer")); - if (master_timing == NULL) { - master_ = true; - ts_extrapolator_ = new TimestampExtrapolator(clock_->TimeInMilliseconds()); - } else { - ts_extrapolator_ = master_timing->ts_extrapolator_; - } -} - -VCMTiming::~VCMTiming() { - if (master_) { - delete ts_extrapolator_; - } } void VCMTiming::Reset() { MutexLock lock(&mutex_); ts_extrapolator_->Reset(clock_->TimeInMilliseconds()); - codec_timer_.reset(new VCMCodecTimer()); + codec_timer_ = std::make_unique(); render_delay_ms_ = kDefaultRenderDelayMs; min_playout_delay_ms_ = 0; jitter_delay_ms_ = 0; @@ -190,6 +178,8 @@ int64_t VCMTiming::RenderTimeMsInternal(uint32_t frame_timestamp, // Render as soon as possible or with low-latency renderer algorithm. return 0; } + // Note that TimestampExtrapolator::ExtrapolateLocalTime is not a const + // method; it mutates the object's wraparound state. int64_t estimated_complete_time_ms = ts_extrapolator_->ExtrapolateLocalTime(frame_timestamp); if (estimated_complete_time_ms == -1) { diff --git a/modules/video_coding/timing.h b/modules/video_coding/timing.h index 69352de93a..736b5e9ae4 100644 --- a/modules/video_coding/timing.h +++ b/modules/video_coding/timing.h @@ -19,6 +19,7 @@ #include "rtc_base/experiments/field_trial_parser.h" #include "rtc_base/synchronization/mutex.h" #include "rtc_base/thread_annotations.h" +#include "rtc_base/time/timestamp_extrapolator.h" namespace webrtc { @@ -27,10 +28,8 @@ class TimestampExtrapolator; class VCMTiming { public: - // The primary timing component should be passed - // if this is the dual timing component. - explicit VCMTiming(Clock* clock, VCMTiming* master_timing = NULL); - virtual ~VCMTiming(); + explicit VCMTiming(Clock* clock); + virtual ~VCMTiming() = default; // Resets the timing to the initial state. void Reset(); @@ -117,8 +116,7 @@ class VCMTiming { private: mutable Mutex mutex_; Clock* const clock_; - bool master_ RTC_GUARDED_BY(mutex_); - TimestampExtrapolator* ts_extrapolator_ RTC_GUARDED_BY(mutex_) + const std::unique_ptr ts_extrapolator_ RTC_PT_GUARDED_BY(mutex_); std::unique_ptr codec_timer_ RTC_GUARDED_BY(mutex_) RTC_PT_GUARDED_BY(mutex_);