diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2014-03-11 14:37:49 +0100 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2014-03-11 15:34:40 +0100 |
commit | 37b99b347c7c47045e197f5e5a4dba85326d6cb6 (patch) | |
tree | 8393f195c2fa2e7efcd282132f2e3025d8eeb0f0 | |
parent | e1421c5d768826720a222146a2ffa38702e60e11 (diff) | |
download | gstreamer-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.c | 32 |
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, ×tamp, 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, ×tamp, output_buffer, |