mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-01 06:01:04 +00:00
vorbisdec: Re-init on new caps
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.
This commit is contained in:
parent
0b98ed32ce
commit
797a0ca376
1 changed files with 29 additions and 0 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue