Chromium Code Reviews| Index: content/common/gpu/media/vt_support.cc |
| diff --git a/content/common/gpu/media/vt_support.cc b/content/common/gpu/media/vt_support.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..2ef889293e15bc8483315cbfe1f20a33abad7cdc |
| --- /dev/null |
| +++ b/content/common/gpu/media/vt_support.cc |
| @@ -0,0 +1,87 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include <dlfcn.h> |
| + |
| +#include "base/memory/singleton.h" |
| +#include "content/common/gpu/media/vt_support.h" |
| + |
| +namespace content { |
| + |
| +// static |
| +VTSupport* VTSupport::GetInstance() { |
| + VTSupport* vt_support = Singleton<VTSupport>::get(); |
| + if (vt_support->Initialized()) |
| + return vt_support; |
| + return NULL; |
| +} |
| + |
| +VTSupport::VTSupport() |
| + : cm_handle_(NULL), |
| + initialized_(false) { |
| + cm_handle_ = dlopen( |
| + "/System/Library/Frameworks/CoreMedia.framework/CoreMedia", |
| + RTLD_LAZY | RTLD_LOCAL); |
| + // TODO(sandersd): Attempt fallback to private framework. |
| + vt_handle_ = dlopen( |
| + "/System/Library/Frameworks/VideoToolbox.framework/VideoToolbox", |
| + RTLD_LAZY | RTLD_LOCAL); |
|
mcasas
2014/06/19 12:04:23
First create the Bundle and then dlopen() it:
NSB
|
| + if (!cm_handle_ || !vt_handle_) |
| + return; |
| + |
| + CMBlockBufferCreateWithMemoryBlock = |
| + reinterpret_cast<CMBlockBufferCreateWithMemoryBlockPtr>( |
| + dlsym(cm_handle_, "CMBlockBufferCreateWithMemoryBlock")); |
|
mcasas
2014/06/19 12:04:24
CHECK(CMBlockBufferCreateWithMemoryBlock) << dlerr
|
| + CMFormatDescriptionGetExtensions = |
| + reinterpret_cast<CMFormatDescriptionGetExtensionsPtr>( |
| + dlsym(cm_handle_, "CMFormatDescriptionGetExtensions")); |
| + CMSampleBufferCreate = |
| + reinterpret_cast<CMSampleBufferCreatePtr>( |
| + dlsym(cm_handle_, "CMSampleBufferCreate")); |
| + // TODO(sandersd): Make CreateFromH264 optional. |
| + CMVideoFormatDescriptionCreateFromH264ParameterSets = |
| + reinterpret_cast<CMVideoFormatDescriptionCreateFromH264ParameterSetsPtr>( |
| + dlsym(cm_handle_, |
| + "CMVideoFormatDescriptionCreateFromH264ParameterSets")); |
| + |
| + VTDecompressionSessionDecodeFrame = |
| + reinterpret_cast<VTDecompressionSessionDecodeFramePtr>( |
| + dlsym(vt_handle_, "VTDecompressionSessionDecodeFrame")); |
| + VTDecompressionSessionCreate = |
| + reinterpret_cast<VTDecompressionSessionCreatePtr>( |
| + dlsym(vt_handle_, "VTDecompressionSessionCreate")); |
| + |
| + if (!CMBlockBufferCreateWithMemoryBlock || |
| + !CMFormatDescriptionGetExtensions || |
| + !CMSampleBufferCreate || |
| + !CMVideoFormatDescriptionCreateFromH264ParameterSets || |
| + !VTDecompressionSessionDecodeFrame || |
| + !VTDecompressionSessionCreate) { |
| + CloseLibraryHandles(); |
| + return; |
| + } |
| + |
| + initialized_ = true; |
| +} |
| + |
| +VTSupport::~VTSupport() { |
| + CloseLibraryHandles(); |
| +} |
| + |
| +bool VTSupport::Initialized() { |
| + return initialized_; |
| +} |
| + |
| +void VTSupport::CloseLibraryHandles() { |
| + if (cm_handle_) { |
| + dlclose(cm_handle_); |
| + cm_handle_ = NULL; |
| + } |
| + if (vt_handle_) { |
| + dlclose(vt_handle_); |
| + vt_handle_ = NULL; |
| + } |
| +} |
| + |
| +} // namespace content |