summaryrefslogtreecommitdiffstats
path: root/gst/id3demux
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim@centricular.net>2006-12-12 18:45:58 +0000
committerTim-Philipp Müller <tim@centricular.net>2006-12-12 18:45:58 +0000
commit173ee367e4c68c0d37af9dce9d1fb1e77b8e5ebf (patch)
treefce708c87ef0cc9eea72fe302f370ba4723ddcb1 /gst/id3demux
parentb61aef839f6256889b54144cff790fdfde430cda (diff)
gst/: In streaming mode, if the first buffer we get doesn't have an offset, fix it up to be 0, otherwise trimming won...
Original commit message from CVS: * gst/apetag/gsttagdemux.c: (gst_tag_demux_chain_parse_tag), (gst_tag_demux_chain): * gst/id3demux/gstid3demux.c: (gst_id3demux_chain): In streaming mode, if the first buffer we get doesn't have an offset, fix it up to be 0, otherwise trimming won't work later on and we'll be typefinding application/x-id3, which may result in decodebin plugging an endless number of id3demux elements as a consequence. Fixes #385031.
Diffstat (limited to 'gst/id3demux')
-rw-r--r--gst/id3demux/gstid3demux.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/gst/id3demux/gstid3demux.c b/gst/id3demux/gstid3demux.c
index 98443193..ef7a4c19 100644
--- a/gst/id3demux/gstid3demux.c
+++ b/gst/id3demux/gstid3demux.c
@@ -46,6 +46,7 @@
#include <gst/base/gsttypefindhelper.h>
#include <gst/gst-i18n-plugin.h>
#include <gst/tag/tag.h>
+#include <string.h>
#include "gstid3demux.h"
#include "id3tags.h"
@@ -418,9 +419,21 @@ gst_id3demux_chain (GstPad * pad, GstBuffer * buf)
switch (id3demux->state) {
case GST_ID3DEMUX_READID3V2:
+ if (GST_BUFFER_SIZE (id3demux->collect) < 3)
+ break; /* Go get more data first */
+
+ /* need to set offset of first buffer to 0 or trimming won't work */
+ if (!GST_BUFFER_OFFSET_IS_VALID (id3demux->collect) &&
+ memcmp (GST_BUFFER_DATA (id3demux->collect), "ID3", 3) == 0) {
+ GST_WARNING_OBJECT (id3demux, "Fixing up first buffer without offset");
+ id3demux->collect =
+ gst_buffer_make_metadata_writable (id3demux->collect);
+ GST_BUFFER_OFFSET (id3demux->collect) = 0;
+ }
+
/* If we receive a buffer that's from the middle of the file,
* we can't read tags so move to typefinding */
- if (GST_BUFFER_OFFSET_IS_VALID (id3demux->collect) &&
+ if (!GST_BUFFER_OFFSET_IS_VALID (id3demux->collect) ||
GST_BUFFER_OFFSET (id3demux->collect) != 0) {
GST_DEBUG_OBJECT (id3demux,
"Received buffer with non-zero offset %" G_GINT64_FORMAT