summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2014-03-11 14:22:57 +0100
committerSebastian Dröge <sebastian@centricular.com>2014-03-11 15:34:24 +0100
commit552441c351caf9237f55f3754b4f96e9c29d4c00 (patch)
tree1af806c9ff4687ed0815d6cb93830674ba1b7046
parent8815c6baf68f5bf4a26dcfebfed5869d9467e77e (diff)
downloadgstreamer-plugins-bad-552441c351caf9237f55f3754b4f96e9c29d4c00.tar.gz
atdec: Handle errors in handle_frame() properly
-rw-r--r--sys/applemedia/atdec.c51
1 files changed, 48 insertions, 3 deletions
diff --git a/sys/applemedia/atdec.c b/sys/applemedia/atdec.c
index 35fad7810..fae15c9e3 100644
--- a/sys/applemedia/atdec.c
+++ b/sys/applemedia/atdec.c
@@ -374,6 +374,7 @@ gst_atdec_buffer_emptied (void *user_data, AudioQueueRef queue,
static GstFlowReturn
gst_atdec_handle_frame (GstAudioDecoder * decoder, GstBuffer * buffer)
{
+ OSStatus status;
AudioTimeStamp timestamp = { 0 };
AudioStreamPacketDescription packet;
AudioQueueBufferRef input_buffer, output_buffer;
@@ -391,7 +392,9 @@ gst_atdec_handle_frame (GstAudioDecoder * decoder, GstBuffer * buffer)
/* copy the input buffer into an AudioQueueBuffer */
size = gst_buffer_get_size (buffer);
- AudioQueueAllocateBuffer (atdec->queue, size, &input_buffer);
+ status = AudioQueueAllocateBuffer (atdec->queue, size, &input_buffer);
+ if (status)
+ goto allocate_input_failed;
gst_buffer_extract (buffer, 0, input_buffer->mAudioData, size);
input_buffer->mAudioDataByteSize = size;
@@ -403,16 +406,25 @@ gst_atdec_handle_frame (GstAudioDecoder * decoder, GstBuffer * buffer)
/* enqueue the buffer. It will get free'd once the gst_atdec_buffer_emptied
* callback is called
*/
- AudioQueueEnqueueBuffer (atdec->queue, input_buffer, 1, &packet);
+ status = AudioQueueEnqueueBuffer (atdec->queue, input_buffer, 1, &packet);
+ if (status)
+ goto enqueue_buffer_failed;
/* figure out how many frames we need to pull out of the queue */
out_frames = GST_CLOCK_TIME_TO_FRAMES (GST_BUFFER_DURATION (buffer),
audio_info->rate);
size = out_frames * audio_info->bpf;
AudioQueueAllocateBuffer (atdec->queue, size, &output_buffer);
+ if (status)
+ goto allocate_output_failed;
/* pull the frames */
- AudioQueueOfflineRender (atdec->queue, &timestamp, output_buffer, out_frames);
+ status =
+ AudioQueueOfflineRender (atdec->queue, &timestamp, output_buffer,
+ out_frames);
+ if (status)
+ goto offline_render_failed;
+
if (output_buffer->mAudioDataByteSize) {
out =
gst_audio_decoder_allocate_output_buffer (decoder,
@@ -429,6 +441,39 @@ gst_atdec_handle_frame (GstAudioDecoder * decoder, GstBuffer * buffer)
AudioQueueFreeBuffer (atdec->queue, output_buffer);
return flow_ret;
+
+allocate_input_failed:
+ {
+ GST_ELEMENT_ERROR (atdec, STREAM, DECODE, (NULL),
+ ("AudioQueueAllocateBuffer returned error: %d", (gint) status));
+ return GST_FLOW_ERROR;
+ }
+
+enqueue_buffer_failed:
+ {
+ GST_AUDIO_DECODER_ERROR (atdec, 1, STREAM, DECODE, (NULL),
+ ("AudioQueueEnqueueBuffer returned error: %d", (gint) status),
+ flow_ret);
+ return flow_ret;
+ }
+
+allocate_output_failed:
+ {
+ GST_ELEMENT_ERROR (atdec, STREAM, DECODE, (NULL),
+ ("AudioQueueAllocateBuffer returned error: %d", (gint) status));
+ return GST_FLOW_ERROR;
+ }
+
+offline_render_failed:
+ {
+ AudioQueueFreeBuffer (atdec->queue, output_buffer);
+
+ GST_AUDIO_DECODER_ERROR (atdec, 1, STREAM, DECODE, (NULL),
+ ("AudioQueueOfflineRender returned error: %d", (gint) status),
+ flow_ret);
+
+ return flow_ret;
+ }
}
static void