From: <tp...@ke...> - 2006-05-19 15:01:06
|
CVS Root: /cvs/gstreamer Module: gst-plugins-base Changes by: tpm Date: Fri May 19 2006 15:00:55 UTC Log message: * gst-libs/gst/riff/riff-read.c: (gst_riff_read_chunk): On second thought, just skip JUNK chunks automatically, so the caller doesn't have to handle this. Fixes #342345. Also, return GST_FLOW_UNEXPECTED if we get a short read, not GST_FLOW_ERROR. Modified files: . : ChangeLog gst-libs/gst/riff: riff-read.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/ChangeLog.diff?r1=1.2654&r2=1.2655 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-base/gst-libs/gst/riff/riff-read.c.diff?r1=1.43&r2=1.44 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-base/ChangeLog,v retrieving revision 1.2654 retrieving revision 1.2655 diff -u -d -r1.2654 -r1.2655 --- ChangeLog 19 May 2006 13:37:55 -0000 1.2654 +++ ChangeLog 19 May 2006 15:00:43 -0000 1.2655 @@ -1,6 +1,14 @@ 2006-05-19 Tim-Philipp Müller <tim at centricular dot net> * gst-libs/gst/riff/riff-read.c: (gst_riff_read_chunk): + On second thought, just skip JUNK chunks automatically, so + the caller doesn't have to handle this. Fixes #342345. + Also, return GST_FLOW_UNEXPECTED if we get a short read, + not GST_FLOW_ERROR. + +2006-05-19 Tim-Philipp Müller <tim at centricular dot net> + * gst-libs/gst/riff/riff-read.c: (gst_riff_read_chunk): Don't bail out on JUNK chunks with a size of 0 (would try to pull_range 0 bytes before, which sources don't like too much). See #342345. Index: riff-read.c RCS file: /cvs/gstreamer/gst-plugins-base/gst-libs/gst/riff/riff-read.c,v retrieving revision 1.43 retrieving revision 1.44 diff -u -d -r1.43 -r1.44 --- riff-read.c 19 May 2006 13:37:55 -0000 1.43 +++ riff-read.c 19 May 2006 15:00:43 -0000 1.44 @@ -39,7 +39,8 @@ * @tag: fourcc of the chunk (returned by this function). * @chunk_data: buffer (returned by this function). * - * Reads a single chunk of data. + * Reads a single chunk of data. Since 0.10.8 'JUNK' chunks + * are skipped automatically. * Returns: flow status. */ @@ -54,6 +55,8 @@ guint64 offset = *_offset; gchar dbg[5] = { 0, }; +skip_junk: if ((res = gst_pad_pull_range (pad, offset, 8, &buf)) != GST_FLOW_OK) return res; else if (!buf || GST_BUFFER_SIZE (buf) < 8) { @@ -69,18 +72,22 @@ memcpy (dbg, tag, 4); GST_DEBUG_OBJECT (element, "tag=%s, size=%u", dbg, size); - if (*tag == GST_RIFF_TAG_JUNK && size == 0) { - buf = gst_buffer_new (); - } else { - if ((res = gst_pad_pull_range (pad, offset + 8, size, &buf)) != GST_FLOW_OK) - return res; - if (!buf || GST_BUFFER_SIZE (buf) < size) { - GST_DEBUG_OBJECT (element, "not enough data (available=%u, needed=%u)", - (buf) ? GST_BUFFER_SIZE (buf) : 0, size); - if (buf) - gst_buffer_unref (buf); - return GST_FLOW_ERROR; - } + /* skip 'JUNK' chunks */ + if (*tag == GST_RIFF_TAG_JUNK) { + *_offset += 8 + GST_ROUND_UP_2 (size); + offset += 8 + GST_ROUND_UP_2 (size); + GST_DEBUG_OBJECT (element, "skipping JUNK chunk"); + goto skip_junk; + } + if ((res = gst_pad_pull_range (pad, offset + 8, size, &buf)) != GST_FLOW_OK) + return res; + else if (!buf || GST_BUFFER_SIZE (buf) < size) { + GST_DEBUG_OBJECT (element, "not enough data (available=%u, needed=%u)", + (buf) ? GST_BUFFER_SIZE (buf) : 0, size); + if (buf) + gst_buffer_unref (buf); + return GST_FLOW_UNEXPECTED; } *_chunk_data = buf; @@ -101,7 +108,7 @@ * Reads a single chunk. - * Returns: the fourcc tag of this chunk, or 0 on error. + * Returns: the fourcc tag of this chunk, or FALSE on error gboolean |