| Index: media/base/video_frame.cc
|
| diff --git a/media/base/video_frame.cc b/media/base/video_frame.cc
|
| index 6b3427db1aa936c1707b507f13e1070ed33710b0..c77dc1348b69258fef99544846521374ddf1f290 100644
|
| --- a/media/base/video_frame.cc
|
| +++ b/media/base/video_frame.cc
|
| @@ -278,6 +278,51 @@ scoped_refptr<VideoFrame> VideoFrame::WrapExternalDmabufs(
|
| }
|
| #endif
|
|
|
| +#if defined(OS_MACOSX)
|
| +// static
|
| +scoped_refptr<VideoFrame> VideoFrame::WrapCVPixelBuffer(
|
| + CVPixelBufferRef cv_pixel_buffer,
|
| + base::TimeDelta timestamp) {
|
| + DCHECK(cv_pixel_buffer);
|
| + DCHECK(CFGetTypeID(cv_pixel_buffer) == CVPixelBufferGetTypeID());
|
| +
|
| + OSType cv_format = CVPixelBufferGetPixelFormatType(cv_pixel_buffer);
|
| + Format format;
|
| + // There are very few compatible CV pixel formats, so just check each.
|
| + if (cv_format == kCVPixelFormatType_420YpCbCr8Planar) {
|
| + format = Format::I420;
|
| + } else if (cv_format == kCVPixelFormatType_444YpCbCr8) {
|
| + format = Format::YV24;
|
| + } else if (cv_format == '420v') {
|
| + // TODO(jfroy): Use kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange when the
|
| + // minimum OS X and iOS SDKs permits it.
|
| + format = Format::NV12;
|
| + } else {
|
| + DLOG(ERROR) << "CVPixelBuffer format not supported: " << cv_format;
|
| + return NULL;
|
| + }
|
| +
|
| + gfx::Size coded_size(CVImageBufferGetEncodedSize(cv_pixel_buffer));
|
| + gfx::Rect visible_rect(CVImageBufferGetCleanRect(cv_pixel_buffer));
|
| + gfx::Size natural_size(CVImageBufferGetDisplaySize(cv_pixel_buffer));
|
| +
|
| + if (!IsValidConfig(format, coded_size, visible_rect, natural_size))
|
| + return NULL;
|
| +
|
| + scoped_refptr<VideoFrame> frame(
|
| + new VideoFrame(format,
|
| + coded_size,
|
| + visible_rect,
|
| + natural_size,
|
| + scoped_ptr<gpu::MailboxHolder>(),
|
| + timestamp,
|
| + false));
|
| +
|
| + frame->cv_pixel_buffer_.reset(cv_pixel_buffer, base::scoped_policy::RETAIN);
|
| + return frame;
|
| +}
|
| +#endif
|
| +
|
| // static
|
| scoped_refptr<VideoFrame> VideoFrame::WrapExternalYuvData(
|
| Format format,
|
| @@ -857,6 +902,12 @@ int VideoFrame::dmabuf_fd(size_t plane) const {
|
| }
|
| #endif
|
|
|
| +#if defined(OS_MACOSX)
|
| +CVPixelBufferRef VideoFrame::cv_pixel_buffer() const {
|
| + return cv_pixel_buffer_.get();
|
| +}
|
| +#endif
|
| +
|
| void VideoFrame::HashFrameForTesting(base::MD5Context* context) {
|
| for (int plane = 0; plane < kMaxPlanes; ++plane) {
|
| if (!IsValidPlane(plane, format_))
|
|
|