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)
/* 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)
#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;
}