summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2014-03-11 14:32:12 +0100
committerSebastian Dröge <sebastian@centricular.com>2014-03-11 15:34:35 +0100
commite1421c5d768826720a222146a2ffa38702e60e11 (patch)
tree0e31e3debb074b263eefc10322e42ed2010948c0
parentab4d49b6db06c3c03ef1e728b958014f1ef106d5 (diff)
downloadgstreamer-plugins-bad-e1421c5d768826720a222146a2ffa38702e60e11.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.c22
-rw-r--r--sys/applemedia/atdec.h1
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, &timestamp, 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