gst_element_class_set_details => gst_element_class_set_details_simple
[platform/upstream/gstreamer.git] / ext / vorbis / gstvorbisdec.c
1 /* GStreamer
2  * Copyright (C) 2004 Benjamin Otte <in7y118@public.uni-hamburg.de>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19
20 /**
21  * SECTION:element-vorbisdec
22  * @see_also: vorbisenc, oggdemux
23  *
24  * This element decodes a Vorbis stream to raw float audio.
25  * <ulink url="http://www.vorbis.com/">Vorbis</ulink> is a royalty-free
26  * audio codec maintained by the <ulink url="http://www.xiph.org/">Xiph.org
27  * Foundation</ulink>.
28  *
29  * <refsect2>
30  * <title>Example pipelines</title>
31  * |[
32  * gst-launch -v filesrc location=sine.ogg ! oggdemux ! vorbisdec ! audioconvert ! alsasink
33  * ]| Decode an Ogg/Vorbis. To create an Ogg/Vorbis file refer to the documentation of vorbisenc.
34  * </refsect2>
35  *
36  * Last reviewed on 2006-03-01 (0.10.4)
37  */
38
39 #ifdef HAVE_CONFIG_H
40 #  include "config.h"
41 #endif
42
43 #include "gstvorbisdec.h"
44 #include <string.h>
45 #include <gst/audio/audio.h>
46 #include <gst/tag/tag.h>
47 #include <gst/audio/multichannel.h>
48
49 #include "gstvorbiscommon.h"
50
51 GST_DEBUG_CATEGORY_EXTERN (vorbisdec_debug);
52 #define GST_CAT_DEFAULT vorbisdec_debug
53
54 static GstStaticPadTemplate vorbis_dec_src_factory =
55 GST_STATIC_PAD_TEMPLATE ("src",
56     GST_PAD_SRC,
57     GST_PAD_ALWAYS,
58     GST_VORBIS_DEC_SRC_CAPS);
59
60 static GstStaticPadTemplate vorbis_dec_sink_factory =
61 GST_STATIC_PAD_TEMPLATE ("sink",
62     GST_PAD_SINK,
63     GST_PAD_ALWAYS,
64     GST_STATIC_CAPS ("audio/x-vorbis")
65     );
66
67 GST_BOILERPLATE (GST_VORBIS_DEC_GLIB_TYPE_NAME, gst_vorbis_dec, GstElement,
68     GST_TYPE_ELEMENT);
69
70 static void vorbis_dec_finalize (GObject * object);
71 static gboolean vorbis_dec_sink_event (GstPad * pad, GstEvent * event);
72 static GstFlowReturn vorbis_dec_chain (GstPad * pad, GstBuffer * buffer);
73 static GstFlowReturn vorbis_dec_chain_forward (GstVorbisDec * vd,
74     gboolean discont, GstBuffer * buffer);
75 static GstStateChangeReturn vorbis_dec_change_state (GstElement * element,
76     GstStateChange transition);
77
78 static gboolean vorbis_dec_src_event (GstPad * pad, GstEvent * event);
79 static gboolean vorbis_dec_src_query (GstPad * pad, GstQuery * query);
80 static gboolean vorbis_dec_convert (GstPad * pad,
81     GstFormat src_format, gint64 src_value,
82     GstFormat * dest_format, gint64 * dest_value);
83
84 static gboolean vorbis_dec_sink_query (GstPad * pad, GstQuery * query);
85
86 static void
87 gst_vorbis_dec_base_init (gpointer g_class)
88 {
89   GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
90   GstPadTemplate *src_template, *sink_template;
91
92   src_template = gst_static_pad_template_get (&vorbis_dec_src_factory);
93   gst_element_class_add_pad_template (element_class, src_template);
94
95   sink_template = gst_static_pad_template_get (&vorbis_dec_sink_factory);
96   gst_element_class_add_pad_template (element_class, sink_template);
97
98   gst_element_class_set_details_simple (element_class,
99       "Vorbis audio decoder", "Codec/Decoder/Audio",
100       GST_VORBIS_DEC_DESCRIPTION,
101       "Benjamin Otte <otte@gnome.org>, Chris Lord <chris@openedhand.com>");
102 }
103
104 static void
105 gst_vorbis_dec_class_init (GstVorbisDecClass * klass)
106 {
107   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
108   GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
109
110   gobject_class->finalize = vorbis_dec_finalize;
111
112   gstelement_class->change_state = GST_DEBUG_FUNCPTR (vorbis_dec_change_state);
113 }
114
115 static const GstQueryType *
116 vorbis_get_query_types (GstPad * pad)
117 {
118   static const GstQueryType vorbis_dec_src_query_types[] = {
119     GST_QUERY_POSITION,
120     GST_QUERY_DURATION,
121     GST_QUERY_CONVERT,
122     0
123   };
124
125   return vorbis_dec_src_query_types;
126 }
127
128 static void
129 gst_vorbis_dec_init (GstVorbisDec * dec, GstVorbisDecClass * g_class)
130 {
131   dec->sinkpad = gst_pad_new_from_static_template (&vorbis_dec_sink_factory,
132       "sink");
133
134   gst_pad_set_event_function (dec->sinkpad,
135       GST_DEBUG_FUNCPTR (vorbis_dec_sink_event));
136   gst_pad_set_chain_function (dec->sinkpad,
137       GST_DEBUG_FUNCPTR (vorbis_dec_chain));
138   gst_pad_set_query_function (dec->sinkpad,
139       GST_DEBUG_FUNCPTR (vorbis_dec_sink_query));
140   gst_element_add_pad (GST_ELEMENT (dec), dec->sinkpad);
141
142   dec->srcpad = gst_pad_new_from_static_template (&vorbis_dec_src_factory,
143       "src");
144
145   gst_pad_set_event_function (dec->srcpad,
146       GST_DEBUG_FUNCPTR (vorbis_dec_src_event));
147   gst_pad_set_query_type_function (dec->srcpad,
148       GST_DEBUG_FUNCPTR (vorbis_get_query_types));
149   gst_pad_set_query_function (dec->srcpad,
150       GST_DEBUG_FUNCPTR (vorbis_dec_src_query));
151   gst_pad_use_fixed_caps (dec->srcpad);
152   gst_element_add_pad (GST_ELEMENT (dec), dec->srcpad);
153
154   dec->queued = NULL;
155   dec->pendingevents = NULL;
156   dec->taglist = NULL;
157 }
158
159 static void
160 vorbis_dec_finalize (GObject * object)
161 {
162   /* Release any possibly allocated libvorbis data.
163    * _clear functions can safely be called multiple times
164    */
165   GstVorbisDec *vd = GST_VORBIS_DEC (object);
166
167   vorbis_block_clear (&vd->vb);
168   vorbis_dsp_clear (&vd->vd);
169   vorbis_comment_clear (&vd->vc);
170   vorbis_info_clear (&vd->vi);
171
172   G_OBJECT_CLASS (parent_class)->finalize (object);
173 }
174
175 static void
176 gst_vorbis_dec_reset (GstVorbisDec * dec)
177 {
178   dec->last_timestamp = GST_CLOCK_TIME_NONE;
179   dec->discont = TRUE;
180   dec->seqnum = gst_util_seqnum_next ();
181   gst_segment_init (&dec->segment, GST_FORMAT_TIME);
182
183   g_list_foreach (dec->queued, (GFunc) gst_mini_object_unref, NULL);
184   g_list_free (dec->queued);
185   dec->queued = NULL;
186   g_list_foreach (dec->gather, (GFunc) gst_mini_object_unref, NULL);
187   g_list_free (dec->gather);
188   dec->gather = NULL;
189   g_list_foreach (dec->decode, (GFunc) gst_mini_object_unref, NULL);
190   g_list_free (dec->decode);
191   dec->decode = NULL;
192   g_list_foreach (dec->pendingevents, (GFunc) gst_mini_object_unref, NULL);
193   g_list_free (dec->pendingevents);
194   dec->pendingevents = NULL;
195
196   if (dec->taglist)
197     gst_tag_list_free (dec->taglist);
198   dec->taglist = NULL;
199 }
200
201
202 static gboolean
203 vorbis_dec_convert (GstPad * pad,
204     GstFormat src_format, gint64 src_value,
205     GstFormat * dest_format, gint64 * dest_value)
206 {
207   gboolean res = TRUE;
208   GstVorbisDec *dec;
209   guint64 scale = 1;
210
211   if (src_format == *dest_format) {
212     *dest_value = src_value;
213     return TRUE;
214   }
215
216   dec = GST_VORBIS_DEC (gst_pad_get_parent (pad));
217
218   if (!dec->initialized)
219     goto no_header;
220
221   if (dec->sinkpad == pad &&
222       (src_format == GST_FORMAT_BYTES || *dest_format == GST_FORMAT_BYTES))
223     goto no_format;
224
225   switch (src_format) {
226     case GST_FORMAT_TIME:
227       switch (*dest_format) {
228         case GST_FORMAT_BYTES:
229           scale = dec->width * dec->vi.channels;
230         case GST_FORMAT_DEFAULT:
231           *dest_value =
232               scale * gst_util_uint64_scale_int (src_value, dec->vi.rate,
233               GST_SECOND);
234           break;
235         default:
236           res = FALSE;
237       }
238       break;
239     case GST_FORMAT_DEFAULT:
240       switch (*dest_format) {
241         case GST_FORMAT_BYTES:
242           *dest_value = src_value * dec->width * dec->vi.channels;
243           break;
244         case GST_FORMAT_TIME:
245           *dest_value =
246               gst_util_uint64_scale_int (src_value, GST_SECOND, dec->vi.rate);
247           break;
248         default:
249           res = FALSE;
250       }
251       break;
252     case GST_FORMAT_BYTES:
253       switch (*dest_format) {
254         case GST_FORMAT_DEFAULT:
255           *dest_value = src_value / (dec->width * dec->vi.channels);
256           break;
257         case GST_FORMAT_TIME:
258           *dest_value = gst_util_uint64_scale_int (src_value, GST_SECOND,
259               dec->vi.rate * dec->width * dec->vi.channels);
260           break;
261         default:
262           res = FALSE;
263       }
264       break;
265     default:
266       res = FALSE;
267   }
268 done:
269   gst_object_unref (dec);
270
271   return res;
272
273   /* ERRORS */
274 no_header:
275   {
276     GST_DEBUG_OBJECT (dec, "no header packets received");
277     res = FALSE;
278     goto done;
279   }
280 no_format:
281   {
282     GST_DEBUG_OBJECT (dec, "formats unsupported");
283     res = FALSE;
284     goto done;
285   }
286 }
287
288 static gboolean
289 vorbis_dec_src_query (GstPad * pad, GstQuery * query)
290 {
291   GstVorbisDec *dec;
292   gboolean res = FALSE;
293
294   dec = GST_VORBIS_DEC (gst_pad_get_parent (pad));
295
296   switch (GST_QUERY_TYPE (query)) {
297     case GST_QUERY_POSITION:
298     {
299       gint64 value;
300       GstFormat format;
301       gint64 time;
302
303       gst_query_parse_position (query, &format, NULL);
304
305       /* we start from the last seen time */
306       time = dec->last_timestamp;
307       /* correct for the segment values */
308       time = gst_segment_to_stream_time (&dec->segment, GST_FORMAT_TIME, time);
309
310       GST_LOG_OBJECT (dec,
311           "query %p: our time: %" GST_TIME_FORMAT, query, GST_TIME_ARGS (time));
312
313       /* and convert to the final format */
314       if (!(res =
315               vorbis_dec_convert (pad, GST_FORMAT_TIME, time, &format, &value)))
316         goto error;
317
318       gst_query_set_position (query, format, value);
319
320       GST_LOG_OBJECT (dec,
321           "query %p: we return %" G_GINT64_FORMAT " (format %u)", query, value,
322           format);
323
324       break;
325     }
326     case GST_QUERY_DURATION:
327     {
328       res = gst_pad_peer_query (dec->sinkpad, query);
329       if (!res)
330         goto error;
331
332       break;
333     }
334     case GST_QUERY_CONVERT:
335     {
336       GstFormat src_fmt, dest_fmt;
337       gint64 src_val, dest_val;
338
339       gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val);
340       if (!(res =
341               vorbis_dec_convert (pad, src_fmt, src_val, &dest_fmt, &dest_val)))
342         goto error;
343       gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val);
344       break;
345     }
346     default:
347       res = gst_pad_query_default (pad, query);
348       break;
349   }
350 done:
351   gst_object_unref (dec);
352
353   return res;
354
355   /* ERRORS */
356 error:
357   {
358     GST_WARNING_OBJECT (dec, "error handling query");
359     goto done;
360   }
361 }
362
363 static gboolean
364 vorbis_dec_sink_query (GstPad * pad, GstQuery * query)
365 {
366   GstVorbisDec *dec;
367   gboolean res;
368
369   dec = GST_VORBIS_DEC (gst_pad_get_parent (pad));
370
371   switch (GST_QUERY_TYPE (query)) {
372     case GST_QUERY_CONVERT:
373     {
374       GstFormat src_fmt, dest_fmt;
375       gint64 src_val, dest_val;
376
377       gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val);
378       if (!(res =
379               vorbis_dec_convert (pad, src_fmt, src_val, &dest_fmt, &dest_val)))
380         goto error;
381       gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val);
382       break;
383     }
384     default:
385       res = gst_pad_query_default (pad, query);
386       break;
387   }
388
389 done:
390   gst_object_unref (dec);
391
392   return res;
393
394   /* ERRORS */
395 error:
396   {
397     GST_DEBUG_OBJECT (dec, "error converting value");
398     goto done;
399   }
400 }
401
402 static gboolean
403 vorbis_dec_src_event (GstPad * pad, GstEvent * event)
404 {
405   gboolean res = TRUE;
406   GstVorbisDec *dec;
407
408   dec = GST_VORBIS_DEC (gst_pad_get_parent (pad));
409
410   switch (GST_EVENT_TYPE (event)) {
411     case GST_EVENT_SEEK:
412     {
413       GstFormat format, tformat;
414       gdouble rate;
415       GstEvent *real_seek;
416       GstSeekFlags flags;
417       GstSeekType cur_type, stop_type;
418       gint64 cur, stop;
419       gint64 tcur, tstop;
420       guint32 seqnum;
421
422       gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur,
423           &stop_type, &stop);
424       seqnum = gst_event_get_seqnum (event);
425       gst_event_unref (event);
426
427       /* First bring the requested format to time */
428       tformat = GST_FORMAT_TIME;
429       if (!(res = vorbis_dec_convert (pad, format, cur, &tformat, &tcur)))
430         goto convert_error;
431       if (!(res = vorbis_dec_convert (pad, format, stop, &tformat, &tstop)))
432         goto convert_error;
433
434       /* then seek with time on the peer */
435       real_seek = gst_event_new_seek (rate, GST_FORMAT_TIME,
436           flags, cur_type, tcur, stop_type, tstop);
437       gst_event_set_seqnum (real_seek, seqnum);
438
439       res = gst_pad_push_event (dec->sinkpad, real_seek);
440       break;
441     }
442     default:
443       res = gst_pad_push_event (dec->sinkpad, event);
444       break;
445   }
446 done:
447   gst_object_unref (dec);
448
449   return res;
450
451   /* ERRORS */
452 convert_error:
453   {
454     GST_DEBUG_OBJECT (dec, "cannot convert start/stop for seek");
455     goto done;
456   }
457 }
458
459 static gboolean
460 vorbis_dec_sink_event (GstPad * pad, GstEvent * event)
461 {
462   gboolean ret = FALSE;
463   GstVorbisDec *dec;
464
465   dec = GST_VORBIS_DEC (gst_pad_get_parent (pad));
466
467   GST_LOG_OBJECT (dec, "handling event");
468   switch (GST_EVENT_TYPE (event)) {
469     case GST_EVENT_EOS:
470       ret = gst_pad_push_event (dec->srcpad, event);
471       break;
472     case GST_EVENT_FLUSH_START:
473       ret = gst_pad_push_event (dec->srcpad, event);
474       break;
475     case GST_EVENT_FLUSH_STOP:
476       /* here we must clean any state in the decoder */
477 #ifdef HAVE_VORBIS_SYNTHESIS_RESTART
478       vorbis_synthesis_restart (&dec->vd);
479 #endif
480       gst_vorbis_dec_reset (dec);
481       ret = gst_pad_push_event (dec->srcpad, event);
482       break;
483     case GST_EVENT_NEWSEGMENT:
484     {
485       GstFormat format;
486       gdouble rate, arate;
487       gint64 start, stop, time;
488       gboolean update;
489
490       gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format,
491           &start, &stop, &time);
492
493       /* we need time for now */
494       if (format != GST_FORMAT_TIME)
495         goto newseg_wrong_format;
496
497       GST_DEBUG_OBJECT (dec,
498           "newsegment: update %d, rate %g, arate %g, start %" GST_TIME_FORMAT
499           ", stop %" GST_TIME_FORMAT ", time %" GST_TIME_FORMAT,
500           update, rate, arate, GST_TIME_ARGS (start), GST_TIME_ARGS (stop),
501           GST_TIME_ARGS (time));
502
503       /* now configure the values */
504       gst_segment_set_newsegment_full (&dec->segment, update,
505           rate, arate, format, start, stop, time);
506       dec->seqnum = gst_event_get_seqnum (event);
507
508       if (dec->initialized)
509         /* and forward */
510         ret = gst_pad_push_event (dec->srcpad, event);
511       else {
512         /* store it to send once we're initialized */
513         dec->pendingevents = g_list_append (dec->pendingevents, event);
514         ret = TRUE;
515       }
516       break;
517     }
518     case GST_EVENT_TAG:
519     {
520       if (dec->initialized)
521         /* and forward */
522         ret = gst_pad_push_event (dec->srcpad, event);
523       else {
524         /* store it to send once we're initialized */
525         dec->pendingevents = g_list_append (dec->pendingevents, event);
526         ret = TRUE;
527       }
528       break;
529     }
530     default:
531       ret = gst_pad_push_event (dec->srcpad, event);
532       break;
533   }
534 done:
535   gst_object_unref (dec);
536
537   return ret;
538
539   /* ERRORS */
540 newseg_wrong_format:
541   {
542     GST_DEBUG_OBJECT (dec, "received non TIME newsegment");
543     goto done;
544   }
545 }
546
547 static GstFlowReturn
548 vorbis_handle_identification_packet (GstVorbisDec * vd)
549 {
550   GstCaps *caps;
551   const GstAudioChannelPosition *pos = NULL;
552   gint width = GST_VORBIS_DEC_DEFAULT_SAMPLE_WIDTH;
553
554   switch (vd->vi.channels) {
555     case 1:
556     case 2:
557       /* nothing */
558       break;
559     case 3:
560     case 4:
561     case 5:
562     case 6:
563     case 7:
564     case 8:
565       pos = gst_vorbis_channel_positions[vd->vi.channels - 1];
566       break;
567     default:{
568       gint i;
569       GstAudioChannelPosition *posn =
570           g_new (GstAudioChannelPosition, vd->vi.channels);
571
572       GST_ELEMENT_WARNING (GST_ELEMENT (vd), STREAM, DECODE,
573           (NULL), ("Using NONE channel layout for more than 8 channels"));
574
575       for (i = 0; i < vd->vi.channels; i++)
576         posn[i] = GST_AUDIO_CHANNEL_POSITION_NONE;
577
578       pos = posn;
579     }
580   }
581
582   /* negotiate width with downstream */
583   caps = gst_pad_get_allowed_caps (vd->srcpad);
584   if (caps) {
585     if (!gst_caps_is_empty (caps)) {
586       GstStructure *s;
587
588       s = gst_caps_get_structure (caps, 0);
589       /* template ensures 16 or 32 */
590       gst_structure_get_int (s, "width", &width);
591     }
592     gst_caps_unref (caps);
593   }
594   vd->width = width >> 3;
595
596   caps = gst_caps_copy (gst_pad_get_pad_template_caps (vd->srcpad));
597   gst_caps_set_simple (caps, "rate", G_TYPE_INT, vd->vi.rate,
598       "channels", G_TYPE_INT, vd->vi.channels,
599       "width", G_TYPE_INT, width, NULL);
600
601   if (pos) {
602     gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos);
603   }
604
605   if (vd->vi.channels > 8) {
606     g_free ((GstAudioChannelPosition *) pos);
607   }
608
609   gst_pad_set_caps (vd->srcpad, caps);
610   gst_caps_unref (caps);
611
612   return GST_FLOW_OK;
613 }
614
615 static GstFlowReturn
616 vorbis_handle_comment_packet (GstVorbisDec * vd, ogg_packet * packet)
617 {
618   guint bitrate = 0;
619   gchar *encoder = NULL;
620   GstTagList *list, *old_list;
621   GstBuffer *buf;
622
623   GST_DEBUG_OBJECT (vd, "parsing comment packet");
624
625   buf = gst_buffer_new ();
626   GST_BUFFER_DATA (buf) = gst_ogg_packet_data (packet);
627   GST_BUFFER_SIZE (buf) = gst_ogg_packet_size (packet);
628
629   list =
630       gst_tag_list_from_vorbiscomment_buffer (buf, (guint8 *) "\003vorbis", 7,
631       &encoder);
632
633   old_list = vd->taglist;
634   vd->taglist = gst_tag_list_merge (vd->taglist, list, GST_TAG_MERGE_REPLACE);
635
636   if (old_list)
637     gst_tag_list_free (old_list);
638   gst_tag_list_free (list);
639   gst_buffer_unref (buf);
640
641   if (!vd->taglist) {
642     GST_ERROR_OBJECT (vd, "couldn't decode comments");
643     vd->taglist = gst_tag_list_new ();
644   }
645   if (encoder) {
646     if (encoder[0])
647       gst_tag_list_add (vd->taglist, GST_TAG_MERGE_REPLACE,
648           GST_TAG_ENCODER, encoder, NULL);
649     g_free (encoder);
650   }
651   gst_tag_list_add (vd->taglist, GST_TAG_MERGE_REPLACE,
652       GST_TAG_ENCODER_VERSION, vd->vi.version,
653       GST_TAG_AUDIO_CODEC, "Vorbis", NULL);
654   if (vd->vi.bitrate_nominal > 0 && vd->vi.bitrate_nominal <= 0x7FFFFFFF) {
655     gst_tag_list_add (vd->taglist, GST_TAG_MERGE_REPLACE,
656         GST_TAG_NOMINAL_BITRATE, (guint) vd->vi.bitrate_nominal, NULL);
657     bitrate = vd->vi.bitrate_nominal;
658   }
659   if (vd->vi.bitrate_upper > 0 && vd->vi.bitrate_upper <= 0x7FFFFFFF) {
660     gst_tag_list_add (vd->taglist, GST_TAG_MERGE_REPLACE,
661         GST_TAG_MAXIMUM_BITRATE, (guint) vd->vi.bitrate_upper, NULL);
662     if (!bitrate)
663       bitrate = vd->vi.bitrate_upper;
664   }
665   if (vd->vi.bitrate_lower > 0 && vd->vi.bitrate_lower <= 0x7FFFFFFF) {
666     gst_tag_list_add (vd->taglist, GST_TAG_MERGE_REPLACE,
667         GST_TAG_MINIMUM_BITRATE, (guint) vd->vi.bitrate_lower, NULL);
668     if (!bitrate)
669       bitrate = vd->vi.bitrate_lower;
670   }
671   if (bitrate) {
672     gst_tag_list_add (vd->taglist, GST_TAG_MERGE_REPLACE,
673         GST_TAG_BITRATE, (guint) bitrate, NULL);
674   }
675
676   if (vd->initialized) {
677     gst_element_found_tags_for_pad (GST_ELEMENT_CAST (vd), vd->srcpad,
678         vd->taglist);
679     vd->taglist = NULL;
680   } else {
681     /* Only post them as messages for the time being. *
682      * They will be pushed on the pad once the decoder is initialized */
683     gst_element_post_message (GST_ELEMENT_CAST (vd),
684         gst_message_new_tag (GST_OBJECT (vd), gst_tag_list_copy (vd->taglist)));
685   }
686
687   return GST_FLOW_OK;
688 }
689
690 static GstFlowReturn
691 vorbis_handle_type_packet (GstVorbisDec * vd)
692 {
693   GList *walk;
694   gint res;
695
696   g_assert (vd->initialized == FALSE);
697
698   if (G_UNLIKELY ((res = vorbis_synthesis_init (&vd->vd, &vd->vi))))
699     goto synthesis_init_error;
700
701   if (G_UNLIKELY ((res = vorbis_block_init (&vd->vd, &vd->vb))))
702     goto block_init_error;
703
704   vd->initialized = TRUE;
705
706   if (vd->pendingevents) {
707     for (walk = vd->pendingevents; walk; walk = g_list_next (walk))
708       gst_pad_push_event (vd->srcpad, GST_EVENT_CAST (walk->data));
709     g_list_free (vd->pendingevents);
710     vd->pendingevents = NULL;
711   }
712
713   if (vd->taglist) {
714     /* The tags have already been sent on the bus as messages. */
715     gst_pad_push_event (vd->srcpad, gst_event_new_tag (vd->taglist));
716     vd->taglist = NULL;
717   }
718   return GST_FLOW_OK;
719
720   /* ERRORS */
721 synthesis_init_error:
722   {
723     GST_ELEMENT_ERROR (GST_ELEMENT (vd), STREAM, DECODE,
724         (NULL), ("couldn't initialize synthesis (%d)", res));
725     return GST_FLOW_ERROR;
726   }
727 block_init_error:
728   {
729     GST_ELEMENT_ERROR (GST_ELEMENT (vd), STREAM, DECODE,
730         (NULL), ("couldn't initialize block (%d)", res));
731     return GST_FLOW_ERROR;
732   }
733 }
734
735 static GstFlowReturn
736 vorbis_handle_header_packet (GstVorbisDec * vd, ogg_packet * packet)
737 {
738   GstFlowReturn res;
739   gint ret;
740
741   GST_DEBUG_OBJECT (vd, "parsing header packet");
742
743   /* Packetno = 0 if the first byte is exactly 0x01 */
744   packet->b_o_s = ((gst_ogg_packet_data (packet))[0] == 0x1) ? 1 : 0;
745
746   if ((ret = vorbis_synthesis_headerin (&vd->vi, &vd->vc, packet)))
747     goto header_read_error;
748
749   switch ((gst_ogg_packet_data (packet))[0]) {
750     case 0x01:
751       res = vorbis_handle_identification_packet (vd);
752       break;
753     case 0x03:
754       res = vorbis_handle_comment_packet (vd, packet);
755       break;
756     case 0x05:
757       res = vorbis_handle_type_packet (vd);
758       break;
759     default:
760       /* ignore */
761       g_warning ("unknown vorbis header packet found");
762       res = GST_FLOW_OK;
763       break;
764   }
765   return res;
766
767   /* ERRORS */
768 header_read_error:
769   {
770     GST_ELEMENT_ERROR (GST_ELEMENT (vd), STREAM, DECODE,
771         (NULL), ("couldn't read header packet (%d)", ret));
772     return GST_FLOW_ERROR;
773   }
774 }
775
776 static GstFlowReturn
777 vorbis_dec_push_forward (GstVorbisDec * dec, GstBuffer * buf)
778 {
779   GstFlowReturn result;
780
781   /* clip */
782   if (!(buf = gst_audio_buffer_clip (buf, &dec->segment, dec->vi.rate,
783               dec->vi.channels * dec->width))) {
784     GST_LOG_OBJECT (dec, "clipped buffer");
785     return GST_FLOW_OK;
786   }
787
788   if (dec->discont) {
789     GST_LOG_OBJECT (dec, "setting DISCONT");
790     GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
791     dec->discont = FALSE;
792   }
793
794   GST_DEBUG_OBJECT (dec,
795       "pushing time %" GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT,
796       GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
797       GST_TIME_ARGS (GST_BUFFER_DURATION (buf)));
798
799   result = gst_pad_push (dec->srcpad, buf);
800
801   return result;
802 }
803
804 static GstFlowReturn
805 vorbis_dec_push_reverse (GstVorbisDec * dec, GstBuffer * buf)
806 {
807   GstFlowReturn result = GST_FLOW_OK;
808
809   dec->queued = g_list_prepend (dec->queued, buf);
810
811   return result;
812 }
813
814 static void
815 vorbis_do_timestamps (GstVorbisDec * vd, GstBuffer * buf, gboolean reverse,
816     GstClockTime timestamp, GstClockTime duration)
817 {
818   /* interpolate reverse */
819   if (vd->last_timestamp != -1 && reverse)
820     vd->last_timestamp -= duration;
821
822   /* take buffer timestamp, use interpolated timestamp otherwise */
823   if (timestamp != -1)
824     vd->last_timestamp = timestamp;
825   else
826     timestamp = vd->last_timestamp;
827
828   /* interpolate forwards */
829   if (vd->last_timestamp != -1 && !reverse)
830     vd->last_timestamp += duration;
831
832   GST_BUFFER_TIMESTAMP (buf) = timestamp;
833   GST_BUFFER_DURATION (buf) = duration;
834 }
835
836 static GstFlowReturn
837 vorbis_handle_data_packet (GstVorbisDec * vd, ogg_packet * packet,
838     GstClockTime timestamp, GstClockTime duration)
839 {
840   vorbis_sample_t **pcm;
841   guint sample_count;
842   GstBuffer *out;
843   GstFlowReturn result;
844   gint size;
845
846   if (G_UNLIKELY (!vd->initialized))
847     goto not_initialized;
848
849   /* normal data packet */
850   /* FIXME, we can skip decoding if the packet is outside of the
851    * segment, this is however not very trivial as we need a previous
852    * packet to decode the current one so we must be carefull not to
853    * throw away too much. For now we decode everything and clip right
854    * before pushing data. */
855   if (G_UNLIKELY (vorbis_synthesis (&vd->vb, packet)))
856     goto could_not_read;
857
858   if (G_UNLIKELY (vorbis_synthesis_blockin (&vd->vd, &vd->vb) < 0))
859     goto not_accepted;
860
861   /* assume all goes well here */
862   result = GST_FLOW_OK;
863
864   /* count samples ready for reading */
865   if ((sample_count = vorbis_synthesis_pcmout (&vd->vd, NULL)) == 0)
866     goto done;
867
868   size = sample_count * vd->vi.channels * vd->width;
869   GST_LOG_OBJECT (vd, "%d samples ready for reading, size %d", sample_count,
870       size);
871
872   /* alloc buffer for it */
873   result =
874       gst_pad_alloc_buffer_and_set_caps (vd->srcpad, GST_BUFFER_OFFSET_NONE,
875       size, GST_PAD_CAPS (vd->srcpad), &out);
876   if (G_UNLIKELY (result != GST_FLOW_OK))
877     goto done;
878
879   /* get samples ready for reading now, should be sample_count */
880   if (G_UNLIKELY ((vorbis_synthesis_pcmout (&vd->vd, &pcm)) != sample_count))
881     goto wrong_samples;
882
883   /* copy samples in buffer */
884   copy_samples ((vorbis_sample_t *) GST_BUFFER_DATA (out), pcm, sample_count,
885       vd->vi.channels, vd->width);
886
887   GST_LOG_OBJECT (vd, "setting output size to %d", size);
888   GST_BUFFER_SIZE (out) = size;
889
890   /* this should not overflow */
891   if (duration == -1)
892     duration = sample_count * GST_SECOND / vd->vi.rate;
893
894   vorbis_do_timestamps (vd, out, FALSE, timestamp, duration);
895
896   if (vd->segment.rate >= 0.0)
897     result = vorbis_dec_push_forward (vd, out);
898   else
899     result = vorbis_dec_push_reverse (vd, out);
900
901 done:
902   vorbis_synthesis_read (&vd->vd, sample_count);
903
904   return result;
905
906   /* ERRORS */
907 not_initialized:
908   {
909     GST_ELEMENT_ERROR (GST_ELEMENT (vd), STREAM, DECODE,
910         (NULL), ("no header sent yet"));
911     return GST_FLOW_ERROR;
912   }
913 could_not_read:
914   {
915     GST_ELEMENT_ERROR (GST_ELEMENT (vd), STREAM, DECODE,
916         (NULL), ("couldn't read data packet"));
917     return GST_FLOW_ERROR;
918   }
919 not_accepted:
920   {
921     GST_ELEMENT_ERROR (GST_ELEMENT (vd), STREAM, DECODE,
922         (NULL), ("vorbis decoder did not accept data packet"));
923     return GST_FLOW_ERROR;
924   }
925 wrong_samples:
926   {
927     gst_buffer_unref (out);
928     GST_ELEMENT_ERROR (GST_ELEMENT (vd), STREAM, DECODE,
929         (NULL), ("vorbis decoder reported wrong number of samples"));
930     return GST_FLOW_ERROR;
931   }
932 }
933
934 static GstFlowReturn
935 vorbis_dec_decode_buffer (GstVorbisDec * vd, GstBuffer * buffer)
936 {
937   ogg_packet *packet;
938   ogg_packet_wrapper packet_wrapper;
939   GstFlowReturn result = GST_FLOW_OK;
940
941   /* make ogg_packet out of the buffer */
942   gst_ogg_packet_wrapper_from_buffer (&packet_wrapper, buffer);
943   packet = gst_ogg_packet_from_wrapper (&packet_wrapper);
944   /* set some more stuff */
945   packet->granulepos = -1;
946   packet->packetno = 0;         /* we don't care */
947   /* EOS does not matter, it is used in vorbis to implement clipping the last
948    * block of samples based on the granulepos. We clip based on segments. */
949   packet->e_o_s = 0;
950
951   GST_LOG_OBJECT (vd, "decode buffer of size %ld", packet->bytes);
952
953   /* error out on empty header packets, but just skip empty data packets */
954   if (G_UNLIKELY (packet->bytes == 0)) {
955     if (vd->initialized)
956       goto empty_buffer;
957     else
958       goto empty_header;
959   }
960
961   /* switch depending on packet type */
962   if ((gst_ogg_packet_data (packet))[0] & 1) {
963     if (vd->initialized) {
964       GST_WARNING_OBJECT (vd, "Already initialized, so ignoring header packet");
965       goto done;
966     }
967     result = vorbis_handle_header_packet (vd, packet);
968   } else {
969     GstClockTime timestamp, duration;
970
971     timestamp = GST_BUFFER_TIMESTAMP (buffer);
972     duration = GST_BUFFER_DURATION (buffer);
973
974     result = vorbis_handle_data_packet (vd, packet, timestamp, duration);
975   }
976
977 done:
978   return result;
979
980 empty_buffer:
981   {
982     /* don't error out here, just ignore the buffer, it's invalid for vorbis
983      * but not fatal. */
984     GST_WARNING_OBJECT (vd, "empty buffer received, ignoring");
985     result = GST_FLOW_OK;
986     goto done;
987   }
988
989 /* ERRORS */
990 empty_header:
991   {
992     GST_ELEMENT_ERROR (vd, STREAM, DECODE, (NULL), ("empty header received"));
993     result = GST_FLOW_ERROR;
994     vd->discont = TRUE;
995     goto done;
996   }
997 }
998
999 /*
1000  * Input:
1001  *  Buffer decoding order:  7  8  9  4  5  6  3  1  2  EOS
1002  *  Discont flag:           D        D        D  D
1003  *
1004  * - Each Discont marks a discont in the decoding order.
1005  *
1006  * for vorbis, each buffer is a keyframe when we have the previous
1007  * buffer. This means that to decode buffer 7, we need buffer 6, which
1008  * arrives out of order.
1009  *
1010  * we first gather buffers in the gather queue until we get a DISCONT. We
1011  * prepend each incomming buffer so that they are in reversed order.
1012  *
1013  *    gather queue:    9  8  7
1014  *    decode queue:
1015  *    output queue:
1016  *
1017  * When a DISCONT is received (buffer 4), we move the gather queue to the
1018  * decode queue. This is simply done be taking the head of the gather queue
1019  * and prepending it to the decode queue. This yields:
1020  *
1021  *    gather queue:
1022  *    decode queue:    7  8  9
1023  *    output queue:
1024  *
1025  * Then we decode each buffer in the decode queue in order and put the output
1026  * buffer in the output queue. The first buffer (7) will not produce any output
1027  * because it needs the previous buffer (6) which did not arrive yet. This
1028  * yields:
1029  *
1030  *    gather queue:
1031  *    decode queue:    7  8  9
1032  *    output queue:    9  8
1033  *
1034  * Then we remove the consumed buffers from the decode queue. Buffer 7 is not
1035  * completely consumed, we need to keep it around for when we receive buffer
1036  * 6. This yields:
1037  *
1038  *    gather queue:
1039  *    decode queue:    7
1040  *    output queue:    9  8
1041  *
1042  * Then we accumulate more buffers:
1043  *
1044  *    gather queue:    6  5  4
1045  *    decode queue:    7
1046  *    output queue:
1047  *
1048  * prepending to the decode queue on DISCONT yields:
1049  *
1050  *    gather queue:
1051  *    decode queue:    4  5  6  7
1052  *    output queue:
1053  *
1054  * after decoding and keeping buffer 4:
1055  *
1056  *    gather queue:
1057  *    decode queue:    4
1058  *    output queue:    7  6  5
1059  *
1060  * Etc..
1061  */
1062 static GstFlowReturn
1063 vorbis_dec_flush_decode (GstVorbisDec * dec)
1064 {
1065   GstFlowReturn res = GST_FLOW_OK;
1066   GList *walk;
1067
1068   walk = dec->decode;
1069
1070   GST_DEBUG_OBJECT (dec, "flushing buffers to decoder");
1071
1072   while (walk) {
1073     GList *next;
1074     GstBuffer *buf = GST_BUFFER_CAST (walk->data);
1075
1076     GST_DEBUG_OBJECT (dec, "decoding buffer %p, ts %" GST_TIME_FORMAT,
1077         buf, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)));
1078
1079     next = g_list_next (walk);
1080
1081     /* decode buffer, prepend to output queue */
1082     res = vorbis_dec_decode_buffer (dec, buf);
1083
1084     /* if we generated output, we can discard the buffer, else we
1085      * keep it in the queue */
1086     if (dec->queued) {
1087       GST_DEBUG_OBJECT (dec, "decoded buffer to %p", dec->queued->data);
1088       dec->decode = g_list_delete_link (dec->decode, walk);
1089       gst_buffer_unref (buf);
1090     } else {
1091       GST_DEBUG_OBJECT (dec, "buffer did not decode, keeping");
1092     }
1093     walk = next;
1094   }
1095   while (dec->queued) {
1096     GstBuffer *buf = GST_BUFFER_CAST (dec->queued->data);
1097     GstClockTime timestamp, duration;
1098
1099     timestamp = GST_BUFFER_TIMESTAMP (buf);
1100     duration = GST_BUFFER_DURATION (buf);
1101
1102     vorbis_do_timestamps (dec, buf, TRUE, timestamp, duration);
1103     res = vorbis_dec_push_forward (dec, buf);
1104
1105     dec->queued = g_list_delete_link (dec->queued, dec->queued);
1106   }
1107   return res;
1108 }
1109
1110 static GstFlowReturn
1111 vorbis_dec_chain_reverse (GstVorbisDec * vd, gboolean discont, GstBuffer * buf)
1112 {
1113   GstFlowReturn result = GST_FLOW_OK;
1114
1115   /* if we have a discont, move buffers to the decode list */
1116   if (G_UNLIKELY (discont)) {
1117     GST_DEBUG_OBJECT (vd, "received discont");
1118     while (vd->gather) {
1119       GstBuffer *gbuf;
1120
1121       gbuf = GST_BUFFER_CAST (vd->gather->data);
1122       /* remove from the gather list */
1123       vd->gather = g_list_delete_link (vd->gather, vd->gather);
1124       /* copy to decode queue */
1125       vd->decode = g_list_prepend (vd->decode, gbuf);
1126     }
1127     /* flush and decode the decode queue */
1128     result = vorbis_dec_flush_decode (vd);
1129   }
1130
1131   GST_DEBUG_OBJECT (vd, "gathering buffer %p of size %u, time %" GST_TIME_FORMAT
1132       ", dur %" GST_TIME_FORMAT, buf, GST_BUFFER_SIZE (buf),
1133       GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
1134       GST_TIME_ARGS (GST_BUFFER_DURATION (buf)));
1135
1136   /* add buffer to gather queue */
1137   vd->gather = g_list_prepend (vd->gather, buf);
1138
1139   return result;
1140 }
1141
1142 static GstFlowReturn
1143 vorbis_dec_chain_forward (GstVorbisDec * vd, gboolean discont,
1144     GstBuffer * buffer)
1145 {
1146   GstFlowReturn result;
1147
1148   result = vorbis_dec_decode_buffer (vd, buffer);
1149
1150   gst_buffer_unref (buffer);
1151
1152   return result;
1153 }
1154
1155 static GstFlowReturn
1156 vorbis_dec_chain (GstPad * pad, GstBuffer * buffer)
1157 {
1158   GstVorbisDec *vd;
1159   GstFlowReturn result = GST_FLOW_OK;
1160   gboolean discont;
1161
1162   vd = GST_VORBIS_DEC (gst_pad_get_parent (pad));
1163
1164   discont = GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT);
1165
1166   /* resync on DISCONT */
1167   if (G_UNLIKELY (discont)) {
1168     GST_DEBUG_OBJECT (vd, "received DISCONT buffer");
1169     vd->last_timestamp = GST_CLOCK_TIME_NONE;
1170 #ifdef HAVE_VORBIS_SYNTHESIS_RESTART
1171     vorbis_synthesis_restart (&vd->vd);
1172 #endif
1173     vd->discont = TRUE;
1174   }
1175
1176   if (vd->segment.rate >= 0.0)
1177     result = vorbis_dec_chain_forward (vd, discont, buffer);
1178   else
1179     result = vorbis_dec_chain_reverse (vd, discont, buffer);
1180
1181   gst_object_unref (vd);
1182
1183   return result;
1184 }
1185
1186 static GstStateChangeReturn
1187 vorbis_dec_change_state (GstElement * element, GstStateChange transition)
1188 {
1189   GstVorbisDec *vd = GST_VORBIS_DEC (element);
1190   GstStateChangeReturn res;
1191
1192   switch (transition) {
1193     case GST_STATE_CHANGE_NULL_TO_READY:
1194       break;
1195     case GST_STATE_CHANGE_READY_TO_PAUSED:
1196       vorbis_info_init (&vd->vi);
1197       vorbis_comment_init (&vd->vc);
1198       vd->initialized = FALSE;
1199       gst_vorbis_dec_reset (vd);
1200       break;
1201     case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
1202       break;
1203     default:
1204       break;
1205   }
1206
1207   res = parent_class->change_state (element, transition);
1208
1209   switch (transition) {
1210     case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
1211       break;
1212     case GST_STATE_CHANGE_PAUSED_TO_READY:
1213       GST_DEBUG_OBJECT (vd, "PAUSED -> READY, clearing vorbis structures");
1214       vd->initialized = FALSE;
1215       vorbis_block_clear (&vd->vb);
1216       vorbis_dsp_clear (&vd->vd);
1217       vorbis_comment_clear (&vd->vc);
1218       vorbis_info_clear (&vd->vi);
1219       gst_vorbis_dec_reset (vd);
1220       break;
1221     case GST_STATE_CHANGE_READY_TO_NULL:
1222       break;
1223     default:
1224       break;
1225   }
1226
1227   return res;
1228 }