Use VideoFrameBuffer::CropAndScale in VideoStreamEncoder
This avoids a conversion to I420 for frames that support crop and scale. Bug: webrtc:11976 Change-Id: I6517a016403cff3ea7ebce1f3de9f9af8b569933 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/187357 Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org> Commit-Queue: Evan Shrubsole <eshr@google.com> Cr-Commit-Position: refs/heads/master@{#32366}
This commit is contained in:

committed by
Commit Bot

parent
4cf8e17e92
commit
9577be3693
@ -1347,29 +1347,24 @@ void VideoStreamEncoder::EncodeVideoFrame(const VideoFrame& video_frame,
|
||||
out_frame.video_frame_buffer()->type() !=
|
||||
VideoFrameBuffer::Type::kNative) {
|
||||
// If the frame can't be converted to I420, drop it.
|
||||
auto i420_buffer = video_frame.video_frame_buffer()->ToI420();
|
||||
if (!i420_buffer) {
|
||||
RTC_LOG(LS_ERROR) << "Frame conversion for crop failed, dropping frame.";
|
||||
return;
|
||||
}
|
||||
int cropped_width = video_frame.width() - crop_width_;
|
||||
int cropped_height = video_frame.height() - crop_height_;
|
||||
rtc::scoped_refptr<I420Buffer> cropped_buffer =
|
||||
I420Buffer::Create(cropped_width, cropped_height);
|
||||
rtc::scoped_refptr<VideoFrameBuffer> cropped_buffer;
|
||||
// TODO(ilnik): Remove scaling if cropping is too big, as it should never
|
||||
// happen after SinkWants signaled correctly from ReconfigureEncoder.
|
||||
VideoFrame::UpdateRect update_rect = video_frame.update_rect();
|
||||
if (crop_width_ < 4 && crop_height_ < 4) {
|
||||
cropped_buffer->CropAndScaleFrom(*i420_buffer, crop_width_ / 2,
|
||||
crop_height_ / 2, cropped_width,
|
||||
cropped_height);
|
||||
cropped_buffer = video_frame.video_frame_buffer()->CropAndScale(
|
||||
crop_width_ / 2, crop_height_ / 2, cropped_width, cropped_height,
|
||||
cropped_width, cropped_height);
|
||||
update_rect.offset_x -= crop_width_ / 2;
|
||||
update_rect.offset_y -= crop_height_ / 2;
|
||||
update_rect.Intersect(
|
||||
VideoFrame::UpdateRect{0, 0, cropped_width, cropped_height});
|
||||
|
||||
} else {
|
||||
cropped_buffer->ScaleFrom(*i420_buffer);
|
||||
cropped_buffer = video_frame.video_frame_buffer()->Scale(cropped_width,
|
||||
cropped_height);
|
||||
if (!update_rect.IsEmpty()) {
|
||||
// Since we can't reason about pixels after scaling, we invalidate whole
|
||||
// picture, if anything changed.
|
||||
@ -1377,6 +1372,11 @@ void VideoStreamEncoder::EncodeVideoFrame(const VideoFrame& video_frame,
|
||||
VideoFrame::UpdateRect{0, 0, cropped_width, cropped_height};
|
||||
}
|
||||
}
|
||||
if (!cropped_buffer) {
|
||||
RTC_LOG(LS_ERROR) << "Cropping and scaling frame failed, dropping frame.";
|
||||
return;
|
||||
}
|
||||
|
||||
out_frame.set_video_frame_buffer(cropped_buffer);
|
||||
out_frame.set_update_rect(update_rect);
|
||||
out_frame.set_ntp_time_ms(video_frame.ntp_time_ms());
|
||||
|
Reference in New Issue
Block a user