11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2013 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/base/mac/coremedia_glue.h" 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <dlfcn.h> 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#import <Foundation/Foundation.h> 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/logging.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/lazy_instance.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace { 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// This class is used to retrieve some CoreMedia library functions. It must be 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// used as a LazyInstance so that it is initialised once and in a thread-safe 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// way. Normally no work is done in constructors: LazyInstance is an exception. 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass CoreMediaLibraryInternal { 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef CoreMediaGlue::CMTime (*CMTimeMakeMethod)(int64_t, int32_t); 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef OSStatus (*CMBlockBufferCreateContiguousMethod)( 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CFAllocatorRef, 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CoreMediaGlue::CMBlockBufferRef, 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CFAllocatorRef, 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const CoreMediaGlue::CMBlockBufferCustomBlockSource*, 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t, 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t, 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CoreMediaGlue::CMBlockBufferFlags, 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CoreMediaGlue::CMBlockBufferRef*); 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef size_t (*CMBlockBufferGetDataLengthMethod)( 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CoreMediaGlue::CMBlockBufferRef); 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef OSStatus (*CMBlockBufferGetDataPointerMethod)( 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CoreMediaGlue::CMBlockBufferRef, 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t, 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t*, 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t*, 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char**); 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef Boolean (*CMBlockBufferIsRangeContiguousMethod)( 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CoreMediaGlue::CMBlockBufferRef, 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t, 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t); 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef CoreMediaGlue::CMBlockBufferRef (*CMSampleBufferGetDataBufferMethod)( 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CoreMediaGlue::CMSampleBufferRef); 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef CoreMediaGlue::CMFormatDescriptionRef ( 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *CMSampleBufferGetFormatDescriptionMethod)( 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CoreMediaGlue::CMSampleBufferRef); 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef CVImageBufferRef (*CMSampleBufferGetImageBufferMethod)( 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CoreMediaGlue::CMSampleBufferRef); 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef CFArrayRef (*CMSampleBufferGetSampleAttachmentsArrayMethod)( 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CoreMediaGlue::CMSampleBufferRef, 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Boolean); 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef FourCharCode (*CMFormatDescriptionGetMediaSubTypeMethod)( 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CoreMediaGlue::CMFormatDescriptionRef desc); 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef CoreMediaGlue::CMVideoDimensions 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (*CMVideoFormatDescriptionGetDimensionsMethod)( 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CoreMediaGlue::CMVideoFormatDescriptionRef videoDesc); 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef OSStatus (*CMVideoFormatDescriptionGetH264ParameterSetAtIndexMethod)( 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CoreMediaGlue::CMFormatDescriptionRef, 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t, 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const uint8_t**, 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t*, 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t*, 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int*); 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CoreMediaLibraryInternal() { 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NSBundle* bundle = [NSBundle 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bundleWithPath:@"/System/Library/Frameworks/CoreMedia.framework"]; 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char* path = [[bundle executablePath] fileSystemRepresentation]; 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK(path); 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void* library_handle = dlopen(path, RTLD_LAZY | RTLD_LOCAL); 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK(library_handle) << dlerror(); 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Now extract the methods. 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_time_make_ = reinterpret_cast<CMTimeMakeMethod>( 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dlsym(library_handle, "CMTimeMake")); 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK(cm_time_make_) << dlerror(); 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_block_buffer_create_contiguous_method_ = 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reinterpret_cast<CMBlockBufferCreateContiguousMethod>( 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dlsym(library_handle, "CMBlockBufferCreateContiguous")); 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK(cm_block_buffer_create_contiguous_method_) << dlerror(); 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_block_buffer_get_data_length_method_ = 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reinterpret_cast<CMBlockBufferGetDataLengthMethod>( 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dlsym(library_handle, "CMBlockBufferGetDataLength")); 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK(cm_block_buffer_get_data_length_method_) << dlerror(); 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_block_buffer_get_data_pointer_method_ = 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reinterpret_cast<CMBlockBufferGetDataPointerMethod>( 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dlsym(library_handle, "CMBlockBufferGetDataPointer")); 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK(cm_block_buffer_get_data_pointer_method_) << dlerror(); 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_block_buffer_is_range_contiguous_method_ = 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reinterpret_cast<CMBlockBufferIsRangeContiguousMethod>( 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dlsym(library_handle, "CMBlockBufferIsRangeContiguous")); 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK(cm_block_buffer_is_range_contiguous_method_) << dlerror(); 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_sample_buffer_get_data_buffer_method_ = 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reinterpret_cast<CMSampleBufferGetDataBufferMethod>( 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dlsym(library_handle, "CMSampleBufferGetDataBuffer")); 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK(cm_sample_buffer_get_data_buffer_method_) << dlerror(); 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_sample_buffer_get_format_description_method_ = 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reinterpret_cast<CMSampleBufferGetFormatDescriptionMethod>( 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dlsym(library_handle, "CMSampleBufferGetFormatDescription")); 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK(cm_sample_buffer_get_format_description_method_) << dlerror(); 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_sample_buffer_get_image_buffer_method_ = 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reinterpret_cast<CMSampleBufferGetImageBufferMethod>( 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dlsym(library_handle, "CMSampleBufferGetImageBuffer")); 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK(cm_sample_buffer_get_image_buffer_method_) << dlerror(); 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_sample_buffer_get_sample_attachments_array_method_ = 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reinterpret_cast<CMSampleBufferGetSampleAttachmentsArrayMethod>( 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dlsym(library_handle, "CMSampleBufferGetSampleAttachmentsArray")); 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK(cm_sample_buffer_get_sample_attachments_array_method_) << dlerror(); 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci k_cm_sample_attachment_key_not_sync_ = reinterpret_cast<CFStringRef*>( 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dlsym(library_handle, "kCMSampleAttachmentKey_NotSync")); 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK(k_cm_sample_attachment_key_not_sync_) << dlerror(); 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_format_description_get_media_sub_type_method_ = 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reinterpret_cast<CMFormatDescriptionGetMediaSubTypeMethod>( 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dlsym(library_handle, "CMFormatDescriptionGetMediaSubType")); 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK(cm_format_description_get_media_sub_type_method_) << dlerror(); 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_video_format_description_get_dimensions_method_ = 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reinterpret_cast<CMVideoFormatDescriptionGetDimensionsMethod>( 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dlsym(library_handle, "CMVideoFormatDescriptionGetDimensions")); 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK(cm_video_format_description_get_dimensions_method_) << dlerror(); 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Available starting (OS X 10.9, iOS 7), allow to be null. 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_video_format_description_get_h264_parameter_set_at_index_method_ = 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci reinterpret_cast< 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMVideoFormatDescriptionGetH264ParameterSetAtIndexMethod>( 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dlsym(library_handle, 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "CMVideoFormatDescriptionGetH264ParameterSetAtIndex")); 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const CMTimeMakeMethod& cm_time_make() const { return cm_time_make_; } 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const CMBlockBufferCreateContiguousMethod& 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_block_buffer_create_contiguous_method() const { 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return cm_block_buffer_create_contiguous_method_; 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const CMBlockBufferGetDataLengthMethod& 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_block_buffer_get_data_length_method() const { 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return cm_block_buffer_get_data_length_method_; 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const CMBlockBufferGetDataPointerMethod& 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_block_buffer_get_data_pointer_method() const { 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return cm_block_buffer_get_data_pointer_method_; 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const CMBlockBufferIsRangeContiguousMethod& 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_block_buffer_is_range_contiguous_method() const { 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return cm_block_buffer_is_range_contiguous_method_; 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const CMSampleBufferGetDataBufferMethod& 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_sample_buffer_get_data_buffer_method() const { 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return cm_sample_buffer_get_data_buffer_method_; 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const CMSampleBufferGetFormatDescriptionMethod& 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_sample_buffer_get_format_description_method() const { 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return cm_sample_buffer_get_format_description_method_; 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const CMSampleBufferGetImageBufferMethod& 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_sample_buffer_get_image_buffer_method() const { 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return cm_sample_buffer_get_image_buffer_method_; 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const CMSampleBufferGetSampleAttachmentsArrayMethod& 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_sample_buffer_get_sample_attachments_array_method() const { 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return cm_sample_buffer_get_sample_attachments_array_method_; 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CFStringRef* const& k_cm_sample_attachment_key_not_sync() const { 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return k_cm_sample_attachment_key_not_sync_; 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const CMFormatDescriptionGetMediaSubTypeMethod& 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_format_description_get_media_sub_type_method() const { 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return cm_format_description_get_media_sub_type_method_; 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const CMVideoFormatDescriptionGetDimensionsMethod& 1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_video_format_description_get_dimensions_method() const { 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return cm_video_format_description_get_dimensions_method_; 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const CMVideoFormatDescriptionGetH264ParameterSetAtIndexMethod& 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_video_format_description_get_h264_parameter_set_at_index_method() const { 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return cm_video_format_description_get_h264_parameter_set_at_index_method_; 1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMTimeMakeMethod cm_time_make_; 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMBlockBufferCreateContiguousMethod cm_block_buffer_create_contiguous_method_; 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMBlockBufferGetDataLengthMethod cm_block_buffer_get_data_length_method_; 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMBlockBufferGetDataPointerMethod cm_block_buffer_get_data_pointer_method_; 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMBlockBufferIsRangeContiguousMethod 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_block_buffer_is_range_contiguous_method_; 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMSampleBufferGetDataBufferMethod cm_sample_buffer_get_data_buffer_method_; 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMSampleBufferGetFormatDescriptionMethod 1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_sample_buffer_get_format_description_method_; 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMSampleBufferGetImageBufferMethod cm_sample_buffer_get_image_buffer_method_; 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMSampleBufferGetSampleAttachmentsArrayMethod 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_sample_buffer_get_sample_attachments_array_method_; 2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CFStringRef* k_cm_sample_attachment_key_not_sync_; 2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMFormatDescriptionGetMediaSubTypeMethod 2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_format_description_get_media_sub_type_method_; 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMVideoFormatDescriptionGetDimensionsMethod 2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_video_format_description_get_dimensions_method_; 2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMVideoFormatDescriptionGetH264ParameterSetAtIndexMethod 2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cm_video_format_description_get_h264_parameter_set_at_index_method_; 2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(CoreMediaLibraryInternal); 2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic base::LazyInstance<CoreMediaLibraryInternal> g_coremedia_handle = 2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci LAZY_INSTANCE_INITIALIZER; 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static 2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciCoreMediaGlue::CMTime CoreMediaGlue::CMTimeMake(int64_t value, 2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int32_t timescale) { 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return g_coremedia_handle.Get().cm_time_make()(value, timescale); 2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciOSStatus CoreMediaGlue::CMBlockBufferCreateContiguous( 2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CFAllocatorRef structureAllocator, 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMBlockBufferRef sourceBuffer, 2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CFAllocatorRef blockAllocator, 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const CMBlockBufferCustomBlockSource* customBlockSource, 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t offsetToData, 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t dataLength, 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMBlockBufferFlags flags, 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMBlockBufferRef* newBBufOut) { 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return g_coremedia_handle.Get().cm_block_buffer_create_contiguous_method()( 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci structureAllocator, 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sourceBuffer, 2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blockAllocator, 2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci customBlockSource, 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci offsetToData, 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dataLength, 2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci flags, 2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci newBBufOut); 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccisize_t CoreMediaGlue::CMBlockBufferGetDataLength(CMBlockBufferRef theBuffer) { 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return g_coremedia_handle.Get().cm_block_buffer_get_data_length_method()( 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci theBuffer); 2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static 2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciOSStatus CoreMediaGlue::CMBlockBufferGetDataPointer(CMBlockBufferRef theBuffer, 2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t offset, 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t* lengthAtOffset, 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t* totalLength, 2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci char** dataPointer) { 2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return g_coremedia_handle.Get().cm_block_buffer_get_data_pointer_method()( 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci theBuffer, offset, lengthAtOffset, totalLength, dataPointer); 2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static 2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBoolean CoreMediaGlue::CMBlockBufferIsRangeContiguous( 2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMBlockBufferRef theBuffer, 2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t offset, 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t length) { 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return g_coremedia_handle.Get().cm_block_buffer_is_range_contiguous_method()( 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci theBuffer, offset, length); 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static 2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciCoreMediaGlue::CMBlockBufferRef CoreMediaGlue::CMSampleBufferGetDataBuffer( 2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMSampleBufferRef sbuf) { 2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return g_coremedia_handle.Get().cm_sample_buffer_get_data_buffer_method()( 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sbuf); 2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static 2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciCoreMediaGlue::CMFormatDescriptionRef 2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciCoreMediaGlue::CMSampleBufferGetFormatDescription( 2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CoreMediaGlue::CMSampleBufferRef sbuf) { 2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return g_coremedia_handle.Get() 2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .cm_sample_buffer_get_format_description_method()(sbuf); 2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static 2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciCVImageBufferRef CoreMediaGlue::CMSampleBufferGetImageBuffer( 2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMSampleBufferRef buffer) { 2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return g_coremedia_handle.Get().cm_sample_buffer_get_image_buffer_method()( 2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer); 2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static 2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciCFArrayRef CoreMediaGlue::CMSampleBufferGetSampleAttachmentsArray( 2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMSampleBufferRef sbuf, 2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Boolean createIfNecessary) { 2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return g_coremedia_handle.Get() 2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .cm_sample_buffer_get_sample_attachments_array_method()( 3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sbuf, createIfNecessary); 3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static 3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciCFStringRef CoreMediaGlue::kCMSampleAttachmentKey_NotSync() { 3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return *g_coremedia_handle.Get().k_cm_sample_attachment_key_not_sync(); 3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static 3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciFourCharCode CoreMediaGlue::CMFormatDescriptionGetMediaSubType( 3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMFormatDescriptionRef desc) { 3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return g_coremedia_handle.Get() 3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .cm_format_description_get_media_sub_type_method()(desc); 3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static 3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciCoreMediaGlue::CMVideoDimensions 3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CoreMediaGlue::CMVideoFormatDescriptionGetDimensions( 3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMVideoFormatDescriptionRef videoDesc) { 3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return g_coremedia_handle.Get() 3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .cm_video_format_description_get_dimensions_method()(videoDesc); 3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static 3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciOSStatus CoreMediaGlue::CMVideoFormatDescriptionGetH264ParameterSetAtIndex( 3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CMFormatDescriptionRef videoDesc, 3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t parameterSetIndex, 3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const uint8_t** parameterSetPointerOut, 3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t* parameterSetSizeOut, 3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t* parameterSetCountOut, 3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int* NALUnitHeaderLengthOut) { 3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return g_coremedia_handle.Get() 3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .cm_video_format_description_get_h264_parameter_set_at_index_method()( 3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci videoDesc, 3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parameterSetIndex, 3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parameterSetPointerOut, 3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parameterSetSizeOut, 3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parameterSetCountOut, 3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NALUnitHeaderLengthOut); 3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 340