Chromium Code Reviews| 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 |