diff options
-rw-r--r-- | ChangeLog | 11 | ||||
m--------- | common | 0 | ||||
-rw-r--r-- | ext/faad/gstfaad.c | 42 | ||||
-rw-r--r-- | gst/qtdemux/qtdemux.c | 1 |
4 files changed, 43 insertions, 11 deletions
@@ -1,3 +1,14 @@ +2006-10-06 Wim Taymans <wim@fluendo.com> + + * ext/faad/gstfaad.c: (gst_faad_setcaps), (gst_faad_chain), + (gst_faad_close_decoder): + Some cleanups. + Added some more debugging. + Don't ever ignore unlinked, we're not a demuxer. + + * gst/qtdemux/qtdemux.c: (gst_qtdemux_add_stream): + Activate pad before adding it to the element. + 2006-10-06 Michael Smith <msmith@fluendo.com> * ext/theora/theoradec.c: (gst_theoradec_reset), diff --git a/common b/common -Subproject a4af1b8542911352e29d53fba47e2c3d7231ebd +Subproject 83b08805d0c109b6dbdcfca0a8b9659b1c55648 diff --git a/ext/faad/gstfaad.c b/ext/faad/gstfaad.c index dda21e95..72530138 100644 --- a/ext/faad/gstfaad.c +++ b/ext/faad/gstfaad.c @@ -291,14 +291,21 @@ gst_faad_setcaps (GstPad * pad, GstCaps * caps) if ((value = gst_structure_get_value (str, "codec_data"))) { guint32 samplerate; guint8 channels; + guint8 *cdata; + guint csize; /* We have codec data, means packetised stream */ faad->packetised = TRUE; - buf = GST_BUFFER (gst_value_get_mini_object (value)); + buf = gst_value_get_buffer (value); + + cdata = GST_BUFFER_DATA (buf); + csize = GST_BUFFER_SIZE (buf); + + if (csize < 2) + goto wrong_length; /* someone forgot that char can be unsigned when writing the API */ - if ((gint8) faacDecInit2 (faad->handle, - GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), &samplerate, + if ((gint8) faacDecInit2 (faad->handle, cdata, csize, &samplerate, &channels) < 0) goto init_failed; @@ -351,6 +358,11 @@ gst_faad_setcaps (GstPad * pad, GstCaps * caps) return TRUE; /* ERRORS */ +wrong_length: + { + GST_DEBUG_OBJECT (faad, "codec_data less than 2 bytes long"); + return FALSE; + } init_failed: { GST_DEBUG_OBJECT (faad, "faacDecInit2() failed"); @@ -1028,7 +1040,6 @@ gst_faad_update_caps (GstFaad * faad, faacDecFrameInfo * info) * subsequent syncpoints (similar to mp3 typefinding in * gst/typefind/) for ADTS because 12 bits isn't very reliable. */ - static gboolean gst_faad_sync (GstBuffer * buf, guint * off) { @@ -1197,6 +1208,7 @@ gst_faad_chain (GstPad * pad, GstBuffer * buffer) input_data = GST_BUFFER_DATA (buffer); input_size = GST_BUFFER_SIZE (buffer); + if (!faad->packetised) { if (!gst_faad_sync (buffer, &sync_off)) { goto next; @@ -1262,10 +1274,15 @@ gst_faad_chain (GstPad * pad, GstBuffer * buffer) out = faacDecDecode (faad->handle, &info, input_data + skip_bytes, input_size - skip_bytes); - if (info.error) { + if (info.error > 0) { guint32 rate; guint8 ch; + GST_DEBUG_OBJECT (faad, "decoding error: %s", + faacDecGetErrorMessage (info.error)); + + goto out; + if (!faad->packetised) goto decode_error; @@ -1303,6 +1320,7 @@ gst_faad_chain (GstPad * pad, GstBuffer * buffer) if (info.bytesconsumed > input_size) info.bytesconsumed = input_size; + input_size -= info.bytesconsumed; input_data += info.bytesconsumed; @@ -1336,6 +1354,8 @@ gst_faad_chain (GstPad * pad, GstBuffer * buffer) guint bufsize = info.samples * faad->bps; guint num_samples = info.samples / faad->channels; + GST_DEBUG_OBJECT (faad, "decoded %d samples", info.samples); + /* note: info.samples is total samples, not per channel */ ret = gst_pad_alloc_buffer_and_set_caps (faad->srcpad, 0, bufsize, @@ -1360,8 +1380,8 @@ gst_faad_chain (GstPad * pad, GstBuffer * buffer) "pushing buffer, off=%" G_GUINT64_FORMAT ", ts=%" GST_TIME_FORMAT, GST_BUFFER_OFFSET (outbuf), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf))); - if ((ret = gst_pad_push (faad->srcpad, outbuf)) != GST_FLOW_OK - && ret != GST_FLOW_NOT_LINKED) + ret = gst_pad_push (faad->srcpad, outbuf); + if (ret != GST_FLOW_OK) goto out; } else gst_buffer_unref (outbuf); @@ -1397,7 +1417,6 @@ init_failed: ret = GST_FLOW_ERROR; goto out; } - init2_failed: { GST_ELEMENT_ERROR (faad, STREAM, DECODE, (NULL), @@ -1405,7 +1424,6 @@ init2_failed: ret = GST_FLOW_ERROR; goto out; } - decode_error: { GST_ELEMENT_ERROR (faad, STREAM, DECODE, (NULL), @@ -1443,8 +1461,10 @@ gst_faad_open_decoder (GstFaad * faad) static void gst_faad_close_decoder (GstFaad * faad) { - faacDecClose (faad->handle); - faad->handle = NULL; + if (faad->handle) { + faacDecClose (faad->handle); + faad->handle = NULL; + } } static GstStateChangeReturn diff --git a/gst/qtdemux/qtdemux.c b/gst/qtdemux/qtdemux.c index 6ec89eb0..9357d6ae 100644 --- a/gst/qtdemux/qtdemux.c +++ b/gst/qtdemux/qtdemux.c @@ -1905,6 +1905,7 @@ gst_qtdemux_add_stream (GstQTDemux * qtdemux, GST_DEBUG_OBJECT (qtdemux, "adding pad %s %p to qtdemux %p", GST_OBJECT_NAME (stream->pad), stream->pad, qtdemux); + gst_pad_set_active (stream->pad, TRUE); gst_element_add_pad (GST_ELEMENT (qtdemux), stream->pad); if (list) { gst_element_found_tags_for_pad (GST_ELEMENT (qtdemux), stream->pad, list); |