mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-26 02:00:33 +00:00
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
This commit is contained in:
parent
bb051c14b3
commit
b95725c37e
1 changed files with 23 additions and 14 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue