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