vorbisdec: reset decoder on vorbis headers update
authorJochen Henneberg <jh@henneberg-systemdesign.com>
Thu, 9 Feb 2017 12:44:51 +0000 (12:44 +0000)
committerSebastian Dröge <sebastian@centricular.com>
Mon, 27 Feb 2017 17:17:58 +0000 (19:17 +0200)
if the vorbis encoder receives new headers it must be
reset and re-initialized to continue decoding, e. g.
for live streams

ext/vorbis/gstvorbisdec.c

index afe32ca..a3bea96 100644 (file)
@@ -79,6 +79,7 @@ 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 vorbis_dec_reset (GstAudioDecoder * dec);
 
 static void
 gst_vorbis_dec_class_init (GstVorbisDecClass * klass)
@@ -582,8 +583,8 @@ vorbis_dec_handle_frame (GstAudioDecoder * dec, GstBuffer * buffer)
   /* switch depending on packet type */
   if ((gst_ogg_packet_data (packet))[0] & 1) {
     if (vd->initialized) {
-      GST_WARNING_OBJECT (vd, "Already initialized, so ignoring header packet");
-      goto done;
+      GST_INFO_OBJECT (vd, "already initialized, re-init");
+      vorbis_dec_reset (dec);
     }
     result = vorbis_handle_header_packet (vd, packet);
     if (result != GST_FLOW_OK)
@@ -633,29 +634,37 @@ vorbis_dec_flush (GstAudioDecoder * dec, gboolean hard)
 #endif
 }
 
-static gboolean
-vorbis_dec_set_format (GstAudioDecoder * dec, GstCaps * caps)
+static void
+vorbis_dec_reset (GstAudioDecoder * dec)
 {
   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);
+}
+
+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;
+
+  /* We need to free and re-init libvorbis,
+   * or it chokes */
+  vorbis_dec_reset (dec);
 
   return TRUE;
 }