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.
This commit is contained in:
Tim-Philipp Müller 2006-12-12 18:45:58 +00:00
parent b61aef839f
commit 173ee367e4
3 changed files with 35 additions and 1 deletions

View file

@ -1,3 +1,14 @@
2006-12-12 Tim-Philipp Müller <tim at centricular dot net>
* 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.
2006-12-08 Jan Schmidt <thaytan@mad.scientist.com>
* sys/sunaudio/gstsunaudiosink.c: (gst_sunaudiosink_prepare):

View file

@ -458,6 +458,8 @@ gst_tag_demux_chain_parse_tag (GstTagDemux * demux, GstBuffer * collect)
guint tagsize = 0;
guint available;
g_assert (gst_buffer_is_metadata_writable (collect));
klass = GST_TAG_DEMUX_CLASS (G_OBJECT_GET_CLASS (demux));
/* If we receive a buffer that's from the middle of the file,
@ -486,6 +488,12 @@ gst_tag_demux_chain_parse_tag (GstTagDemux * demux, GstBuffer * collect)
return;
}
/* need to set offset of first buffer to 0 or trimming won't work */
if (!GST_BUFFER_OFFSET_IS_VALID (collect)) {
GST_WARNING_OBJECT (demux, "Fixing up first buffer without offset");
GST_BUFFER_OFFSET (collect) = 0;
}
GST_DEBUG_OBJECT (demux, "Identified tag, size = %u bytes", tagsize);
do {
@ -550,6 +558,8 @@ gst_tag_demux_chain (GstPad * pad, GstBuffer * buf)
switch (demux->priv->state) {
case GST_TAG_DEMUX_READ_START_TAG:
demux->priv->collect =
gst_buffer_make_metadata_writable (demux->priv->collect);
gst_tag_demux_chain_parse_tag (demux, demux->priv->collect);
if (demux->priv->state != GST_TAG_DEMUX_TYPEFINDING)
break;

View file

@ -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