From 552441c351caf9237f55f3754b4f96e9c29d4c00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 11 Mar 2014 14:22:57 +0100 Subject: atdec: Handle errors in handle_frame() properly --- sys/applemedia/atdec.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file 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, ×tamp, output_buffer, out_frames); + status = + AudioQueueOfflineRender (atdec->queue, ×tamp, 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 -- cgit v1.2.1