| Index: webrtc/sdk/objc/Framework/Classes/avfoundationvideocapturer.mm
|
| diff --git a/webrtc/sdk/objc/Framework/Classes/avfoundationvideocapturer.mm b/webrtc/sdk/objc/Framework/Classes/avfoundationvideocapturer.mm
|
| index 778d70b897cd9777b2cd8aa13ced4ae6f9d0c47a..9b1a7832d248bdfa85dc6a5c01f2a222f8dcc92c 100644
|
| --- a/webrtc/sdk/objc/Framework/Classes/avfoundationvideocapturer.mm
|
| +++ b/webrtc/sdk/objc/Framework/Classes/avfoundationvideocapturer.mm
|
| @@ -22,6 +22,7 @@
|
| #include "webrtc/base/bind.h"
|
| #include "webrtc/base/checks.h"
|
| #include "webrtc/base/thread.h"
|
| +#include "webrtc/common_video/include/corevideo_frame_buffer.h"
|
|
|
| // TODO(tkchin): support other formats.
|
| static NSString *const kDefaultPreset = AVCaptureSessionPreset640x480;
|
| @@ -642,57 +643,46 @@ void AVFoundationVideoCapturer::OnMessage(rtc::Message *msg) {
|
| }
|
|
|
| void AVFoundationVideoCapturer::OnFrameMessage(CVImageBufferRef image_buffer,
|
| - int64_t capture_time) {
|
| + int64_t capture_time_ns) {
|
| RTC_DCHECK(_startThread->IsCurrent());
|
|
|
| - // Base address must be unlocked to access frame data.
|
| - CVOptionFlags lock_flags = kCVPixelBufferLock_ReadOnly;
|
| - CVReturn ret = CVPixelBufferLockBaseAddress(image_buffer, lock_flags);
|
| - if (ret != kCVReturnSuccess) {
|
| + rtc::scoped_refptr<webrtc::VideoFrameBuffer> buffer =
|
| + new rtc::RefCountedObject<webrtc::CoreVideoFrameBuffer>(image_buffer);
|
| +
|
| + const int captured_width = buffer->width();
|
| + const int captured_height = buffer->height();
|
| +
|
| + int adapted_width;
|
| + int adapted_height;
|
| + int crop_width;
|
| + int crop_height;
|
| + int crop_x;
|
| + int crop_y;
|
| + int64_t translated_camera_time_us;
|
| +
|
| + if (!AdaptFrame(captured_width, captured_height,
|
| + capture_time_ns / rtc::kNumNanosecsPerMicrosec,
|
| + rtc::TimeMicros(), &adapted_width, &adapted_height,
|
| + &crop_width, &crop_height, &crop_x, &crop_y,
|
| + &translated_camera_time_us)) {
|
| + CVBufferRelease(image_buffer);
|
| return;
|
| }
|
|
|
| - static size_t const kYPlaneIndex = 0;
|
| - static size_t const kUVPlaneIndex = 1;
|
| - uint8_t* y_plane_address =
|
| - static_cast<uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(image_buffer,
|
| - kYPlaneIndex));
|
| - size_t y_plane_height =
|
| - CVPixelBufferGetHeightOfPlane(image_buffer, kYPlaneIndex);
|
| - size_t y_plane_width =
|
| - CVPixelBufferGetWidthOfPlane(image_buffer, kYPlaneIndex);
|
| - size_t y_plane_bytes_per_row =
|
| - CVPixelBufferGetBytesPerRowOfPlane(image_buffer, kYPlaneIndex);
|
| - size_t uv_plane_height =
|
| - CVPixelBufferGetHeightOfPlane(image_buffer, kUVPlaneIndex);
|
| - size_t uv_plane_bytes_per_row =
|
| - CVPixelBufferGetBytesPerRowOfPlane(image_buffer, kUVPlaneIndex);
|
| - size_t frame_size = y_plane_bytes_per_row * y_plane_height +
|
| - uv_plane_bytes_per_row * uv_plane_height;
|
| -
|
| - // Sanity check assumption that planar bytes are contiguous.
|
| - uint8_t* uv_plane_address =
|
| - static_cast<uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(image_buffer,
|
| - kUVPlaneIndex));
|
| - RTC_DCHECK(uv_plane_address ==
|
| - y_plane_address + y_plane_height * y_plane_bytes_per_row);
|
| -
|
| - // Stuff data into a cricket::CapturedFrame.
|
| - cricket::CapturedFrame frame;
|
| - frame.width = y_plane_width;
|
| - frame.height = y_plane_height;
|
| - frame.pixel_width = 1;
|
| - frame.pixel_height = 1;
|
| - frame.fourcc = static_cast<uint32_t>(cricket::FOURCC_NV12);
|
| - frame.time_stamp = capture_time;
|
| - frame.data = y_plane_address;
|
| - frame.data_size = frame_size;
|
| -
|
| - // This will call a superclass method that will perform the frame conversion
|
| - // to I420.
|
| - SignalFrameCaptured(this, &frame);
|
| -
|
| - CVPixelBufferUnlockBaseAddress(image_buffer, lock_flags);
|
| + if (adapted_width != captured_width || crop_width != captured_width ||
|
| + adapted_height != captured_height || crop_height != captured_height) {
|
| + // TODO(magjed): Avoid converting to I420.
|
| + rtc::scoped_refptr<webrtc::I420Buffer> scaled_buffer(
|
| + _buffer_pool.CreateBuffer(adapted_width, adapted_height));
|
| + scaled_buffer->CropAndScaleFrom(buffer->NativeToI420Buffer(), crop_x,
|
| + crop_y, crop_width, crop_height);
|
| + buffer = scaled_buffer;
|
| + }
|
| +
|
| + OnFrame(cricket::WebRtcVideoFrame(buffer, webrtc::kVideoRotation_0,
|
| + translated_camera_time_us),
|
| + captured_width, captured_height);
|
| +
|
| CVBufferRelease(image_buffer);
|
| }
|
|
|
|
|