diff options
author | sail@chromium.org <sail@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-09 23:46:12 +0000 |
---|---|---|
committer | sail@chromium.org <sail@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-09 23:46:12 +0000 |
commit | 956900a27a68afca0c35e592d590d6df0d2cb11a (patch) | |
tree | 9b1ec2237adc45b4d8e6a559aa53ed843a990b30 /ui/surface | |
parent | 27b695412d74cce089d21de897b3a098675aab15 (diff) | |
download | chromium_src-956900a27a68afca0c35e592d590d6df0d2cb11a.zip chromium_src-956900a27a68afca0c35e592d590d6df0d2cb11a.tar.gz chromium_src-956900a27a68afca0c35e592d590d6df0d2cb11a.tar.bz2 |
Add CVPixelBufferGetIOSurface() to IOSurfaceSupport
This functionality will be used by new hardware video decoding feature.
BUG=127414
TEST=
Review URL: https://chromiumcodereview.appspot.com/10388043
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@136177 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/surface')
-rw-r--r-- | ui/surface/io_surface_support_mac.cc | 57 | ||||
-rw-r--r-- | ui/surface/io_surface_support_mac.h | 4 |
2 files changed, 49 insertions, 12 deletions
diff --git a/ui/surface/io_surface_support_mac.cc b/ui/surface/io_surface_support_mac.cc index 1b2c324..49cc285 100644 --- a/ui/surface/io_surface_support_mac.cc +++ b/ui/surface/io_surface_support_mac.cc @@ -23,6 +23,8 @@ typedef CGLError (*CGLTexImageIOSurface2DProcPtr)(CGLContextObj ctx, GLenum type, CFTypeRef io_surface, GLuint plane); +typedef CFTypeRef (*CVPixelBufferGetIOSurfaceProcPtr)( + CVPixelBufferRef pixel_buffer); class IOSurfaceSupportImpl : public IOSurfaceSupport { public: @@ -56,12 +58,18 @@ class IOSurfaceSupportImpl : public IOSurfaceSupport { CFTypeRef io_surface, GLuint plane); + virtual CFTypeRef CVPixelBufferGetIOSurface( + CVPixelBufferRef pixel_buffer) OVERRIDE; + private: IOSurfaceSupportImpl(); ~IOSurfaceSupportImpl(); + void CloseLibraryHandles(); + void* iosurface_handle_; void* opengl_handle_; + void* core_video_handle_; CFStringRef k_io_surface_width_; CFStringRef k_io_surface_height_; CFStringRef k_io_surface_bytes_per_element_; @@ -74,6 +82,7 @@ class IOSurfaceSupportImpl : public IOSurfaceSupport { IOSurfaceGetWidthPtr io_surface_get_width_; IOSurfaceGetHeightPtr io_surface_get_height_; CGLTexImageIOSurface2DProcPtr cgl_tex_image_io_surface_2d_; + CVPixelBufferGetIOSurfaceProcPtr cv_pixel_buffer_get_io_surface_; bool initialized_successfully_; friend struct DefaultSingletonTraits<IOSurfaceSupportImpl>; @@ -154,9 +163,15 @@ CGLError IOSurfaceSupportImpl::CGLTexImageIOSurface2D(CGLContextObj ctx, plane); } +CFTypeRef IOSurfaceSupportImpl::CVPixelBufferGetIOSurface( + CVPixelBufferRef pixel_buffer) { + return cv_pixel_buffer_get_io_surface_(pixel_buffer); +} + IOSurfaceSupportImpl::IOSurfaceSupportImpl() : iosurface_handle_(NULL), opengl_handle_(NULL), + core_video_handle_(NULL), k_io_surface_width_(NULL), k_io_surface_height_(NULL), k_io_surface_bytes_per_element_(NULL), @@ -169,18 +184,21 @@ IOSurfaceSupportImpl::IOSurfaceSupportImpl() io_surface_get_width_(NULL), io_surface_get_height_(NULL), cgl_tex_image_io_surface_2d_(NULL), + cv_pixel_buffer_get_io_surface_(NULL), initialized_successfully_(false) { iosurface_handle_ = dlopen( "/System/Library/Frameworks/IOSurface.framework/IOSurface", RTLD_LAZY | RTLD_LOCAL); - if (!iosurface_handle_) - return; opengl_handle_ = dlopen( "/System/Library/Frameworks/OpenGL.framework/OpenGL", RTLD_LAZY | RTLD_LOCAL); - if (!opengl_handle_) { - dlclose(iosurface_handle_); - iosurface_handle_ = NULL; + core_video_handle_ = dlopen( + "/System/Library/Frameworks/CoreVideo.framework/CoreVideo", + RTLD_LAZY | RTLD_LOCAL); + if (!iosurface_handle_ || + !opengl_handle_ || + !core_video_handle_) { + CloseLibraryHandles(); return; } @@ -203,6 +221,8 @@ IOSurfaceSupportImpl::IOSurfaceSupportImpl() dlsym(iosurface_handle_, "IOSurfaceGetHeight"); void* tex_image_io_surface_2d_ptr = dlsym(opengl_handle_, "CGLTexImageIOSurface2D"); + void* cv_pixel_buffer_get_io_surface = + dlsym(core_video_handle_, "CVPixelBufferGetIOSurface"); if (!surface_width_ptr || !surface_height_ptr || !surface_bytes_per_element_ptr || @@ -214,11 +234,9 @@ IOSurfaceSupportImpl::IOSurfaceSupportImpl() !surface_lookup_from_mach_port_ptr || !io_surface_get_width_ptr || !io_surface_get_height_ptr || - !tex_image_io_surface_2d_ptr) { - dlclose(iosurface_handle_); - iosurface_handle_ = NULL; - dlclose(opengl_handle_); - opengl_handle_ = NULL; + !tex_image_io_surface_2d_ptr || + !cv_pixel_buffer_get_io_surface) { + CloseLibraryHandles(); return; } @@ -248,14 +266,29 @@ IOSurfaceSupportImpl::IOSurfaceSupportImpl() cgl_tex_image_io_surface_2d_ = reinterpret_cast<CGLTexImageIOSurface2DProcPtr>( tex_image_io_surface_2d_ptr); + cv_pixel_buffer_get_io_surface_ = + reinterpret_cast<CVPixelBufferGetIOSurfaceProcPtr>( + cv_pixel_buffer_get_io_surface); initialized_successfully_ = true; } IOSurfaceSupportImpl::~IOSurfaceSupportImpl() { - if (iosurface_handle_) + CloseLibraryHandles(); +} + +void IOSurfaceSupportImpl::CloseLibraryHandles() { + if (iosurface_handle_) { dlclose(iosurface_handle_); - if (opengl_handle_) + iosurface_handle_ = NULL; + } + if (opengl_handle_) { dlclose(opengl_handle_); + opengl_handle_ = NULL; + } + if (core_video_handle_) { + dlclose(core_video_handle_); + core_video_handle_ = NULL; + } } IOSurfaceSupport* IOSurfaceSupport::Initialize() { diff --git a/ui/surface/io_surface_support_mac.h b/ui/surface/io_surface_support_mac.h index e1d78ef..afc4e95 100644 --- a/ui/surface/io_surface_support_mac.h +++ b/ui/surface/io_surface_support_mac.h @@ -7,6 +7,7 @@ #pragma once #include <CoreFoundation/CoreFoundation.h> +#include <CoreVideo/CoreVideo.h> #include <mach/mach.h> #include <OpenGL/OpenGL.h> @@ -60,6 +61,9 @@ class SURFACE_EXPORT IOSurfaceSupport { CFTypeRef io_surface, GLuint plane) = 0; + virtual CFTypeRef CVPixelBufferGetIOSurface( + CVPixelBufferRef pixel_buffer) = 0; + protected: IOSurfaceSupport(); virtual ~IOSurfaceSupport(); |