1 /* GStreamer Matroska muxer/demuxer
2 * (c) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
3 * (c) 2006 Tim-Philipp Müller <tim centricular net>
4 * (c) 2008 Sebastian Dröge <slomo@circular-chaos.org>
5 * (c) 2011 Debarshi Ray <rishi@gnu.org>
7 * matroska-demux.c: matroska file/stream demuxer
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public
11 * License as published by the Free Software Foundation; either
12 * version 2 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Library General Public License for more details.
19 * You should have received a copy of the GNU Library General Public
20 * License along with this library; if not, write to the
21 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22 * Boston, MA 02111-1307, USA.
25 /* TODO: check CRC32 if present
26 * TODO: there can be a segment after the first segment. Handle like
27 * chained oggs. Fixes #334082
28 * TODO: Test samples: http://www.matroska.org/samples/matrix/index.html
29 * http://samples.mplayerhq.hu/Matroska/
30 * TODO: check if demuxing is done correct for all codecs according to spec
31 * TODO: seeking with incomplete or without CUE
35 * SECTION:element-matroskademux
37 * matroskademux demuxes a Matroska file into the different contained streams.
40 * <title>Example launch line</title>
42 * gst-launch -v filesrc location=/path/to/mkv ! matroskademux ! vorbisdec ! audioconvert ! audioresample ! autoaudiosink
43 * ]| This pipeline demuxes a Matroska file and outputs the contained Vorbis audio.
54 #include <glib/gprintf.h>
56 /* For AVI compatibility mode
57 and for fourcc stuff */
58 #include <gst/riff/riff-read.h>
59 #include <gst/riff/riff-ids.h>
60 #include <gst/riff/riff-media.h>
62 #include <gst/tag/tag.h>
64 #include <gst/base/gsttypefindhelper.h>
66 #include <gst/pbutils/pbutils.h>
68 #include "matroska-demux.h"
69 #include "matroska-ids.h"
71 GST_DEBUG_CATEGORY_STATIC (matroskademux_debug);
72 #define GST_CAT_DEFAULT matroskademux_debug
74 #define DEBUG_ELEMENT_START(demux, ebml, element) \
75 GST_DEBUG_OBJECT (demux, "Parsing " element " element at offset %" \
76 G_GUINT64_FORMAT, gst_ebml_read_get_pos (ebml))
78 #define DEBUG_ELEMENT_STOP(demux, ebml, element, ret) \
79 GST_DEBUG_OBJECT (demux, "Parsing " element " element " \
80 " finished with '%s'", gst_flow_get_name (ret))
89 static GstStaticPadTemplate sink_templ = GST_STATIC_PAD_TEMPLATE ("sink",
92 GST_STATIC_CAPS ("video/x-matroska; video/webm")
95 /* TODO: fill in caps! */
97 static GstStaticPadTemplate audio_src_templ =
98 GST_STATIC_PAD_TEMPLATE ("audio_%02d",
101 GST_STATIC_CAPS ("ANY")
104 static GstStaticPadTemplate video_src_templ =
105 GST_STATIC_PAD_TEMPLATE ("video_%02d",
108 GST_STATIC_CAPS ("ANY")
111 static GstStaticPadTemplate subtitle_src_templ =
112 GST_STATIC_PAD_TEMPLATE ("subtitle_%02d",
115 GST_STATIC_CAPS ("text/plain; application/x-ssa; application/x-ass; "
116 "application/x-usf; video/x-dvd-subpicture; "
117 "subpicture/x-pgs; subtitle/x-kate; " "application/x-subtitle-unknown")
120 static GstFlowReturn gst_matroska_demux_parse_id (GstMatroskaDemux * demux,
121 guint32 id, guint64 length, guint needed);
123 /* element functions */
124 static void gst_matroska_demux_loop (GstPad * pad);
126 static gboolean gst_matroska_demux_element_send_event (GstElement * element,
128 static gboolean gst_matroska_demux_element_query (GstElement * element,
132 static gboolean gst_matroska_demux_sink_activate_pull (GstPad * sinkpad,
134 static gboolean gst_matroska_demux_sink_activate (GstPad * sinkpad);
136 static gboolean gst_matroska_demux_handle_seek_event (GstMatroskaDemux * demux,
137 GstPad * pad, GstEvent * event);
138 static gboolean gst_matroska_demux_handle_src_event (GstPad * pad,
140 static const GstQueryType *gst_matroska_demux_get_src_query_types (GstPad *
142 static gboolean gst_matroska_demux_handle_src_query (GstPad * pad,
145 static gboolean gst_matroska_demux_handle_sink_event (GstPad * pad,
147 static GstFlowReturn gst_matroska_demux_chain (GstPad * pad,
150 static GstStateChangeReturn
151 gst_matroska_demux_change_state (GstElement * element,
152 GstStateChange transition);
154 gst_matroska_demux_set_index (GstElement * element, GstIndex * index);
155 static GstIndex *gst_matroska_demux_get_index (GstElement * element);
158 static GstCaps *gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext
159 * videocontext, const gchar * codec_id, guint8 * data, guint size,
160 gchar ** codec_name, guint32 * riff_fourcc);
161 static GstCaps *gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext
162 * audiocontext, const gchar * codec_id, guint8 * data, guint size,
163 gchar ** codec_name, guint16 * riff_audio_fmt);
165 * gst_matroska_demux_subtitle_caps (GstMatroskaTrackSubtitleContext *
166 subtitlecontext, const gchar * codec_id, gpointer data, guint size);
169 static void gst_matroska_demux_reset (GstElement * element);
170 static gboolean perform_seek_to_offset (GstMatroskaDemux * demux,
173 GType gst_matroska_demux_get_type (void);
174 GST_BOILERPLATE (GstMatroskaDemux, gst_matroska_demux, GstElement,
178 gst_matroska_demux_base_init (gpointer klass)
180 GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
182 gst_element_class_add_pad_template (element_class,
183 gst_static_pad_template_get (&video_src_templ));
184 gst_element_class_add_pad_template (element_class,
185 gst_static_pad_template_get (&audio_src_templ));
186 gst_element_class_add_pad_template (element_class,
187 gst_static_pad_template_get (&subtitle_src_templ));
188 gst_element_class_add_pad_template (element_class,
189 gst_static_pad_template_get (&sink_templ));
191 gst_element_class_set_details_simple (element_class, "Matroska demuxer",
193 "Demuxes Matroska/WebM streams into video/audio/subtitles",
194 "GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>");
198 gst_matroska_demux_finalize (GObject * object)
200 GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (object);
202 if (demux->common.src) {
203 g_ptr_array_free (demux->common.src, TRUE);
204 demux->common.src = NULL;
207 if (demux->global_tags) {
208 gst_tag_list_free (demux->global_tags);
209 demux->global_tags = NULL;
212 g_object_unref (demux->adapter);
214 G_OBJECT_CLASS (parent_class)->finalize (object);
218 gst_matroska_demux_class_init (GstMatroskaDemuxClass * klass)
220 GObjectClass *gobject_class = (GObjectClass *) klass;
221 GstElementClass *gstelement_class = (GstElementClass *) klass;
223 GST_DEBUG_CATEGORY_INIT (matroskademux_debug, "matroskademux", 0,
226 gobject_class->finalize = gst_matroska_demux_finalize;
228 gstelement_class->change_state =
229 GST_DEBUG_FUNCPTR (gst_matroska_demux_change_state);
230 gstelement_class->send_event =
231 GST_DEBUG_FUNCPTR (gst_matroska_demux_element_send_event);
232 gstelement_class->query =
233 GST_DEBUG_FUNCPTR (gst_matroska_demux_element_query);
235 gstelement_class->set_index =
236 GST_DEBUG_FUNCPTR (gst_matroska_demux_set_index);
237 gstelement_class->get_index =
238 GST_DEBUG_FUNCPTR (gst_matroska_demux_get_index);
242 gst_matroska_demux_init (GstMatroskaDemux * demux,
243 GstMatroskaDemuxClass * klass)
245 demux->sinkpad = gst_pad_new_from_static_template (&sink_templ, "sink");
246 gst_pad_set_activate_function (demux->sinkpad,
247 GST_DEBUG_FUNCPTR (gst_matroska_demux_sink_activate));
248 gst_pad_set_activatepull_function (demux->sinkpad,
249 GST_DEBUG_FUNCPTR (gst_matroska_demux_sink_activate_pull));
250 gst_pad_set_chain_function (demux->sinkpad,
251 GST_DEBUG_FUNCPTR (gst_matroska_demux_chain));
252 gst_pad_set_event_function (demux->sinkpad,
253 GST_DEBUG_FUNCPTR (gst_matroska_demux_handle_sink_event));
254 gst_element_add_pad (GST_ELEMENT (demux), demux->sinkpad);
256 /* initial stream no. */
257 demux->common.src = NULL;
259 demux->writing_app = NULL;
260 demux->muxing_app = NULL;
261 demux->common.index = NULL;
262 demux->global_tags = NULL;
264 demux->adapter = gst_adapter_new ();
267 gst_matroska_demux_reset (GST_ELEMENT (demux));
271 gst_matroska_track_free (GstMatroskaTrackContext * track)
273 g_free (track->codec_id);
274 g_free (track->codec_name);
275 g_free (track->name);
276 g_free (track->language);
277 g_free (track->codec_priv);
278 g_free (track->codec_state);
280 if (track->encodings != NULL) {
283 for (i = 0; i < track->encodings->len; ++i) {
284 GstMatroskaTrackEncoding *enc = &g_array_index (track->encodings,
285 GstMatroskaTrackEncoding,
288 g_free (enc->comp_settings);
290 g_array_free (track->encodings, TRUE);
293 if (track->pending_tags)
294 gst_tag_list_free (track->pending_tags);
296 if (track->index_table)
297 g_array_free (track->index_table, TRUE);
303 * Returns the aggregated GstFlowReturn.
306 gst_matroska_demux_combine_flows (GstMatroskaDemux * demux,
307 GstMatroskaTrackContext * track, GstFlowReturn ret)
311 /* store the value */
312 track->last_flow = ret;
314 /* any other error that is not-linked can be returned right away */
315 if (ret != GST_FLOW_NOT_LINKED)
318 /* only return NOT_LINKED if all other pads returned NOT_LINKED */
319 g_assert (demux->common.src->len == demux->common.num_streams);
320 for (i = 0; i < demux->common.src->len; i++) {
321 GstMatroskaTrackContext *ostream = g_ptr_array_index (demux->common.src,
327 ret = ostream->last_flow;
328 /* some other return value (must be SUCCESS but we can return
329 * other values as well) */
330 if (ret != GST_FLOW_NOT_LINKED)
333 /* if we get here, all other pads were unlinked and we return
336 GST_LOG_OBJECT (demux, "combined return %s", gst_flow_get_name (ret));
341 gst_matroska_demux_free_parsed_el (gpointer mem, gpointer user_data)
343 g_slice_free (guint64, mem);
347 gst_matroska_demux_reset (GstElement * element)
349 GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (element);
352 GST_DEBUG_OBJECT (demux, "Resetting state");
355 demux->common.state = GST_MATROSKA_READ_STATE_START;
357 /* clean up existing streams */
358 if (demux->common.src) {
359 g_assert (demux->common.src->len == demux->common.num_streams);
360 for (i = 0; i < demux->common.src->len; i++) {
361 GstMatroskaTrackContext *context = g_ptr_array_index (demux->common.src,
364 if (context->pad != NULL)
365 gst_element_remove_pad (GST_ELEMENT (demux), context->pad);
367 gst_caps_replace (&context->caps, NULL);
368 gst_matroska_track_free (context);
370 g_ptr_array_free (demux->common.src, TRUE);
372 demux->common.src = g_ptr_array_new ();
374 demux->common.num_streams = 0;
375 demux->num_a_streams = 0;
376 demux->num_t_streams = 0;
377 demux->num_v_streams = 0;
379 /* reset media info */
380 g_free (demux->writing_app);
381 demux->writing_app = NULL;
382 g_free (demux->muxing_app);
383 demux->muxing_app = NULL;
386 if (demux->common.index) {
387 g_array_free (demux->common.index, TRUE);
388 demux->common.index = NULL;
391 if (demux->clusters) {
392 g_array_free (demux->clusters, TRUE);
393 demux->clusters = NULL;
398 demux->common.time_scale = 1000000;
399 demux->created = G_MININT64;
401 demux->common.index_parsed = FALSE;
402 demux->tracks_parsed = FALSE;
403 demux->segmentinfo_parsed = FALSE;
404 demux->attachments_parsed = FALSE;
406 g_list_foreach (demux->tags_parsed,
407 (GFunc) gst_matroska_demux_free_parsed_el, NULL);
408 g_list_free (demux->tags_parsed);
409 demux->tags_parsed = NULL;
411 g_list_foreach (demux->seek_parsed,
412 (GFunc) gst_matroska_demux_free_parsed_el, NULL);
413 g_list_free (demux->seek_parsed);
414 demux->seek_parsed = NULL;
416 gst_segment_init (&demux->segment, GST_FORMAT_TIME);
417 demux->last_stop_end = GST_CLOCK_TIME_NONE;
418 demux->seek_block = 0;
421 demux->cluster_time = GST_CLOCK_TIME_NONE;
422 demux->cluster_offset = 0;
423 demux->next_cluster_offset = 0;
424 demux->index_offset = 0;
425 demux->seekable = FALSE;
426 demux->need_newsegment = FALSE;
427 demux->building_index = FALSE;
428 if (demux->seek_event) {
429 gst_event_unref (demux->seek_event);
430 demux->seek_event = NULL;
433 demux->seek_index = NULL;
434 demux->seek_entry = 0;
436 if (demux->close_segment) {
437 gst_event_unref (demux->close_segment);
438 demux->close_segment = NULL;
441 if (demux->new_segment) {
442 gst_event_unref (demux->new_segment);
443 demux->new_segment = NULL;
446 if (demux->common.element_index) {
447 gst_object_unref (demux->common.element_index);
448 demux->common.element_index = NULL;
450 demux->common.element_index_writer_id = -1;
452 if (demux->global_tags) {
453 gst_tag_list_free (demux->global_tags);
455 demux->global_tags = gst_tag_list_new ();
457 if (demux->cached_buffer) {
458 gst_buffer_unref (demux->cached_buffer);
459 demux->cached_buffer = NULL;
464 * Calls pull_range for (offset,size) without advancing our offset
467 gst_matroska_demux_peek_bytes (GstMatroskaDemux * demux, guint64 offset,
468 guint size, GstBuffer ** p_buf, guint8 ** bytes)
472 /* Caching here actually makes much less difference than one would expect.
473 * We do it mainly to avoid pulling buffers of 1 byte all the time */
474 if (demux->cached_buffer) {
475 guint64 cache_offset = GST_BUFFER_OFFSET (demux->cached_buffer);
476 guint cache_size = GST_BUFFER_SIZE (demux->cached_buffer);
478 if (cache_offset <= demux->offset &&
479 (demux->offset + size) <= (cache_offset + cache_size)) {
481 *p_buf = gst_buffer_create_sub (demux->cached_buffer,
482 demux->offset - cache_offset, size);
484 *bytes = GST_BUFFER_DATA (demux->cached_buffer) + demux->offset -
488 /* not enough data in the cache, free cache and get a new one */
489 gst_buffer_unref (demux->cached_buffer);
490 demux->cached_buffer = NULL;
493 /* refill the cache */
494 ret = gst_pad_pull_range (demux->sinkpad, demux->offset,
495 MAX (size, 64 * 1024), &demux->cached_buffer);
496 if (ret != GST_FLOW_OK) {
497 demux->cached_buffer = NULL;
501 if (GST_BUFFER_SIZE (demux->cached_buffer) >= size) {
503 *p_buf = gst_buffer_create_sub (demux->cached_buffer, 0, size);
505 *bytes = GST_BUFFER_DATA (demux->cached_buffer);
509 /* Not possible to get enough data, try a last time with
510 * requesting exactly the size we need */
511 gst_buffer_unref (demux->cached_buffer);
512 demux->cached_buffer = NULL;
515 gst_pad_pull_range (demux->sinkpad, demux->offset, size,
516 &demux->cached_buffer);
517 if (ret != GST_FLOW_OK) {
518 GST_DEBUG_OBJECT (demux, "pull_range returned %d", ret);
526 if (GST_BUFFER_SIZE (demux->cached_buffer) < size) {
527 GST_WARNING_OBJECT (demux, "Dropping short buffer at offset %"
528 G_GUINT64_FORMAT ": wanted %u bytes, got %u bytes", demux->offset,
529 size, GST_BUFFER_SIZE (demux->cached_buffer));
531 gst_buffer_unref (demux->cached_buffer);
532 demux->cached_buffer = NULL;
537 return GST_FLOW_UNEXPECTED;
541 *p_buf = gst_buffer_create_sub (demux->cached_buffer, 0, size);
543 *bytes = GST_BUFFER_DATA (demux->cached_buffer);
548 static const guint8 *
549 gst_matroska_demux_peek_pull (GstMatroskaDemux * demux, guint peek)
553 gst_matroska_demux_peek_bytes (demux, demux->offset, peek, NULL, &data);
558 gst_matroska_demux_peek_id_length_pull (GstMatroskaDemux * demux, guint32 * _id,
559 guint64 * _length, guint * _needed)
561 return gst_ebml_peek_id_length (_id, _length, _needed,
562 (GstPeekData) gst_matroska_demux_peek_pull, (gpointer) demux,
563 GST_ELEMENT_CAST (demux), demux->offset);
567 gst_matroska_demux_get_length (GstMatroskaDemux * demux)
569 GstFormat fmt = GST_FORMAT_BYTES;
572 if (!gst_pad_query_peer_duration (demux->sinkpad, &fmt, &end) ||
573 fmt != GST_FORMAT_BYTES || end < 0)
574 GST_DEBUG_OBJECT (demux, "no upstream length");
580 gst_matroska_demux_encoding_cmp (GstMatroskaTrackEncoding * a,
581 GstMatroskaTrackEncoding * b)
583 if (b->order > a->order)
585 else if (b->order < a->order)
592 gst_matroska_demux_encoding_order_unique (GArray * encodings, guint64 order)
596 if (encodings == NULL || encodings->len == 0)
599 for (i = 0; i < encodings->len; i++)
600 if (g_array_index (encodings, GstMatroskaTrackEncoding, i).order == order)
607 gst_matroska_demux_read_track_encoding (GstMatroskaDemux * demux,
608 GstEbmlRead * ebml, GstMatroskaTrackContext * context)
610 GstMatroskaTrackEncoding enc = { 0, };
614 DEBUG_ELEMENT_START (demux, ebml, "ContentEncoding");
615 /* Set default values */
617 /* All other default values are 0 */
619 if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) {
620 DEBUG_ELEMENT_STOP (demux, ebml, "ContentEncoding", ret);
624 while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) {
625 if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK)
629 case GST_MATROSKA_ID_CONTENTENCODINGORDER:{
632 if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK)
635 if (!gst_matroska_demux_encoding_order_unique (context->encodings, num)) {
636 GST_ERROR_OBJECT (demux, "ContentEncodingOrder %" G_GUINT64_FORMAT
637 "is not unique for track %d", num, context->num);
638 ret = GST_FLOW_ERROR;
642 GST_DEBUG_OBJECT (demux, "ContentEncodingOrder: %" G_GUINT64_FORMAT,
647 case GST_MATROSKA_ID_CONTENTENCODINGSCOPE:{
650 if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK)
653 if (num > 7 && num == 0) {
654 GST_ERROR_OBJECT (demux, "Invalid ContentEncodingScope %"
655 G_GUINT64_FORMAT, num);
656 ret = GST_FLOW_ERROR;
660 GST_DEBUG_OBJECT (demux, "ContentEncodingScope: %" G_GUINT64_FORMAT,
666 case GST_MATROSKA_ID_CONTENTENCODINGTYPE:{
669 if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK)
673 GST_ERROR_OBJECT (demux, "Invalid ContentEncodingType %"
674 G_GUINT64_FORMAT, num);
675 ret = GST_FLOW_ERROR;
677 } else if (num != 0) {
678 GST_ERROR_OBJECT (demux, "Encrypted tracks are not supported yet");
679 ret = GST_FLOW_ERROR;
682 GST_DEBUG_OBJECT (demux, "ContentEncodingType: %" G_GUINT64_FORMAT,
687 case GST_MATROSKA_ID_CONTENTCOMPRESSION:{
689 DEBUG_ELEMENT_START (demux, ebml, "ContentCompression");
691 if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK)
694 while (ret == GST_FLOW_OK &&
695 gst_ebml_read_has_remaining (ebml, 1, TRUE)) {
696 if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK)
700 case GST_MATROSKA_ID_CONTENTCOMPALGO:{
703 if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) {
707 GST_ERROR_OBJECT (demux, "Invalid ContentCompAlgo %"
708 G_GUINT64_FORMAT, num);
709 ret = GST_FLOW_ERROR;
712 GST_DEBUG_OBJECT (demux, "ContentCompAlgo: %" G_GUINT64_FORMAT,
718 case GST_MATROSKA_ID_CONTENTCOMPSETTINGS:{
723 gst_ebml_read_binary (ebml, &id, &data,
724 &size)) != GST_FLOW_OK) {
727 enc.comp_settings = data;
728 enc.comp_settings_length = size;
729 GST_DEBUG_OBJECT (demux,
730 "ContentCompSettings of size %" G_GUINT64_FORMAT, size);
734 GST_WARNING_OBJECT (demux,
735 "Unknown ContentCompression subelement 0x%x - ignoring", id);
736 ret = gst_ebml_read_skip (ebml);
740 DEBUG_ELEMENT_STOP (demux, ebml, "ContentCompression", ret);
744 case GST_MATROSKA_ID_CONTENTENCRYPTION:
745 GST_ERROR_OBJECT (demux, "Encrypted tracks not yet supported");
746 gst_ebml_read_skip (ebml);
747 ret = GST_FLOW_ERROR;
750 GST_WARNING_OBJECT (demux,
751 "Unknown ContentEncoding subelement 0x%x - ignoring", id);
752 ret = gst_ebml_read_skip (ebml);
757 DEBUG_ELEMENT_STOP (demux, ebml, "ContentEncoding", ret);
758 if (ret != GST_FLOW_OK && ret != GST_FLOW_UNEXPECTED)
761 /* TODO: Check if the combination of values is valid */
763 g_array_append_val (context->encodings, enc);
769 gst_matroska_decode_data (GArray * encodings, guint8 ** data_out,
770 guint * size_out, GstMatroskaTrackEncodingScope scope, gboolean free)
777 g_return_val_if_fail (encodings != NULL, FALSE);
778 g_return_val_if_fail (data_out != NULL && *data_out != NULL, FALSE);
779 g_return_val_if_fail (size_out != NULL, FALSE);
784 for (i = 0; i < encodings->len; i++) {
785 GstMatroskaTrackEncoding *enc =
786 &g_array_index (encodings, GstMatroskaTrackEncoding, i);
787 guint8 *new_data = NULL;
790 if ((enc->scope & scope) == 0)
793 /* Encryption not supported yet */
794 if (enc->type != 0) {
803 gst_matroska_decompress_data (enc, &new_data, &new_size,
809 if ((data == *data_out && free) || (data != *data_out))
817 if ((data == *data_out && free) || (data != *data_out))
831 gst_matroska_decode_buffer (GstMatroskaTrackContext * context, GstBuffer * buf)
837 g_return_val_if_fail (GST_IS_BUFFER (buf), NULL);
839 GST_DEBUG ("decoding buffer %p", buf);
841 data = GST_BUFFER_DATA (buf);
842 size = GST_BUFFER_SIZE (buf);
844 g_return_val_if_fail (data != NULL && size > 0, buf);
846 if (gst_matroska_decode_data (context->encodings, &data, &size,
847 GST_MATROSKA_TRACK_ENCODING_SCOPE_FRAME, FALSE)) {
848 new_buf = gst_buffer_new ();
849 GST_BUFFER_MALLOCDATA (new_buf) = (guint8 *) data;
850 GST_BUFFER_DATA (new_buf) = (guint8 *) data;
851 GST_BUFFER_SIZE (new_buf) = size;
853 gst_buffer_unref (buf);
858 GST_DEBUG ("decode data failed");
859 gst_buffer_unref (buf);
865 gst_matroska_demux_read_track_encodings (GstMatroskaDemux * demux,
866 GstEbmlRead * ebml, GstMatroskaTrackContext * context)
871 DEBUG_ELEMENT_START (demux, ebml, "ContentEncodings");
873 if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) {
874 DEBUG_ELEMENT_STOP (demux, ebml, "ContentEncodings", ret);
879 g_array_sized_new (FALSE, FALSE, sizeof (GstMatroskaTrackEncoding), 1);
881 while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) {
882 if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK)
886 case GST_MATROSKA_ID_CONTENTENCODING:
887 ret = gst_matroska_demux_read_track_encoding (demux, ebml, context);
890 GST_WARNING_OBJECT (demux,
891 "Unknown ContentEncodings subelement 0x%x - ignoring", id);
892 ret = gst_ebml_read_skip (ebml);
897 DEBUG_ELEMENT_STOP (demux, ebml, "ContentEncodings", ret);
898 if (ret != GST_FLOW_OK && ret != GST_FLOW_UNEXPECTED)
901 /* Sort encodings according to their order */
902 g_array_sort (context->encodings,
903 (GCompareFunc) gst_matroska_demux_encoding_cmp);
905 return gst_matroska_decode_content_encodings (context->encodings);
909 gst_matroska_demux_tracknumber_unique (GstMatroskaDemux * demux, guint64 num)
913 g_assert (demux->common.src->len == demux->common.num_streams);
914 for (i = 0; i < demux->common.src->len; i++) {
915 GstMatroskaTrackContext *context = g_ptr_array_index (demux->common.src,
918 if (context->num == num)
926 gst_matroska_demux_add_stream (GstMatroskaDemux * demux, GstEbmlRead * ebml)
928 GstElementClass *klass = GST_ELEMENT_GET_CLASS (demux);
929 GstMatroskaTrackContext *context;
930 GstPadTemplate *templ = NULL;
931 GstCaps *caps = NULL;
932 gchar *padname = NULL;
934 guint32 id, riff_fourcc = 0;
935 guint16 riff_audio_fmt = 0;
936 GstTagList *list = NULL;
939 DEBUG_ELEMENT_START (demux, ebml, "TrackEntry");
941 /* start with the master */
942 if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) {
943 DEBUG_ELEMENT_STOP (demux, ebml, "TrackEntry", ret);
947 /* allocate generic... if we know the type, we'll g_renew()
948 * with the precise type */
949 context = g_new0 (GstMatroskaTrackContext, 1);
950 g_ptr_array_add (demux->common.src, context);
951 context->index = demux->common.num_streams;
952 context->index_writer_id = -1;
953 context->type = 0; /* no type yet */
954 context->default_duration = 0;
956 context->set_discont = TRUE;
957 context->timecodescale = 1.0;
959 GST_MATROSKA_TRACK_ENABLED | GST_MATROSKA_TRACK_DEFAULT |
960 GST_MATROSKA_TRACK_LACING;
961 context->last_flow = GST_FLOW_OK;
962 context->to_offset = G_MAXINT64;
963 demux->common.num_streams++;
964 g_assert (demux->common.src->len == demux->common.num_streams);
966 GST_DEBUG_OBJECT (demux, "Stream number %d", context->index);
968 /* try reading the trackentry headers */
969 while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) {
970 if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK)
974 /* track number (unique stream ID) */
975 case GST_MATROSKA_ID_TRACKNUMBER:{
978 if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK)
982 GST_ERROR_OBJECT (demux, "Invalid TrackNumber 0");
983 ret = GST_FLOW_ERROR;
985 } else if (!gst_matroska_demux_tracknumber_unique (demux, num)) {
986 GST_ERROR_OBJECT (demux, "TrackNumber %" G_GUINT64_FORMAT
987 " is not unique", num);
988 ret = GST_FLOW_ERROR;
992 GST_DEBUG_OBJECT (demux, "TrackNumber: %" G_GUINT64_FORMAT, num);
996 /* track UID (unique identifier) */
997 case GST_MATROSKA_ID_TRACKUID:{
1000 if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK)
1004 GST_ERROR_OBJECT (demux, "Invalid TrackUID 0");
1005 ret = GST_FLOW_ERROR;
1009 GST_DEBUG_OBJECT (demux, "TrackUID: %" G_GUINT64_FORMAT, num);
1014 /* track type (video, audio, combined, subtitle, etc.) */
1015 case GST_MATROSKA_ID_TRACKTYPE:{
1018 if ((ret = gst_ebml_read_uint (ebml, &id, &track_type)) != GST_FLOW_OK) {
1022 if (context->type != 0 && context->type != track_type) {
1023 GST_WARNING_OBJECT (demux,
1024 "More than one tracktype defined in a TrackEntry - skipping");
1026 } else if (track_type < 1 || track_type > 254) {
1027 GST_WARNING_OBJECT (demux, "Invalid TrackType %" G_GUINT64_FORMAT,
1032 GST_DEBUG_OBJECT (demux, "TrackType: %" G_GUINT64_FORMAT, track_type);
1034 /* ok, so we're actually going to reallocate this thing */
1035 switch (track_type) {
1036 case GST_MATROSKA_TRACK_TYPE_VIDEO:
1037 gst_matroska_track_init_video_context (&context);
1039 case GST_MATROSKA_TRACK_TYPE_AUDIO:
1040 gst_matroska_track_init_audio_context (&context);
1042 case GST_MATROSKA_TRACK_TYPE_SUBTITLE:
1043 gst_matroska_track_init_subtitle_context (&context);
1045 case GST_MATROSKA_TRACK_TYPE_COMPLEX:
1046 case GST_MATROSKA_TRACK_TYPE_LOGO:
1047 case GST_MATROSKA_TRACK_TYPE_BUTTONS:
1048 case GST_MATROSKA_TRACK_TYPE_CONTROL:
1050 GST_WARNING_OBJECT (demux,
1051 "Unknown or unsupported TrackType %" G_GUINT64_FORMAT,
1056 g_ptr_array_index (demux->common.src, demux->common.num_streams - 1)
1061 /* tracktype specific stuff for video */
1062 case GST_MATROSKA_ID_TRACKVIDEO:{
1063 GstMatroskaTrackVideoContext *videocontext;
1065 DEBUG_ELEMENT_START (demux, ebml, "TrackVideo");
1067 if (!gst_matroska_track_init_video_context (&context)) {
1068 GST_WARNING_OBJECT (demux,
1069 "TrackVideo element in non-video track - ignoring track");
1070 ret = GST_FLOW_ERROR;
1072 } else if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) {
1075 videocontext = (GstMatroskaTrackVideoContext *) context;
1076 g_ptr_array_index (demux->common.src, demux->common.num_streams - 1)
1079 while (ret == GST_FLOW_OK &&
1080 gst_ebml_read_has_remaining (ebml, 1, TRUE)) {
1081 if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK)
1085 /* Should be one level up but some broken muxers write it here. */
1086 case GST_MATROSKA_ID_TRACKDEFAULTDURATION:{
1089 if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK)
1093 GST_WARNING_OBJECT (demux, "Invalid TrackDefaultDuration 0");
1097 GST_DEBUG_OBJECT (demux,
1098 "TrackDefaultDuration: %" G_GUINT64_FORMAT, num);
1099 context->default_duration = num;
1103 /* video framerate */
1104 /* NOTE: This one is here only for backward compatibility.
1105 * Use _TRACKDEFAULDURATION one level up. */
1106 case GST_MATROSKA_ID_VIDEOFRAMERATE:{
1109 if ((ret = gst_ebml_read_float (ebml, &id, &num)) != GST_FLOW_OK)
1113 GST_WARNING_OBJECT (demux, "Invalid TrackVideoFPS %lf", num);
1117 GST_DEBUG_OBJECT (demux, "TrackVideoFrameRate: %lf", num);
1118 if (context->default_duration == 0)
1119 context->default_duration =
1120 gst_gdouble_to_guint64 ((gdouble) GST_SECOND * (1.0 / num));
1121 videocontext->default_fps = num;
1125 /* width of the size to display the video at */
1126 case GST_MATROSKA_ID_VIDEODISPLAYWIDTH:{
1129 if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK)
1133 GST_WARNING_OBJECT (demux, "Invalid TrackVideoDisplayWidth 0");
1137 GST_DEBUG_OBJECT (demux,
1138 "TrackVideoDisplayWidth: %" G_GUINT64_FORMAT, num);
1139 videocontext->display_width = num;
1143 /* height of the size to display the video at */
1144 case GST_MATROSKA_ID_VIDEODISPLAYHEIGHT:{
1147 if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK)
1151 GST_WARNING_OBJECT (demux, "Invalid TrackVideoDisplayHeight 0");
1155 GST_DEBUG_OBJECT (demux,
1156 "TrackVideoDisplayHeight: %" G_GUINT64_FORMAT, num);
1157 videocontext->display_height = num;
1161 /* width of the video in the file */
1162 case GST_MATROSKA_ID_VIDEOPIXELWIDTH:{
1165 if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK)
1169 GST_WARNING_OBJECT (demux, "Invalid TrackVideoPixelWidth 0");
1173 GST_DEBUG_OBJECT (demux,
1174 "TrackVideoPixelWidth: %" G_GUINT64_FORMAT, num);
1175 videocontext->pixel_width = num;
1179 /* height of the video in the file */
1180 case GST_MATROSKA_ID_VIDEOPIXELHEIGHT:{
1183 if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK)
1187 GST_WARNING_OBJECT (demux, "Invalid TrackVideoPixelHeight 0");
1191 GST_DEBUG_OBJECT (demux,
1192 "TrackVideoPixelHeight: %" G_GUINT64_FORMAT, num);
1193 videocontext->pixel_height = num;
1197 /* whether the video is interlaced */
1198 case GST_MATROSKA_ID_VIDEOFLAGINTERLACED:{
1201 if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK)
1205 context->flags |= GST_MATROSKA_VIDEOTRACK_INTERLACED;
1207 context->flags &= ~GST_MATROSKA_VIDEOTRACK_INTERLACED;
1208 GST_DEBUG_OBJECT (demux, "TrackVideoInterlaced: %d",
1209 (context->flags & GST_MATROSKA_VIDEOTRACK_INTERLACED) ? 1 :
1214 /* aspect ratio behaviour */
1215 case GST_MATROSKA_ID_VIDEOASPECTRATIOTYPE:{
1218 if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK)
1221 if (num != GST_MATROSKA_ASPECT_RATIO_MODE_FREE &&
1222 num != GST_MATROSKA_ASPECT_RATIO_MODE_KEEP &&
1223 num != GST_MATROSKA_ASPECT_RATIO_MODE_FIXED) {
1224 GST_WARNING_OBJECT (demux,
1225 "Unknown TrackVideoAspectRatioType 0x%x", (guint) num);
1228 GST_DEBUG_OBJECT (demux,
1229 "TrackVideoAspectRatioType: %" G_GUINT64_FORMAT, num);
1230 videocontext->asr_mode = num;
1234 /* colourspace (only matters for raw video) fourcc */
1235 case GST_MATROSKA_ID_VIDEOCOLOURSPACE:{
1240 gst_ebml_read_binary (ebml, &id, &data,
1241 &datalen)) != GST_FLOW_OK)
1246 GST_WARNING_OBJECT (demux,
1247 "Invalid TrackVideoColourSpace length %" G_GUINT64_FORMAT,
1252 memcpy (&videocontext->fourcc, data, 4);
1253 GST_DEBUG_OBJECT (demux,
1254 "TrackVideoColourSpace: %" GST_FOURCC_FORMAT,
1255 GST_FOURCC_ARGS (videocontext->fourcc));
1261 GST_WARNING_OBJECT (demux,
1262 "Unknown TrackVideo subelement 0x%x - ignoring", id);
1264 case GST_MATROSKA_ID_VIDEOSTEREOMODE:
1265 case GST_MATROSKA_ID_VIDEODISPLAYUNIT:
1266 case GST_MATROSKA_ID_VIDEOPIXELCROPBOTTOM:
1267 case GST_MATROSKA_ID_VIDEOPIXELCROPTOP:
1268 case GST_MATROSKA_ID_VIDEOPIXELCROPLEFT:
1269 case GST_MATROSKA_ID_VIDEOPIXELCROPRIGHT:
1270 case GST_MATROSKA_ID_VIDEOGAMMAVALUE:
1271 ret = gst_ebml_read_skip (ebml);
1276 DEBUG_ELEMENT_STOP (demux, ebml, "TrackVideo", ret);
1280 /* tracktype specific stuff for audio */
1281 case GST_MATROSKA_ID_TRACKAUDIO:{
1282 GstMatroskaTrackAudioContext *audiocontext;
1284 DEBUG_ELEMENT_START (demux, ebml, "TrackAudio");
1286 if (!gst_matroska_track_init_audio_context (&context)) {
1287 GST_WARNING_OBJECT (demux,
1288 "TrackAudio element in non-audio track - ignoring track");
1289 ret = GST_FLOW_ERROR;
1293 if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK)
1296 audiocontext = (GstMatroskaTrackAudioContext *) context;
1297 g_ptr_array_index (demux->common.src, demux->common.num_streams - 1)
1300 while (ret == GST_FLOW_OK &&
1301 gst_ebml_read_has_remaining (ebml, 1, TRUE)) {
1302 if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK)
1307 case GST_MATROSKA_ID_AUDIOSAMPLINGFREQ:{
1310 if ((ret = gst_ebml_read_float (ebml, &id, &num)) != GST_FLOW_OK)
1315 GST_WARNING_OBJECT (demux,
1316 "Invalid TrackAudioSamplingFrequency %lf", num);
1320 GST_DEBUG_OBJECT (demux, "TrackAudioSamplingFrequency: %lf", num);
1321 audiocontext->samplerate = num;
1326 case GST_MATROSKA_ID_AUDIOBITDEPTH:{
1329 if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK)
1333 GST_WARNING_OBJECT (demux, "Invalid TrackAudioBitDepth 0");
1337 GST_DEBUG_OBJECT (demux, "TrackAudioBitDepth: %" G_GUINT64_FORMAT,
1339 audiocontext->bitdepth = num;
1344 case GST_MATROSKA_ID_AUDIOCHANNELS:{
1347 if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK)
1351 GST_WARNING_OBJECT (demux, "Invalid TrackAudioChannels 0");
1355 GST_DEBUG_OBJECT (demux, "TrackAudioChannels: %" G_GUINT64_FORMAT,
1357 audiocontext->channels = num;
1362 GST_WARNING_OBJECT (demux,
1363 "Unknown TrackAudio subelement 0x%x - ignoring", id);
1365 case GST_MATROSKA_ID_AUDIOCHANNELPOSITIONS:
1366 case GST_MATROSKA_ID_AUDIOOUTPUTSAMPLINGFREQ:
1367 ret = gst_ebml_read_skip (ebml);
1372 DEBUG_ELEMENT_STOP (demux, ebml, "TrackAudio", ret);
1377 /* codec identifier */
1378 case GST_MATROSKA_ID_CODECID:{
1381 if ((ret = gst_ebml_read_ascii (ebml, &id, &text)) != GST_FLOW_OK)
1384 GST_DEBUG_OBJECT (demux, "CodecID: %s", GST_STR_NULL (text));
1385 context->codec_id = text;
1389 /* codec private data */
1390 case GST_MATROSKA_ID_CODECPRIVATE:{
1395 gst_ebml_read_binary (ebml, &id, &data, &size)) != GST_FLOW_OK)
1398 context->codec_priv = data;
1399 context->codec_priv_size = size;
1401 GST_DEBUG_OBJECT (demux, "CodecPrivate of size %" G_GUINT64_FORMAT,
1406 /* name of the codec */
1407 case GST_MATROSKA_ID_CODECNAME:{
1410 if ((ret = gst_ebml_read_utf8 (ebml, &id, &text)) != GST_FLOW_OK)
1413 GST_DEBUG_OBJECT (demux, "CodecName: %s", GST_STR_NULL (text));
1414 context->codec_name = text;
1418 /* name of this track */
1419 case GST_MATROSKA_ID_TRACKNAME:{
1422 if ((ret = gst_ebml_read_utf8 (ebml, &id, &text)) != GST_FLOW_OK)
1425 context->name = text;
1426 GST_DEBUG_OBJECT (demux, "TrackName: %s", GST_STR_NULL (text));
1430 /* language (matters for audio/subtitles, mostly) */
1431 case GST_MATROSKA_ID_TRACKLANGUAGE:{
1434 if ((ret = gst_ebml_read_utf8 (ebml, &id, &text)) != GST_FLOW_OK)
1438 context->language = text;
1441 if (strlen (context->language) >= 4 && context->language[3] == '-')
1442 context->language[3] = '\0';
1444 GST_DEBUG_OBJECT (demux, "TrackLanguage: %s",
1445 GST_STR_NULL (context->language));
1449 /* whether this is actually used */
1450 case GST_MATROSKA_ID_TRACKFLAGENABLED:{
1453 if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK)
1457 context->flags |= GST_MATROSKA_TRACK_ENABLED;
1459 context->flags &= ~GST_MATROSKA_TRACK_ENABLED;
1461 GST_DEBUG_OBJECT (demux, "TrackEnabled: %d",
1462 (context->flags & GST_MATROSKA_TRACK_ENABLED) ? 1 : 0);
1466 /* whether it's the default for this track type */
1467 case GST_MATROSKA_ID_TRACKFLAGDEFAULT:{
1470 if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK)
1474 context->flags |= GST_MATROSKA_TRACK_DEFAULT;
1476 context->flags &= ~GST_MATROSKA_TRACK_DEFAULT;
1478 GST_DEBUG_OBJECT (demux, "TrackDefault: %d",
1479 (context->flags & GST_MATROSKA_TRACK_ENABLED) ? 1 : 0);
1483 /* whether the track must be used during playback */
1484 case GST_MATROSKA_ID_TRACKFLAGFORCED:{
1487 if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK)
1491 context->flags |= GST_MATROSKA_TRACK_FORCED;
1493 context->flags &= ~GST_MATROSKA_TRACK_FORCED;
1495 GST_DEBUG_OBJECT (demux, "TrackForced: %d",
1496 (context->flags & GST_MATROSKA_TRACK_ENABLED) ? 1 : 0);
1500 /* lacing (like MPEG, where blocks don't end/start on frame
1502 case GST_MATROSKA_ID_TRACKFLAGLACING:{
1505 if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK)
1509 context->flags |= GST_MATROSKA_TRACK_LACING;
1511 context->flags &= ~GST_MATROSKA_TRACK_LACING;
1513 GST_DEBUG_OBJECT (demux, "TrackLacing: %d",
1514 (context->flags & GST_MATROSKA_TRACK_ENABLED) ? 1 : 0);
1518 /* default length (in time) of one data block in this track */
1519 case GST_MATROSKA_ID_TRACKDEFAULTDURATION:{
1522 if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK)
1527 GST_WARNING_OBJECT (demux, "Invalid TrackDefaultDuration 0");
1531 GST_DEBUG_OBJECT (demux, "TrackDefaultDuration: %" G_GUINT64_FORMAT,
1533 context->default_duration = num;
1537 case GST_MATROSKA_ID_CONTENTENCODINGS:{
1538 ret = gst_matroska_demux_read_track_encodings (demux, ebml, context);
1542 case GST_MATROSKA_ID_TRACKTIMECODESCALE:{
1545 if ((ret = gst_ebml_read_float (ebml, &id, &num)) != GST_FLOW_OK)
1549 GST_WARNING_OBJECT (demux, "Invalid TrackTimeCodeScale %lf", num);
1553 GST_DEBUG_OBJECT (demux, "TrackTimeCodeScale: %lf", num);
1554 context->timecodescale = num;
1559 GST_WARNING ("Unknown TrackEntry subelement 0x%x - ignoring", id);
1562 /* we ignore these because they're nothing useful (i.e. crap)
1563 * or simply not implemented yet. */
1564 case GST_MATROSKA_ID_TRACKMINCACHE:
1565 case GST_MATROSKA_ID_TRACKMAXCACHE:
1566 case GST_MATROSKA_ID_MAXBLOCKADDITIONID:
1567 case GST_MATROSKA_ID_TRACKATTACHMENTLINK:
1568 case GST_MATROSKA_ID_TRACKOVERLAY:
1569 case GST_MATROSKA_ID_TRACKTRANSLATE:
1570 case GST_MATROSKA_ID_TRACKOFFSET:
1571 case GST_MATROSKA_ID_CODECSETTINGS:
1572 case GST_MATROSKA_ID_CODECINFOURL:
1573 case GST_MATROSKA_ID_CODECDOWNLOADURL:
1574 case GST_MATROSKA_ID_CODECDECODEALL:
1575 ret = gst_ebml_read_skip (ebml);
1580 DEBUG_ELEMENT_STOP (demux, ebml, "TrackEntry", ret);
1582 /* Decode codec private data if necessary */
1583 if (context->encodings && context->encodings->len > 0 && context->codec_priv
1584 && context->codec_priv_size > 0) {
1585 if (!gst_matroska_decode_data (context->encodings,
1586 &context->codec_priv, &context->codec_priv_size,
1587 GST_MATROSKA_TRACK_ENCODING_SCOPE_CODEC_DATA, TRUE)) {
1588 GST_WARNING_OBJECT (demux, "Decoding codec private data failed");
1589 ret = GST_FLOW_ERROR;
1593 if (context->type == 0 || context->codec_id == NULL || (ret != GST_FLOW_OK
1594 && ret != GST_FLOW_UNEXPECTED)) {
1595 if (ret == GST_FLOW_OK || ret == GST_FLOW_UNEXPECTED)
1596 GST_WARNING_OBJECT (ebml, "Unknown stream/codec in track entry header");
1598 demux->common.num_streams--;
1599 g_ptr_array_remove_index (demux->common.src, demux->common.num_streams);
1600 g_assert (demux->common.src->len == demux->common.num_streams);
1602 gst_matroska_track_free (context);
1608 /* now create the GStreamer connectivity */
1609 switch (context->type) {
1610 case GST_MATROSKA_TRACK_TYPE_VIDEO:{
1611 GstMatroskaTrackVideoContext *videocontext =
1612 (GstMatroskaTrackVideoContext *) context;
1614 padname = g_strdup_printf ("video_%02d", demux->num_v_streams++);
1615 templ = gst_element_class_get_pad_template (klass, "video_%02d");
1616 caps = gst_matroska_demux_video_caps (videocontext,
1617 context->codec_id, (guint8 *) context->codec_priv,
1618 context->codec_priv_size, &codec, &riff_fourcc);
1621 list = gst_tag_list_new ();
1622 gst_tag_list_add (list, GST_TAG_MERGE_REPLACE,
1623 GST_TAG_VIDEO_CODEC, codec, NULL);
1629 case GST_MATROSKA_TRACK_TYPE_AUDIO:{
1630 GstMatroskaTrackAudioContext *audiocontext =
1631 (GstMatroskaTrackAudioContext *) context;
1633 padname = g_strdup_printf ("audio_%02d", demux->num_a_streams++);
1634 templ = gst_element_class_get_pad_template (klass, "audio_%02d");
1635 caps = gst_matroska_demux_audio_caps (audiocontext,
1636 context->codec_id, context->codec_priv, context->codec_priv_size,
1637 &codec, &riff_audio_fmt);
1640 list = gst_tag_list_new ();
1641 gst_tag_list_add (list, GST_TAG_MERGE_REPLACE,
1642 GST_TAG_AUDIO_CODEC, codec, NULL);
1648 case GST_MATROSKA_TRACK_TYPE_SUBTITLE:{
1649 GstMatroskaTrackSubtitleContext *subtitlecontext =
1650 (GstMatroskaTrackSubtitleContext *) context;
1652 padname = g_strdup_printf ("subtitle_%02d", demux->num_t_streams++);
1653 templ = gst_element_class_get_pad_template (klass, "subtitle_%02d");
1654 caps = gst_matroska_demux_subtitle_caps (subtitlecontext,
1655 context->codec_id, context->codec_priv, context->codec_priv_size);
1659 case GST_MATROSKA_TRACK_TYPE_COMPLEX:
1660 case GST_MATROSKA_TRACK_TYPE_LOGO:
1661 case GST_MATROSKA_TRACK_TYPE_BUTTONS:
1662 case GST_MATROSKA_TRACK_TYPE_CONTROL:
1664 /* we should already have quit by now */
1665 g_assert_not_reached ();
1668 if ((context->language == NULL || *context->language == '\0') &&
1669 (context->type == GST_MATROSKA_TRACK_TYPE_AUDIO ||
1670 context->type == GST_MATROSKA_TRACK_TYPE_SUBTITLE)) {
1671 GST_LOG ("stream %d: language=eng (assuming default)", context->index);
1672 context->language = g_strdup ("eng");
1675 if (context->language) {
1679 list = gst_tag_list_new ();
1681 /* Matroska contains ISO 639-2B codes, we want ISO 639-1 */
1682 lang = gst_tag_get_language_code (context->language);
1683 gst_tag_list_add (list, GST_TAG_MERGE_REPLACE,
1684 GST_TAG_LANGUAGE_CODE, (lang) ? lang : context->language, NULL);
1688 GST_WARNING_OBJECT (demux, "could not determine caps for stream with "
1689 "codec_id='%s'", context->codec_id);
1690 switch (context->type) {
1691 case GST_MATROSKA_TRACK_TYPE_VIDEO:
1692 caps = gst_caps_new_simple ("video/x-unknown", NULL);
1694 case GST_MATROSKA_TRACK_TYPE_AUDIO:
1695 caps = gst_caps_new_simple ("audio/x-unknown", NULL);
1697 case GST_MATROSKA_TRACK_TYPE_SUBTITLE:
1698 caps = gst_caps_new_simple ("application/x-subtitle-unknown", NULL);
1700 case GST_MATROSKA_TRACK_TYPE_COMPLEX:
1702 caps = gst_caps_new_simple ("application/x-matroska-unknown", NULL);
1705 gst_caps_set_simple (caps, "codec-id", G_TYPE_STRING, context->codec_id,
1708 /* add any unrecognised riff fourcc / audio format, but after codec-id */
1709 if (context->type == GST_MATROSKA_TRACK_TYPE_AUDIO && riff_audio_fmt != 0)
1710 gst_caps_set_simple (caps, "format", G_TYPE_INT, riff_audio_fmt, NULL);
1711 else if (context->type == GST_MATROSKA_TRACK_TYPE_VIDEO && riff_fourcc != 0)
1712 gst_caps_set_simple (caps, "fourcc", GST_TYPE_FOURCC, riff_fourcc, NULL);
1715 /* the pad in here */
1716 context->pad = gst_pad_new_from_template (templ, padname);
1717 context->caps = caps;
1719 gst_pad_set_event_function (context->pad,
1720 GST_DEBUG_FUNCPTR (gst_matroska_demux_handle_src_event));
1721 gst_pad_set_query_type_function (context->pad,
1722 GST_DEBUG_FUNCPTR (gst_matroska_demux_get_src_query_types));
1723 gst_pad_set_query_function (context->pad,
1724 GST_DEBUG_FUNCPTR (gst_matroska_demux_handle_src_query));
1726 GST_INFO_OBJECT (demux, "Adding pad '%s' with caps %" GST_PTR_FORMAT,
1729 context->pending_tags = list;
1731 gst_pad_set_element_private (context->pad, context);
1733 gst_pad_use_fixed_caps (context->pad);
1734 gst_pad_set_caps (context->pad, context->caps);
1735 gst_pad_set_active (context->pad, TRUE);
1736 gst_element_add_pad (GST_ELEMENT (demux), context->pad);
1744 static const GstQueryType *
1745 gst_matroska_demux_get_src_query_types (GstPad * pad)
1747 static const GstQueryType query_types[] = {
1758 gst_matroska_demux_query (GstMatroskaDemux * demux, GstPad * pad,
1761 gboolean res = FALSE;
1762 GstMatroskaTrackContext *context = NULL;
1765 context = gst_pad_get_element_private (pad);
1768 switch (GST_QUERY_TYPE (query)) {
1769 case GST_QUERY_POSITION:
1773 gst_query_parse_position (query, &format, NULL);
1775 if (format == GST_FORMAT_TIME) {
1776 GST_OBJECT_LOCK (demux);
1778 gst_query_set_position (query, GST_FORMAT_TIME, context->pos);
1780 gst_query_set_position (query, GST_FORMAT_TIME,
1781 demux->segment.last_stop);
1782 GST_OBJECT_UNLOCK (demux);
1783 } else if (format == GST_FORMAT_DEFAULT && context
1784 && context->default_duration) {
1785 GST_OBJECT_LOCK (demux);
1786 gst_query_set_position (query, GST_FORMAT_DEFAULT,
1787 context->pos / context->default_duration);
1788 GST_OBJECT_UNLOCK (demux);
1790 GST_DEBUG_OBJECT (demux,
1791 "only position query in TIME and DEFAULT format is supported");
1797 case GST_QUERY_DURATION:
1801 gst_query_parse_duration (query, &format, NULL);
1803 if (format == GST_FORMAT_TIME) {
1804 GST_OBJECT_LOCK (demux);
1805 gst_query_set_duration (query, GST_FORMAT_TIME,
1806 demux->segment.duration);
1807 GST_OBJECT_UNLOCK (demux);
1808 } else if (format == GST_FORMAT_DEFAULT && context
1809 && context->default_duration) {
1810 GST_OBJECT_LOCK (demux);
1811 gst_query_set_duration (query, GST_FORMAT_DEFAULT,
1812 demux->segment.duration / context->default_duration);
1813 GST_OBJECT_UNLOCK (demux);
1815 GST_DEBUG_OBJECT (demux,
1816 "only duration query in TIME and DEFAULT format is supported");
1823 case GST_QUERY_SEEKING:
1827 gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL);
1828 GST_OBJECT_LOCK (demux);
1829 if (fmt == GST_FORMAT_TIME) {
1832 if (demux->streaming) {
1833 /* assuming we'll be able to get an index ... */
1834 seekable = demux->seekable;
1839 gst_query_set_seeking (query, GST_FORMAT_TIME, seekable,
1840 0, demux->segment.duration);
1843 GST_OBJECT_UNLOCK (demux);
1847 res = gst_pad_query_default (pad, query);
1855 gst_matroska_demux_element_query (GstElement * element, GstQuery * query)
1857 return gst_matroska_demux_query (GST_MATROSKA_DEMUX (element), NULL, query);
1861 gst_matroska_demux_handle_src_query (GstPad * pad, GstQuery * query)
1864 GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (gst_pad_get_parent (pad));
1866 ret = gst_matroska_demux_query (demux, pad, query);
1868 gst_object_unref (demux);
1874 gst_matroska_index_seek_find (GstMatroskaIndex * i1, GstClockTime * time,
1877 if (i1->time < *time)
1879 else if (i1->time > *time)
1885 static GstMatroskaIndex *
1886 gst_matroskademux_do_index_seek (GstMatroskaDemux * demux,
1887 GstMatroskaTrackContext * track, gint64 seek_pos, GArray ** _index,
1888 gint * _entry_index)
1890 GstMatroskaIndex *entry = NULL;
1893 if (!demux->common.index || !demux->common.index->len)
1896 /* find entry just before or at the requested position */
1897 if (track && track->index_table)
1898 index = track->index_table;
1900 index = demux->common.index;
1903 gst_util_array_binary_search (index->data, index->len,
1904 sizeof (GstMatroskaIndex),
1905 (GCompareDataFunc) gst_matroska_index_seek_find, GST_SEARCH_MODE_BEFORE,
1909 entry = &g_array_index (index, GstMatroskaIndex, 0);
1914 *_entry_index = entry - (GstMatroskaIndex *) index->data;
1919 /* takes ownership of taglist */
1921 gst_matroska_demux_found_global_tag (GstMatroskaDemux * demux,
1922 GstTagList * taglist)
1924 if (demux->global_tags) {
1925 /* nothing sent yet, add to cache */
1926 gst_tag_list_insert (demux->global_tags, taglist, GST_TAG_MERGE_APPEND);
1927 gst_tag_list_free (taglist);
1929 /* hm, already sent, no need to cache and wait anymore */
1930 GST_DEBUG_OBJECT (demux, "Sending late global tags %" GST_PTR_FORMAT,
1932 gst_element_found_tags (GST_ELEMENT (demux), taglist);
1936 /* returns FALSE if there are no pads to deliver event to,
1937 * otherwise TRUE (whatever the outcome of event sending),
1938 * takes ownership of the passed event! */
1940 gst_matroska_demux_send_event (GstMatroskaDemux * demux, GstEvent * event)
1942 gboolean is_newsegment;
1943 gboolean ret = FALSE;
1946 g_return_val_if_fail (event != NULL, FALSE);
1948 GST_DEBUG_OBJECT (demux, "Sending event of type %s to all source pads",
1949 GST_EVENT_TYPE_NAME (event));
1951 is_newsegment = (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT);
1953 g_assert (demux->common.src->len == demux->common.num_streams);
1954 for (i = 0; i < demux->common.src->len; i++) {
1955 GstMatroskaTrackContext *stream;
1957 stream = g_ptr_array_index (demux->common.src, i);
1958 gst_event_ref (event);
1959 gst_pad_push_event (stream->pad, event);
1962 /* FIXME: send global tags before stream tags */
1963 if (G_UNLIKELY (is_newsegment && stream->pending_tags != NULL)) {
1964 GST_DEBUG_OBJECT (demux, "Sending pending_tags %p for pad %s:%s : %"
1965 GST_PTR_FORMAT, stream->pending_tags,
1966 GST_DEBUG_PAD_NAME (stream->pad), stream->pending_tags);
1967 gst_element_found_tags_for_pad (GST_ELEMENT (demux), stream->pad,
1968 stream->pending_tags);
1969 stream->pending_tags = NULL;
1973 if (G_UNLIKELY (is_newsegment && demux->global_tags != NULL)) {
1974 gst_tag_list_add (demux->global_tags, GST_TAG_MERGE_REPLACE,
1975 GST_TAG_CONTAINER_FORMAT, "Matroska", NULL);
1976 GST_DEBUG_OBJECT (demux, "Sending global_tags %p : %" GST_PTR_FORMAT,
1977 demux->global_tags, demux->global_tags);
1978 gst_element_found_tags (GST_ELEMENT (demux), demux->global_tags);
1979 demux->global_tags = NULL;
1982 gst_event_unref (event);
1987 gst_matroska_demux_element_send_event (GstElement * element, GstEvent * event)
1989 GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (element);
1992 g_return_val_if_fail (event != NULL, FALSE);
1994 if (GST_EVENT_TYPE (event) == GST_EVENT_SEEK) {
1995 res = gst_matroska_demux_handle_seek_event (demux, NULL, event);
1997 GST_WARNING_OBJECT (demux, "Unhandled event of type %s",
1998 GST_EVENT_TYPE_NAME (event));
2001 gst_event_unref (event);
2005 /* determine track to seek in */
2006 static GstMatroskaTrackContext *
2007 gst_matroska_demux_get_seek_track (GstMatroskaDemux * demux,
2008 GstMatroskaTrackContext * track)
2012 if (track && track->type == GST_MATROSKA_TRACK_TYPE_VIDEO)
2015 for (i = 0; i < demux->common.src->len; i++) {
2016 GstMatroskaTrackContext *stream;
2018 stream = g_ptr_array_index (demux->common.src, i);
2019 if (stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO && stream->index_table)
2026 /* call with object lock held */
2028 gst_matroska_demux_reset_streams (GstMatroskaDemux * demux, GstClockTime time,
2033 GST_DEBUG_OBJECT (demux, "resetting stream state");
2035 g_assert (demux->common.src->len == demux->common.num_streams);
2036 for (i = 0; i < demux->common.src->len; i++) {
2037 GstMatroskaTrackContext *context = g_ptr_array_index (demux->common.src,
2039 context->pos = time;
2040 context->set_discont = TRUE;
2041 context->eos = FALSE;
2042 context->from_time = GST_CLOCK_TIME_NONE;
2044 context->last_flow = GST_FLOW_OK;
2045 if (context->type == GST_MATROSKA_TRACK_TYPE_VIDEO) {
2046 GstMatroskaTrackVideoContext *videocontext =
2047 (GstMatroskaTrackVideoContext *) context;
2048 /* demux object lock held by caller */
2049 videocontext->earliest_time = GST_CLOCK_TIME_NONE;
2055 gst_matroska_demux_move_to_entry (GstMatroskaDemux * demux,
2056 GstMatroskaIndex * entry, gboolean reset)
2060 GST_OBJECT_LOCK (demux);
2062 /* seek (relative to matroska segment) */
2063 /* position might be invalid; will error when streaming resumes ... */
2064 demux->offset = entry->pos + demux->common.ebml_segment_start;
2066 GST_DEBUG_OBJECT (demux, "Seeked to offset %" G_GUINT64_FORMAT ", block %d, "
2067 "time %" GST_TIME_FORMAT, entry->pos + demux->common.ebml_segment_start,
2068 entry->block, GST_TIME_ARGS (entry->time));
2070 /* update the time */
2071 gst_matroska_demux_reset_streams (demux, entry->time, TRUE);
2072 demux->segment.last_stop = entry->time;
2073 demux->seek_block = entry->block;
2074 demux->seek_first = TRUE;
2075 demux->last_stop_end = GST_CLOCK_TIME_NONE;
2077 for (i = 0; i < demux->common.src->len; i++) {
2078 GstMatroskaTrackContext *stream = g_ptr_array_index (demux->common.src, i);
2081 stream->to_offset = G_MAXINT64;
2083 if (stream->from_offset != -1)
2084 stream->to_offset = stream->from_offset;
2086 stream->from_offset = -1;
2089 GST_OBJECT_UNLOCK (demux);
2095 gst_matroska_cluster_compare (gint64 * i1, gint64 * i2)
2105 /* searches for a cluster start from @pos,
2106 * return GST_FLOW_OK and cluster position in @pos if found */
2107 static GstFlowReturn
2108 gst_matroska_demux_search_cluster (GstMatroskaDemux * demux, gint64 * pos)
2110 gint64 newpos = *pos;
2112 GstFlowReturn ret = GST_FLOW_OK;
2113 const guint chunk = 64 * 1024;
2114 GstBuffer *buf = NULL;
2119 orig_offset = demux->offset;
2121 GST_LOG_OBJECT (demux, "searching cluster following offset %" G_GINT64_FORMAT,
2124 if (demux->clusters) {
2127 cpos = gst_util_array_binary_search (demux->clusters->data,
2128 demux->clusters->len, sizeof (gint64),
2129 (GCompareDataFunc) gst_matroska_cluster_compare,
2130 GST_SEARCH_MODE_AFTER, pos, NULL);
2133 GST_DEBUG_OBJECT (demux,
2134 "cluster reported at offset %" G_GINT64_FORMAT, *cpos);
2135 demux->offset = *cpos;
2137 gst_matroska_demux_peek_id_length_pull (demux, &id, &length, &needed);
2138 if (ret == GST_FLOW_OK && id == GST_MATROSKA_ID_CLUSTER) {
2145 /* read in at newpos and scan for ebml cluster id */
2147 GstByteReader reader;
2150 ret = gst_pad_pull_range (demux->sinkpad, newpos, chunk, &buf);
2151 if (ret != GST_FLOW_OK)
2153 GST_DEBUG_OBJECT (demux, "read buffer size %d at offset %" G_GINT64_FORMAT,
2154 GST_BUFFER_SIZE (buf), newpos);
2155 gst_byte_reader_init_from_buffer (&reader, buf);
2157 cluster_pos = gst_byte_reader_masked_scan_uint32 (&reader, 0xffffffff,
2158 GST_MATROSKA_ID_CLUSTER, 0, gst_byte_reader_get_remaining (&reader));
2159 if (cluster_pos >= 0) {
2160 newpos += cluster_pos;
2161 /* prepare resuming at next byte */
2162 gst_byte_reader_skip (&reader, cluster_pos + 1);
2163 GST_DEBUG_OBJECT (demux,
2164 "found cluster ebml id at offset %" G_GINT64_FORMAT, newpos);
2165 /* extra checks whether we really sync'ed to a cluster:
2166 * - either it is the first and only cluster
2167 * - either there is a cluster after this one
2168 * - either cluster length is undefined
2170 /* ok if first cluster (there may not a subsequent one) */
2171 if (newpos == demux->first_cluster_offset) {
2172 GST_DEBUG_OBJECT (demux, "cluster is first cluster -> OK");
2175 demux->offset = newpos;
2177 gst_matroska_demux_peek_id_length_pull (demux, &id, &length, &needed);
2178 if (ret != GST_FLOW_OK)
2180 g_assert (id == GST_MATROSKA_ID_CLUSTER);
2181 GST_DEBUG_OBJECT (demux, "cluster size %" G_GUINT64_FORMAT ", prefix %d",
2183 /* ok if undefined length or first cluster */
2184 if (length == G_MAXUINT64) {
2185 GST_DEBUG_OBJECT (demux, "cluster has undefined length -> OK");
2189 demux->offset += length + needed;
2191 gst_matroska_demux_peek_id_length_pull (demux, &id, &length, &needed);
2192 if (ret != GST_FLOW_OK)
2194 GST_DEBUG_OBJECT (demux, "next element is %scluster",
2195 id == GST_MATROSKA_ID_CLUSTER ? "" : "not ");
2196 if (id == GST_MATROSKA_ID_CLUSTER)
2198 /* not ok, resume */
2201 /* partial cluster id may have been in tail of buffer */
2202 newpos += MAX (gst_byte_reader_get_remaining (&reader), 4) - 3;
2203 gst_buffer_unref (buf);
2209 gst_buffer_unref (buf);
2214 demux->offset = orig_offset;
2219 /* bisect and scan through file for cluster starting before @time,
2220 * returns fake index entry with corresponding info on cluster */
2221 static GstMatroskaIndex *
2222 gst_matroska_demux_search_pos (GstMatroskaDemux * demux, GstClockTime time)
2224 GstMatroskaIndex *entry = NULL;
2225 GstMatroskaReadState current_state;
2226 GstClockTime otime, prev_cluster_time, current_cluster_time, cluster_time;
2227 gint64 opos, newpos, startpos = 0, current_offset;
2228 gint64 prev_cluster_offset = -1, current_cluster_offset, cluster_offset;
2229 const guint chunk = 64 * 1024;
2230 GstBuffer *buf = NULL;
2236 /* (under)estimate new position, resync using cluster ebml id,
2237 * and scan forward to appropriate cluster
2238 * (and re-estimate if need to go backward) */
2240 prev_cluster_time = GST_CLOCK_TIME_NONE;
2242 /* store some current state */
2243 current_state = demux->common.state;
2244 g_return_val_if_fail (current_state == GST_MATROSKA_READ_STATE_DATA, NULL);
2246 current_cluster_offset = demux->cluster_offset;
2247 current_cluster_time = demux->cluster_time;
2248 current_offset = demux->offset;
2250 demux->common.state = GST_MATROSKA_READ_STATE_SCANNING;
2252 /* estimate using start and current position */
2253 GST_OBJECT_LOCK (demux);
2254 opos = demux->offset - demux->common.ebml_segment_start;
2255 otime = demux->segment.last_stop;
2256 GST_OBJECT_UNLOCK (demux);
2259 GST_LOG_OBJECT (demux,
2260 "opos: %" G_GUINT64_FORMAT ", otime: %" GST_TIME_FORMAT, opos,
2261 GST_TIME_ARGS (otime));
2262 newpos = gst_util_uint64_scale (opos, time, otime) - chunk;
2265 /* favour undershoot */
2266 newpos = newpos * 90 / 100;
2267 newpos += demux->common.ebml_segment_start;
2269 GST_DEBUG_OBJECT (demux,
2270 "estimated offset for %" GST_TIME_FORMAT ": %" G_GINT64_FORMAT,
2271 GST_TIME_ARGS (time), newpos);
2273 /* and at least start scanning before previous scan start to avoid looping */
2274 startpos = startpos * 90 / 100;
2275 if (startpos && startpos < newpos)
2278 /* read in at newpos and scan for ebml cluster id */
2282 ret = gst_matroska_demux_search_cluster (demux, &newpos);
2283 if (ret == GST_FLOW_UNEXPECTED) {
2284 /* heuristic HACK */
2285 newpos = startpos * 80 / 100;
2286 GST_DEBUG_OBJECT (demux, "EOS; "
2287 "new estimated offset for %" GST_TIME_FORMAT ": %" G_GINT64_FORMAT,
2288 GST_TIME_ARGS (time), newpos);
2291 } else if (ret != GST_FLOW_OK) {
2298 /* then start scanning and parsing for cluster time,
2299 * re-estimate if overshoot, otherwise next cluster and so on */
2300 demux->offset = newpos;
2301 demux->cluster_time = cluster_time = GST_CLOCK_TIME_NONE;
2303 guint64 cluster_size = 0;
2305 /* peek and parse some elements */
2306 ret = gst_matroska_demux_peek_id_length_pull (demux, &id, &length, &needed);
2307 if (ret != GST_FLOW_OK)
2309 GST_LOG_OBJECT (demux, "Offset %" G_GUINT64_FORMAT ", Element id 0x%x, "
2310 "size %" G_GUINT64_FORMAT ", needed %d", demux->offset, id,
2312 ret = gst_matroska_demux_parse_id (demux, id, length, needed);
2313 if (ret != GST_FLOW_OK)
2316 if (id == GST_MATROSKA_ID_CLUSTER) {
2317 cluster_time = GST_CLOCK_TIME_NONE;
2318 if (length == G_MAXUINT64)
2321 cluster_size = length + needed;
2323 if (demux->cluster_time != GST_CLOCK_TIME_NONE &&
2324 cluster_time == GST_CLOCK_TIME_NONE) {
2325 cluster_time = demux->cluster_time * demux->common.time_scale;
2326 cluster_offset = demux->cluster_offset;
2327 GST_DEBUG_OBJECT (demux, "found cluster at offset %" G_GINT64_FORMAT
2328 " with time %" GST_TIME_FORMAT, cluster_offset,
2329 GST_TIME_ARGS (cluster_time));
2330 if (cluster_time > time) {
2331 GST_DEBUG_OBJECT (demux, "overshot target");
2332 /* cluster overshoots */
2333 if (cluster_offset == demux->first_cluster_offset) {
2334 /* but no prev one */
2335 GST_DEBUG_OBJECT (demux, "but using first cluster anyway");
2336 prev_cluster_time = cluster_time;
2337 prev_cluster_offset = cluster_offset;
2340 if (prev_cluster_time != GST_CLOCK_TIME_NONE) {
2341 /* prev cluster did not overshoot, so prev cluster is target */
2344 /* re-estimate using this new position info */
2345 opos = cluster_offset;
2346 otime = cluster_time;
2350 /* cluster undershoots, goto next one */
2351 prev_cluster_time = cluster_time;
2352 prev_cluster_offset = cluster_offset;
2353 /* skip cluster if length is defined,
2354 * otherwise will be skippingly parsed into */
2356 GST_DEBUG_OBJECT (demux, "skipping to next cluster");
2357 demux->offset = cluster_offset + cluster_size;
2358 demux->cluster_time = GST_CLOCK_TIME_NONE;
2360 GST_DEBUG_OBJECT (demux, "parsing/skipping cluster elements");
2367 if (ret == GST_FLOW_UNEXPECTED) {
2368 if (prev_cluster_time != GST_CLOCK_TIME_NONE)
2374 entry = g_new0 (GstMatroskaIndex, 1);
2375 entry->time = prev_cluster_time;
2376 entry->pos = prev_cluster_offset - demux->common.ebml_segment_start;
2377 GST_DEBUG_OBJECT (demux, "simulated index entry; time %" GST_TIME_FORMAT
2378 ", pos %" G_GUINT64_FORMAT, GST_TIME_ARGS (entry->time), entry->pos);
2382 gst_buffer_unref (buf);
2384 /* restore some state */
2385 demux->cluster_offset = current_cluster_offset;
2386 demux->cluster_time = current_cluster_time;
2387 demux->offset = current_offset;
2388 demux->common.state = current_state;
2394 gst_matroska_demux_handle_seek_event (GstMatroskaDemux * demux,
2395 GstPad * pad, GstEvent * event)
2397 GstMatroskaIndex *entry = NULL;
2398 GstMatroskaIndex scan_entry;
2400 GstSeekType cur_type, stop_type;
2402 gboolean flush, keyunit;
2405 GstMatroskaTrackContext *track = NULL;
2406 GstSegment seeksegment = { 0, };
2410 track = gst_pad_get_element_private (pad);
2412 gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur,
2415 /* we can only seek on time */
2416 if (format != GST_FORMAT_TIME) {
2417 GST_DEBUG_OBJECT (demux, "Can only seek on TIME");
2421 /* copy segment, we need this because we still need the old
2422 * segment when we close the current segment. */
2423 memcpy (&seeksegment, &demux->segment, sizeof (GstSegment));
2426 GST_DEBUG_OBJECT (demux, "configuring seek");
2427 gst_segment_set_seek (&seeksegment, rate, format, flags,
2428 cur_type, cur, stop_type, stop, &update);
2431 GST_DEBUG_OBJECT (demux, "New segment %" GST_SEGMENT_FORMAT, &seeksegment);
2433 /* check sanity before we start flushing and all that */
2434 GST_OBJECT_LOCK (demux);
2435 track = gst_matroska_demux_get_seek_track (demux, track);
2436 if ((entry = gst_matroskademux_do_index_seek (demux, track,
2437 seeksegment.last_stop, &demux->seek_index, &demux->seek_entry)) ==
2439 /* pull mode without index can scan later on */
2440 if (demux->common.index || demux->streaming) {
2441 GST_DEBUG_OBJECT (demux, "No matching seek entry in index");
2442 GST_OBJECT_UNLOCK (demux);
2446 GST_DEBUG_OBJECT (demux, "Seek position looks sane");
2447 GST_OBJECT_UNLOCK (demux);
2449 if (demux->streaming) {
2450 /* need to seek to cluster start to pick up cluster time */
2451 /* upstream takes care of flushing and all that
2452 * ... and newsegment event handling takes care of the rest */
2453 return perform_seek_to_offset (demux,
2454 entry->pos + demux->common.ebml_segment_start);
2457 flush = !!(flags & GST_SEEK_FLAG_FLUSH);
2458 keyunit = !!(flags & GST_SEEK_FLAG_KEY_UNIT);
2461 GST_DEBUG_OBJECT (demux, "Starting flush");
2462 gst_pad_push_event (demux->sinkpad, gst_event_new_flush_start ());
2463 gst_matroska_demux_send_event (demux, gst_event_new_flush_start ());
2465 GST_DEBUG_OBJECT (demux, "Non-flushing seek, pausing task");
2466 gst_pad_pause_task (demux->sinkpad);
2469 /* now grab the stream lock so that streaming cannot continue, for
2470 * non flushing seeks when the element is in PAUSED this could block
2472 GST_DEBUG_OBJECT (demux, "Waiting for streaming to stop");
2473 GST_PAD_STREAM_LOCK (demux->sinkpad);
2475 /* pull mode without index can do some scanning */
2476 if (!demux->streaming && !demux->common.index) {
2477 /* need to stop flushing upstream as we need it next */
2479 gst_pad_push_event (demux->sinkpad, gst_event_new_flush_stop ());
2480 entry = gst_matroska_demux_search_pos (demux, seeksegment.last_stop);
2481 /* keep local copy */
2483 scan_entry = *entry;
2485 entry = &scan_entry;
2487 GST_DEBUG_OBJECT (demux, "Scan failed to find matching position");
2489 gst_matroska_demux_send_event (demux, gst_event_new_flush_stop ());
2495 GST_DEBUG_OBJECT (demux, "seek to key unit, adjusting segment start to %"
2496 GST_TIME_FORMAT, GST_TIME_ARGS (entry->time));
2497 seeksegment.start = entry->time;
2498 seeksegment.last_stop = entry->time;
2499 seeksegment.time = entry->time;
2503 GST_DEBUG_OBJECT (demux, "Stopping flush");
2504 gst_pad_push_event (demux->sinkpad, gst_event_new_flush_stop ());
2505 gst_matroska_demux_send_event (demux, gst_event_new_flush_stop ());
2506 } else if (demux->segment_running) {
2507 GST_DEBUG_OBJECT (demux, "Closing currently running segment");
2509 GST_OBJECT_LOCK (demux);
2510 if (demux->close_segment)
2511 gst_event_unref (demux->close_segment);
2513 demux->close_segment = gst_event_new_new_segment (TRUE,
2514 demux->segment.rate, GST_FORMAT_TIME, demux->segment.start,
2515 demux->segment.last_stop, demux->segment.time);
2516 GST_OBJECT_UNLOCK (demux);
2519 GST_OBJECT_LOCK (demux);
2520 /* now update the real segment info */
2521 GST_DEBUG_OBJECT (demux, "Committing new seek segment");
2522 memcpy (&demux->segment, &seeksegment, sizeof (GstSegment));
2523 GST_OBJECT_UNLOCK (demux);
2525 /* update some (segment) state */
2526 if (!gst_matroska_demux_move_to_entry (demux, entry, TRUE))
2529 /* notify start of new segment */
2530 if (demux->segment.flags & GST_SEEK_FLAG_SEGMENT) {
2533 msg = gst_message_new_segment_start (GST_OBJECT (demux),
2534 GST_FORMAT_TIME, demux->segment.start);
2535 gst_element_post_message (GST_ELEMENT (demux), msg);
2538 GST_OBJECT_LOCK (demux);
2539 if (demux->new_segment)
2540 gst_event_unref (demux->new_segment);
2541 demux->new_segment = gst_event_new_new_segment_full (FALSE,
2542 demux->segment.rate, demux->segment.applied_rate, demux->segment.format,
2543 demux->segment.start, demux->segment.stop, demux->segment.time);
2544 GST_OBJECT_UNLOCK (demux);
2546 /* restart our task since it might have been stopped when we did the
2548 demux->segment_running = TRUE;
2549 gst_pad_start_task (demux->sinkpad, (GstTaskFunction) gst_matroska_demux_loop,
2552 /* streaming can continue now */
2553 GST_PAD_STREAM_UNLOCK (demux->sinkpad);
2559 GST_PAD_STREAM_UNLOCK (demux->sinkpad);
2560 GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("Got a seek error"));
2566 * Handle whether we can perform the seek event or if we have to let the chain
2567 * function handle seeks to build the seek indexes first.
2570 gst_matroska_demux_handle_seek_push (GstMatroskaDemux * demux, GstPad * pad,
2574 GstSeekType cur_type, stop_type;
2579 gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur,
2584 /* we can only seek on time */
2585 if (format != GST_FORMAT_TIME) {
2586 GST_DEBUG_OBJECT (demux, "Can only seek on TIME");
2590 if (stop_type != GST_SEEK_TYPE_NONE && stop != GST_CLOCK_TIME_NONE) {
2591 GST_DEBUG_OBJECT (demux, "Seek end-time not supported in streaming mode");
2595 if (!(flags & GST_SEEK_FLAG_FLUSH)) {
2596 GST_DEBUG_OBJECT (demux,
2597 "Non-flushing seek not supported in streaming mode");
2601 if (flags & GST_SEEK_FLAG_SEGMENT) {
2602 GST_DEBUG_OBJECT (demux, "Segment seek not supported in streaming mode");
2606 /* check for having parsed index already */
2607 if (!demux->common.index_parsed) {
2608 gboolean building_index;
2611 if (!demux->index_offset) {
2612 GST_DEBUG_OBJECT (demux, "no index (location); no seek in push mode");
2616 GST_OBJECT_LOCK (demux);
2617 /* handle the seek event in the chain function */
2618 demux->common.state = GST_MATROSKA_READ_STATE_SEEK;
2619 /* no more seek can be issued until state reset to _DATA */
2621 /* copy the event */
2622 if (demux->seek_event)
2623 gst_event_unref (demux->seek_event);
2624 demux->seek_event = gst_event_ref (event);
2626 /* set the building_index flag so that only one thread can setup the
2627 * structures for index seeking. */
2628 building_index = demux->building_index;
2629 if (!building_index) {
2630 demux->building_index = TRUE;
2631 offset = demux->index_offset;
2633 GST_OBJECT_UNLOCK (demux);
2635 if (!building_index) {
2636 /* seek to the first subindex or legacy index */
2637 GST_INFO_OBJECT (demux, "Seeking to Cues at %" G_GUINT64_FORMAT, offset);
2638 return perform_seek_to_offset (demux, offset);
2641 /* well, we are handling it already */
2645 /* delegate to tweaked regular seek */
2646 return gst_matroska_demux_handle_seek_event (demux, pad, event);
2650 gst_matroska_demux_handle_src_event (GstPad * pad, GstEvent * event)
2652 GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (gst_pad_get_parent (pad));
2653 gboolean res = TRUE;
2655 switch (GST_EVENT_TYPE (event)) {
2656 case GST_EVENT_SEEK:
2657 /* no seeking until we are (safely) ready */
2658 if (demux->common.state != GST_MATROSKA_READ_STATE_DATA) {
2659 GST_DEBUG_OBJECT (demux, "not ready for seeking yet");
2662 if (!demux->streaming)
2663 res = gst_matroska_demux_handle_seek_event (demux, pad, event);
2665 res = gst_matroska_demux_handle_seek_push (demux, pad, event);
2666 gst_event_unref (event);
2671 GstMatroskaTrackContext *context = gst_pad_get_element_private (pad);
2672 if (context->type == GST_MATROSKA_TRACK_TYPE_VIDEO) {
2673 GstMatroskaTrackVideoContext *videocontext =
2674 (GstMatroskaTrackVideoContext *) context;
2676 GstClockTimeDiff diff;
2677 GstClockTime timestamp;
2679 gst_event_parse_qos (event, &proportion, &diff, ×tamp);
2681 GST_OBJECT_LOCK (demux);
2682 videocontext->earliest_time = timestamp + diff;
2683 GST_OBJECT_UNLOCK (demux);
2686 gst_event_unref (event);
2690 /* events we don't need to handle */
2691 case GST_EVENT_NAVIGATION:
2692 gst_event_unref (event);
2696 case GST_EVENT_LATENCY:
2698 res = gst_pad_push_event (demux->sinkpad, event);
2702 gst_object_unref (demux);
2707 static GstFlowReturn
2708 gst_matroska_demux_seek_to_previous_keyframe (GstMatroskaDemux * demux)
2710 GstFlowReturn ret = GST_FLOW_UNEXPECTED;
2711 gboolean done = TRUE;
2714 g_return_val_if_fail (demux->seek_index, GST_FLOW_UNEXPECTED);
2715 g_return_val_if_fail (demux->seek_entry < demux->seek_index->len,
2716 GST_FLOW_UNEXPECTED);
2718 GST_DEBUG_OBJECT (demux, "locating previous keyframe");
2720 if (!demux->seek_entry) {
2721 GST_DEBUG_OBJECT (demux, "no earlier index entry");
2725 for (i = 0; i < demux->common.src->len; i++) {
2726 GstMatroskaTrackContext *stream = g_ptr_array_index (demux->common.src, i);
2728 GST_DEBUG_OBJECT (demux, "segment start %" GST_TIME_FORMAT
2729 ", stream %d at %" GST_TIME_FORMAT,
2730 GST_TIME_ARGS (demux->segment.start), stream->index,
2731 GST_TIME_ARGS (stream->from_time));
2732 if (GST_CLOCK_TIME_IS_VALID (stream->from_time)) {
2733 if (stream->from_time > demux->segment.start) {
2734 GST_DEBUG_OBJECT (demux, "stream %d not finished yet", stream->index);
2738 /* nothing pushed for this stream;
2739 * likely seek entry did not start at keyframe, so all was skipped.
2740 * So we need an earlier entry */
2746 GstMatroskaIndex *entry;
2748 entry = &g_array_index (demux->seek_index, GstMatroskaIndex,
2749 --demux->seek_entry);
2750 if (!gst_matroska_demux_move_to_entry (demux, entry, FALSE))
2760 static GstFlowReturn
2761 gst_matroska_demux_parse_header (GstMatroskaDemux * demux, GstEbmlRead * ebml)
2768 /* this function is the first to be called */
2774 ret = gst_ebml_peek_id (ebml, &id);
2775 if (ret != GST_FLOW_OK)
2778 GST_DEBUG_OBJECT (demux, "id: %08x", id);
2780 if (id != GST_EBML_ID_HEADER) {
2781 GST_ERROR_OBJECT (demux, "Failed to read header");
2785 ret = gst_ebml_read_master (ebml, &id);
2786 if (ret != GST_FLOW_OK)
2789 while (gst_ebml_read_has_remaining (ebml, 1, TRUE)) {
2790 ret = gst_ebml_peek_id (ebml, &id);
2791 if (ret != GST_FLOW_OK)
2795 /* is our read version uptodate? */
2796 case GST_EBML_ID_EBMLREADVERSION:{
2799 ret = gst_ebml_read_uint (ebml, &id, &num);
2800 if (ret != GST_FLOW_OK)
2802 if (num != GST_EBML_VERSION) {
2803 GST_ERROR_OBJECT (ebml, "Unsupported EBML version %" G_GUINT64_FORMAT,
2805 return GST_FLOW_ERROR;
2808 GST_DEBUG_OBJECT (ebml, "EbmlReadVersion: %" G_GUINT64_FORMAT, num);
2812 /* we only handle 8 byte lengths at max */
2813 case GST_EBML_ID_EBMLMAXSIZELENGTH:{
2816 ret = gst_ebml_read_uint (ebml, &id, &num);
2817 if (ret != GST_FLOW_OK)
2819 if (num > sizeof (guint64)) {
2820 GST_ERROR_OBJECT (ebml,
2821 "Unsupported EBML maximum size %" G_GUINT64_FORMAT, num);
2822 return GST_FLOW_ERROR;
2824 GST_DEBUG_OBJECT (ebml, "EbmlMaxSizeLength: %" G_GUINT64_FORMAT, num);
2828 /* we handle 4 byte IDs at max */
2829 case GST_EBML_ID_EBMLMAXIDLENGTH:{
2832 ret = gst_ebml_read_uint (ebml, &id, &num);
2833 if (ret != GST_FLOW_OK)
2835 if (num > sizeof (guint32)) {
2836 GST_ERROR_OBJECT (ebml,
2837 "Unsupported EBML maximum ID %" G_GUINT64_FORMAT, num);
2838 return GST_FLOW_ERROR;
2840 GST_DEBUG_OBJECT (ebml, "EbmlMaxIdLength: %" G_GUINT64_FORMAT, num);
2844 case GST_EBML_ID_DOCTYPE:{
2847 ret = gst_ebml_read_ascii (ebml, &id, &text);
2848 if (ret != GST_FLOW_OK)
2851 GST_DEBUG_OBJECT (ebml, "EbmlDocType: %s", GST_STR_NULL (text));
2859 case GST_EBML_ID_DOCTYPEREADVERSION:{
2862 ret = gst_ebml_read_uint (ebml, &id, &num);
2863 if (ret != GST_FLOW_OK)
2866 GST_DEBUG_OBJECT (ebml, "EbmlReadVersion: %" G_GUINT64_FORMAT, num);
2871 ret = gst_matroska_read_common_parse_skip (&demux->common, ebml,
2873 if (ret != GST_FLOW_OK)
2877 /* we ignore these two, as they don't tell us anything we care about */
2878 case GST_EBML_ID_EBMLVERSION:
2879 case GST_EBML_ID_DOCTYPEVERSION:
2880 ret = gst_ebml_read_skip (ebml);
2881 if (ret != GST_FLOW_OK)
2889 if ((doctype != NULL && !strcmp (doctype, GST_MATROSKA_DOCTYPE_MATROSKA)) ||
2890 (doctype != NULL && !strcmp (doctype, GST_MATROSKA_DOCTYPE_WEBM)) ||
2891 (doctype == NULL)) {
2894 GST_INFO_OBJECT (demux, "Input is %s version %d", doctype, version);
2896 GST_WARNING_OBJECT (demux, "Input is EBML without doctype, assuming "
2897 "matroska (version %d)", version);
2901 GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL),
2902 ("Demuxer version (2) is too old to read %s version %d",
2903 GST_STR_NULL (doctype), version));
2904 ret = GST_FLOW_ERROR;
2908 GST_ELEMENT_ERROR (demux, STREAM, WRONG_TYPE, (NULL),
2909 ("Input is not a matroska stream (doctype=%s)", doctype));
2910 ret = GST_FLOW_ERROR;
2917 static GstFlowReturn
2918 gst_matroska_demux_parse_tracks (GstMatroskaDemux * demux, GstEbmlRead * ebml)
2920 GstFlowReturn ret = GST_FLOW_OK;
2923 DEBUG_ELEMENT_START (demux, ebml, "Tracks");
2925 if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) {
2926 DEBUG_ELEMENT_STOP (demux, ebml, "Tracks", ret);
2930 while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) {
2931 if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK)
2935 /* one track within the "all-tracks" header */
2936 case GST_MATROSKA_ID_TRACKENTRY:
2937 ret = gst_matroska_demux_add_stream (demux, ebml);
2941 ret = gst_matroska_read_common_parse_skip (&demux->common, ebml,
2946 DEBUG_ELEMENT_STOP (demux, ebml, "Tracks", ret);
2948 demux->tracks_parsed = TRUE;
2953 static GstFlowReturn
2954 gst_matroska_demux_parse_info (GstMatroskaDemux * demux, GstEbmlRead * ebml)
2956 GstFlowReturn ret = GST_FLOW_OK;
2957 gdouble dur_f = -1.0;
2960 DEBUG_ELEMENT_START (demux, ebml, "SegmentInfo");
2962 if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) {
2963 DEBUG_ELEMENT_STOP (demux, ebml, "SegmentInfo", ret);
2967 while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) {
2968 if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK)
2972 /* cluster timecode */
2973 case GST_MATROSKA_ID_TIMECODESCALE:{
2976 if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK)
2980 GST_DEBUG_OBJECT (demux, "TimeCodeScale: %" G_GUINT64_FORMAT, num);
2981 demux->common.time_scale = num;
2985 case GST_MATROSKA_ID_DURATION:{
2986 if ((ret = gst_ebml_read_float (ebml, &id, &dur_f)) != GST_FLOW_OK)
2990 GST_WARNING_OBJECT (demux, "Invalid duration %lf", dur_f);
2994 GST_DEBUG_OBJECT (demux, "Duration: %lf", dur_f);
2998 case GST_MATROSKA_ID_WRITINGAPP:{
3001 if ((ret = gst_ebml_read_utf8 (ebml, &id, &text)) != GST_FLOW_OK)
3004 GST_DEBUG_OBJECT (demux, "WritingApp: %s", GST_STR_NULL (text));
3005 demux->writing_app = text;
3009 case GST_MATROSKA_ID_MUXINGAPP:{
3012 if ((ret = gst_ebml_read_utf8 (ebml, &id, &text)) != GST_FLOW_OK)
3015 GST_DEBUG_OBJECT (demux, "MuxingApp: %s", GST_STR_NULL (text));
3016 demux->muxing_app = text;
3020 case GST_MATROSKA_ID_DATEUTC:{
3023 if ((ret = gst_ebml_read_date (ebml, &id, &time)) != GST_FLOW_OK)
3026 GST_DEBUG_OBJECT (demux, "DateUTC: %" G_GINT64_FORMAT, time);
3027 demux->created = time;
3031 case GST_MATROSKA_ID_TITLE:{
3033 GstTagList *taglist;
3035 if ((ret = gst_ebml_read_utf8 (ebml, &id, &text)) != GST_FLOW_OK)
3038 GST_DEBUG_OBJECT (demux, "Title: %s", GST_STR_NULL (text));
3039 taglist = gst_tag_list_new ();
3040 gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, GST_TAG_TITLE, text,
3042 gst_matroska_demux_found_global_tag (demux, taglist);
3048 ret = gst_matroska_read_common_parse_skip (&demux->common, ebml,
3053 case GST_MATROSKA_ID_SEGMENTUID:
3054 case GST_MATROSKA_ID_SEGMENTFILENAME:
3055 case GST_MATROSKA_ID_PREVUID:
3056 case GST_MATROSKA_ID_PREVFILENAME:
3057 case GST_MATROSKA_ID_NEXTUID:
3058 case GST_MATROSKA_ID_NEXTFILENAME:
3059 case GST_MATROSKA_ID_SEGMENTFAMILY:
3060 case GST_MATROSKA_ID_CHAPTERTRANSLATE:
3061 ret = gst_ebml_read_skip (ebml);
3069 dur_u = gst_gdouble_to_guint64 (dur_f *
3070 gst_guint64_to_gdouble (demux->common.time_scale));
3071 if (GST_CLOCK_TIME_IS_VALID (dur_u) && dur_u <= G_MAXINT64)
3072 gst_segment_set_duration (&demux->segment, GST_FORMAT_TIME, dur_u);
3075 DEBUG_ELEMENT_STOP (demux, ebml, "SegmentInfo", ret);
3077 demux->segmentinfo_parsed = TRUE;
3082 static GstFlowReturn
3083 gst_matroska_demux_parse_metadata_id_simple_tag (GstMatroskaDemux * demux,
3084 GstEbmlRead * ebml, GstTagList ** p_taglist)
3086 /* FIXME: check if there are more useful mappings */
3089 const gchar *matroska_tagname;
3090 const gchar *gstreamer_tagname;
3094 GST_MATROSKA_TAG_ID_TITLE, GST_TAG_TITLE}, {
3095 GST_MATROSKA_TAG_ID_ARTIST, GST_TAG_ARTIST}, {
3096 GST_MATROSKA_TAG_ID_AUTHOR, GST_TAG_ARTIST}, {
3097 GST_MATROSKA_TAG_ID_ALBUM, GST_TAG_ALBUM}, {
3098 GST_MATROSKA_TAG_ID_COMMENTS, GST_TAG_COMMENT}, {
3099 GST_MATROSKA_TAG_ID_BITSPS, GST_TAG_BITRATE}, {
3100 GST_MATROSKA_TAG_ID_BPS, GST_TAG_BITRATE}, {
3101 GST_MATROSKA_TAG_ID_ENCODER, GST_TAG_ENCODER}, {
3102 GST_MATROSKA_TAG_ID_DATE, GST_TAG_DATE}, {
3103 GST_MATROSKA_TAG_ID_ISRC, GST_TAG_ISRC}, {
3104 GST_MATROSKA_TAG_ID_COPYRIGHT, GST_TAG_COPYRIGHT}, {
3105 GST_MATROSKA_TAG_ID_BPM, GST_TAG_BEATS_PER_MINUTE}, {
3106 GST_MATROSKA_TAG_ID_TERMS_OF_USE, GST_TAG_LICENSE}, {
3107 GST_MATROSKA_TAG_ID_COMPOSER, GST_TAG_COMPOSER}, {
3108 GST_MATROSKA_TAG_ID_LEAD_PERFORMER, GST_TAG_PERFORMER}, {
3109 GST_MATROSKA_TAG_ID_GENRE, GST_TAG_GENRE}
3113 gchar *value = NULL;
3116 DEBUG_ELEMENT_START (demux, ebml, "SimpleTag");
3118 if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) {
3119 DEBUG_ELEMENT_STOP (demux, ebml, "SimpleTag", ret);
3123 while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) {
3124 /* read all sub-entries */
3126 if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK)
3130 case GST_MATROSKA_ID_TAGNAME:
3133 ret = gst_ebml_read_ascii (ebml, &id, &tag);
3134 GST_DEBUG_OBJECT (demux, "TagName: %s", GST_STR_NULL (tag));
3137 case GST_MATROSKA_ID_TAGSTRING:
3140 ret = gst_ebml_read_utf8 (ebml, &id, &value);
3141 GST_DEBUG_OBJECT (demux, "TagString: %s", GST_STR_NULL (value));
3145 ret = gst_matroska_read_common_parse_skip (&demux->common, ebml,
3150 case GST_MATROSKA_ID_TAGLANGUAGE:
3151 case GST_MATROSKA_ID_TAGDEFAULT:
3152 case GST_MATROSKA_ID_TAGBINARY:
3153 ret = gst_ebml_read_skip (ebml);
3158 DEBUG_ELEMENT_STOP (demux, ebml, "SimpleTag", ret);
3163 for (i = 0; i < G_N_ELEMENTS (tag_conv); i++) {
3164 const gchar *tagname_gst = tag_conv[i].gstreamer_tagname;
3166 const gchar *tagname_mkv = tag_conv[i].matroska_tagname;
3168 if (strcmp (tagname_mkv, tag) == 0) {
3169 GValue dest = { 0, };
3170 GType dest_type = gst_tag_get_type (tagname_gst);
3172 /* Ensure that any date string is complete */
3173 if (dest_type == GST_TYPE_DATE) {
3174 guint year = 1901, month = 1, day = 1;
3176 /* Dates can be yyyy-MM-dd, yyyy-MM or yyyy, but we need
3178 if (sscanf (value, "%04u-%02u-%02u", &year, &month, &day) != 0) {
3180 value = g_strdup_printf ("%04u-%02u-%02u", year, month, day);
3184 g_value_init (&dest, dest_type);
3185 if (gst_value_deserialize (&dest, value)) {
3186 gst_tag_list_add_values (*p_taglist, GST_TAG_MERGE_APPEND,
3187 tagname_gst, &dest, NULL);
3189 GST_WARNING_OBJECT (demux, "Can't transform tag '%s' with "
3190 "value '%s' to target type '%s'", tag, value,
3191 g_type_name (dest_type));
3193 g_value_unset (&dest);
3205 static GstFlowReturn
3206 gst_matroska_demux_parse_metadata_id_tag (GstMatroskaDemux * demux,
3207 GstEbmlRead * ebml, GstTagList ** p_taglist)
3212 DEBUG_ELEMENT_START (demux, ebml, "Tag");
3214 if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) {
3215 DEBUG_ELEMENT_STOP (demux, ebml, "Tag", ret);
3219 while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) {
3220 /* read all sub-entries */
3222 if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK)
3226 case GST_MATROSKA_ID_SIMPLETAG:
3227 ret = gst_matroska_demux_parse_metadata_id_simple_tag (demux, ebml,
3232 ret = gst_matroska_read_common_parse_skip (&demux->common, ebml,
3238 DEBUG_ELEMENT_STOP (demux, ebml, "Tag", ret);
3243 static GstFlowReturn
3244 gst_matroska_demux_parse_metadata (GstMatroskaDemux * demux, GstEbmlRead * ebml)
3246 GstTagList *taglist;
3247 GstFlowReturn ret = GST_FLOW_OK;
3252 curpos = gst_ebml_read_get_pos (ebml);
3254 /* Make sure we don't parse a tags element twice and
3255 * post it's tags twice */
3256 curpos = gst_ebml_read_get_pos (ebml);
3257 for (l = demux->tags_parsed; l; l = l->next) {
3258 guint64 *pos = l->data;
3260 if (*pos == curpos) {
3261 GST_DEBUG_OBJECT (demux, "Skipping already parsed Tags at offset %"
3262 G_GUINT64_FORMAT, curpos);
3267 demux->tags_parsed =
3268 g_list_prepend (demux->tags_parsed, g_slice_new (guint64));
3269 *((guint64 *) demux->tags_parsed->data) = curpos;
3272 if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) {
3273 DEBUG_ELEMENT_STOP (demux, ebml, "Tags", ret);
3277 taglist = gst_tag_list_new ();
3279 while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) {
3280 if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK)
3284 case GST_MATROSKA_ID_TAG:
3285 ret = gst_matroska_demux_parse_metadata_id_tag (demux, ebml, &taglist);
3289 ret = gst_matroska_read_common_parse_skip (&demux->common, ebml,
3292 /* FIXME: Use to limit the tags to specific pads */
3293 case GST_MATROSKA_ID_TARGETS:
3294 ret = gst_ebml_read_skip (ebml);
3299 DEBUG_ELEMENT_STOP (demux, ebml, "Tags", ret);
3301 gst_matroska_demux_found_global_tag (demux, taglist);
3306 static GstFlowReturn
3307 gst_matroska_demux_parse_attached_file (GstMatroskaDemux * demux,
3308 GstEbmlRead * ebml, GstTagList * taglist)
3312 gchar *description = NULL;
3313 gchar *filename = NULL;
3314 gchar *mimetype = NULL;
3315 guint8 *data = NULL;
3316 guint64 datalen = 0;
3318 DEBUG_ELEMENT_START (demux, ebml, "AttachedFile");
3320 if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) {
3321 DEBUG_ELEMENT_STOP (demux, ebml, "AttachedFile", ret);
3325 while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) {
3326 /* read all sub-entries */
3328 if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK)
3332 case GST_MATROSKA_ID_FILEDESCRIPTION:
3334 GST_WARNING_OBJECT (demux, "FileDescription can only appear once");
3338 ret = gst_ebml_read_utf8 (ebml, &id, &description);
3339 GST_DEBUG_OBJECT (demux, "FileDescription: %s",
3340 GST_STR_NULL (description));
3342 case GST_MATROSKA_ID_FILENAME:
3344 GST_WARNING_OBJECT (demux, "FileName can only appear once");
3348 ret = gst_ebml_read_utf8 (ebml, &id, &filename);
3350 GST_DEBUG_OBJECT (demux, "FileName: %s", GST_STR_NULL (filename));
3352 case GST_MATROSKA_ID_FILEMIMETYPE:
3354 GST_WARNING_OBJECT (demux, "FileMimeType can only appear once");
3358 ret = gst_ebml_read_ascii (ebml, &id, &mimetype);
3359 GST_DEBUG_OBJECT (demux, "FileMimeType: %s", GST_STR_NULL (mimetype));
3361 case GST_MATROSKA_ID_FILEDATA:
3363 GST_WARNING_OBJECT (demux, "FileData can only appear once");
3367 ret = gst_ebml_read_binary (ebml, &id, &data, &datalen);
3368 GST_DEBUG_OBJECT (demux, "FileData of size %" G_GUINT64_FORMAT,
3373 ret = gst_matroska_read_common_parse_skip (&demux->common, ebml,
3374 "AttachedFile", id);
3376 case GST_MATROSKA_ID_FILEUID:
3377 ret = gst_ebml_read_skip (ebml);
3382 DEBUG_ELEMENT_STOP (demux, ebml, "AttachedFile", ret);
3384 if (filename && mimetype && data && datalen > 0) {
3385 GstTagImageType image_type = GST_TAG_IMAGE_TYPE_NONE;
3386 GstBuffer *tagbuffer = NULL;
3388 gchar *filename_lc = g_utf8_strdown (filename, -1);
3390 GST_DEBUG_OBJECT (demux, "Creating tag for attachment with filename '%s', "
3391 "mimetype '%s', description '%s', size %" G_GUINT64_FORMAT, filename,
3392 mimetype, GST_STR_NULL (description), datalen);
3394 /* TODO: better heuristics for different image types */
3395 if (strstr (filename_lc, "cover")) {
3396 if (strstr (filename_lc, "back"))
3397 image_type = GST_TAG_IMAGE_TYPE_BACK_COVER;
3399 image_type = GST_TAG_IMAGE_TYPE_FRONT_COVER;
3400 } else if (g_str_has_prefix (mimetype, "image/") ||
3401 g_str_has_suffix (filename_lc, "png") ||
3402 g_str_has_suffix (filename_lc, "jpg") ||
3403 g_str_has_suffix (filename_lc, "jpeg") ||
3404 g_str_has_suffix (filename_lc, "gif") ||
3405 g_str_has_suffix (filename_lc, "bmp")) {
3406 image_type = GST_TAG_IMAGE_TYPE_UNDEFINED;
3408 g_free (filename_lc);
3410 /* First try to create an image tag buffer from this */
3411 if (image_type != GST_TAG_IMAGE_TYPE_NONE) {
3413 gst_tag_image_data_to_image_buffer (data, datalen, image_type);
3416 image_type = GST_TAG_IMAGE_TYPE_NONE;
3419 /* if this failed create an attachment buffer */
3421 tagbuffer = gst_buffer_new_and_alloc (datalen);
3423 memcpy (GST_BUFFER_DATA (tagbuffer), data, datalen);
3424 GST_BUFFER_SIZE (tagbuffer) = datalen;
3426 caps = gst_type_find_helper_for_buffer (NULL, tagbuffer, NULL);
3428 caps = gst_caps_new_simple (mimetype, NULL);
3429 gst_buffer_set_caps (tagbuffer, caps);
3430 gst_caps_unref (caps);
3433 /* Set filename and description on the caps */
3434 caps = GST_BUFFER_CAPS (tagbuffer);
3435 gst_caps_set_simple (caps, "filename", G_TYPE_STRING, filename, NULL);
3437 gst_caps_set_simple (caps, "description", G_TYPE_STRING, description,
3440 GST_DEBUG_OBJECT (demux,
3441 "Created attachment buffer with caps: %" GST_PTR_FORMAT, caps);
3443 /* and append to the tag list */
3444 if (image_type != GST_TAG_IMAGE_TYPE_NONE)
3445 gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, GST_TAG_IMAGE, tagbuffer,
3448 gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, GST_TAG_ATTACHMENT,
3455 g_free (description);
3460 static GstFlowReturn
3461 gst_matroska_demux_parse_attachments (GstMatroskaDemux * demux,
3465 GstFlowReturn ret = GST_FLOW_OK;
3466 GstTagList *taglist;
3468 DEBUG_ELEMENT_START (demux, ebml, "Attachments");
3470 if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) {
3471 DEBUG_ELEMENT_STOP (demux, ebml, "Attachments", ret);
3475 taglist = gst_tag_list_new ();
3477 while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) {
3478 if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK)
3482 case GST_MATROSKA_ID_ATTACHEDFILE:
3483 ret = gst_matroska_demux_parse_attached_file (demux, ebml, taglist);
3487 ret = gst_matroska_read_common_parse_skip (&demux->common, ebml,
3492 DEBUG_ELEMENT_STOP (demux, ebml, "Attachments", ret);
3494 if (gst_structure_n_fields (GST_STRUCTURE (taglist)) > 0) {
3495 GST_DEBUG_OBJECT (demux, "Storing attachment tags");
3496 gst_matroska_demux_found_global_tag (demux, taglist);
3498 GST_DEBUG_OBJECT (demux, "No valid attachments found");
3499 gst_tag_list_free (taglist);
3502 demux->attachments_parsed = TRUE;
3507 static GstFlowReturn
3508 gst_matroska_demux_parse_chapters (GstMatroskaDemux * demux, GstEbmlRead * ebml)
3511 GstFlowReturn ret = GST_FLOW_OK;
3513 GST_WARNING_OBJECT (demux, "Parsing of chapters not implemented yet");
3515 /* TODO: implement parsing of chapters */
3517 DEBUG_ELEMENT_START (demux, ebml, "Chapters");
3519 if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) {
3520 DEBUG_ELEMENT_STOP (demux, ebml, "Chapters", ret);
3524 while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) {
3525 if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK)
3530 ret = gst_ebml_read_skip (ebml);
3535 DEBUG_ELEMENT_STOP (demux, ebml, "Chapters", ret);
3540 * Read signed/unsigned "EBML" numbers.
3541 * Return: number of bytes processed.
3545 gst_matroska_ebmlnum_uint (guint8 * data, guint size, guint64 * num)
3547 gint len_mask = 0x80, read = 1, n = 1, num_ffs = 0;
3555 while (read <= 8 && !(total & len_mask)) {
3562 if ((total &= (len_mask - 1)) == len_mask - 1)
3567 if (data[n] == 0xff)
3569 total = (total << 8) | data[n];
3573 if (read == num_ffs && total != 0)
3582 gst_matroska_ebmlnum_sint (guint8 * data, guint size, gint64 * num)
3587 /* read as unsigned number first */
3588 if ((res = gst_matroska_ebmlnum_uint (data, size, &unum)) < 0)
3592 if (unum == G_MAXUINT64)
3595 *num = unum - ((1 << ((7 * res) - 1)) - 1);
3601 * Mostly used for subtitles. We add void filler data for each
3602 * lagging stream to make sure we don't deadlock.
3606 gst_matroska_demux_sync_streams (GstMatroskaDemux * demux)
3610 GST_OBJECT_LOCK (demux);
3612 GST_LOG_OBJECT (demux, "Sync to %" GST_TIME_FORMAT,
3613 GST_TIME_ARGS (demux->segment.last_stop));
3615 g_assert (demux->common.num_streams == demux->common.src->len);
3616 for (stream_nr = 0; stream_nr < demux->common.src->len; stream_nr++) {
3617 GstMatroskaTrackContext *context;
3619 context = g_ptr_array_index (demux->common.src, stream_nr);
3621 GST_LOG_OBJECT (demux,
3622 "Checking for resync on stream %d (%" GST_TIME_FORMAT ")", stream_nr,
3623 GST_TIME_ARGS (context->pos));
3625 if (G_LIKELY (context->type != GST_MATROSKA_TRACK_TYPE_SUBTITLE)) {
3626 GST_LOG_OBJECT (demux, "Skipping sync on non-subtitle stream");
3630 /* does it lag? 0.5 seconds is a random threshold...
3631 * lag need only be considered if we have advanced into requested segment */
3632 if (GST_CLOCK_TIME_IS_VALID (context->pos) &&
3633 GST_CLOCK_TIME_IS_VALID (demux->segment.last_stop) &&
3634 demux->segment.last_stop > demux->segment.start &&
3635 context->pos + (GST_SECOND / 2) < demux->segment.last_stop) {
3639 new_start = demux->segment.last_stop - (GST_SECOND / 2);
3640 if (GST_CLOCK_TIME_IS_VALID (demux->segment.stop))
3641 new_start = MIN (new_start, demux->segment.stop);
3642 GST_DEBUG_OBJECT (demux,
3643 "Synchronizing stream %d with others by advancing time " "from %"
3644 GST_TIME_FORMAT " to %" GST_TIME_FORMAT, stream_nr,
3645 GST_TIME_ARGS (context->pos), GST_TIME_ARGS (new_start));
3647 context->pos = new_start;
3649 /* advance stream time */
3650 event = gst_event_new_new_segment (TRUE, demux->segment.rate,
3651 demux->segment.format, new_start, demux->segment.stop, new_start);
3652 GST_OBJECT_UNLOCK (demux);
3653 gst_pad_push_event (context->pad, event);
3654 GST_OBJECT_LOCK (demux);
3658 GST_OBJECT_UNLOCK (demux);
3661 static GstFlowReturn
3662 gst_matroska_demux_push_hdr_buf (GstMatroskaDemux * demux,
3663 GstMatroskaTrackContext * stream, guint8 * data, guint len)
3665 GstFlowReturn ret, cret;
3666 GstBuffer *header_buf;
3668 header_buf = gst_buffer_new_and_alloc (len);
3669 gst_buffer_set_caps (header_buf, stream->caps);
3670 memcpy (GST_BUFFER_DATA (header_buf), data, len);
3672 if (stream->set_discont) {
3673 GST_BUFFER_FLAG_SET (header_buf, GST_BUFFER_FLAG_DISCONT);
3674 stream->set_discont = FALSE;
3677 ret = gst_pad_push (stream->pad, header_buf);
3680 cret = gst_matroska_demux_combine_flows (demux, stream, ret);
3685 static GstFlowReturn
3686 gst_matroska_demux_push_flac_codec_priv_data (GstMatroskaDemux * demux,
3687 GstMatroskaTrackContext * stream)
3693 GST_LOG_OBJECT (demux, "priv data size = %u", stream->codec_priv_size);
3695 pdata = (guint8 *) stream->codec_priv;
3697 /* need at least 'fLaC' marker + STREAMINFO metadata block */
3698 if (stream->codec_priv_size < ((4) + (4 + 34))) {
3699 GST_WARNING_OBJECT (demux, "not enough codec priv data for flac headers");
3700 return GST_FLOW_ERROR;
3703 if (memcmp (pdata, "fLaC", 4) != 0) {
3704 GST_WARNING_OBJECT (demux, "no flac marker at start of stream headers");
3705 return GST_FLOW_ERROR;
3708 ret = gst_matroska_demux_push_hdr_buf (demux, stream, pdata, 4);
3709 if (ret != GST_FLOW_OK)
3712 off = 4; /* skip fLaC marker */
3713 while (off < stream->codec_priv_size) {
3714 len = GST_READ_UINT8 (pdata + off + 1) << 16;
3715 len |= GST_READ_UINT8 (pdata + off + 2) << 8;
3716 len |= GST_READ_UINT8 (pdata + off + 3);
3718 GST_DEBUG_OBJECT (demux, "header packet: len=%u bytes, flags=0x%02x",
3719 len, (guint) pdata[off]);
3721 ret = gst_matroska_demux_push_hdr_buf (demux, stream, pdata + off, len + 4);
3722 if (ret != GST_FLOW_OK)
3730 static GstFlowReturn
3731 gst_matroska_demux_push_speex_codec_priv_data (GstMatroskaDemux * demux,
3732 GstMatroskaTrackContext * stream)
3737 GST_LOG_OBJECT (demux, "priv data size = %u", stream->codec_priv_size);
3739 pdata = (guint8 *) stream->codec_priv;
3741 /* need at least 'fLaC' marker + STREAMINFO metadata block */
3742 if (stream->codec_priv_size < 80) {
3743 GST_WARNING_OBJECT (demux, "not enough codec priv data for speex headers");
3744 return GST_FLOW_ERROR;
3747 if (memcmp (pdata, "Speex ", 8) != 0) {
3748 GST_WARNING_OBJECT (demux, "no Speex marker at start of stream headers");
3749 return GST_FLOW_ERROR;
3752 ret = gst_matroska_demux_push_hdr_buf (demux, stream, pdata, 80);
3753 if (ret != GST_FLOW_OK)
3756 if (stream->codec_priv_size == 80)
3759 return gst_matroska_demux_push_hdr_buf (demux, stream, pdata + 80,
3760 stream->codec_priv_size - 80);
3763 static GstFlowReturn
3764 gst_matroska_demux_push_xiph_codec_priv_data (GstMatroskaDemux * demux,
3765 GstMatroskaTrackContext * stream)
3768 guint8 *p = (guint8 *) stream->codec_priv;
3769 gint i, offset, num_packets;
3770 guint *length, last;
3772 if (stream->codec_priv == NULL || stream->codec_priv_size == 0) {
3773 GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL),
3774 ("Missing codec private data for xiph headers, broken file"));
3775 return GST_FLOW_ERROR;
3778 /* start of the stream and vorbis audio or theora video, need to
3779 * send the codec_priv data as first three packets */
3780 num_packets = p[0] + 1;
3781 GST_DEBUG_OBJECT (demux, "%u stream headers, total length=%u bytes",
3782 (guint) num_packets, stream->codec_priv_size);
3784 length = g_alloca (num_packets * sizeof (guint));
3788 /* first packets, read length values */
3789 for (i = 0; i < num_packets - 1; i++) {
3791 while (offset < stream->codec_priv_size) {
3792 length[i] += p[offset];
3793 if (p[offset++] != 0xff)
3798 if (offset + last > stream->codec_priv_size)
3799 return GST_FLOW_ERROR;
3801 /* last packet is the remaining size */
3802 length[i] = stream->codec_priv_size - offset - last;
3804 for (i = 0; i < num_packets; i++) {
3805 GST_DEBUG_OBJECT (demux, "buffer %d: length=%u bytes", i,
3807 if (offset + length[i] > stream->codec_priv_size)
3808 return GST_FLOW_ERROR;
3811 gst_matroska_demux_push_hdr_buf (demux, stream, p + offset, length[i]);
3812 if (ret != GST_FLOW_OK)
3815 offset += length[i];
3821 gst_matroska_demux_push_dvd_clut_change_event (GstMatroskaDemux * demux,
3822 GstMatroskaTrackContext * stream)
3826 g_assert (!strcmp (stream->codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_VOBSUB));
3828 if (!stream->codec_priv)
3831 /* ideally, VobSub private data should be parsed and stored more convenient
3832 * elsewhere, but for now, only interested in a small part */
3834 /* make sure we have terminating 0 */
3835 buf = g_strndup ((gchar *) stream->codec_priv, stream->codec_priv_size);
3837 /* just locate and parse palette part */
3838 start = strstr (buf, "palette:");
3843 guint8 r, g, b, y, u, v;
3846 while (g_ascii_isspace (*start))
3848 for (i = 0; i < 16; i++) {
3849 if (sscanf (start, "%06x", &col) != 1)
3852 while ((*start == ',') || g_ascii_isspace (*start))
3854 /* sigh, need to convert this from vobsub pseudo-RGB to YUV */
3855 r = (col >> 16) & 0xff;
3856 g = (col >> 8) & 0xff;
3858 y = CLAMP ((0.1494 * r + 0.6061 * g + 0.2445 * b) * 219 / 255 + 16, 0,
3860 u = CLAMP (0.6066 * r - 0.4322 * g - 0.1744 * b + 128, 0, 255);
3861 v = CLAMP (-0.08435 * r - 0.3422 * g + 0.4266 * b + 128, 0, 255);
3862 clut[i] = (y << 16) | (u << 8) | v;
3865 /* got them all without problems; build and send event */
3869 s = gst_structure_new ("application/x-gst-dvd", "event", G_TYPE_STRING,
3870 "dvd-spu-clut-change", "clut00", G_TYPE_INT, clut[0], "clut01",
3871 G_TYPE_INT, clut[1], "clut02", G_TYPE_INT, clut[2], "clut03",
3872 G_TYPE_INT, clut[3], "clut04", G_TYPE_INT, clut[4], "clut05",
3873 G_TYPE_INT, clut[5], "clut06", G_TYPE_INT, clut[6], "clut07",
3874 G_TYPE_INT, clut[7], "clut08", G_TYPE_INT, clut[8], "clut09",
3875 G_TYPE_INT, clut[9], "clut10", G_TYPE_INT, clut[10], "clut11",
3876 G_TYPE_INT, clut[11], "clut12", G_TYPE_INT, clut[12], "clut13",
3877 G_TYPE_INT, clut[13], "clut14", G_TYPE_INT, clut[14], "clut15",
3878 G_TYPE_INT, clut[15], NULL);
3880 gst_pad_push_event (stream->pad,
3881 gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM, s));
3887 static GstFlowReturn
3888 gst_matroska_demux_add_mpeg_seq_header (GstElement * element,
3889 GstMatroskaTrackContext * stream, GstBuffer ** buf)
3892 guint seq_header_len;
3895 if (stream->codec_state) {
3896 seq_header = stream->codec_state;
3897 seq_header_len = stream->codec_state_size;
3898 } else if (stream->codec_priv) {
3899 seq_header = stream->codec_priv;
3900 seq_header_len = stream->codec_priv_size;
3905 /* Sequence header only needed for keyframes */
3906 if (GST_BUFFER_FLAG_IS_SET (*buf, GST_BUFFER_FLAG_DELTA_UNIT))
3909 if (GST_BUFFER_SIZE (*buf) < 4)
3912 header = GST_READ_UINT32_BE (GST_BUFFER_DATA (*buf));
3913 /* Sequence start code, if not found prepend */
3914 if (header != 0x000001b3) {
3917 newbuf = gst_buffer_new_and_alloc (GST_BUFFER_SIZE (*buf) + seq_header_len);
3918 gst_buffer_set_caps (newbuf, stream->caps);
3920 GST_DEBUG_OBJECT (element, "Prepending MPEG sequence header");
3921 gst_buffer_copy_metadata (newbuf, *buf, GST_BUFFER_COPY_TIMESTAMPS |
3922 GST_BUFFER_COPY_FLAGS);
3923 g_memmove (GST_BUFFER_DATA (newbuf), seq_header, seq_header_len);
3924 g_memmove (GST_BUFFER_DATA (newbuf) + seq_header_len,
3925 GST_BUFFER_DATA (*buf), GST_BUFFER_SIZE (*buf));
3926 gst_buffer_unref (*buf);
3933 static GstFlowReturn
3934 gst_matroska_demux_add_wvpk_header (GstElement * element,
3935 GstMatroskaTrackContext * stream, GstBuffer ** buf)
3937 GstMatroskaTrackAudioContext *audiocontext =
3938 (GstMatroskaTrackAudioContext *) stream;
3939 GstBuffer *newbuf = NULL;
3949 wvh.version = GST_READ_UINT16_LE (stream->codec_priv);
3952 wvh.total_samples = -1;
3953 wvh.block_index = audiocontext->wvpk_block_index;
3955 if (audiocontext->channels <= 2) {
3956 guint32 block_samples;
3958 block_samples = GST_READ_UINT32_LE (GST_BUFFER_DATA (*buf));
3959 /* we need to reconstruct the header of the wavpack block */
3961 /* -20 because ck_size is the size of the wavpack block -8
3962 * and lace_size is the size of the wavpack block + 12
3963 * (the three guint32 of the header that already are in the buffer) */
3964 wvh.ck_size = GST_BUFFER_SIZE (*buf) + sizeof (Wavpack4Header) - 20;
3966 /* block_samples, flags and crc are already in the buffer */
3967 newlen = GST_BUFFER_SIZE (*buf) + sizeof (Wavpack4Header) - 12;
3968 newbuf = gst_buffer_new_and_alloc (newlen);
3969 gst_buffer_set_caps (newbuf, stream->caps);
3971 data = GST_BUFFER_DATA (newbuf);
3976 GST_WRITE_UINT32_LE (data + 4, wvh.ck_size);
3977 GST_WRITE_UINT16_LE (data + 8, wvh.version);
3978 GST_WRITE_UINT8 (data + 10, wvh.track_no);
3979 GST_WRITE_UINT8 (data + 11, wvh.index_no);
3980 GST_WRITE_UINT32_LE (data + 12, wvh.total_samples);
3981 GST_WRITE_UINT32_LE (data + 16, wvh.block_index);
3982 g_memmove (data + 20, GST_BUFFER_DATA (*buf), GST_BUFFER_SIZE (*buf));
3983 gst_buffer_copy_metadata (newbuf, *buf,
3984 GST_BUFFER_COPY_TIMESTAMPS | GST_BUFFER_COPY_FLAGS);
3985 gst_buffer_unref (*buf);
3987 audiocontext->wvpk_block_index += block_samples;
3992 guint32 block_samples, flags, crc, blocksize;
3994 data = GST_BUFFER_DATA (*buf);
3995 size = GST_BUFFER_SIZE (*buf);
3998 GST_ERROR_OBJECT (element, "Too small wavpack buffer");
3999 return GST_FLOW_ERROR;
4002 block_samples = GST_READ_UINT32_LE (data);
4007 flags = GST_READ_UINT32_LE (data);
4010 crc = GST_READ_UINT32_LE (data);
4013 blocksize = GST_READ_UINT32_LE (data);
4017 if (blocksize == 0 || size < blocksize)
4020 if (newbuf == NULL) {
4021 newbuf = gst_buffer_new_and_alloc (sizeof (Wavpack4Header) + blocksize);
4022 gst_buffer_set_caps (newbuf, stream->caps);
4024 gst_buffer_copy_metadata (newbuf, *buf,
4025 GST_BUFFER_COPY_TIMESTAMPS | GST_BUFFER_COPY_FLAGS);
4028 outdata = GST_BUFFER_DATA (newbuf);
4030 GST_BUFFER_SIZE (newbuf) += sizeof (Wavpack4Header) + blocksize;
4031 GST_BUFFER_DATA (newbuf) =
4032 g_realloc (GST_BUFFER_DATA (newbuf), GST_BUFFER_SIZE (newbuf));
4033 GST_BUFFER_MALLOCDATA (newbuf) = GST_BUFFER_DATA (newbuf);
4034 outdata = GST_BUFFER_DATA (newbuf);
4037 outdata[outpos] = 'w';
4038 outdata[outpos + 1] = 'v';
4039 outdata[outpos + 2] = 'p';
4040 outdata[outpos + 3] = 'k';
4043 GST_WRITE_UINT32_LE (outdata + outpos,
4044 blocksize + sizeof (Wavpack4Header) - 8);
4045 GST_WRITE_UINT16_LE (outdata + outpos + 4, wvh.version);
4046 GST_WRITE_UINT8 (outdata + outpos + 6, wvh.track_no);
4047 GST_WRITE_UINT8 (outdata + outpos + 7, wvh.index_no);
4048 GST_WRITE_UINT32_LE (outdata + outpos + 8, wvh.total_samples);
4049 GST_WRITE_UINT32_LE (outdata + outpos + 12, wvh.block_index);
4050 GST_WRITE_UINT32_LE (outdata + outpos + 16, block_samples);
4051 GST_WRITE_UINT32_LE (outdata + outpos + 20, flags);
4052 GST_WRITE_UINT32_LE (outdata + outpos + 24, crc);
4055 g_memmove (outdata + outpos, data, blocksize);
4056 outpos += blocksize;
4060 gst_buffer_unref (*buf);
4062 audiocontext->wvpk_block_index += block_samples;
4068 static GstFlowReturn
4069 gst_matroska_demux_check_subtitle_buffer (GstElement * element,
4070 GstMatroskaTrackContext * stream, GstBuffer ** buf)
4072 GstMatroskaTrackSubtitleContext *sub_stream;
4073 const gchar *encoding, *data;
4079 sub_stream = (GstMatroskaTrackSubtitleContext *) stream;
4081 data = (const gchar *) GST_BUFFER_DATA (*buf);
4082 size = GST_BUFFER_SIZE (*buf);
4084 if (!sub_stream->invalid_utf8) {
4085 if (g_utf8_validate (data, size, NULL)) {
4088 GST_WARNING_OBJECT (element, "subtitle stream %d is not valid UTF-8, this "
4089 "is broken according to the matroska specification", stream->num);
4090 sub_stream->invalid_utf8 = TRUE;
4093 /* file with broken non-UTF8 subtitle, do the best we can do to fix it */
4094 encoding = g_getenv ("GST_SUBTITLE_ENCODING");
4095 if (encoding == NULL || *encoding == '\0') {
4096 /* if local encoding is UTF-8 and no encoding specified
4097 * via the environment variable, assume ISO-8859-15 */
4098 if (g_get_charset (&encoding)) {
4099 encoding = "ISO-8859-15";
4103 utf8 = g_convert_with_fallback (data, size, "UTF-8", encoding, (char *) "*",
4107 GST_LOG_OBJECT (element, "could not convert string from '%s' to UTF-8: %s",
4108 encoding, err->message);
4112 /* invalid input encoding, fall back to ISO-8859-15 (always succeeds) */
4113 encoding = "ISO-8859-15";
4114 utf8 = g_convert_with_fallback (data, size, "UTF-8", encoding, (char *) "*",
4118 GST_LOG_OBJECT (element, "converted subtitle text from %s to UTF-8 %s",
4119 encoding, (err) ? "(using ISO-8859-15 as fallback)" : "");
4122 utf8 = g_strdup ("invalid subtitle");
4124 newbuf = gst_buffer_new ();
4125 GST_BUFFER_MALLOCDATA (newbuf) = (guint8 *) utf8;
4126 GST_BUFFER_DATA (newbuf) = (guint8 *) utf8;
4127 GST_BUFFER_SIZE (newbuf) = strlen (utf8);
4128 gst_buffer_copy_metadata (newbuf, *buf,
4129 GST_BUFFER_COPY_TIMESTAMPS | GST_BUFFER_COPY_FLAGS);
4130 gst_buffer_unref (*buf);
4136 static GstFlowReturn
4137 gst_matroska_demux_check_aac (GstElement * element,
4138 GstMatroskaTrackContext * stream, GstBuffer ** buf)
4143 data = GST_BUFFER_DATA (*buf);
4144 size = GST_BUFFER_SIZE (*buf);
4146 if (size > 2 && data[0] == 0xff && (data[1] >> 4 == 0x0f)) {
4150 /* tss, ADTS data, remove codec_data
4151 * still assume it is at least parsed */
4152 new_caps = gst_caps_copy (stream->caps);
4153 s = gst_caps_get_structure (new_caps, 0);
4155 gst_structure_remove_field (s, "codec_data");
4156 gst_caps_replace (&stream->caps, new_caps);
4157 gst_pad_set_caps (stream->pad, new_caps);
4158 gst_buffer_set_caps (*buf, new_caps);
4159 GST_DEBUG_OBJECT (element, "ADTS AAC audio data; removing codec-data, "
4160 "new caps: %" GST_PTR_FORMAT, new_caps);
4161 gst_caps_unref (new_caps);
4164 /* disable subsequent checking */
4165 stream->postprocess_frame = NULL;
4170 static GstFlowReturn
4171 gst_matroska_demux_parse_blockgroup_or_simpleblock (GstMatroskaDemux * demux,
4172 GstEbmlRead * ebml, guint64 cluster_time, guint64 cluster_offset,
4173 gboolean is_simpleblock)
4175 GstMatroskaTrackContext *stream = NULL;
4176 GstFlowReturn ret = GST_FLOW_OK;
4177 gboolean readblock = FALSE;
4179 guint64 block_duration = 0;
4180 GstBuffer *buf = NULL;
4181 gint stream_num = -1, n, laces = 0;
4183 gint *lace_size = NULL;
4186 gint64 referenceblock = 0;
4189 offset = gst_ebml_read_get_offset (ebml);
4191 while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) {
4192 if (!is_simpleblock) {
4193 if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK) {
4197 id = GST_MATROSKA_ID_SIMPLEBLOCK;
4201 /* one block inside the group. Note, block parsing is one
4202 * of the harder things, so this code is a bit complicated.
4203 * See http://www.matroska.org/ for documentation. */
4204 case GST_MATROSKA_ID_SIMPLEBLOCK:
4205 case GST_MATROSKA_ID_BLOCK:
4211 gst_buffer_unref (buf);
4214 if ((ret = gst_ebml_read_buffer (ebml, &id, &buf)) != GST_FLOW_OK)
4217 data = GST_BUFFER_DATA (buf);
4218 size = GST_BUFFER_SIZE (buf);
4220 /* first byte(s): blocknum */
4221 if ((n = gst_matroska_ebmlnum_uint (data, size, &num)) < 0)
4226 /* fetch stream from num */
4227 stream_num = gst_matroska_read_common_stream_from_num (&demux->common,
4229 if (G_UNLIKELY (size < 3)) {
4230 GST_WARNING_OBJECT (demux, "Invalid size %u", size);
4231 /* non-fatal, try next block(group) */
4234 } else if (G_UNLIKELY (stream_num < 0 ||
4235 stream_num >= demux->common.num_streams)) {
4236 /* let's not give up on a stray invalid track number */
4237 GST_WARNING_OBJECT (demux,
4238 "Invalid stream %d for track number %" G_GUINT64_FORMAT
4239 "; ignoring block", stream_num, num);
4243 stream = g_ptr_array_index (demux->common.src, stream_num);
4245 /* time (relative to cluster time) */
4246 time = ((gint16) GST_READ_UINT16_BE (data));
4249 flags = GST_READ_UINT8 (data);
4253 GST_LOG_OBJECT (demux, "time %" G_GUINT64_FORMAT ", flags %d", time,
4256 switch ((flags & 0x06) >> 1) {
4257 case 0x0: /* no lacing */
4259 lace_size = g_new (gint, 1);
4260 lace_size[0] = size;
4263 case 0x1: /* xiph lacing */
4264 case 0x2: /* fixed-size lacing */
4265 case 0x3: /* EBML lacing */
4267 goto invalid_lacing;
4268 laces = GST_READ_UINT8 (data) + 1;
4271 lace_size = g_new0 (gint, laces);
4273 switch ((flags & 0x06) >> 1) {
4274 case 0x1: /* xiph lacing */ {
4275 guint temp, total = 0;
4277 for (n = 0; ret == GST_FLOW_OK && n < laces - 1; n++) {
4280 goto invalid_lacing;
4281 temp = GST_READ_UINT8 (data);
4282 lace_size[n] += temp;
4288 total += lace_size[n];
4290 lace_size[n] = size - total;
4294 case 0x2: /* fixed-size lacing */
4295 for (n = 0; n < laces; n++)
4296 lace_size[n] = size / laces;
4299 case 0x3: /* EBML lacing */ {
4302 if ((n = gst_matroska_ebmlnum_uint (data, size, &num)) < 0)
4306 total = lace_size[0] = num;
4307 for (n = 1; ret == GST_FLOW_OK && n < laces - 1; n++) {
4311 if ((r = gst_matroska_ebmlnum_sint (data, size, &snum)) < 0)
4315 lace_size[n] = lace_size[n - 1] + snum;
4316 total += lace_size[n];
4319 lace_size[n] = size - total;
4326 if (stream->send_xiph_headers) {
4327 ret = gst_matroska_demux_push_xiph_codec_priv_data (demux, stream);
4328 stream->send_xiph_headers = FALSE;
4331 if (stream->send_flac_headers) {
4332 ret = gst_matroska_demux_push_flac_codec_priv_data (demux, stream);
4333 stream->send_flac_headers = FALSE;
4336 if (stream->send_speex_headers) {
4337 ret = gst_matroska_demux_push_speex_codec_priv_data (demux, stream);
4338 stream->send_speex_headers = FALSE;
4341 if (stream->send_dvd_event) {
4342 gst_matroska_demux_push_dvd_clut_change_event (demux, stream);
4343 /* FIXME: should we send this event again after (flushing) seek ? */
4344 stream->send_dvd_event = FALSE;
4347 if (ret != GST_FLOW_OK)
4354 case GST_MATROSKA_ID_BLOCKDURATION:{
4355 ret = gst_ebml_read_uint (ebml, &id, &block_duration);
4356 GST_DEBUG_OBJECT (demux, "BlockDuration: %" G_GUINT64_FORMAT,
4361 case GST_MATROSKA_ID_REFERENCEBLOCK:{
4362 ret = gst_ebml_read_sint (ebml, &id, &referenceblock);
4363 GST_DEBUG_OBJECT (demux, "ReferenceBlock: %" G_GINT64_FORMAT,
4368 case GST_MATROSKA_ID_CODECSTATE:{
4370 guint64 data_len = 0;
4373 gst_ebml_read_binary (ebml, &id, &data,
4374 &data_len)) != GST_FLOW_OK)
4377 if (G_UNLIKELY (stream == NULL)) {
4378 GST_WARNING_OBJECT (demux,
4379 "Unexpected CodecState subelement - ignoring");
4383 g_free (stream->codec_state);
4384 stream->codec_state = data;
4385 stream->codec_state_size = data_len;
4387 /* Decode if necessary */
4388 if (stream->encodings && stream->encodings->len > 0
4389 && stream->codec_state && stream->codec_state_size > 0) {
4390 if (!gst_matroska_decode_data (stream->encodings,
4391 &stream->codec_state, &stream->codec_state_size,
4392 GST_MATROSKA_TRACK_ENCODING_SCOPE_CODEC_DATA, TRUE)) {
4393 GST_WARNING_OBJECT (demux, "Decoding codec state failed");
4397 GST_DEBUG_OBJECT (demux, "CodecState of %u bytes",
4398 stream->codec_state_size);
4403 ret = gst_matroska_read_common_parse_skip (&demux->common, ebml,
4407 case GST_MATROSKA_ID_BLOCKVIRTUAL:
4408 case GST_MATROSKA_ID_BLOCKADDITIONS:
4409 case GST_MATROSKA_ID_REFERENCEPRIORITY:
4410 case GST_MATROSKA_ID_REFERENCEVIRTUAL:
4411 case GST_MATROSKA_ID_SLICES:
4412 GST_DEBUG_OBJECT (demux,
4413 "Skipping BlockGroup subelement 0x%x - ignoring", id);
4414 ret = gst_ebml_read_skip (ebml);
4422 /* reading a number or so could have failed */
4423 if (ret != GST_FLOW_OK)
4426 if (ret == GST_FLOW_OK && readblock) {
4427 guint64 duration = 0;
4428 gint64 lace_time = 0;
4429 gboolean delta_unit;
4431 stream = g_ptr_array_index (demux->common.src, stream_num);
4433 if (cluster_time != GST_CLOCK_TIME_NONE) {
4434 /* FIXME: What to do with negative timestamps? Give timestamp 0 or -1?
4435 * Drop unless the lace contains timestamp 0? */
4436 if (time < 0 && (-time) > cluster_time) {
4439 if (stream->timecodescale == 1.0)
4440 lace_time = (cluster_time + time) * demux->common.time_scale;
4443 gst_util_guint64_to_gdouble ((cluster_time + time) *
4444 demux->common.time_scale) * stream->timecodescale;
4447 lace_time = GST_CLOCK_TIME_NONE;
4450 /* need to refresh segment info ASAP */
4451 if (GST_CLOCK_TIME_IS_VALID (lace_time) && demux->need_newsegment) {
4452 GST_DEBUG_OBJECT (demux,
4453 "generating segment starting at %" GST_TIME_FORMAT,
4454 GST_TIME_ARGS (lace_time));
4455 /* pretend we seeked here */
4456 gst_segment_set_seek (&demux->segment, demux->segment.rate,
4457 GST_FORMAT_TIME, 0, GST_SEEK_TYPE_SET, lace_time,
4458 GST_SEEK_TYPE_SET, GST_CLOCK_TIME_NONE, NULL);
4459 /* now convey our segment notion downstream */
4460 gst_matroska_demux_send_event (demux, gst_event_new_new_segment (FALSE,
4461 demux->segment.rate, demux->segment.format, demux->segment.start,
4462 demux->segment.stop, demux->segment.start));
4463 demux->need_newsegment = FALSE;
4466 if (block_duration) {
4467 if (stream->timecodescale == 1.0)
4468 duration = gst_util_uint64_scale (block_duration,
4469 demux->common.time_scale, 1);
4472 gst_util_gdouble_to_guint64 (gst_util_guint64_to_gdouble
4473 (gst_util_uint64_scale (block_duration, demux->common.time_scale,
4474 1)) * stream->timecodescale);
4475 } else if (stream->default_duration) {
4476 duration = stream->default_duration * laces;
4478 /* else duration is diff between timecode of this and next block */
4480 /* For SimpleBlock, look at the keyframe bit in flags. Otherwise,
4481 a ReferenceBlock implies that this is not a keyframe. In either
4482 case, it only makes sense for video streams. */
4483 delta_unit = stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO &&
4484 ((is_simpleblock && !(flags & 0x80)) || referenceblock);
4486 if (delta_unit && stream->set_discont) {
4487 /* When doing seeks or such, we need to restart on key frames or
4488 * decoders might choke. */
4489 GST_DEBUG_OBJECT (demux, "skipping delta unit");
4493 for (n = 0; n < laces; n++) {
4496 if (G_UNLIKELY (lace_size[n] > size)) {
4497 GST_WARNING_OBJECT (demux, "Invalid lace size");
4501 /* QoS for video track with an index. the assumption is that
4502 index entries point to keyframes, but if that is not true we
4503 will instad skip until the next keyframe. */
4504 if (GST_CLOCK_TIME_IS_VALID (lace_time) &&
4505 stream->type == GST_MATROSKA_TRACK_TYPE_VIDEO &&
4506 stream->index_table && demux->segment.rate > 0.0) {
4507 GstMatroskaTrackVideoContext *videocontext =
4508 (GstMatroskaTrackVideoContext *) stream;
4509 GstClockTime earliest_time;
4510 GstClockTime earliest_stream_time;
4512 GST_OBJECT_LOCK (demux);
4513 earliest_time = videocontext->earliest_time;
4514 GST_OBJECT_UNLOCK (demux);
4515 earliest_stream_time = gst_segment_to_position (&demux->segment,
4516 GST_FORMAT_TIME, earliest_time);
4518 if (GST_CLOCK_TIME_IS_VALID (lace_time) &&
4519 GST_CLOCK_TIME_IS_VALID (earliest_stream_time) &&
4520 lace_time <= earliest_stream_time) {
4521 /* find index entry (keyframe) <= earliest_stream_time */
4522 GstMatroskaIndex *entry =
4523 gst_util_array_binary_search (stream->index_table->data,
4524 stream->index_table->len, sizeof (GstMatroskaIndex),
4525 (GCompareDataFunc) gst_matroska_index_seek_find,
4526 GST_SEARCH_MODE_BEFORE, &earliest_stream_time, NULL);
4528 /* if that entry (keyframe) is after the current the current
4529 buffer, we can skip pushing (and thus decoding) all
4530 buffers until that keyframe. */
4531 if (entry && GST_CLOCK_TIME_IS_VALID (entry->time) &&
4532 entry->time > lace_time) {
4533 GST_LOG_OBJECT (demux, "Skipping lace before late keyframe");
4534 stream->set_discont = TRUE;
4540 sub = gst_buffer_create_sub (buf,
4541 GST_BUFFER_SIZE (buf) - size, lace_size[n]);
4542 GST_DEBUG_OBJECT (demux, "created subbuffer %p", sub);
4545 GST_BUFFER_FLAG_SET (sub, GST_BUFFER_FLAG_DELTA_UNIT);
4547 GST_BUFFER_FLAG_UNSET (sub, GST_BUFFER_FLAG_DELTA_UNIT);
4549 if (stream->encodings != NULL && stream->encodings->len > 0)
4550 sub = gst_matroska_decode_buffer (stream, sub);
4553 GST_WARNING_OBJECT (demux, "Decoding buffer failed");
4557 GST_BUFFER_TIMESTAMP (sub) = lace_time;
4559 if (GST_CLOCK_TIME_IS_VALID (lace_time)) {
4560 GstClockTime last_stop_end;
4562 /* Check if this stream is after segment stop */
4563 if (GST_CLOCK_TIME_IS_VALID (demux->segment.stop) &&
4564 lace_time >= demux->segment.stop) {
4565 GST_DEBUG_OBJECT (demux,
4566 "Stream %d after segment stop %" GST_TIME_FORMAT, stream->index,
4567 GST_TIME_ARGS (demux->segment.stop));
4568 gst_buffer_unref (sub);
4571 if (offset >= stream->to_offset) {
4572 GST_DEBUG_OBJECT (demux, "Stream %d after playback section",
4574 gst_buffer_unref (sub);
4578 /* handle gaps, e.g. non-zero start-time, or an cue index entry
4579 * that landed us with timestamps not quite intended */
4580 GST_OBJECT_LOCK (demux);
4581 if (GST_CLOCK_TIME_IS_VALID (demux->segment.last_stop) &&
4582 demux->segment.rate > 0.0) {
4583 GstClockTimeDiff diff;
4584 GstEvent *event1, *event2;
4586 /* only send newsegments with increasing start times,
4587 * otherwise if these go back and forth downstream (sinks) increase
4588 * accumulated time and running_time */
4589 diff = GST_CLOCK_DIFF (demux->segment.last_stop, lace_time);
4590 if (diff > 2 * GST_SECOND && lace_time > demux->segment.start &&
4591 (!GST_CLOCK_TIME_IS_VALID (demux->segment.stop) ||
4592 lace_time < demux->segment.stop)) {
4593 GST_DEBUG_OBJECT (demux,
4594 "Gap of %" G_GINT64_FORMAT " ns detected in"
4595 "stream %d (%" GST_TIME_FORMAT " -> %" GST_TIME_FORMAT "). "
4596 "Sending updated NEWSEGMENT events", diff,
4597 stream->index, GST_TIME_ARGS (stream->pos),
4598 GST_TIME_ARGS (lace_time));
4599 /* send newsegment events such that the gap is not accounted in
4600 * accum time, hence running_time */
4601 /* close ahead of gap */
4602 event1 = gst_event_new_new_segment (TRUE, demux->segment.rate,
4603 demux->segment.format, demux->segment.last_stop,
4604 demux->segment.last_stop, demux->segment.last_stop);
4606 event2 = gst_event_new_new_segment (FALSE, demux->segment.rate,
4607 demux->segment.format, lace_time, demux->segment.stop,
4609 GST_OBJECT_UNLOCK (demux);
4610 gst_matroska_demux_send_event (demux, event1);
4611 gst_matroska_demux_send_event (demux, event2);
4612 GST_OBJECT_LOCK (demux);
4613 /* align segment view with downstream,
4614 * prevents double-counting accum when closing segment */
4615 gst_segment_set_newsegment (&demux->segment, FALSE,
4616 demux->segment.rate, demux->segment.format, lace_time,
4617 demux->segment.stop, lace_time);
4618 demux->segment.last_stop = lace_time;
4622 if (!GST_CLOCK_TIME_IS_VALID (demux->segment.last_stop)
4623 || demux->segment.last_stop < lace_time) {
4624 demux->segment.last_stop = lace_time;
4626 GST_OBJECT_UNLOCK (demux);
4628 last_stop_end = lace_time;
4630 GST_BUFFER_DURATION (sub) = duration / laces;
4631 last_stop_end += GST_BUFFER_DURATION (sub);
4634 if (!GST_CLOCK_TIME_IS_VALID (demux->last_stop_end) ||
4635 demux->last_stop_end < last_stop_end)
4636 demux->last_stop_end = last_stop_end;
4638 GST_OBJECT_LOCK (demux);
4639 if (demux->segment.duration == -1 ||
4640 demux->segment.duration < lace_time) {
4641 gst_segment_set_duration (&demux->segment, GST_FORMAT_TIME,
4643 GST_OBJECT_UNLOCK (demux);
4644 gst_element_post_message (GST_ELEMENT_CAST (demux),
4645 gst_message_new_duration (GST_OBJECT_CAST (demux),
4646 GST_FORMAT_TIME, GST_CLOCK_TIME_NONE));
4648 GST_OBJECT_UNLOCK (demux);
4652 stream->pos = lace_time;
4654 gst_matroska_demux_sync_streams (demux);
4656 if (stream->set_discont) {
4657 GST_DEBUG_OBJECT (demux, "marking DISCONT");
4658 GST_BUFFER_FLAG_SET (sub, GST_BUFFER_FLAG_DISCONT);
4659 stream->set_discont = FALSE;
4662 /* reverse playback book-keeping */
4663 if (!GST_CLOCK_TIME_IS_VALID (stream->from_time))
4664 stream->from_time = lace_time;
4665 if (stream->from_offset == -1)
4666 stream->from_offset = offset;
4668 GST_DEBUG_OBJECT (demux,
4669 "Pushing lace %d, data of size %d for stream %d, time=%"
4670 GST_TIME_FORMAT " and duration=%" GST_TIME_FORMAT, n,
4671 GST_BUFFER_SIZE (sub), stream_num,
4672 GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (sub)),
4673 GST_TIME_ARGS (GST_BUFFER_DURATION (sub)));
4675 if (demux->common.element_index) {
4676 if (stream->index_writer_id == -1)
4677 gst_index_get_writer_id (demux->common.element_index,
4678 GST_OBJECT (stream->pad), &stream->index_writer_id);
4680 GST_LOG_OBJECT (demux, "adding association %" GST_TIME_FORMAT "-> %"
4681 G_GUINT64_FORMAT " for writer id %d",
4682 GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (sub)), cluster_offset,
4683 stream->index_writer_id);
4684 gst_index_add_association (demux->common.element_index,
4685 stream->index_writer_id, GST_BUFFER_FLAG_IS_SET (sub,
4686 GST_BUFFER_FLAG_DELTA_UNIT) ? 0 : GST_ASSOCIATION_FLAG_KEY_UNIT,
4687 GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (sub), GST_FORMAT_BYTES,
4688 cluster_offset, NULL);
4691 gst_buffer_set_caps (sub, GST_PAD_CAPS (stream->pad));
4693 /* Postprocess the buffers depending on the codec used */
4694 if (stream->postprocess_frame) {
4695 GST_LOG_OBJECT (demux, "running post process");
4696 ret = stream->postprocess_frame (GST_ELEMENT (demux), stream, &sub);
4699 ret = gst_pad_push (stream->pad, sub);
4700 if (demux->segment.rate < 0) {
4701 if (lace_time > demux->segment.stop && ret == GST_FLOW_UNEXPECTED) {
4702 /* In reverse playback we can get a GST_FLOW_UNEXPECTED when
4703 * we are at the end of the segment, so we just need to jump
4704 * back to the previous section. */
4705 GST_DEBUG_OBJECT (demux, "downstream has reached end of segment");
4710 ret = gst_matroska_demux_combine_flows (demux, stream, ret);
4713 size -= lace_size[n];
4714 if (lace_time != GST_CLOCK_TIME_NONE && duration)
4715 lace_time += duration / laces;
4717 lace_time = GST_CLOCK_TIME_NONE;
4723 gst_buffer_unref (buf);
4734 ret = gst_matroska_demux_combine_flows (demux, stream, ret);
4739 GST_ELEMENT_WARNING (demux, STREAM, DEMUX, (NULL), ("Invalid lacing size"));
4740 /* non-fatal, try next block(group) */
4746 GST_ELEMENT_WARNING (demux, STREAM, DEMUX, (NULL), ("Data error"));
4747 /* non-fatal, try next block(group) */
4753 /* return FALSE if block(group) should be skipped (due to a seek) */
4754 static inline gboolean
4755 gst_matroska_demux_seek_block (GstMatroskaDemux * demux)
4757 if (G_UNLIKELY (demux->seek_block)) {
4758 if (!(--demux->seek_block)) {
4761 GST_LOG_OBJECT (demux, "should skip block due to seek");
4769 static GstFlowReturn
4770 gst_matroska_demux_parse_contents_seekentry (GstMatroskaDemux * demux,
4774 guint64 seek_pos = (guint64) - 1;
4775 guint32 seek_id = 0;
4778 DEBUG_ELEMENT_START (demux, ebml, "Seek");
4780 if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) {
4781 DEBUG_ELEMENT_STOP (demux, ebml, "Seek", ret);
4785 while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) {
4786 if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK)
4790 case GST_MATROSKA_ID_SEEKID:
4794 if ((ret = gst_ebml_read_uint (ebml, &id, &t)) != GST_FLOW_OK)
4797 GST_DEBUG_OBJECT (demux, "SeekID: %" G_GUINT64_FORMAT, t);
4802 case GST_MATROSKA_ID_SEEKPOSITION:
4806 if ((ret = gst_ebml_read_uint (ebml, &id, &t)) != GST_FLOW_OK)
4809 if (t > G_MAXINT64) {
4810 GST_WARNING_OBJECT (demux,
4811 "Too large SeekPosition %" G_GUINT64_FORMAT, t);
4815 GST_DEBUG_OBJECT (demux, "SeekPosition: %" G_GUINT64_FORMAT, t);
4821 ret = gst_matroska_read_common_parse_skip (&demux->common, ebml,
4827 if (ret != GST_FLOW_OK && ret != GST_FLOW_UNEXPECTED)
4830 if (!seek_id || seek_pos == (guint64) - 1) {
4831 GST_WARNING_OBJECT (demux, "Incomplete seekhead entry (0x%x/%"
4832 G_GUINT64_FORMAT ")", seek_id, seek_pos);
4837 case GST_MATROSKA_ID_SEEKHEAD:
4840 case GST_MATROSKA_ID_CUES:
4841 case GST_MATROSKA_ID_TAGS:
4842 case GST_MATROSKA_ID_TRACKS:
4843 case GST_MATROSKA_ID_SEGMENTINFO:
4844 case GST_MATROSKA_ID_ATTACHMENTS:
4845 case GST_MATROSKA_ID_CHAPTERS:
4847 guint64 before_pos, length;
4851 length = gst_matroska_demux_get_length (demux);
4852 before_pos = demux->offset;
4854 if (length == (guint64) - 1) {
4855 GST_DEBUG_OBJECT (demux, "no upstream length, skipping SeakHead entry");
4859 /* check for validity */
4860 if (seek_pos + demux->common.ebml_segment_start + 12 >= length) {
4861 GST_WARNING_OBJECT (demux,
4862 "SeekHead reference lies outside file!" " (%"
4863 G_GUINT64_FORMAT "+%" G_GUINT64_FORMAT "+12 >= %"
4864 G_GUINT64_FORMAT ")", seek_pos, demux->common.ebml_segment_start,
4869 /* only pick up index location when streaming */
4870 if (demux->streaming) {
4871 if (seek_id == GST_MATROSKA_ID_CUES) {
4872 demux->index_offset = seek_pos + demux->common.ebml_segment_start;
4873 GST_DEBUG_OBJECT (demux, "Cues located at offset %" G_GUINT64_FORMAT,
4874 demux->index_offset);
4880 demux->offset = seek_pos + demux->common.ebml_segment_start;
4883 if ((ret = gst_matroska_demux_peek_id_length_pull (demux, &id, &length,
4884 &needed)) != GST_FLOW_OK)
4887 if (id != seek_id) {
4888 GST_WARNING_OBJECT (demux,
4889 "We looked for ID=0x%x but got ID=0x%x (pos=%" G_GUINT64_FORMAT ")",
4890 seek_id, id, seek_pos + demux->common.ebml_segment_start);
4893 ret = gst_matroska_demux_parse_id (demux, id, length, needed);
4898 demux->offset = before_pos;
4902 case GST_MATROSKA_ID_CLUSTER:
4904 guint64 pos = seek_pos + demux->common.ebml_segment_start;
4906 GST_LOG_OBJECT (demux, "Cluster position");
4907 if (G_UNLIKELY (!demux->clusters))
4908 demux->clusters = g_array_sized_new (TRUE, TRUE, sizeof (guint64), 100);
4909 g_array_append_val (demux->clusters, pos);
4914 GST_DEBUG_OBJECT (demux, "Ignoring Seek entry for ID=0x%x", seek_id);
4917 DEBUG_ELEMENT_STOP (demux, ebml, "Seek", ret);
4922 static GstFlowReturn
4923 gst_matroska_demux_parse_contents (GstMatroskaDemux * demux, GstEbmlRead * ebml)
4925 GstFlowReturn ret = GST_FLOW_OK;
4928 DEBUG_ELEMENT_START (demux, ebml, "SeekHead");
4930 if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) {
4931 DEBUG_ELEMENT_STOP (demux, ebml, "SeekHead", ret);
4935 while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) {
4936 if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK)
4940 case GST_MATROSKA_ID_SEEKENTRY:
4942 ret = gst_matroska_demux_parse_contents_seekentry (demux, ebml);
4943 /* Ignore EOS and errors here */
4944 if (ret != GST_FLOW_OK) {
4945 GST_DEBUG_OBJECT (demux, "Ignoring %s", gst_flow_get_name (ret));
4952 ret = gst_matroska_read_common_parse_skip (&demux->common,
4953 ebml, "SeekHead", id);
4958 DEBUG_ELEMENT_STOP (demux, ebml, "SeekHead", ret);
4960 /* Sort clusters by position for easier searching */
4961 if (demux->clusters)
4962 g_array_sort (demux->clusters, (GCompareFunc) gst_matroska_cluster_compare);
4967 #define GST_FLOW_OVERFLOW GST_FLOW_CUSTOM_ERROR
4969 #define MAX_BLOCK_SIZE (15 * 1024 * 1024)
4971 static inline GstFlowReturn
4972 gst_matroska_demux_check_read_size (GstMatroskaDemux * demux, guint64 bytes)
4974 if (G_UNLIKELY (bytes > MAX_BLOCK_SIZE)) {
4975 /* only a few blocks are expected/allowed to be large,
4976 * and will be recursed into, whereas others will be read and must fit */
4977 if (demux->streaming) {
4978 /* fatal in streaming case, as we can't step over easily */
4979 GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL),
4980 ("reading large block of size %" G_GUINT64_FORMAT " not supported; "
4981 "file might be corrupt.", bytes));
4982 return GST_FLOW_ERROR;
4984 /* indicate higher level to quietly give up */
4985 GST_DEBUG_OBJECT (demux,
4986 "too large block of size %" G_GUINT64_FORMAT, bytes);
4987 return GST_FLOW_ERROR;
4994 /* returns TRUE if we truely are in error state, and should give up */
4995 static inline gboolean
4996 gst_matroska_demux_check_parse_error (GstMatroskaDemux * demux)
4998 if (!demux->streaming && demux->next_cluster_offset > 0) {
4999 /* just repositioning to where next cluster should be and try from there */
5000 GST_WARNING_OBJECT (demux, "parse error, trying next cluster expected at %"
5001 G_GUINT64_FORMAT, demux->next_cluster_offset);
5002 demux->offset = demux->next_cluster_offset;
5003 demux->next_cluster_offset = 0;
5008 /* sigh, one last attempt above and beyond call of duty ...;
5009 * search for cluster mark following current pos */
5010 pos = demux->offset;
5011 GST_WARNING_OBJECT (demux, "parse error, looking for next cluster");
5012 if (gst_matroska_demux_search_cluster (demux, &pos) != GST_FLOW_OK) {
5013 /* did not work, give up */
5016 GST_DEBUG_OBJECT (demux, "... found at %" G_GUINT64_FORMAT, pos);
5017 /* try that position */
5018 demux->offset = pos;
5024 static inline GstFlowReturn
5025 gst_matroska_demux_flush (GstMatroskaDemux * demux, guint flush)
5027 GST_LOG_OBJECT (demux, "skipping %d bytes", flush);
5028 demux->offset += flush;
5029 if (demux->streaming) {
5032 /* hard to skip large blocks when streaming */
5033 ret = gst_matroska_demux_check_read_size (demux, flush);
5034 if (ret != GST_FLOW_OK)
5036 if (flush <= gst_adapter_available (demux->adapter))
5037 gst_adapter_flush (demux->adapter, flush);
5039 return GST_FLOW_UNEXPECTED;
5044 /* initializes @ebml with @bytes from input stream at current offset.
5045 * Returns UNEXPECTED if insufficient available,
5046 * ERROR if too much was attempted to read. */
5047 static inline GstFlowReturn
5048 gst_matroska_demux_take (GstMatroskaDemux * demux, guint64 bytes,
5051 GstBuffer *buffer = NULL;
5052 GstFlowReturn ret = GST_FLOW_OK;
5054 GST_LOG_OBJECT (demux, "taking %" G_GUINT64_FORMAT " bytes for parsing",
5056 ret = gst_matroska_demux_check_read_size (demux, bytes);
5057 if (G_UNLIKELY (ret != GST_FLOW_OK)) {
5058 if (!demux->streaming) {
5059 /* in pull mode, we can skip */
5060 if ((ret = gst_matroska_demux_flush (demux, bytes)) == GST_FLOW_OK)
5061 ret = GST_FLOW_OVERFLOW;
5063 /* otherwise fatal */
5064 ret = GST_FLOW_ERROR;
5068 if (demux->streaming) {
5069 if (gst_adapter_available (demux->adapter) >= bytes)
5070 buffer = gst_adapter_take_buffer (demux->adapter, bytes);
5072 ret = GST_FLOW_UNEXPECTED;
5074 ret = gst_matroska_demux_peek_bytes (demux, demux->offset, bytes, &buffer,
5076 if (G_LIKELY (buffer)) {
5077 gst_ebml_read_init (ebml, GST_ELEMENT_CAST (demux), buffer, demux->offset);
5078 demux->offset += bytes;
5085 gst_matroska_demux_check_seekability (GstMatroskaDemux * demux)
5088 gboolean seekable = FALSE;
5089 gint64 start = -1, stop = -1;
5091 query = gst_query_new_seeking (GST_FORMAT_BYTES);
5092 if (!gst_pad_peer_query (demux->sinkpad, query)) {
5093 GST_DEBUG_OBJECT (demux, "seeking query failed");
5097 gst_query_parse_seeking (query, NULL, &seekable, &start, &stop);
5099 /* try harder to query upstream size if we didn't get it the first time */
5100 if (seekable && stop == -1) {
5101 GstFormat fmt = GST_FORMAT_BYTES;
5103 GST_DEBUG_OBJECT (demux, "doing duration query to fix up unset stop");
5104 gst_pad_query_peer_duration (demux->sinkpad, &fmt, &stop);
5107 /* if upstream doesn't know the size, it's likely that it's not seekable in
5108 * practice even if it technically may be seekable */
5109 if (seekable && (start != 0 || stop <= start)) {
5110 GST_DEBUG_OBJECT (demux, "seekable but unknown start/stop -> disable");
5115 GST_INFO_OBJECT (demux, "seekable: %d (%" G_GUINT64_FORMAT " - %"
5116 G_GUINT64_FORMAT ")", seekable, start, stop);
5117 demux->seekable = seekable;
5119 gst_query_unref (query);
5122 static GstFlowReturn
5123 gst_matroska_demux_find_tracks (GstMatroskaDemux * demux)
5129 GstFlowReturn ret = GST_FLOW_OK;
5131 GST_WARNING_OBJECT (demux,
5132 "Found Cluster element before Tracks, searching Tracks");
5135 before_pos = demux->offset;
5137 /* Search Tracks element */
5139 ret = gst_matroska_demux_peek_id_length_pull (demux, &id, &length, &needed);
5140 if (ret != GST_FLOW_OK)
5143 if (id != GST_MATROSKA_ID_TRACKS) {
5144 /* we may be skipping large cluster here, so forego size check etc */
5145 /* ... but we can't skip undefined size; force error */
5146 if (length == G_MAXUINT64) {
5147 ret = gst_matroska_demux_check_read_size (demux, length);
5150 demux->offset += needed;
5151 demux->offset += length;
5156 /* will lead to track parsing ... */
5157 ret = gst_matroska_demux_parse_id (demux, id, length, needed);
5162 demux->offset = before_pos;
5167 #define GST_READ_CHECK(stmt) \
5169 if (G_UNLIKELY ((ret = (stmt)) != GST_FLOW_OK)) { \
5170 if (ret == GST_FLOW_OVERFLOW) { \
5171 ret = GST_FLOW_OK; \
5177 static GstFlowReturn
5178 gst_matroska_demux_parse_id (GstMatroskaDemux * demux, guint32 id,
5179 guint64 length, guint needed)
5181 GstEbmlRead ebml = { 0, };
5182 GstFlowReturn ret = GST_FLOW_OK;
5185 GST_LOG_OBJECT (demux, "Parsing Element id 0x%x, "
5186 "size %" G_GUINT64_FORMAT ", prefix %d", id, length, needed);
5188 /* if we plan to read and parse this element, we need prefix (id + length)
5189 * and the contents */
5190 /* mind about overflow wrap-around when dealing with undefined size */
5192 if (G_LIKELY (length != G_MAXUINT64))
5195 switch (demux->common.state) {
5196 case GST_MATROSKA_READ_STATE_START:
5198 case GST_EBML_ID_HEADER:
5199 GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml));
5200 ret = gst_matroska_demux_parse_header (demux, &ebml);
5201 if (ret != GST_FLOW_OK)
5203 demux->common.state = GST_MATROSKA_READ_STATE_SEGMENT;
5204 gst_matroska_demux_check_seekability (demux);
5207 goto invalid_header;
5211 case GST_MATROSKA_READ_STATE_SEGMENT:
5213 case GST_MATROSKA_ID_SEGMENT:
5214 /* eat segment prefix */
5215 GST_READ_CHECK (gst_matroska_demux_flush (demux, needed));
5216 GST_DEBUG_OBJECT (demux,
5217 "Found Segment start at offset %" G_GUINT64_FORMAT,
5219 /* seeks are from the beginning of the segment,
5220 * after the segment ID/length */
5221 demux->common.ebml_segment_start = demux->offset;
5222 demux->common.state = GST_MATROSKA_READ_STATE_HEADER;
5225 GST_WARNING_OBJECT (demux,
5226 "Expected a Segment ID (0x%x), but received 0x%x!",
5227 GST_MATROSKA_ID_SEGMENT, id);
5228 GST_READ_CHECK (gst_matroska_demux_flush (demux, read));
5232 case GST_MATROSKA_READ_STATE_SCANNING:
5233 if (id != GST_MATROSKA_ID_CLUSTER &&
5234 id != GST_MATROSKA_ID_CLUSTERTIMECODE)
5237 case GST_MATROSKA_READ_STATE_HEADER:
5238 case GST_MATROSKA_READ_STATE_DATA:
5239 case GST_MATROSKA_READ_STATE_SEEK:
5241 case GST_MATROSKA_ID_SEGMENTINFO:
5242 if (!demux->segmentinfo_parsed) {
5243 GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml));
5244 ret = gst_matroska_demux_parse_info (demux, &ebml);
5246 GST_READ_CHECK (gst_matroska_demux_flush (demux, read));
5249 case GST_MATROSKA_ID_TRACKS:
5250 if (!demux->tracks_parsed) {
5251 GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml));
5252 ret = gst_matroska_demux_parse_tracks (demux, &ebml);
5254 GST_READ_CHECK (gst_matroska_demux_flush (demux, read));
5257 case GST_MATROSKA_ID_CLUSTER:
5258 if (G_UNLIKELY (!demux->tracks_parsed)) {
5259 if (demux->streaming) {
5260 GST_DEBUG_OBJECT (demux, "Cluster before Track");
5261 goto not_streamable;
5263 ret = gst_matroska_demux_find_tracks (demux);
5264 if (!demux->tracks_parsed)
5268 if (G_UNLIKELY (demux->common.state
5269 == GST_MATROSKA_READ_STATE_HEADER)) {
5270 demux->common.state = GST_MATROSKA_READ_STATE_DATA;
5271 demux->first_cluster_offset = demux->offset;
5272 GST_DEBUG_OBJECT (demux, "signaling no more pads");
5273 gst_element_no_more_pads (GST_ELEMENT (demux));
5274 /* send initial newsegment */
5275 gst_matroska_demux_send_event (demux,
5276 gst_event_new_new_segment (FALSE, 1.0,
5278 (demux->segment.duration >
5279 0) ? demux->segment.duration : -1, 0));
5281 demux->cluster_time = GST_CLOCK_TIME_NONE;
5282 demux->cluster_offset = demux->offset;
5283 if (G_UNLIKELY (!demux->seek_first && demux->seek_block)) {
5284 GST_DEBUG_OBJECT (demux, "seek target block %" G_GUINT64_FORMAT
5285 " not found in Cluster, trying next Cluster's first block instead",
5287 demux->seek_block = 0;
5289 demux->seek_first = FALSE;
5290 /* record next cluster for recovery */
5291 if (read != G_MAXUINT64)
5292 demux->next_cluster_offset = demux->cluster_offset + read;
5293 /* eat cluster prefix */
5294 gst_matroska_demux_flush (demux, needed);
5296 case GST_MATROSKA_ID_CLUSTERTIMECODE:
5300 GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml));
5301 if ((ret = gst_ebml_read_uint (&ebml, &id, &num)) != GST_FLOW_OK)
5303 GST_DEBUG_OBJECT (demux, "ClusterTimeCode: %" G_GUINT64_FORMAT, num);
5304 demux->cluster_time = num;
5305 if (demux->common.element_index) {
5306 if (demux->common.element_index_writer_id == -1)
5307 gst_index_get_writer_id (demux->common.element_index,
5308 GST_OBJECT (demux), &demux->common.element_index_writer_id);
5309 GST_LOG_OBJECT (demux, "adding association %" GST_TIME_FORMAT "-> %"
5310 G_GUINT64_FORMAT " for writer id %d",
5311 GST_TIME_ARGS (demux->cluster_time), demux->cluster_offset,
5312 demux->common.element_index_writer_id);
5313 gst_index_add_association (demux->common.element_index,
5314 demux->common.element_index_writer_id,
5315 GST_ASSOCIATION_FLAG_KEY_UNIT,
5316 GST_FORMAT_TIME, demux->cluster_time,
5317 GST_FORMAT_BYTES, demux->cluster_offset, NULL);
5321 case GST_MATROSKA_ID_BLOCKGROUP:
5322 if (!gst_matroska_demux_seek_block (demux))
5324 GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml));
5325 DEBUG_ELEMENT_START (demux, &ebml, "BlockGroup");
5326 if ((ret = gst_ebml_read_master (&ebml, &id)) == GST_FLOW_OK) {
5327 ret = gst_matroska_demux_parse_blockgroup_or_simpleblock (demux,
5328 &ebml, demux->cluster_time, demux->cluster_offset, FALSE);
5330 DEBUG_ELEMENT_STOP (demux, &ebml, "BlockGroup", ret);
5332 case GST_MATROSKA_ID_SIMPLEBLOCK:
5333 if (!gst_matroska_demux_seek_block (demux))
5335 GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml));
5336 DEBUG_ELEMENT_START (demux, &ebml, "SimpleBlock");
5337 ret = gst_matroska_demux_parse_blockgroup_or_simpleblock (demux,
5338 &ebml, demux->cluster_time, demux->cluster_offset, TRUE);
5339 DEBUG_ELEMENT_STOP (demux, &ebml, "SimpleBlock", ret);
5341 case GST_MATROSKA_ID_ATTACHMENTS:
5342 if (!demux->attachments_parsed) {
5343 GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml));
5344 ret = gst_matroska_demux_parse_attachments (demux, &ebml);
5346 GST_READ_CHECK (gst_matroska_demux_flush (demux, read));
5349 case GST_MATROSKA_ID_TAGS:
5350 GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml));
5351 ret = gst_matroska_demux_parse_metadata (demux, &ebml);
5353 case GST_MATROSKA_ID_CHAPTERS:
5354 GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml));
5355 ret = gst_matroska_demux_parse_chapters (demux, &ebml);
5357 case GST_MATROSKA_ID_SEEKHEAD:
5358 GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml));
5359 ret = gst_matroska_demux_parse_contents (demux, &ebml);
5361 case GST_MATROSKA_ID_CUES:
5362 if (demux->common.index_parsed) {
5363 GST_READ_CHECK (gst_matroska_demux_flush (demux, read));
5366 GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml));
5367 ret = gst_matroska_read_common_parse_index (&demux->common, &ebml);
5368 /* only push based; delayed index building */
5369 if (ret == GST_FLOW_OK
5370 && demux->common.state == GST_MATROSKA_READ_STATE_SEEK) {
5373 GST_OBJECT_LOCK (demux);
5374 event = demux->seek_event;
5375 demux->seek_event = NULL;
5376 GST_OBJECT_UNLOCK (demux);
5379 /* unlikely to fail, since we managed to seek to this point */
5380 if (!gst_matroska_demux_handle_seek_event (demux, NULL, event))
5382 /* resume data handling, main thread clear to seek again */
5383 GST_OBJECT_LOCK (demux);
5384 demux->common.state = GST_MATROSKA_READ_STATE_DATA;
5385 GST_OBJECT_UNLOCK (demux);
5388 case GST_MATROSKA_ID_POSITION:
5389 case GST_MATROSKA_ID_PREVSIZE:
5390 case GST_MATROSKA_ID_ENCRYPTEDBLOCK:
5391 case GST_MATROSKA_ID_SILENTTRACKS:
5392 GST_DEBUG_OBJECT (demux,
5393 "Skipping Cluster subelement 0x%x - ignoring", id);
5397 GST_DEBUG_OBJECT (demux, "skipping Element 0x%x", id);
5398 GST_READ_CHECK (gst_matroska_demux_flush (demux, read));
5404 if (ret == GST_FLOW_PARSE)
5408 gst_ebml_read_clear (&ebml);
5414 /* simply exit, maybe not enough data yet */
5415 /* no ebml to clear if read error */
5420 GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL),
5421 ("Failed to parse Element 0x%x", id));
5422 ret = GST_FLOW_ERROR;
5427 GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL),
5428 ("File layout does not permit streaming"));
5429 ret = GST_FLOW_ERROR;
5434 GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL),
5435 ("No Tracks element found"));
5436 ret = GST_FLOW_ERROR;
5441 GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("Invalid header"));
5442 ret = GST_FLOW_ERROR;
5447 GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("Failed to seek"));
5448 ret = GST_FLOW_ERROR;
5454 gst_matroska_demux_loop (GstPad * pad)
5456 GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (GST_PAD_PARENT (pad));
5462 /* If we have to close a segment, send a new segment to do this now */
5463 if (G_LIKELY (demux->common.state == GST_MATROSKA_READ_STATE_DATA)) {
5464 if (G_UNLIKELY (demux->close_segment)) {
5465 gst_matroska_demux_send_event (demux, demux->close_segment);
5466 demux->close_segment = NULL;
5468 if (G_UNLIKELY (demux->new_segment)) {
5469 gst_matroska_demux_send_event (demux, demux->new_segment);
5470 demux->new_segment = NULL;
5474 ret = gst_matroska_demux_peek_id_length_pull (demux, &id, &length, &needed);
5475 if (ret == GST_FLOW_UNEXPECTED)
5477 if (ret != GST_FLOW_OK) {
5478 if (gst_matroska_demux_check_parse_error (demux))
5484 GST_LOG_OBJECT (demux, "Offset %" G_GUINT64_FORMAT ", Element id 0x%x, "
5485 "size %" G_GUINT64_FORMAT ", needed %d", demux->offset, id,
5488 ret = gst_matroska_demux_parse_id (demux, id, length, needed);
5489 if (ret == GST_FLOW_UNEXPECTED)
5491 if (ret != GST_FLOW_OK)
5494 /* check if we're at the end of a configured segment */
5495 if (G_LIKELY (demux->common.src->len)) {
5498 g_assert (demux->common.num_streams == demux->common.src->len);
5499 for (i = 0; i < demux->common.src->len; i++) {
5500 GstMatroskaTrackContext *context = g_ptr_array_index (demux->common.src,
5502 GST_DEBUG_OBJECT (context->pad, "pos %" GST_TIME_FORMAT,
5503 GST_TIME_ARGS (context->pos));
5504 if (context->eos == FALSE)
5508 GST_INFO_OBJECT (demux, "All streams are EOS");
5509 ret = GST_FLOW_UNEXPECTED;
5514 if (G_UNLIKELY (demux->offset == gst_matroska_demux_get_length (demux))) {
5515 GST_LOG_OBJECT (demux, "Reached end of stream");
5516 ret = GST_FLOW_UNEXPECTED;
5525 if (demux->segment.rate < 0.0) {
5526 ret = gst_matroska_demux_seek_to_previous_keyframe (demux);
5527 if (ret == GST_FLOW_OK)
5534 const gchar *reason = gst_flow_get_name (ret);
5535 gboolean push_eos = FALSE;
5537 GST_LOG_OBJECT (demux, "pausing task, reason %s", reason);
5538 demux->segment_running = FALSE;
5539 gst_pad_pause_task (demux->sinkpad);
5541 if (ret == GST_FLOW_UNEXPECTED) {
5542 /* perform EOS logic */
5544 /* Close the segment, i.e. update segment stop with the duration
5545 * if no stop was set */
5546 if (GST_CLOCK_TIME_IS_VALID (demux->last_stop_end) &&
5547 !GST_CLOCK_TIME_IS_VALID (demux->segment.stop)) {
5549 gst_event_new_new_segment_full (TRUE, demux->segment.rate,
5550 demux->segment.applied_rate, demux->segment.format,
5551 demux->segment.start,
5552 MAX (demux->last_stop_end, demux->segment.start),
5553 demux->segment.time);
5554 gst_matroska_demux_send_event (demux, event);
5557 if (demux->segment.flags & GST_SEEK_FLAG_SEGMENT) {
5560 /* for segment playback we need to post when (in stream time)
5561 * we stopped, this is either stop (when set) or the duration. */
5562 if ((stop = demux->segment.stop) == -1)
5563 stop = demux->last_stop_end;
5565 GST_LOG_OBJECT (demux, "Sending segment done, at end of segment");
5566 gst_element_post_message (GST_ELEMENT (demux),
5567 gst_message_new_segment_done (GST_OBJECT (demux), GST_FORMAT_TIME,
5572 } else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED) {
5573 /* for fatal errors we post an error message */
5574 GST_ELEMENT_ERROR (demux, STREAM, FAILED, (NULL),
5575 ("stream stopped, reason %s", reason));
5579 /* send EOS, and prevent hanging if no streams yet */
5580 GST_LOG_OBJECT (demux, "Sending EOS, at end of stream");
5581 if (!gst_matroska_demux_send_event (demux, gst_event_new_eos ()) &&
5582 (ret == GST_FLOW_UNEXPECTED)) {
5583 GST_ELEMENT_ERROR (demux, STREAM, DEMUX,
5584 (NULL), ("got eos but no streams (yet)"));
5592 * Create and push a flushing seek event upstream
5595 perform_seek_to_offset (GstMatroskaDemux * demux, guint64 offset)
5600 GST_DEBUG_OBJECT (demux, "Seeking to %" G_GUINT64_FORMAT, offset);
5603 gst_event_new_seek (1.0, GST_FORMAT_BYTES,
5604 GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE, GST_SEEK_TYPE_SET, offset,
5605 GST_SEEK_TYPE_NONE, -1);
5607 res = gst_pad_push_event (demux->sinkpad, event);
5609 /* newsegment event will update offset */
5613 static const guint8 *
5614 gst_matroska_demux_peek_adapter (GstMatroskaDemux * demux, guint peek)
5616 return gst_adapter_peek (demux->adapter, peek);
5619 static GstFlowReturn
5620 gst_matroska_demux_peek_id_length_push (GstMatroskaDemux * demux, guint32 * _id,
5621 guint64 * _length, guint * _needed)
5623 return gst_ebml_peek_id_length (_id, _length, _needed,
5624 (GstPeekData) gst_matroska_demux_peek_adapter, (gpointer) demux,
5625 GST_ELEMENT_CAST (demux), demux->offset);
5628 static GstFlowReturn
5629 gst_matroska_demux_chain (GstPad * pad, GstBuffer * buffer)
5631 GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (GST_PAD_PARENT (pad));
5633 GstFlowReturn ret = GST_FLOW_OK;
5638 if (G_UNLIKELY (GST_BUFFER_IS_DISCONT (buffer))) {
5639 GST_DEBUG_OBJECT (demux, "got DISCONT");
5640 gst_adapter_clear (demux->adapter);
5641 GST_OBJECT_LOCK (demux);
5642 gst_matroska_demux_reset_streams (demux, GST_CLOCK_TIME_NONE, FALSE);
5643 GST_OBJECT_UNLOCK (demux);
5646 gst_adapter_push (demux->adapter, buffer);
5650 available = gst_adapter_available (demux->adapter);
5652 ret = gst_matroska_demux_peek_id_length_push (demux, &id, &length, &needed);
5653 if (G_UNLIKELY (ret != GST_FLOW_OK && ret != GST_FLOW_UNEXPECTED))
5656 GST_LOG_OBJECT (demux, "Offset %" G_GUINT64_FORMAT ", Element id 0x%x, "
5657 "size %" G_GUINT64_FORMAT ", needed %d, available %d", demux->offset, id,
5658 length, needed, available);
5660 if (needed > available)
5663 ret = gst_matroska_demux_parse_id (demux, id, length, needed);
5664 if (ret == GST_FLOW_UNEXPECTED) {
5665 /* need more data */
5667 } else if (ret != GST_FLOW_OK) {
5674 gst_matroska_demux_handle_sink_event (GstPad * pad, GstEvent * event)
5676 gboolean res = TRUE;
5677 GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (GST_PAD_PARENT (pad));
5679 GST_DEBUG_OBJECT (demux,
5680 "have event type %s: %p on sink pad", GST_EVENT_TYPE_NAME (event), event);
5682 switch (GST_EVENT_TYPE (event)) {
5683 case GST_EVENT_NEWSEGMENT:
5686 gdouble rate, arate;
5687 gint64 start, stop, time = 0;
5691 /* some debug output */
5692 gst_segment_init (&segment, GST_FORMAT_UNDEFINED);
5693 gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format,
5694 &start, &stop, &time);
5695 gst_segment_set_newsegment_full (&segment, update, rate, arate, format,
5697 GST_DEBUG_OBJECT (demux,
5698 "received format %d newsegment %" GST_SEGMENT_FORMAT, format,
5701 if (demux->common.state < GST_MATROSKA_READ_STATE_DATA) {
5702 GST_DEBUG_OBJECT (demux, "still starting");
5706 /* we only expect a BYTE segment, e.g. following a seek */
5707 if (format != GST_FORMAT_BYTES) {
5708 GST_DEBUG_OBJECT (demux, "unsupported segment format, ignoring");
5712 GST_DEBUG_OBJECT (demux, "clearing segment state");
5713 GST_OBJECT_LOCK (demux);
5714 /* clear current segment leftover */
5715 gst_adapter_clear (demux->adapter);
5716 /* and some streaming setup */
5717 demux->offset = start;
5718 /* do not know where we are;
5719 * need to come across a cluster and generate newsegment */
5720 demux->segment.last_stop = GST_CLOCK_TIME_NONE;
5721 demux->cluster_time = GST_CLOCK_TIME_NONE;
5722 demux->cluster_offset = 0;
5723 demux->need_newsegment = TRUE;
5724 /* but keep some of the upstream segment */
5725 demux->segment.rate = rate;
5726 GST_OBJECT_UNLOCK (demux);
5728 /* chain will send initial newsegment after pads have been added,
5729 * or otherwise come up with one */
5730 GST_DEBUG_OBJECT (demux, "eating event");
5731 gst_event_unref (event);
5737 if (demux->common.state != GST_MATROSKA_READ_STATE_DATA) {
5738 gst_event_unref (event);
5739 GST_ELEMENT_ERROR (demux, STREAM, DEMUX,
5740 (NULL), ("got eos and didn't receive a complete header object"));
5741 } else if (demux->common.num_streams == 0) {
5742 GST_ELEMENT_ERROR (demux, STREAM, DEMUX,
5743 (NULL), ("got eos but no streams (yet)"));
5745 gst_matroska_demux_send_event (demux, event);
5749 case GST_EVENT_FLUSH_STOP:
5751 gst_adapter_clear (demux->adapter);
5752 GST_OBJECT_LOCK (demux);
5753 gst_matroska_demux_reset_streams (demux, GST_CLOCK_TIME_NONE, TRUE);
5754 demux->segment.last_stop = GST_CLOCK_TIME_NONE;
5755 demux->cluster_time = GST_CLOCK_TIME_NONE;
5756 demux->cluster_offset = 0;
5757 GST_OBJECT_UNLOCK (demux);
5761 res = gst_pad_event_default (pad, event);
5769 gst_matroska_demux_sink_activate (GstPad * sinkpad)
5771 GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (GST_PAD_PARENT (sinkpad));
5773 if (gst_pad_check_pull_range (sinkpad)) {
5774 GST_DEBUG ("going to pull mode");
5775 demux->streaming = FALSE;
5776 return gst_pad_activate_pull (sinkpad, TRUE);
5778 GST_DEBUG ("going to push (streaming) mode");
5779 demux->streaming = TRUE;
5780 return gst_pad_activate_push (sinkpad, TRUE);
5787 gst_matroska_demux_sink_activate_pull (GstPad * sinkpad, gboolean active)
5789 GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (GST_PAD_PARENT (sinkpad));
5792 /* if we have a scheduler we can start the task */
5793 demux->segment_running = TRUE;
5794 gst_pad_start_task (sinkpad, (GstTaskFunction) gst_matroska_demux_loop,
5797 demux->segment_running = FALSE;
5798 gst_pad_stop_task (sinkpad);
5805 gst_duration_to_fraction (guint64 duration, gint * dest_n, gint * dest_d)
5807 static const int common_den[] = { 1, 2, 3, 4, 1001 };
5812 for (i = 0; i < G_N_ELEMENTS (common_den); i++) {
5814 n = floor (0.5 + (d * 1e9) / duration);
5815 a = gst_util_uint64_scale_int (1000000000, d, n);
5816 if (duration >= a - 1 && duration <= a + 1) {
5821 gst_util_double_to_fraction (1e9 / duration, &n, &d);
5830 gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext *
5831 videocontext, const gchar * codec_id, guint8 * data, guint size,
5832 gchar ** codec_name, guint32 * riff_fourcc)
5834 GstMatroskaTrackContext *context = (GstMatroskaTrackContext *) videocontext;
5835 GstCaps *caps = NULL;
5837 g_assert (videocontext != NULL);
5838 g_assert (codec_name != NULL);
5840 context->send_xiph_headers = FALSE;
5841 context->send_flac_headers = FALSE;
5842 context->send_speex_headers = FALSE;
5847 /* TODO: check if we have all codec types from matroska-ids.h
5848 * check if we have to do more special things with codec_private
5851 * GST_MATROSKA_CODEC_ID_VIDEO_QUICKTIME
5852 * GST_MATROSKA_CODEC_ID_VIDEO_SNOW
5855 if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_VFW_FOURCC)) {
5856 gst_riff_strf_vids *vids = NULL;
5859 GstBuffer *buf = NULL;
5861 vids = (gst_riff_strf_vids *) data;
5863 /* assure size is big enough */
5865 GST_WARNING ("Too small BITMAPINFOHEADER (%d bytes)", size);
5868 if (size < sizeof (gst_riff_strf_vids)) {
5869 vids = g_new (gst_riff_strf_vids, 1);
5870 memcpy (vids, data, size);
5873 /* little-endian -> byte-order */
5874 vids->size = GUINT32_FROM_LE (vids->size);
5875 vids->width = GUINT32_FROM_LE (vids->width);
5876 vids->height = GUINT32_FROM_LE (vids->height);
5877 vids->planes = GUINT16_FROM_LE (vids->planes);
5878 vids->bit_cnt = GUINT16_FROM_LE (vids->bit_cnt);
5879 vids->compression = GUINT32_FROM_LE (vids->compression);
5880 vids->image_size = GUINT32_FROM_LE (vids->image_size);
5881 vids->xpels_meter = GUINT32_FROM_LE (vids->xpels_meter);
5882 vids->ypels_meter = GUINT32_FROM_LE (vids->ypels_meter);
5883 vids->num_colors = GUINT32_FROM_LE (vids->num_colors);
5884 vids->imp_colors = GUINT32_FROM_LE (vids->imp_colors);
5886 if (size > sizeof (gst_riff_strf_vids)) { /* some extra_data */
5887 buf = gst_buffer_new_and_alloc (size - sizeof (gst_riff_strf_vids));
5888 memcpy (GST_BUFFER_DATA (buf),
5889 (guint8 *) vids + sizeof (gst_riff_strf_vids),
5890 GST_BUFFER_SIZE (buf));
5894 *riff_fourcc = vids->compression;
5896 caps = gst_riff_create_video_caps (vids->compression, NULL, vids,
5897 buf, NULL, codec_name);
5900 GST_WARNING ("Unhandled RIFF fourcc %" GST_FOURCC_FORMAT,
5901 GST_FOURCC_ARGS (vids->compression));
5905 gst_buffer_unref (buf);
5907 if (vids != (gst_riff_strf_vids *) data)
5910 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_UNCOMPRESSED)) {
5913 switch (videocontext->fourcc) {
5914 case GST_MAKE_FOURCC ('I', '4', '2', '0'):
5915 *codec_name = g_strdup ("Raw planar YUV 4:2:0");
5916 fourcc = videocontext->fourcc;
5918 case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'):
5919 *codec_name = g_strdup ("Raw packed YUV 4:2:2");
5920 fourcc = videocontext->fourcc;
5922 case GST_MAKE_FOURCC ('Y', 'V', '1', '2'):
5923 *codec_name = g_strdup ("Raw packed YUV 4:2:0");
5924 fourcc = videocontext->fourcc;
5926 case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'):
5927 *codec_name = g_strdup ("Raw packed YUV 4:2:2");
5928 fourcc = videocontext->fourcc;
5930 case GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'):
5931 *codec_name = g_strdup ("Raw packed YUV 4:4:4 with alpha channel");
5932 fourcc = videocontext->fourcc;
5936 GST_DEBUG ("Unknown fourcc %" GST_FOURCC_FORMAT,
5937 GST_FOURCC_ARGS (videocontext->fourcc));
5941 caps = gst_caps_new_simple ("video/x-raw-yuv",
5942 "format", GST_TYPE_FOURCC, fourcc, NULL);
5943 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_SP)) {
5944 caps = gst_caps_new_simple ("video/x-divx",
5945 "divxversion", G_TYPE_INT, 4, NULL);
5946 *codec_name = g_strdup ("MPEG-4 simple profile");
5947 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_ASP) ||
5948 !strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_AP)) {
5950 caps = gst_caps_new_full (gst_structure_new ("video/x-divx",
5951 "divxversion", G_TYPE_INT, 5, NULL),
5952 gst_structure_new ("video/x-xvid", NULL),
5953 gst_structure_new ("video/mpeg",
5954 "mpegversion", G_TYPE_INT, 4,
5955 "systemstream", G_TYPE_BOOLEAN, FALSE, NULL), NULL);
5957 caps = gst_caps_new_simple ("video/mpeg",
5958 "mpegversion", G_TYPE_INT, 4,
5959 "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
5961 GstBuffer *priv = gst_buffer_new_and_alloc (size);
5963 memcpy (GST_BUFFER_DATA (priv), data, size);
5964 gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, priv, NULL);
5965 gst_buffer_unref (priv);
5967 if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_ASP))
5968 *codec_name = g_strdup ("MPEG-4 advanced simple profile");
5970 *codec_name = g_strdup ("MPEG-4 advanced profile");
5971 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MSMPEG4V3)) {
5973 caps = gst_caps_new_full (gst_structure_new ("video/x-divx",
5974 "divxversion", G_TYPE_INT, 3, NULL),
5975 gst_structure_new ("video/x-msmpeg",
5976 "msmpegversion", G_TYPE_INT, 43, NULL), NULL);
5978 caps = gst_caps_new_simple ("video/x-msmpeg",
5979 "msmpegversion", G_TYPE_INT, 43, NULL);
5980 *codec_name = g_strdup ("Microsoft MPEG-4 v.3");
5981 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG1) ||
5982 !strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG2)) {
5985 if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG1))
5990 caps = gst_caps_new_simple ("video/mpeg",
5991 "systemstream", G_TYPE_BOOLEAN, FALSE,
5992 "mpegversion", G_TYPE_INT, mpegversion, NULL);
5993 *codec_name = g_strdup_printf ("MPEG-%d video", mpegversion);
5994 context->postprocess_frame = gst_matroska_demux_add_mpeg_seq_header;
5995 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MJPEG)) {
5996 caps = gst_caps_new_simple ("image/jpeg", NULL);
5997 *codec_name = g_strdup ("Motion-JPEG");
5998 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_AVC)) {
5999 caps = gst_caps_new_simple ("video/x-h264", NULL);
6001 GstBuffer *priv = gst_buffer_new_and_alloc (size);
6003 /* First byte is the version, second is the profile indication, and third
6004 * is the 5 contraint_set_flags and 3 reserved bits. Fourth byte is the
6005 * level indication. */
6006 gst_codec_utils_h264_caps_set_level_and_profile (caps, data + 1,
6009 memcpy (GST_BUFFER_DATA (priv), data, size);
6010 gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, priv, NULL);
6011 gst_buffer_unref (priv);
6013 gst_caps_set_simple (caps, "stream-format", G_TYPE_STRING, "avc",
6014 "alignment", G_TYPE_STRING, "au", NULL);
6016 GST_WARNING ("No codec data found, assuming output is byte-stream");
6017 gst_caps_set_simple (caps, "stream-format", G_TYPE_STRING, "byte-stream",
6020 *codec_name = g_strdup ("H264");
6021 } else if ((!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO1)) ||
6022 (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO2)) ||
6023 (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO3)) ||
6024 (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO4))) {
6025 gint rmversion = -1;
6027 if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO1))
6029 else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO2))
6031 else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO3))
6033 else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO4))
6036 caps = gst_caps_new_simple ("video/x-pn-realvideo",
6037 "rmversion", G_TYPE_INT, rmversion, NULL);
6038 GST_DEBUG ("data:%p, size:0x%x", data, size);
6039 /* We need to extract the extradata ! */
6040 if (data && (size >= 0x22)) {
6045 subformat = GST_READ_UINT32_BE (data + 0x1a);
6046 rformat = GST_READ_UINT32_BE (data + 0x1e);
6048 priv = gst_buffer_new_and_alloc (size - 0x1a);
6050 memcpy (GST_BUFFER_DATA (priv), data + 0x1a, size - 0x1a);
6051 gst_caps_set_simple (caps,
6052 "codec_data", GST_TYPE_BUFFER, priv,
6053 "format", G_TYPE_INT, rformat,
6054 "subformat", G_TYPE_INT, subformat, NULL);
6055 gst_buffer_unref (priv);
6058 *codec_name = g_strdup_printf ("RealVideo %d.0", rmversion);
6059 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_THEORA)) {
6060 caps = gst_caps_new_simple ("video/x-theora", NULL);
6061 context->send_xiph_headers = TRUE;
6062 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_DIRAC)) {
6063 caps = gst_caps_new_simple ("video/x-dirac", NULL);
6064 *codec_name = g_strdup_printf ("Dirac");
6065 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_VP8)) {
6066 caps = gst_caps_new_simple ("video/x-vp8", NULL);
6067 *codec_name = g_strdup_printf ("On2 VP8");
6069 GST_WARNING ("Unknown codec '%s', cannot build Caps", codec_id);
6075 GstStructure *structure;
6077 for (i = 0; i < gst_caps_get_size (caps); i++) {
6078 structure = gst_caps_get_structure (caps, i);
6080 /* FIXME: use the real unit here! */
6081 GST_DEBUG ("video size %dx%d, target display size %dx%d (any unit)",
6082 videocontext->pixel_width,
6083 videocontext->pixel_height,
6084 videocontext->display_width, videocontext->display_height);
6086 /* pixel width and height are the w and h of the video in pixels */
6087 if (videocontext->pixel_width > 0 && videocontext->pixel_height > 0) {
6088 gint w = videocontext->pixel_width;
6090 gint h = videocontext->pixel_height;
6092 gst_structure_set (structure,
6093 "width", G_TYPE_INT, w, "height", G_TYPE_INT, h, NULL);
6096 if (videocontext->display_width > 0 && videocontext->display_height > 0) {
6099 /* calculate the pixel aspect ratio using the display and pixel w/h */
6100 n = videocontext->display_width * videocontext->pixel_height;
6101 d = videocontext->display_height * videocontext->pixel_width;
6102 GST_DEBUG ("setting PAR to %d/%d", n, d);
6103 gst_structure_set (structure, "pixel-aspect-ratio",
6105 videocontext->display_width * videocontext->pixel_height,
6106 videocontext->display_height * videocontext->pixel_width, NULL);
6109 if (videocontext->default_fps > 0.0) {
6110 GValue fps_double = { 0, };
6111 GValue fps_fraction = { 0, };
6113 g_value_init (&fps_double, G_TYPE_DOUBLE);
6114 g_value_init (&fps_fraction, GST_TYPE_FRACTION);
6115 g_value_set_double (&fps_double, videocontext->default_fps);
6116 g_value_transform (&fps_double, &fps_fraction);
6118 GST_DEBUG ("using default fps %f", videocontext->default_fps);
6120 gst_structure_set_value (structure, "framerate", &fps_fraction);
6121 g_value_unset (&fps_double);
6122 g_value_unset (&fps_fraction);
6123 } else if (context->default_duration > 0) {
6126 gst_duration_to_fraction (context->default_duration, &fps_n, &fps_d);
6128 GST_INFO ("using default duration %" G_GUINT64_FORMAT
6129 " framerate %d/%d", context->default_duration, fps_n, fps_d);
6131 gst_structure_set (structure, "framerate", GST_TYPE_FRACTION,
6132 fps_n, fps_d, NULL);
6134 /* sort of a hack to get most codecs to support,
6135 * even if the default_duration is missing */
6136 gst_structure_set (structure, "framerate", GST_TYPE_FRACTION,
6140 if (videocontext->parent.flags & GST_MATROSKA_VIDEOTRACK_INTERLACED)
6141 gst_structure_set (structure, "interlaced", G_TYPE_BOOLEAN, TRUE, NULL);
6144 gst_caps_do_simplify (caps);
6151 * Some AAC specific code... *sigh*
6152 * FIXME: maybe we should use '15' and code the sample rate explicitly
6153 * if the sample rate doesn't match the predefined rates exactly? (tpm)
6157 aac_rate_idx (gint rate)
6161 else if (75132 <= rate)
6163 else if (55426 <= rate)
6165 else if (46009 <= rate)
6167 else if (37566 <= rate)
6169 else if (27713 <= rate)
6171 else if (23004 <= rate)
6173 else if (18783 <= rate)
6175 else if (13856 <= rate)
6177 else if (11502 <= rate)
6179 else if (9391 <= rate)
6186 aac_profile_idx (const gchar * codec_id)
6190 if (strlen (codec_id) <= 12)
6192 else if (!strncmp (&codec_id[12], "MAIN", 4))
6194 else if (!strncmp (&codec_id[12], "LC", 2))
6196 else if (!strncmp (&codec_id[12], "SSR", 3))
6204 #define AAC_SYNC_EXTENSION_TYPE 0x02b7
6207 gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext *
6208 audiocontext, const gchar * codec_id, guint8 * data, guint size,
6209 gchar ** codec_name, guint16 * riff_audio_fmt)
6211 GstMatroskaTrackContext *context = (GstMatroskaTrackContext *) audiocontext;
6212 GstCaps *caps = NULL;
6214 g_assert (audiocontext != NULL);
6215 g_assert (codec_name != NULL);
6218 *riff_audio_fmt = 0;
6220 context->send_xiph_headers = FALSE;
6221 context->send_flac_headers = FALSE;
6222 context->send_speex_headers = FALSE;
6224 /* TODO: check if we have all codec types from matroska-ids.h
6225 * check if we have to do more special things with codec_private
6226 * check if we need bitdepth in different places too
6227 * implement channel position magic
6229 * GST_MATROSKA_CODEC_ID_AUDIO_AC3_BSID9
6230 * GST_MATROSKA_CODEC_ID_AUDIO_AC3_BSID10
6231 * GST_MATROSKA_CODEC_ID_AUDIO_QUICKTIME_QDMC
6232 * GST_MATROSKA_CODEC_ID_AUDIO_QUICKTIME_QDM2
6235 if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L1) ||
6236 !strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L2) ||
6237 !strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L3)) {
6240 if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L1))
6242 else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L2))
6247 caps = gst_caps_new_simple ("audio/mpeg",
6248 "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, layer, NULL);
6249 *codec_name = g_strdup_printf ("MPEG-1 layer %d", layer);
6250 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_BE) ||
6251 !strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_LE)) {
6254 if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_BE))
6255 endianness = G_BIG_ENDIAN;
6257 endianness = G_LITTLE_ENDIAN;
6259 caps = gst_caps_new_simple ("audio/x-raw-int",
6260 "width", G_TYPE_INT, audiocontext->bitdepth,
6261 "depth", G_TYPE_INT, audiocontext->bitdepth,
6262 "signed", G_TYPE_BOOLEAN, audiocontext->bitdepth != 8,
6263 "endianness", G_TYPE_INT, endianness, NULL);
6265 *codec_name = g_strdup_printf ("Raw %d-bit PCM audio",
6266 audiocontext->bitdepth);
6267 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_PCM_FLOAT)) {
6268 caps = gst_caps_new_simple ("audio/x-raw-float",
6269 "endianness", G_TYPE_INT, G_LITTLE_ENDIAN,
6270 "width", G_TYPE_INT, audiocontext->bitdepth, NULL);
6271 *codec_name = g_strdup_printf ("Raw %d-bit floating-point audio",
6272 audiocontext->bitdepth);
6273 } else if (!strncmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_AC3,
6274 strlen (GST_MATROSKA_CODEC_ID_AUDIO_AC3))) {
6275 caps = gst_caps_new_simple ("audio/x-ac3",
6276 "framed", G_TYPE_BOOLEAN, TRUE, NULL);
6277 *codec_name = g_strdup ("AC-3 audio");
6278 } else if (!strncmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_EAC3,
6279 strlen (GST_MATROSKA_CODEC_ID_AUDIO_EAC3))) {
6280 caps = gst_caps_new_simple ("audio/x-eac3",
6281 "framed", G_TYPE_BOOLEAN, TRUE, NULL);
6282 *codec_name = g_strdup ("E-AC-3 audio");
6283 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_DTS)) {
6284 caps = gst_caps_new_simple ("audio/x-dts", NULL);
6285 *codec_name = g_strdup ("DTS audio");
6286 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_VORBIS)) {
6287 caps = gst_caps_new_simple ("audio/x-vorbis", NULL);
6288 context->send_xiph_headers = TRUE;
6289 /* vorbis decoder does tags */
6290 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_FLAC)) {
6291 caps = gst_caps_new_simple ("audio/x-flac", NULL);
6292 context->send_flac_headers = TRUE;
6293 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_SPEEX)) {
6294 caps = gst_caps_new_simple ("audio/x-speex", NULL);
6295 context->send_speex_headers = TRUE;
6296 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_ACM)) {
6297 gst_riff_strf_auds auds;
6300 GstBuffer *codec_data = gst_buffer_new ();
6302 /* little-endian -> byte-order */
6303 auds.format = GST_READ_UINT16_LE (data);
6304 auds.channels = GST_READ_UINT16_LE (data + 2);
6305 auds.rate = GST_READ_UINT32_LE (data + 4);
6306 auds.av_bps = GST_READ_UINT32_LE (data + 8);
6307 auds.blockalign = GST_READ_UINT16_LE (data + 12);
6308 auds.size = GST_READ_UINT16_LE (data + 16);
6310 /* 18 is the waveformatex size */
6311 gst_buffer_set_data (codec_data, data + 18, auds.size);
6314 *riff_audio_fmt = auds.format;
6316 caps = gst_riff_create_audio_caps (auds.format, NULL, &auds, NULL,
6317 codec_data, codec_name);
6318 gst_buffer_unref (codec_data);
6321 GST_WARNING ("Unhandled RIFF audio format 0x%02x", auds.format);
6324 } else if (g_str_has_prefix (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_AAC)) {
6325 GstBuffer *priv = NULL;
6327 gint rate_idx, profile;
6328 guint8 *data = NULL;
6330 /* unspecified AAC profile with opaque private codec data */
6331 if (strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_AAC) == 0) {
6332 if (context->codec_priv_size >= 2) {
6333 guint obj_type, freq_index, explicit_freq_bytes = 0;
6335 codec_id = GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG4;
6337 freq_index = (GST_READ_UINT16_BE (context->codec_priv) & 0x780) >> 7;
6338 obj_type = (GST_READ_UINT16_BE (context->codec_priv) & 0xF800) >> 11;
6339 if (freq_index == 15)
6340 explicit_freq_bytes = 3;
6341 GST_DEBUG ("obj_type = %u, freq_index = %u", obj_type, freq_index);
6342 priv = gst_buffer_new_and_alloc (context->codec_priv_size);
6343 memcpy (GST_BUFFER_DATA (priv), context->codec_priv,
6344 context->codec_priv_size);
6345 /* assume SBR if samplerate <= 24kHz */
6346 if (obj_type == 5 || (freq_index >= 6 && freq_index != 15) ||
6347 (context->codec_priv_size == (5 + explicit_freq_bytes))) {
6348 audiocontext->samplerate *= 2;
6351 GST_WARNING ("Opaque A_AAC codec ID, but no codec private data");
6352 /* this is pretty broken;
6353 * maybe we need to make up some default private,
6354 * or maybe ADTS data got dumped in.
6355 * Let's set up some private data now, and check actual data later */
6356 /* just try this and see what happens ... */
6357 codec_id = GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG4;
6358 context->postprocess_frame = gst_matroska_demux_check_aac;
6362 /* make up decoder-specific data if it is not supplied */
6364 priv = gst_buffer_new_and_alloc (5);
6365 data = GST_BUFFER_DATA (priv);
6366 rate_idx = aac_rate_idx (audiocontext->samplerate);
6367 profile = aac_profile_idx (codec_id);
6369 data[0] = ((profile + 1) << 3) | ((rate_idx & 0xE) >> 1);
6370 data[1] = ((rate_idx & 0x1) << 7) | (audiocontext->channels << 3);
6371 GST_BUFFER_SIZE (priv) = 2;
6373 if (!strncmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG2,
6374 strlen (GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG2))) {
6376 } else if (!strncmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG4,
6377 strlen (GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG4))) {
6380 if (g_strrstr (codec_id, "SBR")) {
6381 /* HE-AAC (aka SBR AAC) */
6382 audiocontext->samplerate *= 2;
6383 rate_idx = aac_rate_idx (audiocontext->samplerate);
6384 data[2] = AAC_SYNC_EXTENSION_TYPE >> 3;
6385 data[3] = ((AAC_SYNC_EXTENSION_TYPE & 0x07) << 5) | 5;
6386 data[4] = (1 << 7) | (rate_idx << 3);
6387 GST_BUFFER_SIZE (priv) = 5;
6390 gst_buffer_unref (priv);
6392 GST_ERROR ("Unknown AAC profile and no codec private data");
6397 caps = gst_caps_new_simple ("audio/mpeg",
6398 "mpegversion", G_TYPE_INT, mpegversion,
6399 "framed", G_TYPE_BOOLEAN, TRUE, NULL);
6400 gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, priv, NULL);
6401 *codec_name = g_strdup_printf ("MPEG-%d AAC audio", mpegversion);
6403 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_TTA)) {
6404 caps = gst_caps_new_simple ("audio/x-tta",
6405 "width", G_TYPE_INT, audiocontext->bitdepth, NULL);
6406 *codec_name = g_strdup ("TTA audio");
6407 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_WAVPACK4)) {
6408 caps = gst_caps_new_simple ("audio/x-wavpack",
6409 "width", G_TYPE_INT, audiocontext->bitdepth,
6410 "framed", G_TYPE_BOOLEAN, TRUE, NULL);
6411 *codec_name = g_strdup ("Wavpack audio");
6412 context->postprocess_frame = gst_matroska_demux_add_wvpk_header;
6413 audiocontext->wvpk_block_index = 0;
6414 } else if ((!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_REAL_14_4)) ||
6415 (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_REAL_14_4)) ||
6416 (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_REAL_COOK))) {
6417 gint raversion = -1;
6419 if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_REAL_14_4))
6421 else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_REAL_COOK))
6426 caps = gst_caps_new_simple ("audio/x-pn-realaudio",
6427 "raversion", G_TYPE_INT, raversion, NULL);
6428 /* Extract extra information from caps, mapping varies based on codec */
6429 if (data && (size >= 0x50)) {
6436 guint extra_data_size;
6438 GST_ERROR ("real audio raversion:%d", raversion);
6439 if (raversion == 8) {
6441 flavor = GST_READ_UINT16_BE (data + 22);
6442 packet_size = GST_READ_UINT32_BE (data + 24);
6443 height = GST_READ_UINT16_BE (data + 40);
6444 leaf_size = GST_READ_UINT16_BE (data + 44);
6445 sample_width = GST_READ_UINT16_BE (data + 58);
6446 extra_data_size = GST_READ_UINT32_BE (data + 74);
6449 ("flavor:%d, packet_size:%d, height:%d, leaf_size:%d, sample_width:%d, extra_data_size:%d",
6450 flavor, packet_size, height, leaf_size, sample_width,
6452 gst_caps_set_simple (caps, "flavor", G_TYPE_INT, flavor, "packet_size",
6453 G_TYPE_INT, packet_size, "height", G_TYPE_INT, height, "leaf_size",
6454 G_TYPE_INT, leaf_size, "width", G_TYPE_INT, sample_width, NULL);
6456 if ((size - 78) >= extra_data_size) {
6457 priv = gst_buffer_new_and_alloc (extra_data_size);
6458 memcpy (GST_BUFFER_DATA (priv), data + 78, extra_data_size);
6459 gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, priv, NULL);
6460 gst_buffer_unref (priv);
6465 *codec_name = g_strdup_printf ("RealAudio %d.0", raversion);
6466 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_REAL_SIPR)) {
6467 caps = gst_caps_new_simple ("audio/x-sipro", NULL);
6468 *codec_name = g_strdup ("Sipro/ACELP.NET Voice Codec");
6469 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_REAL_RALF)) {
6470 caps = gst_caps_new_simple ("audio/x-ralf-mpeg4-generic", NULL);
6471 *codec_name = g_strdup ("Real Audio Lossless");
6472 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_REAL_ATRC)) {
6473 caps = gst_caps_new_simple ("audio/x-vnd.sony.atrac3", NULL);
6474 *codec_name = g_strdup ("Sony ATRAC3");
6476 GST_WARNING ("Unknown codec '%s', cannot build Caps", codec_id);
6481 if (audiocontext->samplerate > 0 && audiocontext->channels > 0) {
6484 for (i = 0; i < gst_caps_get_size (caps); i++) {
6485 gst_structure_set (gst_caps_get_structure (caps, i),
6486 "channels", G_TYPE_INT, audiocontext->channels,
6487 "rate", G_TYPE_INT, audiocontext->samplerate, NULL);
6491 gst_caps_do_simplify (caps);
6498 gst_matroska_demux_subtitle_caps (GstMatroskaTrackSubtitleContext *
6499 subtitlecontext, const gchar * codec_id, gpointer data, guint size)
6501 GstCaps *caps = NULL;
6502 GstMatroskaTrackContext *context =
6503 (GstMatroskaTrackContext *) subtitlecontext;
6505 /* for backwards compatibility */
6506 if (!g_ascii_strcasecmp (codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_ASCII))
6507 codec_id = GST_MATROSKA_CODEC_ID_SUBTITLE_UTF8;
6508 else if (!g_ascii_strcasecmp (codec_id, "S_SSA"))
6509 codec_id = GST_MATROSKA_CODEC_ID_SUBTITLE_SSA;
6510 else if (!g_ascii_strcasecmp (codec_id, "S_ASS"))
6511 codec_id = GST_MATROSKA_CODEC_ID_SUBTITLE_ASS;
6512 else if (!g_ascii_strcasecmp (codec_id, "S_USF"))
6513 codec_id = GST_MATROSKA_CODEC_ID_SUBTITLE_USF;
6515 /* TODO: Add GST_MATROSKA_CODEC_ID_SUBTITLE_BMP support
6516 * Check if we have to do something with codec_private */
6517 if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_UTF8)) {
6518 caps = gst_caps_new_simple ("text/plain", NULL);
6519 context->postprocess_frame = gst_matroska_demux_check_subtitle_buffer;
6520 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_SSA)) {
6521 caps = gst_caps_new_simple ("application/x-ssa", NULL);
6522 context->postprocess_frame = gst_matroska_demux_check_subtitle_buffer;
6523 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_ASS)) {
6524 caps = gst_caps_new_simple ("application/x-ass", NULL);
6525 context->postprocess_frame = gst_matroska_demux_check_subtitle_buffer;
6526 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_USF)) {
6527 caps = gst_caps_new_simple ("application/x-usf", NULL);
6528 context->postprocess_frame = gst_matroska_demux_check_subtitle_buffer;
6529 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_VOBSUB)) {
6530 caps = gst_caps_new_simple ("video/x-dvd-subpicture", NULL);
6531 ((GstMatroskaTrackContext *) subtitlecontext)->send_dvd_event = TRUE;
6532 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_HDMVPGS)) {
6533 caps = gst_caps_new_simple ("subpicture/x-pgs", NULL);
6534 } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_SUBTITLE_KATE)) {
6535 caps = gst_caps_new_simple ("subtitle/x-kate", NULL);
6536 context->send_xiph_headers = TRUE;
6538 GST_DEBUG ("Unknown subtitle stream: codec_id='%s'", codec_id);
6539 caps = gst_caps_new_simple ("application/x-subtitle-unknown", NULL);
6542 if (data != NULL && size > 0) {
6545 buf = gst_buffer_new_and_alloc (size);
6546 memcpy (GST_BUFFER_DATA (buf), data, size);
6547 gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, buf, NULL);
6548 gst_buffer_unref (buf);
6555 gst_matroska_demux_set_index (GstElement * element, GstIndex * index)
6557 GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (element);
6559 GST_OBJECT_LOCK (demux);
6560 if (demux->common.element_index)
6561 gst_object_unref (demux->common.element_index);
6562 demux->common.element_index = index ? gst_object_ref (index) : NULL;
6563 GST_OBJECT_UNLOCK (demux);
6564 GST_DEBUG_OBJECT (demux, "Set index %" GST_PTR_FORMAT,
6565 demux->common.element_index);
6569 gst_matroska_demux_get_index (GstElement * element)
6571 GstIndex *result = NULL;
6572 GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (element);
6574 GST_OBJECT_LOCK (demux);
6575 if (demux->common.element_index)
6576 result = gst_object_ref (demux->common.element_index);
6577 GST_OBJECT_UNLOCK (demux);
6579 GST_DEBUG_OBJECT (demux, "Returning index %" GST_PTR_FORMAT, result);
6584 static GstStateChangeReturn
6585 gst_matroska_demux_change_state (GstElement * element,
6586 GstStateChange transition)
6588 GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (element);
6589 GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
6591 /* handle upwards state changes here */
6592 switch (transition) {
6597 ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
6599 /* handle downwards state changes */
6600 switch (transition) {
6601 case GST_STATE_CHANGE_PAUSED_TO_READY:
6602 gst_matroska_demux_reset (GST_ELEMENT (demux));
6612 gst_matroska_demux_plugin_init (GstPlugin * plugin)
6616 /* parser helper separate debug */
6617 GST_DEBUG_CATEGORY_INIT (ebmlread_debug, "ebmlread",
6618 0, "EBML stream helper class");
6620 /* create an elementfactory for the matroska_demux element */
6621 if (!gst_element_register (plugin, "matroskademux",
6622 GST_RANK_PRIMARY, GST_TYPE_MATROSKA_DEMUX))