| Index: content/common/gpu/media/omx_video_decode_accelerator.cc
|
| diff --git a/content/common/gpu/media/omx_video_decode_accelerator.cc b/content/common/gpu/media/omx_video_decode_accelerator.cc
|
| index 57fe2fddaa449c5d3bbd2365a24fdb2537a11a5e..de862197752cc2d491d7c388b15a5266ccc374a3 100644
|
| --- a/content/common/gpu/media/omx_video_decode_accelerator.cc
|
| +++ b/content/common/gpu/media/omx_video_decode_accelerator.cc
|
| @@ -21,8 +21,7 @@ typedef std::pair<scoped_ptr<base::SharedMemory>, int32> SharedMemoryAndId;
|
|
|
| enum { kNumPictureBuffers = 4 };
|
|
|
| -// Open the libOmxCore here for now.
|
| -void* omx_handle = dlopen("libOmxCore.so", RTLD_NOW);
|
| +void* omx_handle = NULL;
|
|
|
| typedef OMX_ERRORTYPE (*OMXInit)();
|
| typedef OMX_ERRORTYPE (*OMXGetHandle)(
|
| @@ -31,21 +30,11 @@ typedef OMX_ERRORTYPE (*OMXGetComponentsOfRole)(OMX_STRING, OMX_U32*, OMX_U8**);
|
| typedef OMX_ERRORTYPE (*OMXFreeHandle)(OMX_HANDLETYPE);
|
| typedef OMX_ERRORTYPE (*OMXDeinit)();
|
|
|
| -OMXInit omx_init = reinterpret_cast<OMXInit>(dlsym(omx_handle, "OMX_Init"));
|
| -OMXGetHandle omx_gethandle =
|
| - reinterpret_cast<OMXGetHandle>(dlsym(omx_handle, "OMX_GetHandle"));
|
| -OMXGetComponentsOfRole omx_get_components_of_role =
|
| - reinterpret_cast<OMXGetComponentsOfRole>(
|
| - dlsym(omx_handle, "OMX_GetComponentsOfRole"));
|
| -OMXFreeHandle omx_free_handle =
|
| - reinterpret_cast<OMXFreeHandle>(dlsym(omx_handle, "OMX_FreeHandle"));
|
| -OMXDeinit omx_deinit =
|
| - reinterpret_cast<OMXDeinit>(dlsym(omx_handle, "OMX_Deinit"));
|
| -
|
| -static bool AreOMXFunctionPointersInitialized() {
|
| - return (omx_init && omx_gethandle && omx_get_components_of_role &&
|
| - omx_free_handle && omx_deinit);
|
| -}
|
| +OMXInit omx_init = NULL;
|
| +OMXGetHandle omx_gethandle = NULL;
|
| +OMXGetComponentsOfRole omx_get_components_of_role = NULL;
|
| +OMXFreeHandle omx_free_handle = NULL;
|
| +OMXDeinit omx_deinit = NULL;
|
|
|
| // Maps h264-related Profile enum values to OMX_VIDEO_AVCPROFILETYPE values.
|
| static OMX_U32 MapH264ProfileToOMXAVCProfile(uint32 profile) {
|
| @@ -97,6 +86,9 @@ static OMX_U32 MapH264ProfileToOMXAVCProfile(uint32 profile) {
|
| log << ", OMX result: 0x" << std::hex << omx_result, \
|
| error, ret_val)
|
|
|
| +// static
|
| +bool OmxVideoDecodeAccelerator::pre_sandbox_init_done_ = false;
|
| +
|
| OmxVideoDecodeAccelerator::OmxVideoDecodeAccelerator(
|
| EGLDisplay egl_display, EGLContext egl_context,
|
| media::VideoDecodeAccelerator::Client* client)
|
| @@ -118,7 +110,8 @@ OmxVideoDecodeAccelerator::OmxVideoDecodeAccelerator(
|
| codec_(UNKNOWN),
|
| h264_profile_(OMX_VIDEO_AVCProfileMax),
|
| component_name_is_nvidia_h264ext_(false) {
|
| - RETURN_ON_FAILURE(AreOMXFunctionPointersInitialized(),
|
| + static bool omx_functions_initialized = PostSandboxInitialization();
|
| + RETURN_ON_FAILURE(omx_functions_initialized,
|
| "Failed to load openmax library", PLATFORM_FAILURE,);
|
| RETURN_ON_OMX_FAILURE(omx_init(), "Failed to init OpenMAX core",
|
| PLATFORM_FAILURE,);
|
| @@ -994,6 +987,32 @@ void OmxVideoDecodeAccelerator::EventHandlerCompleteTask(OMX_EVENTTYPE event,
|
| }
|
|
|
| // static
|
| +void OmxVideoDecodeAccelerator::PreSandboxInitialization() {
|
| + DCHECK(!pre_sandbox_init_done_);
|
| + omx_handle = dlopen("libOmxCore.so", RTLD_NOW);
|
| + pre_sandbox_init_done_ = omx_handle != NULL;
|
| +}
|
| +
|
| +// static
|
| +bool OmxVideoDecodeAccelerator::PostSandboxInitialization() {
|
| + if (!pre_sandbox_init_done_)
|
| + return false;
|
| +
|
| + omx_init = reinterpret_cast<OMXInit>(dlsym(omx_handle, "OMX_Init"));
|
| + omx_gethandle =
|
| + reinterpret_cast<OMXGetHandle>(dlsym(omx_handle, "OMX_GetHandle"));
|
| + omx_get_components_of_role =
|
| + reinterpret_cast<OMXGetComponentsOfRole>(
|
| + dlsym(omx_handle, "OMX_GetComponentsOfRole"));
|
| + omx_free_handle =
|
| + reinterpret_cast<OMXFreeHandle>(dlsym(omx_handle, "OMX_FreeHandle"));
|
| + omx_deinit =
|
| + reinterpret_cast<OMXDeinit>(dlsym(omx_handle, "OMX_Deinit"));
|
| + return (omx_init && omx_gethandle && omx_get_components_of_role &&
|
| + omx_free_handle && omx_deinit);
|
| +}
|
| +
|
| +// static
|
| OMX_ERRORTYPE OmxVideoDecodeAccelerator::EventHandler(OMX_HANDLETYPE component,
|
| OMX_PTR priv_data,
|
| OMX_EVENTTYPE event,
|
|
|