diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | gst/qtdemux/qtdemux.c | 27 |
2 files changed, 25 insertions, 7 deletions
@@ -1,3 +1,8 @@ +2006-01-18 Edgard Lima <edgard.lima@indt.org.br> + + * gst/qtdemux/qtdemux.c: qtdemux_parse_trak: + Ronald's patch applied. see bug #326318. + 2006-01-17 Tim-Philipp Müller <tim at centricular dot net> * gst/qtdemux/qtdemux.c: (gst_qtdemux_init), diff --git a/gst/qtdemux/qtdemux.c b/gst/qtdemux/qtdemux.c index b1a507e6..ee0383cb 100644 --- a/gst/qtdemux/qtdemux.c +++ b/gst/qtdemux/qtdemux.c @@ -2000,20 +2000,33 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak) } else { if (QTDEMUX_FOURCC_GET (stsd->data + 16 + 4) == GST_MAKE_FOURCC ('a', 'v', 'c', '1')) { - gint len = QTDEMUX_GUINT32_GET (stsd->data); + gint len = QTDEMUX_GUINT32_GET (stsd->data) - 0x66; + guint8 *stsddata = stsd->data + 0x66; + - if (len > 0x6E && - QTDEMUX_FOURCC_GET (stsd->data + 0x6A) == + /* find avcC */ + while (len >= 0x8 && + QTDEMUX_FOURCC_GET (stsddata + 0x4) != + GST_MAKE_FOURCC ('a', 'v', 'c', 'C') && + QTDEMUX_GUINT32_GET (stsddata) < len) { + len -= QTDEMUX_GUINT32_GET (stsddata); + stsddata += QTDEMUX_GUINT32_GET (stsddata); + } + + /* parse, if found */ + if (len > 0x8 && + QTDEMUX_FOURCC_GET (stsddata + 0x4) == GST_MAKE_FOURCC ('a', 'v', 'c', 'C')) { GstBuffer *buf; gint size; - if (QTDEMUX_GUINT32_GET (stsd->data + 0x66) < len - 0x66) - size = QTDEMUX_GUINT32_GET (stsd->data + 0x66) - 8; + if (QTDEMUX_GUINT32_GET (stsddata) < len) + size = QTDEMUX_GUINT32_GET (stsddata) - 0x8; else - size = len - 0x6E; + size = len - 0x8; + buf = gst_buffer_new_and_alloc (size); - memcpy (GST_BUFFER_DATA (buf), (guint8 *) stsd->data + 0x6E, size); + memcpy (GST_BUFFER_DATA (buf), (guint8 *) stsd->data + 0x8, size); gst_caps_set_simple (stream->caps, "codec_data", GST_TYPE_BUFFER, buf, NULL); gst_buffer_unref (buf); |