ext/vorbis/vorbisdec.c: When calculating the first timestamp of the buffers, don't go below 0 and clip the samples be...

Original commit message from CVS:
* ext/vorbis/vorbisdec.c: (vorbis_dec_push_forward):
When calculating the first timestamp of the buffers, don't go below 0
and clip the samples because the offset was on the eos page.
Fixes #466717.
This commit is contained in:
Wim Taymans 2007-08-21 12:08:43 +00:00
parent 9a32184a05
commit 8da7f5ece9
2 changed files with 30 additions and 7 deletions

View file

@ -1,3 +1,10 @@
2007-08-21 Wim Taymans <wim.taymans@gmail.com>
* ext/vorbis/vorbisdec.c: (vorbis_dec_push_forward):
When calculating the first timestamp of the buffers, don't go below 0
and clip the samples because the offset was on the eos page.
Fixes #466717.
2007-08-21 Wim Taymans <wim.taymans@gmail.com> 2007-08-21 Wim Taymans <wim.taymans@gmail.com>
* ext/ogg/gstoggdemux.c: (gst_ogg_demux_read_chain), * ext/ogg/gstoggdemux.c: (gst_ogg_demux_read_chain),

View file

@ -806,7 +806,12 @@ static GstFlowReturn
vorbis_dec_push_forward (GstVorbisDec * dec, GstBuffer * buf) vorbis_dec_push_forward (GstVorbisDec * dec, GstBuffer * buf)
{ {
GstFlowReturn result; GstFlowReturn result;
gint64 outoffset = GST_BUFFER_OFFSET (buf); gint64 outoffset, origoffset;
origoffset = GST_BUFFER_OFFSET (buf);
again:
outoffset = origoffset;
if (outoffset == -1) { if (outoffset == -1) {
dec->queued = g_list_append (dec->queued, buf); dec->queued = g_list_append (dec->queued, buf);
@ -814,7 +819,7 @@ vorbis_dec_push_forward (GstVorbisDec * dec, GstBuffer * buf)
result = GST_FLOW_OK; result = GST_FLOW_OK;
} else { } else {
if (G_UNLIKELY (dec->queued)) { if (G_UNLIKELY (dec->queued)) {
gint64 size; guint size;
GstClockTime ts; GstClockTime ts;
GList *walk; GList *walk;
@ -827,9 +832,20 @@ vorbis_dec_push_forward (GstVorbisDec * dec, GstBuffer * buf)
for (walk = g_list_last (dec->queued); walk; for (walk = g_list_last (dec->queued); walk;
walk = g_list_previous (walk)) { walk = g_list_previous (walk)) {
GstBuffer *buffer = GST_BUFFER (walk->data); GstBuffer *buffer = GST_BUFFER (walk->data);
guint offset;
outoffset -= offset = GST_BUFFER_SIZE (buffer) / (sizeof (float) * dec->vi.channels);
GST_BUFFER_SIZE (buffer) / (sizeof (float) * dec->vi.channels);
if (outoffset >= offset)
outoffset -= offset;
else {
/* we can't go below 0, this means this first offset was at the eos
* page and we need to clip to it instead */
GST_DEBUG_OBJECT (dec, "clipping %" G_GINT64_FORMAT,
offset - outoffset);
origoffset += (offset - outoffset);
goto again;
}
GST_BUFFER_OFFSET (buffer) = outoffset; GST_BUFFER_OFFSET (buffer) = outoffset;
GST_BUFFER_TIMESTAMP (buffer) = GST_BUFFER_TIMESTAMP (buffer) =
@ -837,9 +853,9 @@ vorbis_dec_push_forward (GstVorbisDec * dec, GstBuffer * buf)
GST_BUFFER_DURATION (buffer) = GST_CLOCK_DIFF (GST_BUFFER_TIMESTAMP GST_BUFFER_DURATION (buffer) = GST_CLOCK_DIFF (GST_BUFFER_TIMESTAMP
(buffer), ts); (buffer), ts);
ts = GST_BUFFER_TIMESTAMP (buffer); ts = GST_BUFFER_TIMESTAMP (buffer);
GST_DEBUG_OBJECT (dec, "patch buffer %" G_GUINT64_FORMAT GST_DEBUG_OBJECT (dec, "patch buffer %u, offset %" G_GUINT64_FORMAT
", offset %" G_GUINT64_FORMAT ", timestamp %" GST_TIME_FORMAT ", timestamp %" GST_TIME_FORMAT ", duration %" GST_TIME_FORMAT,
", duration %" GST_TIME_FORMAT, size, outoffset, size, outoffset,
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)),
GST_TIME_ARGS (GST_BUFFER_DURATION (buffer))); GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)));
size--; size--;