diff --git a/modules/video_coding/generic_decoder.cc b/modules/video_coding/generic_decoder.cc index 2a87198381..4aaf12c8a1 100644 --- a/modules/video_coding/generic_decoder.cc +++ b/modules/video_coding/generic_decoder.cc @@ -33,18 +33,12 @@ VCMDecodedFrameCallback::VCMDecodedFrameCallback( : _clock(clock), _timing(timing), _timestampMap(kDecoderFrameMemoryLength), - _extra_decode_time("t", absl::nullopt), - low_latency_renderer_enabled_("enabled", true), - low_latency_renderer_include_predecode_buffer_("include_predecode_buffer", - true) { + _extra_decode_time("t", absl::nullopt) { ntp_offset_ = _clock->CurrentNtpInMilliseconds() - _clock->TimeInMilliseconds(); ParseFieldTrial({&_extra_decode_time}, field_trials.Lookup("WebRTC-SlowDownDecoder")); - ParseFieldTrial({&low_latency_renderer_enabled_, - &low_latency_renderer_include_predecode_buffer_}, - field_trials.Lookup("WebRTC-LowLatencyRenderer")); } VCMDecodedFrameCallback::~VCMDecodedFrameCallback() {} @@ -123,19 +117,15 @@ void VCMDecodedFrameCallback::Decoded(VideoFrame& decodedImage, decodedImage.set_packet_infos(frameInfo->packet_infos); decodedImage.set_rotation(frameInfo->rotation); - if (low_latency_renderer_enabled_) { - absl::optional max_composition_delay_in_frames = - _timing->MaxCompositionDelayInFrames(); - if (max_composition_delay_in_frames) { - // Subtract frames that are in flight. - if (low_latency_renderer_include_predecode_buffer_) { - *max_composition_delay_in_frames -= timestamp_map_size; - *max_composition_delay_in_frames = - std::max(0, *max_composition_delay_in_frames); - } - decodedImage.set_max_composition_delay_in_frames( - max_composition_delay_in_frames); - } + absl::optional max_composition_delay_in_frames = + _timing->MaxCompositionDelayInFrames(); + if (max_composition_delay_in_frames) { + // Subtract frames that are in flight. + *max_composition_delay_in_frames -= timestamp_map_size; + *max_composition_delay_in_frames = + std::max(0, *max_composition_delay_in_frames); + decodedImage.set_max_composition_delay_in_frames( + max_composition_delay_in_frames); } RTC_DCHECK(frameInfo->decodeStart); diff --git a/modules/video_coding/generic_decoder.h b/modules/video_coding/generic_decoder.h index a674858726..554b743780 100644 --- a/modules/video_coding/generic_decoder.h +++ b/modules/video_coding/generic_decoder.h @@ -66,16 +66,6 @@ class VCMDecodedFrameCallback : public DecodedImageCallback { int64_t ntp_offset_; // Set by the field trial WebRTC-SlowDownDecoder to simulate a slow decoder. FieldTrialOptional _extra_decode_time; - - // Set by the field trial WebRTC-LowLatencyRenderer. The parameter `enabled` - // determines if the low-latency renderer algorithm should be used for the - // case min playout delay=0 and max playout delay>0. - FieldTrialParameter low_latency_renderer_enabled_; - // Set by the field trial WebRTC-LowLatencyRenderer. The parameter - // `include_predecode_buffer` determines if the predecode buffer should be - // taken into account when calculating maximum number of frames in composition - // queue. - FieldTrialParameter low_latency_renderer_include_predecode_buffer_; }; class VCMGenericDecoder { diff --git a/modules/video_coding/timing.cc b/modules/video_coding/timing.cc index f3d5cb45d3..f45d620ae0 100644 --- a/modules/video_coding/timing.cc +++ b/modules/video_coding/timing.cc @@ -22,6 +22,8 @@ namespace { // Default pacing that is used for the low-latency renderer path. constexpr TimeDelta kZeroPlayoutDelayDefaultMinPacing = TimeDelta::Millis(8); +constexpr TimeDelta kLowLatencyRendererMaxPlayoutDelay = TimeDelta::Millis(500); + } // namespace VCMTiming::VCMTiming(Clock* clock, const FieldTrialsView& field_trials) @@ -36,12 +38,9 @@ VCMTiming::VCMTiming(Clock* clock, const FieldTrialsView& field_trials) current_delay_(TimeDelta::Zero()), prev_frame_timestamp_(0), num_decoded_frames_(0), - low_latency_renderer_enabled_("enabled", true), zero_playout_delay_min_pacing_("min_pacing", kZeroPlayoutDelayDefaultMinPacing), last_decode_scheduled_(Timestamp::Zero()) { - ParseFieldTrial({&low_latency_renderer_enabled_}, - field_trials.Lookup("WebRTC-LowLatencyRenderer")); ParseFieldTrial({&zero_playout_delay_min_pacing_}, field_trials.Lookup("WebRTC-ZeroPlayoutDelay")); } @@ -165,12 +164,9 @@ void VCMTiming::SetLastDecodeScheduledTimestamp( Timestamp VCMTiming::RenderTimeInternal(uint32_t frame_timestamp, Timestamp now) const { - constexpr TimeDelta kLowLatencyRendererMaxPlayoutDelay = - TimeDelta::Millis(500); if (min_playout_delay_.IsZero() && (max_playout_delay_.IsZero() || - (low_latency_renderer_enabled_ && - max_playout_delay_ <= kLowLatencyRendererMaxPlayoutDelay))) { + max_playout_delay_ <= kLowLatencyRendererMaxPlayoutDelay)) { // Render as soon as possible or with low-latency renderer algorithm. return Timestamp::Zero(); } diff --git a/modules/video_coding/timing.h b/modules/video_coding/timing.h index 5868178bc4..41a6f87bde 100644 --- a/modules/video_coding/timing.h +++ b/modules/video_coding/timing.h @@ -141,11 +141,6 @@ class VCMTiming { uint32_t prev_frame_timestamp_ RTC_GUARDED_BY(mutex_); absl::optional timing_frame_info_ RTC_GUARDED_BY(mutex_); size_t num_decoded_frames_ RTC_GUARDED_BY(mutex_); - // Set by the field trial WebRTC-LowLatencyRenderer. The parameter enabled - // determines if the low-latency renderer algorithm should be used for the - // case min playout delay=0 and max playout delay>0. - FieldTrialParameter low_latency_renderer_enabled_ - RTC_GUARDED_BY(mutex_); absl::optional max_composition_delay_in_frames_ RTC_GUARDED_BY(mutex_); // Set by the field trial WebRTC-ZeroPlayoutDelay. The parameter min_pacing // determines the minimum delay between frames scheduled for decoding that is diff --git a/video/video_receive_stream2.cc b/video/video_receive_stream2.cc index 5ee6c8d254..43fd0c37cf 100644 --- a/video/video_receive_stream2.cc +++ b/video/video_receive_stream2.cc @@ -244,9 +244,6 @@ VideoReceiveStream2::VideoReceiveStream2( rtp_stream_sync_(call->worker_thread(), this), max_wait_for_keyframe_ms_(DetermineMaxWaitForFrame(config_, true)), max_wait_for_frame_ms_(DetermineMaxWaitForFrame(config_, false)), - low_latency_renderer_enabled_("enabled", true), - low_latency_renderer_include_predecode_buffer_("include_predecode_buffer", - true), maximum_pre_stream_decoders_("max", kDefaultMaximumPreStreamDecoders), decode_sync_(decode_sync), decode_queue_(task_queue_factory_->CreateTaskQueue( @@ -286,9 +283,6 @@ VideoReceiveStream2::VideoReceiveStream2( true); } - ParseFieldTrial({&low_latency_renderer_enabled_, - &low_latency_renderer_include_predecode_buffer_}, - call_->trials().Lookup("WebRTC-LowLatencyRenderer")); ParseFieldTrial( { &maximum_pre_stream_decoders_, @@ -975,18 +969,16 @@ void VideoReceiveStream2::UpdatePlayoutDelays() const { if (minimum_delay_ms >= 0) { timing_->set_min_playout_delay(TimeDelta::Millis(minimum_delay_ms)); if (frame_minimum_playout_delay_ms_ == 0 && - frame_maximum_playout_delay_ms_ > 0 && low_latency_renderer_enabled_) { + frame_maximum_playout_delay_ms_ > 0) { // TODO(kron): Estimate frame rate from video stream. constexpr double kFrameRate = 60.0; // Convert playout delay in ms to number of frames. int max_composition_delay_in_frames = std::lrint( static_cast(frame_maximum_playout_delay_ms_ * kFrameRate) / rtc::kNumMillisecsPerSec); - if (low_latency_renderer_include_predecode_buffer_) { - // Subtract frames in buffer. - max_composition_delay_in_frames = std::max( - max_composition_delay_in_frames - frame_buffer_->Size(), 0); - } + // Subtract frames in buffer. + max_composition_delay_in_frames = std::max( + max_composition_delay_in_frames - frame_buffer_->Size(), 0); timing_->SetMaxCompositionDelayInFrames( absl::make_optional(max_composition_delay_in_frames)); } diff --git a/video/video_receive_stream2.h b/video/video_receive_stream2.h index ffb1b81f68..2bb5fa005c 100644 --- a/video/video_receive_stream2.h +++ b/video/video_receive_stream2.h @@ -309,16 +309,6 @@ class VideoReceiveStream2 std::vector> buffered_encoded_frames_ RTC_GUARDED_BY(decode_queue_); - // Set by the field trial WebRTC-LowLatencyRenderer. The parameter `enabled` - // determines if the low-latency renderer algorithm should be used for the - // case min playout delay=0 and max playout delay>0. - FieldTrialParameter low_latency_renderer_enabled_; - // Set by the field trial WebRTC-LowLatencyRenderer. The parameter - // `include_predecode_buffer` determines if the predecode buffer should be - // taken into account when calculating maximum number of frames in composition - // queue. - FieldTrialParameter low_latency_renderer_include_predecode_buffer_; - // Set by the field trial WebRTC-PreStreamDecoders. The parameter `max` // determines the maximum number of decoders that are created up front before // any video frame has been received.