From 5089a8ea1411719ac0ee98cee74df3fec2c95b9e Mon Sep 17 00:00:00 2001 From: Evan Shrubsole Date: Mon, 12 Oct 2020 14:43:39 +0200 Subject: [PATCH] Use VideoFrameBuffer::Scale in encoder wrappers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This sincludes the SimulcastEncoderAdapter and the VideoEncoderSoftwareFallbackWrapper. This avoids converting the frame when that is not needed. Bug: webrtc:11976 Change-Id: I686725ecfb79c3b8d87d587a907da1602483bfe8 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/187343 Reviewed-by: Erik Språng Commit-Queue: Evan Shrubsole Cr-Commit-Position: refs/heads/master@{#32389} --- .../video_encoder_software_fallback_wrapper.cc | 9 ++++++--- media/engine/simulcast_encoder_adapter.cc | 14 ++++++++------ 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/api/video_codecs/video_encoder_software_fallback_wrapper.cc b/api/video_codecs/video_encoder_software_fallback_wrapper.cc index 354e8c25ac..54f4731e8d 100644 --- a/api/video_codecs/video_encoder_software_fallback_wrapper.cc +++ b/api/video_codecs/video_encoder_software_fallback_wrapper.cc @@ -367,9 +367,12 @@ int32_t VideoEncoderSoftwareFallbackWrapper::EncodeWithMainEncoder( RTC_LOG(LS_ERROR) << "Failed to convert from to I420"; return WEBRTC_VIDEO_CODEC_ENCODER_FAILURE; } - rtc::scoped_refptr dst_buffer = - I420Buffer::Create(codec_settings_.width, codec_settings_.height); - dst_buffer->ScaleFrom(*src_buffer); + rtc::scoped_refptr dst_buffer = + src_buffer->Scale(codec_settings_.width, codec_settings_.height); + if (!dst_buffer) { + RTC_LOG(LS_ERROR) << "Failed to scale video frame."; + return WEBRTC_VIDEO_CODEC_ENCODER_FAILURE; + } VideoFrame scaled_frame = frame; scaled_frame.set_video_frame_buffer(dst_buffer); scaled_frame.set_update_rect(VideoFrame::UpdateRect{ diff --git a/media/engine/simulcast_encoder_adapter.cc b/media/engine/simulcast_encoder_adapter.cc index 6e93757854..961de15c27 100644 --- a/media/engine/simulcast_encoder_adapter.cc +++ b/media/engine/simulcast_encoder_adapter.cc @@ -377,7 +377,7 @@ int SimulcastEncoderAdapter::Encode( } // Temporary thay may hold the result of texture to i420 buffer conversion. - rtc::scoped_refptr src_buffer; + rtc::scoped_refptr src_buffer; int src_width = input_image.width(); int src_height = input_image.height(); for (size_t stream_idx = 0; stream_idx < streaminfos_.size(); ++stream_idx) { @@ -433,12 +433,14 @@ int SimulcastEncoderAdapter::Encode( } } else { if (src_buffer == nullptr) { - src_buffer = input_image.video_frame_buffer()->ToI420(); + src_buffer = input_image.video_frame_buffer(); + } + rtc::scoped_refptr dst_buffer = + src_buffer->Scale(dst_width, dst_height); + if (!dst_buffer) { + RTC_LOG(LS_ERROR) << "Failed to scale video frame"; + return WEBRTC_VIDEO_CODEC_ENCODER_FAILURE; } - rtc::scoped_refptr dst_buffer = - I420Buffer::Create(dst_width, dst_height); - - dst_buffer->ScaleFrom(*src_buffer); // UpdateRect is not propagated to lower simulcast layers currently. // TODO(ilnik): Consider scaling UpdateRect together with the buffer.