2006-07-05 Tim-Philipp Müller <tim at centricular dot net>
+ * gst/apetag/gsttagdemux.c: (gst_tag_demux_trim_buffer),
+ (gst_tag_demux_read_range):
+ * gst/id3demux/gstid3demux.c: (gst_id3demux_trim_buffer),
+ (gst_id3demux_read_range):
+ Don't return FLOW_UNEXPECTED when a buffer is before
+ the start of the stream (which might happen with
+ large ID3v2 tags if the tag reading was done pullrange
+ based and we then switched to push mode later on).
+ Fixes regression introduced by commit from June 29th.
+
+2006-07-05 Tim-Philipp Müller <tim at centricular dot net>
+
* ext/taglib/gstid3v2mux.cc:
Make UTF-8 the default encoding when writing string
tags (before, our UTF-8 strings would automatically
return res;
};
+/* will return FALSE if buffer is beyond end of data; will return TRUE
+ * if buffer was trimmed successfully or didn't need trimming, but may
+ * also return TRUE and set *buf_ref to NULL if the buffer was before
+ * the start of the data */
static gboolean
gst_tag_demux_trim_buffer (GstTagDemux * tagdemux, GstBuffer ** buf_ref)
{
if (out_offset >= v1tag_offset) {
GST_DEBUG_OBJECT (tagdemux, "Buffer is past the end of the data");
- goto no_out_buffer;
+ goto no_out_buffer_end;
}
if (out_offset + out_size > v1tag_offset) {
if (out_offset <= tagdemux->priv->strip_start) {
if (out_offset + out_size <= tagdemux->priv->strip_start) {
GST_DEBUG_OBJECT (tagdemux, "Buffer is before the start of the data");
- goto no_out_buffer;
+ goto no_out_buffer_start;
}
trim_start = tagdemux->priv->strip_start - out_offset;
return TRUE;
-no_out_buffer:
- gst_buffer_unref (buf);
- *buf_ref = NULL;
- return FALSE;
+no_out_buffer_end:
+ {
+ gst_buffer_unref (buf);
+ *buf_ref = NULL;
+ return FALSE;
+ }
+no_out_buffer_start:
+ {
+ gst_buffer_unref (buf);
+ *buf_ref = NULL;
+ return TRUE;
+ }
}
static void
if (ret == GST_FLOW_OK && *buffer) {
if (!gst_tag_demux_trim_buffer (demux, buffer))
goto read_beyond_end;
+
+ /* this should only happen in streaming mode */
+ g_assert (*buffer != NULL);
}
return ret;
return res;
};
+/* will return FALSE if buffer is beyond end of data; will return TRUE
+ * if buffer was trimmed successfully or didn't need trimming, but may
+ * also return TRUE and set *buf_ref to NULL if the buffer was before
+ * the start of the data */
static gboolean
gst_id3demux_trim_buffer (GstID3Demux * id3demux, GstBuffer ** buf_ref)
{
if (out_offset >= v1tag_offset) {
GST_DEBUG_OBJECT (id3demux, "Buffer is past the end of the data");
- goto no_out_buffer;
+ goto no_out_buffer_end;
}
if (out_offset + out_size > v1tag_offset) {
if (out_offset <= id3demux->strip_start) {
if (out_offset + out_size <= id3demux->strip_start) {
GST_DEBUG_OBJECT (id3demux, "Buffer is before the start of the data");
- goto no_out_buffer;
+ goto no_out_buffer_start;
}
trim_start = id3demux->strip_start - out_offset;
}
return TRUE;
-no_out_buffer:
- gst_buffer_unref (buf);
- *buf_ref = NULL;
- return FALSE;
+
+no_out_buffer_end:
+ {
+ gst_buffer_unref (buf);
+ *buf_ref = NULL;
+ return FALSE;
+ }
+no_out_buffer_start:
+ {
+ gst_buffer_unref (buf);
+ *buf_ref = NULL;
+ return TRUE;
+ }
}
static GstFlowReturn
if (ret == GST_FLOW_OK && *buffer) {
if (!gst_id3demux_trim_buffer (id3demux, buffer))
goto read_beyond_end;
+
+ /* this should only happen in streaming mode */
+ g_assert (*buffer != NULL);
}
return ret;