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);
|
GstBuffer * buffer);
|
||||||
static void vorbis_dec_flush (GstAudioDecoder * dec, gboolean hard);
|
static void vorbis_dec_flush (GstAudioDecoder * dec, gboolean hard);
|
||||||
static gboolean vorbis_dec_set_format (GstAudioDecoder * dec, GstCaps * caps);
|
static gboolean vorbis_dec_set_format (GstAudioDecoder * dec, GstCaps * caps);
|
||||||
|
static void vorbis_dec_reset (GstAudioDecoder * dec);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_vorbis_dec_class_init (GstVorbisDecClass * klass)
|
gst_vorbis_dec_class_init (GstVorbisDecClass * klass)
|
||||||
|
@ -582,8 +583,8 @@ vorbis_dec_handle_frame (GstAudioDecoder * dec, GstBuffer * buffer)
|
||||||
/* switch depending on packet type */
|
/* switch depending on packet type */
|
||||||
if ((gst_ogg_packet_data (packet))[0] & 1) {
|
if ((gst_ogg_packet_data (packet))[0] & 1) {
|
||||||
if (vd->initialized) {
|
if (vd->initialized) {
|
||||||
GST_WARNING_OBJECT (vd, "Already initialized, so ignoring header packet");
|
GST_INFO_OBJECT (vd, "already initialized, re-init");
|
||||||
goto done;
|
vorbis_dec_reset (dec);
|
||||||
}
|
}
|
||||||
result = vorbis_handle_header_packet (vd, packet);
|
result = vorbis_handle_header_packet (vd, packet);
|
||||||
if (result != GST_FLOW_OK)
|
if (result != GST_FLOW_OK)
|
||||||
|
@ -633,6 +634,23 @@ vorbis_dec_flush (GstAudioDecoder * dec, gboolean hard)
|
||||||
#endif
|
#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
|
static gboolean
|
||||||
vorbis_dec_set_format (GstAudioDecoder * dec, GstCaps * caps)
|
vorbis_dec_set_format (GstAudioDecoder * dec, GstCaps * caps)
|
||||||
{
|
{
|
||||||
|
@ -644,18 +662,9 @@ vorbis_dec_set_format (GstAudioDecoder * dec, GstCaps * caps)
|
||||||
if (!vd->initialized)
|
if (!vd->initialized)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
vd->initialized = FALSE;
|
/* We need to free and re-init libvorbis,
|
||||||
#ifndef USE_TREMOLO
|
* or it chokes */
|
||||||
vorbis_block_clear (&vd->vb);
|
vorbis_dec_reset (dec);
|
||||||
#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;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue