summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2014-03-11 14:37:49 +0100
committerSebastian Dröge <sebastian@centricular.com>2014-03-11 15:34:40 +0100
commit37b99b347c7c47045e197f5e5a4dba85326d6cb6 (patch)
tree8393f195c2fa2e7efcd282132f2e3025d8eeb0f0
parente1421c5d768826720a222146a2ffa38702e60e11 (diff)
downloadgstreamer-plugins-bad-37b99b347c7c47045e197f5e5a4dba85326d6cb6.tar.gz
atdec: First dequeue a buffer before enqueueing anything from the queue
Required for offline rendering according to the docs. wtf.
-rw-r--r--sys/applemedia/atdec.c32
1 files changed, 31 insertions, 1 deletions
diff --git a/sys/applemedia/atdec.c b/sys/applemedia/atdec.c
index 5bb2bfecd..242137ee1 100644
--- a/sys/applemedia/atdec.c
+++ b/sys/applemedia/atdec.c
@@ -293,6 +293,8 @@ gst_atdec_set_format (GstAudioDecoder * decoder, GstCaps * caps)
GstAudioInfo output_info = { 0 };
AudioChannelLayout output_layout = { 0 };
GstCaps *output_caps;
+ AudioTimeStamp timestamp = { 0 };
+ AudioQueueBufferRef output_buffer;
GstATDec *atdec = GST_ATDEC (decoder);
GST_DEBUG_OBJECT (atdec, "set_format");
@@ -348,6 +350,21 @@ gst_atdec_set_format (GstAudioDecoder * decoder, GstCaps * caps)
if (status)
goto start_error;
+ timestamp.mFlags = kAudioTimeStampSampleTimeValid;
+ timestamp.mSampleTime = 0;
+
+ status =
+ AudioQueueAllocateBuffer (atdec->queue, atdec->spf * output_info.bpf,
+ &output_buffer);
+ if (status)
+ goto allocate_output_error;
+
+ status = AudioQueueOfflineRender (atdec->queue, &timestamp, output_buffer, 0);
+ if (status)
+ goto offline_render_error;
+
+ AudioQueueFreeBuffer (atdec->queue, output_buffer);
+
return TRUE;
create_queue_error:
@@ -366,6 +383,19 @@ start_error:
("AudioQueueStart returned error: %d", (gint) status));
gst_atdec_destroy_queue (atdec, FALSE);
return FALSE;
+
+allocate_output_error:
+ GST_ELEMENT_ERROR (atdec, STREAM, FORMAT, (NULL),
+ ("AudioQueueAllocateBuffer returned error: %d", (gint) status));
+ gst_atdec_destroy_queue (atdec, FALSE);
+ return FALSE;
+
+offline_render_error:
+ GST_ELEMENT_ERROR (atdec, STREAM, FORMAT, (NULL),
+ ("AudioQueueOfflineRender returned error: %d", (gint) status));
+ AudioQueueFreeBuffer (atdec->queue, output_buffer);
+ gst_atdec_destroy_queue (atdec, FALSE);
+ return FALSE;
}
static void
@@ -421,7 +451,7 @@ gst_atdec_handle_frame (GstAudioDecoder * decoder, GstBuffer * buffer)
goto allocate_output_failed;
/* pull the frames */
- timestamp.kAudioTimeStampSampleTimeValid;
+ timestamp.mFlags = kAudioTimeStampSampleTimeValid;
timestamp.mSampleTime = atdec->output_position;
status =
AudioQueueOfflineRender (atdec->queue, &timestamp, output_buffer,