Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(857)

Unified Diff: media/base/mac/coremedia_glue.mm

Issue 531863002: Extend media glue code to support the VideoToolbox cast video encoder. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@base-glue
Patch Set: Rework the VideoToolbox glue to allow lower-overhead calls to functions and support load failure. Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/base/mac/coremedia_glue.mm
diff --git a/media/base/mac/coremedia_glue.mm b/media/base/mac/coremedia_glue.mm
index 6716e756d2adde9faa1ac019d821d94ac9ec2a4f..61e9199f05b65f03b0f5e0f6f9beb86b116df0d4 100644
--- a/media/base/mac/coremedia_glue.mm
+++ b/media/base/mac/coremedia_glue.mm
@@ -18,13 +18,52 @@ namespace {
class CoreMediaLibraryInternal {
public:
typedef CoreMediaGlue::CMTime (*CMTimeMakeMethod)(int64_t, int32_t);
+
+ typedef OSStatus (*CMBlockBufferCreateContiguousMethod)(
+ CFAllocatorRef,
+ CoreMediaGlue::CMBlockBufferRef,
+ CFAllocatorRef,
+ const CoreMediaGlue::CMBlockBufferCustomBlockSource*,
+ size_t,
+ size_t,
+ CoreMediaGlue::CMBlockBufferFlags,
+ CoreMediaGlue::CMBlockBufferRef*);
+ typedef size_t (*CMBlockBufferGetDataLengthMethod)(
+ CoreMediaGlue::CMBlockBufferRef);
+ typedef OSStatus (*CMBlockBufferGetDataPointerMethod)(
+ CoreMediaGlue::CMBlockBufferRef,
+ size_t,
+ size_t*,
+ size_t*,
+ char**);
+ typedef Boolean (*CMBlockBufferIsRangeContiguousMethod)(
+ CoreMediaGlue::CMBlockBufferRef,
+ size_t,
+ size_t);
+
+ typedef CoreMediaGlue::CMBlockBufferRef (*CMSampleBufferGetDataBufferMethod)(
+ CoreMediaGlue::CMSampleBufferRef);
+ typedef CoreMediaGlue::CMFormatDescriptionRef (
+ *CMSampleBufferGetFormatDescriptionMethod)(
+ CoreMediaGlue::CMSampleBufferRef);
typedef CVImageBufferRef (*CMSampleBufferGetImageBufferMethod)(
CoreMediaGlue::CMSampleBufferRef);
+ typedef CFArrayRef (*CMSampleBufferGetSampleAttachmentsArrayMethod)(
+ CoreMediaGlue::CMSampleBufferRef,
+ Boolean);
+
typedef FourCharCode (*CMFormatDescriptionGetMediaSubTypeMethod)(
CoreMediaGlue::CMFormatDescriptionRef desc);
typedef CoreMediaGlue::CMVideoDimensions
(*CMVideoFormatDescriptionGetDimensionsMethod)(
CoreMediaGlue::CMVideoFormatDescriptionRef videoDesc);
+ typedef OSStatus (*CMVideoFormatDescriptionGetH264ParameterSetAtIndexMethod)(
+ CoreMediaGlue::CMFormatDescriptionRef,
+ size_t,
+ const uint8_t**,
+ size_t*,
+ size_t*,
+ int*);
CoreMediaLibraryInternal() {
NSBundle* bundle = [NSBundle
@@ -40,27 +79,99 @@ class CoreMediaLibraryInternal {
dlsym(library_handle, "CMTimeMake"));
CHECK(cm_time_make_) << dlerror();
+ cm_block_buffer_create_contiguous_method_ =
+ reinterpret_cast<CMBlockBufferCreateContiguousMethod>(
+ dlsym(library_handle, "CMBlockBufferCreateContiguous"));
+ CHECK(cm_block_buffer_create_contiguous_method_) << dlerror();
+ cm_block_buffer_get_data_length_method_ =
+ reinterpret_cast<CMBlockBufferGetDataLengthMethod>(
+ dlsym(library_handle, "CMBlockBufferGetDataLength"));
+ CHECK(cm_block_buffer_get_data_length_method_) << dlerror();
+ cm_block_buffer_get_data_pointer_method_ =
+ reinterpret_cast<CMBlockBufferGetDataPointerMethod>(
+ dlsym(library_handle, "CMBlockBufferGetDataPointer"));
+ CHECK(cm_block_buffer_get_data_pointer_method_) << dlerror();
+ cm_block_buffer_is_range_contiguous_method_ =
+ reinterpret_cast<CMBlockBufferIsRangeContiguousMethod>(
+ dlsym(library_handle, "CMBlockBufferIsRangeContiguous"));
+ CHECK(cm_block_buffer_is_range_contiguous_method_) << dlerror();
+
+ cm_sample_buffer_get_data_buffer_method_ =
+ reinterpret_cast<CMSampleBufferGetDataBufferMethod>(
+ dlsym(library_handle, "CMSampleBufferGetDataBuffer"));
+ CHECK(cm_sample_buffer_get_data_buffer_method_) << dlerror();
+ cm_sample_buffer_get_format_description_method_ =
+ reinterpret_cast<CMSampleBufferGetFormatDescriptionMethod>(
+ dlsym(library_handle, "CMSampleBufferGetFormatDescription"));
+ CHECK(cm_sample_buffer_get_format_description_method_) << dlerror();
cm_sample_buffer_get_image_buffer_method_ =
reinterpret_cast<CMSampleBufferGetImageBufferMethod>(
dlsym(library_handle, "CMSampleBufferGetImageBuffer"));
CHECK(cm_sample_buffer_get_image_buffer_method_) << dlerror();
+ cm_sample_buffer_get_sample_attachments_array_method_ =
+ reinterpret_cast<CMSampleBufferGetSampleAttachmentsArrayMethod>(
+ dlsym(library_handle, "CMSampleBufferGetSampleAttachmentsArray"));
+ CHECK(cm_sample_buffer_get_sample_attachments_array_method_) << dlerror();
+ k_cm_sample_attachment_key_not_sync_ = reinterpret_cast<CFStringRef*>(
+ dlsym(library_handle, "kCMSampleAttachmentKey_NotSync"));
+ CHECK(k_cm_sample_attachment_key_not_sync_) << dlerror();
cm_format_description_get_media_sub_type_method_ =
reinterpret_cast<CMFormatDescriptionGetMediaSubTypeMethod>(
dlsym(library_handle, "CMFormatDescriptionGetMediaSubType"));
CHECK(cm_format_description_get_media_sub_type_method_) << dlerror();
-
cm_video_format_description_get_dimensions_method_ =
reinterpret_cast<CMVideoFormatDescriptionGetDimensionsMethod>(
dlsym(library_handle, "CMVideoFormatDescriptionGetDimensions"));
CHECK(cm_video_format_description_get_dimensions_method_) << dlerror();
+
+ // Available starting (OS X 10.9, iOS 7), allow to be null.
+ cm_video_format_description_get_h264_parameter_set_at_index_method_ =
+ reinterpret_cast<
+ CMVideoFormatDescriptionGetH264ParameterSetAtIndexMethod>(
+ dlsym(library_handle,
+ "CMVideoFormatDescriptionGetH264ParameterSetAtIndex"));
}
const CMTimeMakeMethod& cm_time_make() const { return cm_time_make_; }
+
+ const CMBlockBufferCreateContiguousMethod&
+ cm_block_buffer_create_contiguous_method() const {
+ return cm_block_buffer_create_contiguous_method_;
+ }
+ const CMBlockBufferGetDataLengthMethod&
+ cm_block_buffer_get_data_length_method() const {
+ return cm_block_buffer_get_data_length_method_;
+ }
+ const CMBlockBufferGetDataPointerMethod&
+ cm_block_buffer_get_data_pointer_method() const {
+ return cm_block_buffer_get_data_pointer_method_;
+ }
+ const CMBlockBufferIsRangeContiguousMethod&
+ cm_block_buffer_is_range_contiguous_method() const {
+ return cm_block_buffer_is_range_contiguous_method_;
+ }
+
+ const CMSampleBufferGetDataBufferMethod&
+ cm_sample_buffer_get_data_buffer_method() const {
+ return cm_sample_buffer_get_data_buffer_method_;
+ }
+ const CMSampleBufferGetFormatDescriptionMethod&
+ cm_sample_buffer_get_format_description_method() const {
+ return cm_sample_buffer_get_format_description_method_;
+ }
const CMSampleBufferGetImageBufferMethod&
cm_sample_buffer_get_image_buffer_method() const {
return cm_sample_buffer_get_image_buffer_method_;
}
+ const CMSampleBufferGetSampleAttachmentsArrayMethod&
+ cm_sample_buffer_get_sample_attachments_array_method() const {
+ return cm_sample_buffer_get_sample_attachments_array_method_;
+ }
+ CFStringRef* const& k_cm_sample_attachment_key_not_sync() const {
+ return k_cm_sample_attachment_key_not_sync_;
+ }
+
const CMFormatDescriptionGetMediaSubTypeMethod&
cm_format_description_get_media_sub_type_method() const {
return cm_format_description_get_media_sub_type_method_;
@@ -69,14 +180,34 @@ class CoreMediaLibraryInternal {
cm_video_format_description_get_dimensions_method() const {
return cm_video_format_description_get_dimensions_method_;
}
+ const CMVideoFormatDescriptionGetH264ParameterSetAtIndexMethod&
+ cm_video_format_description_get_h264_parameter_set_at_index_method() const {
+ return cm_video_format_description_get_h264_parameter_set_at_index_method_;
+ }
private:
CMTimeMakeMethod cm_time_make_;
+
+ CMBlockBufferCreateContiguousMethod cm_block_buffer_create_contiguous_method_;
+ CMBlockBufferGetDataLengthMethod cm_block_buffer_get_data_length_method_;
+ CMBlockBufferGetDataPointerMethod cm_block_buffer_get_data_pointer_method_;
+ CMBlockBufferIsRangeContiguousMethod
+ cm_block_buffer_is_range_contiguous_method_;
+
+ CMSampleBufferGetDataBufferMethod cm_sample_buffer_get_data_buffer_method_;
+ CMSampleBufferGetFormatDescriptionMethod
+ cm_sample_buffer_get_format_description_method_;
CMSampleBufferGetImageBufferMethod cm_sample_buffer_get_image_buffer_method_;
+ CMSampleBufferGetSampleAttachmentsArrayMethod
+ cm_sample_buffer_get_sample_attachments_array_method_;
+ CFStringRef* k_cm_sample_attachment_key_not_sync_;
+
CMFormatDescriptionGetMediaSubTypeMethod
cm_format_description_get_media_sub_type_method_;
CMVideoFormatDescriptionGetDimensionsMethod
cm_video_format_description_get_dimensions_method_;
+ CMVideoFormatDescriptionGetH264ParameterSetAtIndexMethod
+ cm_video_format_description_get_h264_parameter_set_at_index_method_;
DISALLOW_COPY_AND_ASSIGN(CoreMediaLibraryInternal);
};
@@ -93,6 +224,67 @@ CoreMediaGlue::CMTime CoreMediaGlue::CMTimeMake(int64_t value,
}
// static
+OSStatus CoreMediaGlue::CMBlockBufferCreateContiguous(
+ CFAllocatorRef structureAllocator,
+ CMBlockBufferRef sourceBuffer,
+ CFAllocatorRef blockAllocator,
+ const CMBlockBufferCustomBlockSource* customBlockSource,
+ size_t offsetToData,
+ size_t dataLength,
+ CMBlockBufferFlags flags,
+ CMBlockBufferRef* newBBufOut) {
+ return g_coremedia_handle.Get().cm_block_buffer_create_contiguous_method()(
+ structureAllocator,
+ sourceBuffer,
+ blockAllocator,
+ customBlockSource,
+ offsetToData,
+ dataLength,
+ flags,
+ newBBufOut);
+}
+
+// static
+size_t CoreMediaGlue::CMBlockBufferGetDataLength(CMBlockBufferRef theBuffer) {
+ return g_coremedia_handle.Get().cm_block_buffer_get_data_length_method()(
+ theBuffer);
+}
+
+// static
+OSStatus CoreMediaGlue::CMBlockBufferGetDataPointer(CMBlockBufferRef theBuffer,
+ size_t offset,
+ size_t* lengthAtOffset,
+ size_t* totalLength,
+ char** dataPointer) {
+ return g_coremedia_handle.Get().cm_block_buffer_get_data_pointer_method()(
+ theBuffer, offset, lengthAtOffset, totalLength, dataPointer);
+}
+
+// static
+Boolean CoreMediaGlue::CMBlockBufferIsRangeContiguous(
+ CMBlockBufferRef theBuffer,
+ size_t offset,
+ size_t length) {
+ return g_coremedia_handle.Get().cm_block_buffer_is_range_contiguous_method()(
+ theBuffer, offset, length);
+}
+
+// static
+CoreMediaGlue::CMBlockBufferRef CoreMediaGlue::CMSampleBufferGetDataBuffer(
+ CMSampleBufferRef sbuf) {
+ return g_coremedia_handle.Get().cm_sample_buffer_get_data_buffer_method()(
+ sbuf);
+}
+
+// static
+CoreMediaGlue::CMFormatDescriptionRef
+CoreMediaGlue::CMSampleBufferGetFormatDescription(
+ CoreMediaGlue::CMSampleBufferRef sbuf) {
+ return g_coremedia_handle.Get()
+ .cm_sample_buffer_get_format_description_method()(sbuf);
+}
+
+// static
CVImageBufferRef CoreMediaGlue::CMSampleBufferGetImageBuffer(
CMSampleBufferRef buffer) {
return g_coremedia_handle.Get().cm_sample_buffer_get_image_buffer_method()(
@@ -100,6 +292,20 @@ CVImageBufferRef CoreMediaGlue::CMSampleBufferGetImageBuffer(
}
// static
+CFArrayRef CoreMediaGlue::CMSampleBufferGetSampleAttachmentsArray(
+ CMSampleBufferRef sbuf,
+ Boolean createIfNecessary) {
+ return g_coremedia_handle.Get()
+ .cm_sample_buffer_get_sample_attachments_array_method()(
+ sbuf, createIfNecessary);
+}
+
+// static
+CFStringRef CoreMediaGlue::kCMSampleAttachmentKey_NotSync() {
+ return *g_coremedia_handle.Get().k_cm_sample_attachment_key_not_sync();
+}
+
+// static
FourCharCode CoreMediaGlue::CMFormatDescriptionGetMediaSubType(
CMFormatDescriptionRef desc) {
return g_coremedia_handle.Get()
@@ -113,3 +319,21 @@ CoreMediaGlue::CMVideoDimensions
return g_coremedia_handle.Get()
.cm_video_format_description_get_dimensions_method()(videoDesc);
}
+
+// static
+OSStatus CoreMediaGlue::CMVideoFormatDescriptionGetH264ParameterSetAtIndex(
+ CMFormatDescriptionRef videoDesc,
+ size_t parameterSetIndex,
+ const uint8_t** parameterSetPointerOut,
+ size_t* parameterSetSizeOut,
+ size_t* parameterSetCountOut,
+ int* NALUnitHeaderLengthOut) {
+ return g_coremedia_handle.Get()
+ .cm_video_format_description_get_h264_parameter_set_at_index_method()(
+ videoDesc,
+ parameterSetIndex,
+ parameterSetPointerOut,
+ parameterSetSizeOut,
+ parameterSetCountOut,
+ NALUnitHeaderLengthOut);
+}

Powered by Google App Engine
This is Rietveld 408576698