summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2012-10-09 10:27:36 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2012-10-15 16:28:43 +0200
commitb0b642d8ab3bcd772904f0631f4fefc867f99535 (patch)
tree04e00dd59df8c31dd6398958caa3e4bba6615e44 /sys
parent2f3b2c586f535680bbc5b12c19d77280d3705bf8 (diff)
Add workaround for Google MP3 decoder outputting garbage in first output buffer
And assume one decoded input frame per output buffer to fix timestamp handling by the base class.
Diffstat (limited to 'sys')
-rw-r--r--sys/androidmedia/gstamcaudiodec.c20
-rw-r--r--sys/androidmedia/gstamcaudiodec.h3
2 files changed, 22 insertions, 1 deletions
diff --git a/sys/androidmedia/gstamcaudiodec.c b/sys/androidmedia/gstamcaudiodec.c
index 616365d61..2725e0ff2 100644
--- a/sys/androidmedia/gstamcaudiodec.c
+++ b/sys/androidmedia/gstamcaudiodec.c
@@ -586,8 +586,10 @@ retry:
buffer_info.flags);
is_eos = ! !(buffer_info.flags & BUFFER_FLAG_END_OF_STREAM);
+ self->n_buffers++;
if (buffer_info.size > 0) {
+ GstAmcAudioDecClass *klass = GST_AMC_AUDIO_DEC_GET_CLASS (self);
GstBuffer *outbuf;
GstAmcBuffer *buf;
@@ -598,6 +600,16 @@ retry:
if (idx >= self->n_output_buffers)
goto invalid_buffer_index;
+ if (strcmp (klass->codec_info->name, "OMX.google.mp3.decoder") == 0) {
+ /* Google's MP3 decoder outputs garbage in the first output buffer
+ * so we just drop it here */
+ if (self->n_buffers == 1) {
+ GST_DEBUG_OBJECT (self,
+ "Skipping first buffer of Google MP3 decoder output");
+ goto done;
+ }
+ }
+
outbuf = gst_buffer_try_new_and_alloc (buffer_info.size);
if (!outbuf)
goto failed_allocate;
@@ -606,10 +618,15 @@ retry:
orc_memcpy (GST_BUFFER_DATA (outbuf), buf->data + buffer_info.offset,
buffer_info.size);
+ /* FIXME: We should get one decoded input frame here for
+ * every buffer. If this is not the case somewhere, we will
+ * error out at some point and will need to add workarounds
+ */
flow_ret =
- gst_audio_decoder_finish_frame (GST_AUDIO_DECODER (self), outbuf, -1);
+ gst_audio_decoder_finish_frame (GST_AUDIO_DECODER (self), outbuf, 1);
}
+done:
if (!gst_amc_codec_release_output_buffer (self->codec, idx))
goto failed_release;
@@ -894,6 +911,7 @@ gst_amc_audio_dec_set_format (GstAudioDecoder * decoder, GstCaps * caps)
GST_DEBUG_OBJECT (self, "Configuring codec with format: %s", format_string);
g_free (format_string);
+ self->n_buffers = 0;
if (!gst_amc_codec_configure (self->codec, format, 0)) {
GST_ERROR_OBJECT (self, "Failed to configure codec");
return FALSE;
diff --git a/sys/androidmedia/gstamcaudiodec.h b/sys/androidmedia/gstamcaudiodec.h
index b8436e312..5941a0114 100644
--- a/sys/androidmedia/gstamcaudiodec.h
+++ b/sys/androidmedia/gstamcaudiodec.h
@@ -80,6 +80,9 @@ struct _GstAmcAudioDec
gboolean eos;
GstFlowReturn downstream_flow_ret;
+
+ /* Output buffers counter */
+ gint n_buffers;
};
struct _GstAmcAudioDecClass