diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2014-03-11 14:32:12 +0100 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2014-03-11 15:33:26 +0100 |
commit | f331d3159f0abfe492405d40f8198fc6b0bd2bf4 (patch) | |
tree | c682de329c3be63513205f507c9c1e4814916248 | |
parent | 8d8b3c04015201aaf08e2bcbc33913af81095698 (diff) | |
download | gstreamer-plugins-bad-f331d3159f0abfe492405d40f8198fc6b0bd2bf4.tar.gz |
atdec: Keep track of the current position
It's required to set a valid sample time for decoding on iOS.
-rw-r--r-- | sys/applemedia/atdec.c | 22 | ||||
-rw-r--r-- | sys/applemedia/atdec.h | 1 |
2 files changed, 23 insertions, 0 deletions
diff --git a/sys/applemedia/atdec.c b/sys/applemedia/atdec.c index f4d1f3ddc..5bb2bfecd 100644 --- a/sys/applemedia/atdec.c +++ b/sys/applemedia/atdec.c @@ -158,6 +158,7 @@ gst_atdec_destroy_queue (GstATDec * atdec, gboolean drain) AudioQueueStop (atdec->queue, drain); AudioQueueDispose (atdec->queue, true); atdec->queue = NULL; + atdec->output_position = 0; } void @@ -179,6 +180,7 @@ gst_atdec_start (GstAudioDecoder * decoder) GstATDec *atdec = GST_ATDEC (decoder); GST_DEBUG_OBJECT (atdec, "start"); + atdec->output_position = 0; return TRUE; } @@ -419,6 +421,8 @@ gst_atdec_handle_frame (GstAudioDecoder * decoder, GstBuffer * buffer) goto allocate_output_failed; /* pull the frames */ + timestamp.kAudioTimeStampSampleTimeValid; + timestamp.mSampleTime = atdec->output_position; status = AudioQueueOfflineRender (atdec->queue, ×tamp, output_buffer, out_frames); @@ -426,6 +430,12 @@ gst_atdec_handle_frame (GstAudioDecoder * decoder, GstBuffer * buffer) goto offline_render_failed; if (output_buffer->mAudioDataByteSize) { + if (output_buffer->mAudioDataByteSize % audio_info->bpf != 0) + goto invalid_buffer_size; + + atdec->output_position += + output_buffer->mAudioDataByteSize / audio_info->bpf; + out = gst_audio_decoder_allocate_output_buffer (decoder, output_buffer->mAudioDataByteSize); @@ -474,6 +484,17 @@ offline_render_failed: return flow_ret; } + +invalid_buffer_size: + { + GST_AUDIO_DECODER_ERROR (atdec, 1, STREAM, DECODE, (NULL), + ("AudioQueueOfflineRender returned invalid buffer size: %u (bpf %d)", + output_buffer->mAudioDataByteSize, audio_info->bpf), flow_ret); + + AudioQueueFreeBuffer (atdec->queue, output_buffer); + + return flow_ret; + } } static void @@ -482,4 +503,5 @@ gst_atdec_flush (GstAudioDecoder * decoder, gboolean hard) GstATDec *atdec = GST_ATDEC (decoder); AudioQueueReset (atdec->queue); + atdec->output_position = 0; } diff --git a/sys/applemedia/atdec.h b/sys/applemedia/atdec.h index 99945549d..ef8829419 100644 --- a/sys/applemedia/atdec.h +++ b/sys/applemedia/atdec.h @@ -39,6 +39,7 @@ struct _GstATDec GstAudioDecoder decoder; AudioQueueRef queue; gint spf; + guint64 output_position; }; struct _GstATDecClass |