From 8cd65c325093e8c951d8b39d403591871519f750 Mon Sep 17 00:00:00 2001 From: Ilya Konstantinov Date: Mon, 27 Apr 2015 15:02:59 +0300 Subject: [PATCH] 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 --- sys/applemedia/coremediabuffer.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/sys/applemedia/coremediabuffer.c b/sys/applemedia/coremediabuffer.c index 1070da5265..87e4cc3491 100644 --- a/sys/applemedia/coremediabuffer.c +++ b/sys/applemedia/coremediabuffer.c @@ -152,18 +152,23 @@ gst_core_media_buffer_wrap_block_buffer (GstBuffer * buf, { OSStatus status; gchar *data = NULL; - UInt32 size; + size_t offset = 0, length_at_offset, total_length; - status = CMBlockBufferGetDataPointer (block_buf, 0, 0, 0, &data); - if (status != noErr) { - return FALSE; - } + /* CMBlockBuffer can contain multiple non-continuous memory blocks */ + do { + 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, - gst_memory_new_wrapped (GST_MEMORY_FLAG_NO_SHARE, data, - size, 0, size, NULL, NULL)); + offset += length_at_offset; + } while (offset < total_length); return TRUE; }