Use VideoFrameBuffer::Scale in encoder wrappers

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 <sprang@webrtc.org>
Commit-Queue: Evan Shrubsole <eshr@google.com>
Cr-Commit-Position: refs/heads/master@{#32389}
This commit is contained in:
Evan Shrubsole
2020-10-12 14:43:39 +02:00
committed by Commit Bot
parent 84524e6b19
commit 5089a8ea14
2 changed files with 14 additions and 9 deletions

View File

@ -367,9 +367,12 @@ int32_t VideoEncoderSoftwareFallbackWrapper::EncodeWithMainEncoder(
RTC_LOG(LS_ERROR) << "Failed to convert from to I420"; RTC_LOG(LS_ERROR) << "Failed to convert from to I420";
return WEBRTC_VIDEO_CODEC_ENCODER_FAILURE; return WEBRTC_VIDEO_CODEC_ENCODER_FAILURE;
} }
rtc::scoped_refptr<I420Buffer> dst_buffer = rtc::scoped_refptr<VideoFrameBuffer> dst_buffer =
I420Buffer::Create(codec_settings_.width, codec_settings_.height); src_buffer->Scale(codec_settings_.width, codec_settings_.height);
dst_buffer->ScaleFrom(*src_buffer); if (!dst_buffer) {
RTC_LOG(LS_ERROR) << "Failed to scale video frame.";
return WEBRTC_VIDEO_CODEC_ENCODER_FAILURE;
}
VideoFrame scaled_frame = frame; VideoFrame scaled_frame = frame;
scaled_frame.set_video_frame_buffer(dst_buffer); scaled_frame.set_video_frame_buffer(dst_buffer);
scaled_frame.set_update_rect(VideoFrame::UpdateRect{ scaled_frame.set_update_rect(VideoFrame::UpdateRect{

View File

@ -377,7 +377,7 @@ int SimulcastEncoderAdapter::Encode(
} }
// Temporary thay may hold the result of texture to i420 buffer conversion. // Temporary thay may hold the result of texture to i420 buffer conversion.
rtc::scoped_refptr<I420BufferInterface> src_buffer; rtc::scoped_refptr<VideoFrameBuffer> src_buffer;
int src_width = input_image.width(); int src_width = input_image.width();
int src_height = input_image.height(); int src_height = input_image.height();
for (size_t stream_idx = 0; stream_idx < streaminfos_.size(); ++stream_idx) { for (size_t stream_idx = 0; stream_idx < streaminfos_.size(); ++stream_idx) {
@ -433,12 +433,14 @@ int SimulcastEncoderAdapter::Encode(
} }
} else { } else {
if (src_buffer == nullptr) { if (src_buffer == nullptr) {
src_buffer = input_image.video_frame_buffer()->ToI420(); src_buffer = input_image.video_frame_buffer();
}
rtc::scoped_refptr<VideoFrameBuffer> 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<I420Buffer> dst_buffer =
I420Buffer::Create(dst_width, dst_height);
dst_buffer->ScaleFrom(*src_buffer);
// UpdateRect is not propagated to lower simulcast layers currently. // UpdateRect is not propagated to lower simulcast layers currently.
// TODO(ilnik): Consider scaling UpdateRect together with the buffer. // TODO(ilnik): Consider scaling UpdateRect together with the buffer.