diff --git a/modules/video_coding/frame_buffer2.cc b/modules/video_coding/frame_buffer2.cc index de239817e6..b4b9c117b9 100644 --- a/modules/video_coding/frame_buffer2.cc +++ b/modules/video_coding/frame_buffer2.cc @@ -596,17 +596,12 @@ void FrameBuffer::UpdateJitterDelay() { if (!stats_callback_) return; - TimeDelta max_decode = TimeDelta::Zero(); - TimeDelta current_delay = TimeDelta::Zero(); - TimeDelta target_delay = TimeDelta::Zero(); - TimeDelta jitter_buffer = TimeDelta::Zero(); - TimeDelta min_playout_delay = TimeDelta::Zero(); - TimeDelta render_delay = TimeDelta::Zero(); - if (timing_->GetTimings(&max_decode, ¤t_delay, &target_delay, - &jitter_buffer, &min_playout_delay, &render_delay)) { + auto timings = timing_->GetTimings(); + if (timings.num_decoded_frames > 0) { stats_callback_->OnFrameBufferTimingsUpdated( - max_decode.ms(), current_delay.ms(), target_delay.ms(), - jitter_buffer.ms(), min_playout_delay.ms(), render_delay.ms()); + timings.max_decode_duration.ms(), timings.current_delay.ms(), + timings.target_delay.ms(), timings.jitter_buffer_delay.ms(), + timings.min_playout_delay.ms(), timings.render_delay.ms()); } } diff --git a/modules/video_coding/frame_buffer2_unittest.cc b/modules/video_coding/frame_buffer2_unittest.cc index 4811635d64..d8ba8633a5 100644 --- a/modules/video_coding/frame_buffer2_unittest.cc +++ b/modules/video_coding/frame_buffer2_unittest.cc @@ -65,25 +65,8 @@ class VCMTimingFake : public VCMTiming { return render_time - now - kDecodeTime; } - bool GetTimings(TimeDelta* max_decode, - TimeDelta* current_delay, - TimeDelta* target_delay, - TimeDelta* jitter_buffer, - TimeDelta* min_playout_delay, - TimeDelta* render_delay) const override { - return true; - } - TimeDelta GetCurrentJitter() { - TimeDelta max_decode = TimeDelta::Zero(); - TimeDelta current_delay = TimeDelta::Zero(); - TimeDelta target_delay = TimeDelta::Zero(); - TimeDelta jitter_buffer = TimeDelta::Zero(); - TimeDelta min_playout_delay = TimeDelta::Zero(); - TimeDelta render_delay = TimeDelta::Zero(); - VCMTiming::GetTimings(&max_decode, ¤t_delay, &target_delay, - &jitter_buffer, &min_playout_delay, &render_delay); - return jitter_buffer; + return VCMTiming::GetTimings().jitter_buffer_delay; } private: @@ -538,6 +521,8 @@ TEST_F(TestFrameBuffer2, StatsCallback) { EXPECT_CALL(stats_callback_, OnCompleteFrame(true, kFrameSize, VideoContentType::UNSPECIFIED)); EXPECT_CALL(stats_callback_, OnFrameBufferTimingsUpdated(_, _, _, _, _, _)); + // Stats callback requires a previously decoded frame. + timing_.StopDecodeTimer(TimeDelta::Millis(1), Timestamp::Zero()); { std::unique_ptr frame(new FrameObjectFake()); diff --git a/modules/video_coding/receiver_unittest.cc b/modules/video_coding/receiver_unittest.cc index 73c88a5800..e38f9c5d21 100644 --- a/modules/video_coding/receiver_unittest.cc +++ b/modules/video_coding/receiver_unittest.cc @@ -448,11 +448,9 @@ TEST_F(VCMReceiverTimingTest, FrameForDecodingPreferLateDecoding) { int64_t arrive_timestamps[kNumFrames]; int64_t render_timestamps[kNumFrames]; - TimeDelta render_delay_ms = TimeDelta::Zero(); - TimeDelta max_decode_ms = TimeDelta::Zero(); - TimeDelta dummy = TimeDelta::Zero(); - timing_.GetTimings(&max_decode_ms, &dummy, &dummy, &dummy, &dummy, - &render_delay_ms); + auto timings = timing_.GetTimings(); + TimeDelta render_delay = timings.render_delay; + TimeDelta max_decode = timings.max_decode_duration; // Construct test samples. // render_timestamps are the timestamps stored in the Frame; @@ -479,9 +477,8 @@ TEST_F(VCMReceiverTimingTest, FrameForDecodingPreferLateDecoding) { receiver_.FrameForDecoding(kMaxWaitTime, prefer_late_decoding); int64_t end_time = clock_.TimeInMilliseconds(); if (frame) { - EXPECT_EQ( - frame->RenderTimeMs() - max_decode_ms.ms() - render_delay_ms.ms(), - end_time); + EXPECT_EQ(frame->RenderTimeMs() - max_decode.ms() - render_delay.ms(), + end_time); receiver_.ReleaseFrame(frame); ++num_frames_return; } else { diff --git a/modules/video_coding/timing.cc b/modules/video_coding/timing.cc index 89159f6a3a..390a49939e 100644 --- a/modules/video_coding/timing.cc +++ b/modules/video_coding/timing.cc @@ -238,20 +238,15 @@ TimeDelta VCMTiming::TargetDelayInternal() const { jitter_delay_ + RequiredDecodeTime() + render_delay_); } -bool VCMTiming::GetTimings(TimeDelta* max_decode, - TimeDelta* current_delay, - TimeDelta* target_delay, - TimeDelta* jitter_buffer, - TimeDelta* min_playout_delay, - TimeDelta* render_delay) const { +VCMTiming::VideoDelayTimings VCMTiming::GetTimings() const { MutexLock lock(&mutex_); - *max_decode = RequiredDecodeTime(); - *current_delay = current_delay_; - *target_delay = TargetDelayInternal(); - *jitter_buffer = jitter_delay_; - *min_playout_delay = min_playout_delay_; - *render_delay = render_delay_; - return (num_decoded_frames_ > 0); + return VideoDelayTimings{.max_decode_duration = RequiredDecodeTime(), + .current_delay = current_delay_, + .target_delay = TargetDelayInternal(), + .jitter_buffer_delay = jitter_delay_, + .min_playout_delay = min_playout_delay_, + .render_delay = render_delay_, + .num_decoded_frames = num_decoded_frames_}; } void VCMTiming::SetTimingFrameInfo(const TimingFrameInfo& info) { diff --git a/modules/video_coding/timing.h b/modules/video_coding/timing.h index 8ab2f685ec..af3974a351 100644 --- a/modules/video_coding/timing.h +++ b/modules/video_coding/timing.h @@ -94,12 +94,16 @@ class VCMTiming { // Return current timing information. Returns true if the first frame has been // decoded, false otherwise. - virtual bool GetTimings(TimeDelta* max_decode, - TimeDelta* current_delay, - TimeDelta* target_delay, - TimeDelta* jitter_buffer, - TimeDelta* min_playout_delay, - TimeDelta* render_delay) const; + struct VideoDelayTimings { + TimeDelta max_decode_duration; + TimeDelta current_delay; + TimeDelta target_delay; + TimeDelta jitter_buffer_delay; + TimeDelta min_playout_delay; + TimeDelta render_delay; + size_t num_decoded_frames; + }; + VideoDelayTimings GetTimings() const; void SetTimingFrameInfo(const TimingFrameInfo& info); absl::optional GetTimingFrameInfo(); diff --git a/video/frame_buffer_proxy.cc b/video/frame_buffer_proxy.cc index 657ffe9286..c3d01c5414 100644 --- a/video/frame_buffer_proxy.cc +++ b/video/frame_buffer_proxy.cc @@ -405,18 +405,12 @@ class FrameBuffer3Proxy : public FrameBufferProxy { } void UpdateJitterDelay() { - TimeDelta max_decode = TimeDelta::Zero(); - TimeDelta current_delay = TimeDelta::Zero(); - TimeDelta target_delay = TimeDelta::Zero(); - TimeDelta jitter_buffer = TimeDelta::Zero(); - TimeDelta min_playout_delay = TimeDelta::Zero(); - TimeDelta render_delay = TimeDelta::Zero(); - if (timing_->GetTimings(&max_decode, ¤t_delay, &target_delay, - &jitter_buffer, &min_playout_delay, - &render_delay)) { + auto timings = timing_->GetTimings(); + if (timings.num_decoded_frames) { stats_proxy_->OnFrameBufferTimingsUpdated( - max_decode.ms(), current_delay.ms(), target_delay.ms(), - jitter_buffer.ms(), min_playout_delay.ms(), render_delay.ms()); + timings.max_decode_duration.ms(), timings.current_delay.ms(), + timings.target_delay.ms(), timings.jitter_buffer_delay.ms(), + timings.min_playout_delay.ms(), timings.render_delay.ms()); } }