vorbisdec: Re-init on new caps
authorJan Schmidt <jan@centricular.com>
Tue, 10 Nov 2015 13:59:16 +0000 (00:59 +1100)
committerJan Schmidt <jan@centricular.com>
Tue, 10 Nov 2015 14:33:55 +0000 (01:33 +1100)
If we get new input caps, then reset the decoder
ready for new headers and fresh data. Makes
chained oggs work when reusing the decoder.

ext/vorbis/gstvorbisdec.c

index f679d7e..bc0a20f 100644 (file)
@@ -78,6 +78,7 @@ static gboolean vorbis_dec_stop (GstAudioDecoder * dec);
 static GstFlowReturn vorbis_dec_handle_frame (GstAudioDecoder * dec,
     GstBuffer * buffer);
 static void vorbis_dec_flush (GstAudioDecoder * dec, gboolean hard);
+static gboolean vorbis_dec_set_format (GstAudioDecoder * dec, GstCaps * caps);
 
 static void
 gst_vorbis_dec_class_init (GstVorbisDecClass * klass)
@@ -102,6 +103,7 @@ gst_vorbis_dec_class_init (GstVorbisDecClass * klass)
 
   base_class->start = GST_DEBUG_FUNCPTR (vorbis_dec_start);
   base_class->stop = GST_DEBUG_FUNCPTR (vorbis_dec_stop);
+  base_class->set_format = GST_DEBUG_FUNCPTR (vorbis_dec_set_format);
   base_class->handle_frame = GST_DEBUG_FUNCPTR (vorbis_dec_handle_frame);
   base_class->flush = GST_DEBUG_FUNCPTR (vorbis_dec_flush);
 }
@@ -632,3 +634,30 @@ vorbis_dec_flush (GstAudioDecoder * dec, gboolean hard)
   vorbis_synthesis_restart (&vd->vd);
 #endif
 }
+
+static gboolean
+vorbis_dec_set_format (GstAudioDecoder * dec, GstCaps * caps)
+{
+  GstVorbisDec *vd = GST_VORBIS_DEC (dec);
+
+  GST_DEBUG_OBJECT (vd, "New caps %" GST_PTR_FORMAT " - resetting", caps);
+
+  /* A set_format call implies new data with new header packets */
+  if (!vd->initialized)
+    return TRUE;
+
+  vd->initialized = FALSE;
+#ifndef USE_TREMOLO
+  vorbis_block_clear (&vd->vb);
+#endif
+  vorbis_dsp_clear (&vd->vd);
+
+  /* We need to free and re-init these,
+   * or libvorbis chokes */
+  vorbis_comment_clear (&vd->vc);
+  vorbis_info_clear (&vd->vi);
+  vorbis_info_init (&vd->vi);
+  vorbis_comment_init (&vd->vc);
+
+  return TRUE;
+}