vorbisdec: Reset decoder in more situations
authorEdward Hervey <edward@centricular.com>
Fri, 3 Mar 2017 09:52:15 +0000 (10:52 +0100)
committerEdward Hervey <bilboed@bilboed.com>
Fri, 3 Mar 2017 09:56:22 +0000 (10:56 +0100)
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

index a3bea96..467c636 100644 (file)
@@ -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);
     }