Index: webrtc/common_video/video_frame_buffer.cc |
diff --git a/webrtc/common_video/video_frame_buffer.cc b/webrtc/common_video/video_frame_buffer.cc |
index 6f49e8aef9d0f1f387ff15cce119aca0699567ac..9ee65914dfb001c783c235e422d7e7506b830a3b 100644 |
--- a/webrtc/common_video/video_frame_buffer.cc |
+++ b/webrtc/common_video/video_frame_buffer.cc |
@@ -12,6 +12,7 @@ |
#include "webrtc/base/checks.h" |
#include "webrtc/base/keep_ref_until_done.h" |
+#include "webrtc/base/logging.h" |
#include "libyuv/convert.h" |
// Aligning pointer to 64 bytes for improved performance, e.g. use SIMD. |
@@ -266,4 +267,50 @@ rtc::scoped_refptr<VideoFrameBuffer> ShallowCenterCrop( |
rtc::KeepRefUntilDone(buffer)); |
} |
+#if defined(WEBRTC_MAC) || defined(WEBRTC_IOS) |
pbos-webrtc
2016/04/01 11:56:10
I want this in a separate file that's only compile
tkchin_webrtc
2016/04/01 16:09:29
Done.
|
+ |
+CoreVideoFrameBuffer::CoreVideoFrameBuffer(CVPixelBufferRef pixel_buffer) |
+ : NativeHandleBuffer(pixel_buffer, |
+ CVPixelBufferGetWidth(pixel_buffer), |
+ CVPixelBufferGetHeight(pixel_buffer)), |
+ pixel_buffer_(pixel_buffer) { |
+ CVBufferRetain(pixel_buffer_); |
+} |
+ |
+CoreVideoFrameBuffer::~CoreVideoFrameBuffer() { |
+ CVBufferRelease(pixel_buffer_); |
+} |
+ |
+rtc::scoped_refptr<VideoFrameBuffer> |
+CoreVideoFrameBuffer::NativeToI420Buffer() { |
+ RTC_DCHECK(CVPixelBufferGetPixelFormatType(pixel_buffer_) == |
+ kCVPixelFormatType_420YpCbCr8BiPlanarFullRange); |
+ size_t width = CVPixelBufferGetWidthOfPlane(pixel_buffer_, 0); |
+ size_t height = CVPixelBufferGetHeightOfPlane(pixel_buffer_, 0); |
+ // TODO(tkchin): Use a frame buffer pool. |
+ rtc::scoped_refptr<webrtc::VideoFrameBuffer> buffer = |
+ new rtc::RefCountedObject<webrtc::I420Buffer>(width, height); |
+ CVPixelBufferLockBaseAddress(pixel_buffer_, kCVPixelBufferLock_ReadOnly); |
+ const uint8_t* src_y = static_cast<const uint8_t*>( |
+ CVPixelBufferGetBaseAddressOfPlane(pixel_buffer_, 0)); |
+ int src_y_stride = CVPixelBufferGetBytesPerRowOfPlane(pixel_buffer_, 0); |
+ const uint8_t* src_uv = static_cast<const uint8_t*>( |
+ CVPixelBufferGetBaseAddressOfPlane(pixel_buffer_, 1)); |
+ int src_uv_stride = CVPixelBufferGetBytesPerRowOfPlane(pixel_buffer_, 1); |
+ int ret = libyuv::NV12ToI420( |
+ src_y, src_y_stride, src_uv, src_uv_stride, |
+ buffer->MutableData(webrtc::kYPlane), buffer->stride(webrtc::kYPlane), |
+ buffer->MutableData(webrtc::kUPlane), buffer->stride(webrtc::kUPlane), |
+ buffer->MutableData(webrtc::kVPlane), buffer->stride(webrtc::kVPlane), |
+ width, height); |
+ CVPixelBufferUnlockBaseAddress(pixel_buffer_, kCVPixelBufferLock_ReadOnly); |
+ if (ret) { |
+ LOG(LS_ERROR) << "Error converting NV12 to I420: " << ret; |
+ return nullptr; |
+ } |
+ return buffer; |
+} |
+ |
+#endif // if defined(WEBRTC_MAC) || defined(WEBRTC_IOS) |
+ |
} // namespace webrtc |