mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 01:00:37 +00:00
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:
parent
9a32184a05
commit
8da7f5ece9
2 changed files with 30 additions and 7 deletions
|
@ -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),
|
||||||
|
|
|
@ -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--;
|
||||||
|
|
Loading…
Reference in a new issue