From eee39206a2f6a55596854774db74ad30f4f4e13e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Spr=C3=A5ng?= Date: Thu, 15 Nov 2018 17:52:43 +0100 Subject: [PATCH] Don't poll EncoderInfo from encoder twice per frame MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: webrtc:9890 Change-Id: Id4c2062a1c0c6be699f2096b4c0b334c98f3c4ba Reviewed-on: https://webrtc-review.googlesource.com/c/111083 Commit-Queue: Erik Språng Reviewed-by: Mirta Dvornicic Cr-Commit-Position: refs/heads/master@{#25672} --- modules/video_coding/video_coding_impl.cc | 2 +- modules/video_coding/video_coding_impl.h | 4 +++- modules/video_coding/video_sender.cc | 19 +++++++++++-------- modules/video_coding/video_sender_unittest.cc | 5 ++++- video/video_stream_encoder.cc | 2 +- 5 files changed, 20 insertions(+), 12 deletions(-) diff --git a/modules/video_coding/video_coding_impl.cc b/modules/video_coding/video_coding_impl.cc index 4fb5ae3bda..58397ad386 100644 --- a/modules/video_coding/video_coding_impl.cc +++ b/modules/video_coding/video_coding_impl.cc @@ -136,7 +136,7 @@ class VideoCodingModuleImpl : public VideoCodingModule { int32_t AddVideoFrame(const VideoFrame& videoFrame, const CodecSpecificInfo* codecSpecificInfo) override { - return sender_.AddVideoFrame(videoFrame, codecSpecificInfo); + return sender_.AddVideoFrame(videoFrame, codecSpecificInfo, absl::nullopt); } int32_t IntraFrameRequest(size_t stream_index) override { diff --git a/modules/video_coding/video_coding_impl.h b/modules/video_coding/video_coding_impl.h index ac88166394..e27a2fe760 100644 --- a/modules/video_coding/video_coding_impl.h +++ b/modules/video_coding/video_coding_impl.h @@ -17,6 +17,7 @@ #include #include +#include "absl/types/optional.h" #include "modules/video_coding/decoder_database.h" #include "modules/video_coding/encoder_database.h" #include "modules/video_coding/frame_buffer.h" @@ -93,7 +94,8 @@ class VideoSender { VideoBitrateAllocationObserver* bitrate_updated_callback); int32_t AddVideoFrame(const VideoFrame& videoFrame, - const CodecSpecificInfo* codecSpecificInfo); + const CodecSpecificInfo* codecSpecificInfo, + absl::optional encoder_info); int32_t IntraFrameRequest(size_t stream_index); int32_t EnableFrameDropper(bool enable); diff --git a/modules/video_coding/video_sender.cc b/modules/video_coding/video_sender.cc index f95d7fcf15..4bd52530c9 100644 --- a/modules/video_coding/video_sender.cc +++ b/modules/video_coding/video_sender.cc @@ -245,8 +245,10 @@ void VideoSender::SetEncoderParameters(EncoderParameters params, } // Add one raw video frame to the encoder, blocking. -int32_t VideoSender::AddVideoFrame(const VideoFrame& videoFrame, - const CodecSpecificInfo* codecSpecificInfo) { +int32_t VideoSender::AddVideoFrame( + const VideoFrame& videoFrame, + const CodecSpecificInfo* codecSpecificInfo, + absl::optional encoder_info) { EncoderParameters encoder_params; std::vector next_frame_types; bool encoder_has_internal_source = false; @@ -260,14 +262,15 @@ int32_t VideoSender::AddVideoFrame(const VideoFrame& videoFrame, if (_encoder == nullptr) return VCM_UNINITIALIZED; SetEncoderParameters(encoder_params, encoder_has_internal_source); - - const VideoEncoder::EncoderInfo encoder_info = _encoder->GetEncoderInfo(); + if (!encoder_info) { + encoder_info = _encoder->GetEncoderInfo(); + } // Frame dropping is enabled iff frame dropping has been requested, and // frame dropping is not force-disabled, and rate controller is not trusted. - const bool frame_dropping_enabled = frame_dropper_requested_ && - !force_disable_frame_dropper_ && - !encoder_info.has_trusted_rate_controller; + const bool frame_dropping_enabled = + frame_dropper_requested_ && !force_disable_frame_dropper_ && + !encoder_info->has_trusted_rate_controller; _mediaOpt.EnableFrameDropper(frame_dropping_enabled); if (_mediaOpt.DropFrame()) { @@ -295,7 +298,7 @@ int32_t VideoSender::AddVideoFrame(const VideoFrame& videoFrame, const bool is_buffer_type_supported = buffer_type == VideoFrameBuffer::Type::kI420 || (buffer_type == VideoFrameBuffer::Type::kNative && - encoder_info.supports_native_handle); + encoder_info->supports_native_handle); if (!is_buffer_type_supported) { // This module only supports software encoding. // TODO(pbos): Offload conversion from the encoder thread. diff --git a/modules/video_coding/video_sender_unittest.cc b/modules/video_coding/video_sender_unittest.cc index e423de5e63..c2ff0f6207 100644 --- a/modules/video_coding/video_sender_unittest.cc +++ b/modules/video_coding/video_sender_unittest.cc @@ -186,7 +186,10 @@ class TestVideoSender : public ::testing::Test { void AddFrame() { assert(generator_.get()); - sender_->AddVideoFrame(*generator_->NextFrame(), NULL); + sender_->AddVideoFrame(*generator_->NextFrame(), nullptr, + encoder_ ? absl::optional( + encoder_->GetEncoderInfo()) + : absl::nullopt); } SimulatedClock clock_; diff --git a/video/video_stream_encoder.cc b/video/video_stream_encoder.cc index 508c564a09..a22d58adf1 100644 --- a/video/video_stream_encoder.cc +++ b/video/video_stream_encoder.cc @@ -902,7 +902,7 @@ void VideoStreamEncoder::EncodeVideoFrame(const VideoFrame& video_frame, } encoder_info_ = info; - video_sender_.AddVideoFrame(out_frame, nullptr); + video_sender_.AddVideoFrame(out_frame, nullptr, encoder_info_); } void VideoStreamEncoder::SendKeyFrame() {