applemedia: CMBlockBuffer can be non-contiguous

CMBlockBufferGetDataLength would return the entire data length, while
size of individual blocks can be smaller. Iterate over the block buffer
and add the individual (possibly non-contiguous) memory blocks.

https://bugzilla.gnome.org/show_bug.cgi?id=751071
This commit is contained in:
Ilya Konstantinov 2015-04-27 15:02:59 +03:00 committed by Sebastian Dröge
parent dbf12ab760
commit 8cd65c3250

View File

@ -152,18 +152,23 @@ gst_core_media_buffer_wrap_block_buffer (GstBuffer * buf,
{ {
OSStatus status; OSStatus status;
gchar *data = NULL; gchar *data = NULL;
UInt32 size; size_t offset = 0, length_at_offset, total_length;
status = CMBlockBufferGetDataPointer (block_buf, 0, 0, 0, &data); /* CMBlockBuffer can contain multiple non-continuous memory blocks */
if (status != noErr) { do {
return FALSE; status =
} CMBlockBufferGetDataPointer (block_buf, offset, &length_at_offset,
&total_length, &data);
if (status != kCMBlockBufferNoErr) {
return FALSE;
}
size = CMBlockBufferGetDataLength (block_buf); gst_buffer_append_memory (buf,
gst_memory_new_wrapped (GST_MEMORY_FLAG_NO_SHARE, data,
length_at_offset, 0, length_at_offset, NULL, NULL));
gst_buffer_append_memory (buf, offset += length_at_offset;
gst_memory_new_wrapped (GST_MEMORY_FLAG_NO_SHARE, data, } while (offset < total_length);
size, 0, size, NULL, NULL));
return TRUE; return TRUE;
} }