From b95725c37e70ad3c1ec8dadb401388db375df482 Mon Sep 17 00:00:00 2001 From: Jochen Henneberg Date: Thu, 9 Feb 2017 12:44:51 +0000 Subject: [PATCH] vorbisdec: reset decoder on vorbis headers update 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 | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/ext/vorbis/gstvorbisdec.c b/ext/vorbis/gstvorbisdec.c index afe32cae9b..a3bea96b2a 100644 --- a/ext/vorbis/gstvorbisdec.c +++ b/ext/vorbis/gstvorbisdec.c @@ -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,6 +634,23 @@ vorbis_dec_flush (GstAudioDecoder * dec, gboolean hard) #endif } +static void +vorbis_dec_reset (GstAudioDecoder * dec) +{ + GstVorbisDec *vd = GST_VORBIS_DEC (dec); + + vd->initialized = FALSE; +#ifndef USE_TREMOLO + vorbis_block_clear (&vd->vb); +#endif + vorbis_dsp_clear (&vd->vd); + + 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) { @@ -644,18 +662,9 @@ vorbis_dec_set_format (GstAudioDecoder * dec, GstCaps * caps) 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); + /* We need to free and re-init libvorbis, + * or it chokes */ + vorbis_dec_reset (dec); return TRUE; }