From 523e98396fa05282ca8e9d98a48426edf72c0023 Mon Sep 17 00:00:00 2001 From: Vincent Penquerc'h Date: Fri, 5 May 2017 12:48:41 +0100 Subject: [PATCH] oggdemux: fix clipping more samples than exist in the first packet This can happen in Opus (and maybe other codecs ?), and would cause failure to play. https://bugzilla.gnome.org/show_bug.cgi?id=782157 --- ext/ogg/gstoggdemux.c | 24 ++++++++++++++++++------ ext/ogg/gstoggstream.c | 14 +++----------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/ext/ogg/gstoggdemux.c b/ext/ogg/gstoggdemux.c index 5307521fba..6825f89708 100644 --- a/ext/ogg/gstoggdemux.c +++ b/ext/ogg/gstoggdemux.c @@ -736,9 +736,15 @@ gst_ogg_demux_chain_peer (GstOggPad * pad, ogg_packet * packet, } if (pad->map.audio_clipping && pad->current_granule - duration < -pad->map.granule_offset) { - if (pad->current_granule >= -pad->map.granule_offset) - clip_start = -pad->map.granule_offset; - else + if (pad->current_granule >= -pad->map.granule_offset) { + guint64 already_removed = + pad->current_granule > + duration ? pad->current_granule - duration : 0; + clip_start = + already_removed > + -pad->map.granule_offset ? 0 : -pad->map.granule_offset - + already_removed; + } else clip_start = pad->current_granule; } } else { @@ -747,9 +753,15 @@ gst_ogg_demux_chain_peer (GstOggPad * pad, ogg_packet * packet, if (pad->map.audio_clipping && pad->current_granule - duration < -pad->map.granule_offset) { - if (pad->current_granule >= -pad->map.granule_offset) - clip_start = -pad->map.granule_offset; - else + if (pad->current_granule >= -pad->map.granule_offset) { + guint64 already_removed = + pad->current_granule > + duration ? pad->current_granule - duration : 0; + clip_start = + already_removed > + -pad->map.granule_offset ? 0 : -pad->map.granule_offset - + already_removed; + } else clip_start = pad->current_granule; } } diff --git a/ext/ogg/gstoggstream.c b/ext/ogg/gstoggstream.c index 34df107be1..042f102d18 100644 --- a/ext/ogg/gstoggstream.c +++ b/ext/ogg/gstoggstream.c @@ -2030,21 +2030,13 @@ granulepos_to_granule_opus (GstOggStream * pad, gint64 granulepos) if (granulepos == -1) return -1; - /* We must reject some particular cases for the first granpos */ - if (pad->first_granpos < 0 || granulepos < pad->first_granpos) pad->first_granpos = granulepos; - if (pad->first_granpos == granulepos) { - if (granulepos < -pad->granule_offset) { - GST_ERROR ("Invalid Opus stream: first granulepos (%" G_GINT64_FORMAT - ") less than preskip (%" G_GINT64_FORMAT ")", granulepos, - -pad->granule_offset); - return -1; - } - } + if (granulepos < -pad->granule_offset) + return 0; - return granulepos; + return granulepos + pad->granule_offset; } static gint64