Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1008)

Unified Diff: webrtc/sdk/objc/Framework/Classes/avfoundationvideocapturer.mm

Issue 2135953002: AVFoundationVideoCapturer: Output native frames instead of I420 frames (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: CVBufferRelease when dropping frame in capturer Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/sdk/objc/Framework/Classes/avfoundationvideocapturer.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
« no previous file with comments | « webrtc/sdk/objc/Framework/Classes/avfoundationvideocapturer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698