Reland "Implement Optimized CropAndScale for ObjCFrameBuffer"

This is a reland of commit 92043022488f80fd58c91d4dbb6889248de160ce

Original change's description:
> Implement Optimized CropAndScale for ObjCFrameBuffer
>
> The default implementation of CropAndScale uses ToI420() and then Scale,
> and this implementation behaves inefficiently with RTCCVPixelBuffer.
>
> Bug: None
> Change-Id: I422ef80d124db0354a2e696892e882a78db445bb
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/271140
> Reviewed-by: Kári Helgason <kthelgason@webrtc.org>
> Commit-Queue: Daniel.L (Byoungchan) Lee <daniel.l@hpcnt.com>
> Auto-Submit: Daniel.L (Byoungchan) Lee <daniel.l@hpcnt.com>
> Commit-Queue: Kári Helgason <kthelgason@webrtc.org>
> Cr-Commit-Position: refs/heads/main@{#37877}

Bug: None
Change-Id: Ie74146a33c1f54d0c988978bd925671afe699d05
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/272740
Reviewed-by: Kári Helgason <kthelgason@webrtc.org>
Commit-Queue: Daniel.L (Byoungchan) Lee <daniel.l@hpcnt.com>
Cr-Commit-Position: refs/heads/main@{#37887}
This commit is contained in:
Byoungchan Lee
2022-08-24 01:49:29 +09:00
committed by WebRTC LUCI CQ
parent a7dcd29c1f
commit 5aa3b073ad
6 changed files with 219 additions and 0 deletions

View File

@ -33,6 +33,12 @@ class ObjCFrameBuffer : public VideoFrameBuffer {
int height() const override;
rtc::scoped_refptr<I420BufferInterface> ToI420() override;
rtc::scoped_refptr<VideoFrameBuffer> CropAndScale(int offset_x,
int offset_y,
int crop_width,
int crop_height,
int scaled_width,
int scaled_height) override;
id<RTC_OBJC_TYPE(RTCVideoFrameBuffer)> wrapped_frame_buffer() const;

View File

@ -70,6 +70,27 @@ rtc::scoped_refptr<I420BufferInterface> ObjCFrameBuffer::ToI420() {
return rtc::make_ref_counted<ObjCI420FrameBuffer>([frame_buffer_ toI420]);
}
rtc::scoped_refptr<VideoFrameBuffer> ObjCFrameBuffer::CropAndScale(int offset_x,
int offset_y,
int crop_width,
int crop_height,
int scaled_width,
int scaled_height) {
if ([frame_buffer_ respondsToSelector:@selector
(cropAndScaleWith:offsetY:cropWidth:cropHeight:scaleWidth:scaleHeight:)]) {
return rtc::make_ref_counted<ObjCFrameBuffer>([frame_buffer_ cropAndScaleWith:offset_x
offsetY:offset_y
cropWidth:crop_width
cropHeight:crop_height
scaleWidth:scaled_width
scaleHeight:scaled_height]);
}
// Use the default implementation.
return VideoFrameBuffer::CropAndScale(
offset_x, offset_y, crop_width, crop_height, scaled_width, scaled_height);
}
id<RTC_OBJC_TYPE(RTCVideoFrameBuffer)> ObjCFrameBuffer::wrapped_frame_buffer() const {
return frame_buffer_;
}