From e575be6dc6689950299049928ad135e456aa07a2 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Fri, 3 Mar 2017 10:52:15 +0100 Subject: [PATCH] vorbisdec: Reset decoder in more situations This is a followup commit to b95725c37e70ad3c1ec8dadb401388db375df482 * Resetting the decoder should only happen when we get a new initialization header (0x01) and not on the other headers * The initialized variable only gets set to TRUE once all headers have been parsed. Also check if the vorbis_info struct has been properly resetted also. Failure to do that would cause vorbisdec to error if it got two initialization header in a row (the first would configure the underlying library and the second one would error out because it's already initialized) https://bugzilla.gnome.org/show_bug.cgi?id=779515 --- ext/vorbis/gstvorbisdec.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ext/vorbis/gstvorbisdec.c b/ext/vorbis/gstvorbisdec.c index a3bea96..467c636 100644 --- a/ext/vorbis/gstvorbisdec.c +++ b/ext/vorbis/gstvorbisdec.c @@ -582,7 +582,11 @@ vorbis_dec_handle_frame (GstAudioDecoder * dec, GstBuffer * buffer) /* switch depending on packet type */ if ((gst_ogg_packet_data (packet))[0] & 1) { - if (vd->initialized) { + /* If we get a new initialization packet, reset the decoder. + * The vorbis_info struct should have a rate of 0 if it hasn't been + * initialized yet. */ + if ((vd->initialized || (vd->vi.rate != 0)) && + (gst_ogg_packet_data (packet))[0] == 0x01) { GST_INFO_OBJECT (vd, "already initialized, re-init"); vorbis_dec_reset (dec); } -- 2.7.4