atdec: First dequeue a buffer before enqueueing anything from the queue
authorSebastian Dröge <sebastian@centricular.com>
Tue, 11 Mar 2014 13:37:49 +0000 (14:37 +0100)
committerSebastian Dröge <sebastian@centricular.com>
Tue, 11 Mar 2014 14:34:40 +0000 (15:34 +0100)
Required for offline rendering according to the docs. wtf.

sys/applemedia/atdec.c

index 5bb2bfecde0b8b7b11ec8324c2d8e7d9b25d72bd..242137ee1a70f3d63c682c29b4931383d24e699a 100644 (file)
@@ -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,