2 * (c) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
4 * ebml-read.c: read EBML data from file/stream
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
16 * You should have received a copy of the GNU Library General Public
17 * License along with this library; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
28 #include "ebml-read.h"
36 static void gst_ebml_read_class_init (GstEbmlReadClass *klass);
37 static void gst_ebml_read_init (GstEbmlRead *ebml);
38 static GstElementStateReturn
39 gst_ebml_read_change_state (GstElement *element);
41 static GstElementClass *parent_class = NULL;
44 gst_ebml_read_get_type (void)
46 static GType gst_ebml_read_type = 0;
48 if (!gst_ebml_read_type) {
49 static const GTypeInfo gst_ebml_read_info = {
50 sizeof (GstEbmlReadClass),
53 (GClassInitFunc) gst_ebml_read_class_init,
58 (GInstanceInitFunc) gst_ebml_read_init,
62 g_type_register_static (GST_TYPE_ELEMENT, "GstEbmlRead",
63 &gst_ebml_read_info, 0);
66 return gst_ebml_read_type;
70 gst_ebml_read_class_init (GstEbmlReadClass *klass)
72 GstElementClass *gstelement_class = (GstElementClass *) klass;
74 parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
76 gstelement_class->change_state = gst_ebml_read_change_state;
80 gst_ebml_read_init (GstEbmlRead *ebml)
87 static GstElementStateReturn
88 gst_ebml_read_change_state (GstElement *element)
90 GstEbmlRead *ebml = GST_EBML_READ (element);
92 switch (GST_STATE_TRANSITION (element)) {
93 case GST_STATE_READY_TO_PAUSED:
95 return GST_STATE_FAILURE;
96 ebml->bs = gst_bytestream_new (ebml->sinkpad);
98 case GST_STATE_PAUSED_TO_READY:
99 gst_bytestream_destroy (ebml->bs);
100 while (ebml->level) {
101 GstEbmlLevel *level = ebml->level->data;
103 ebml->level = g_list_remove (ebml->level, level);
111 if (GST_ELEMENT_CLASS (parent_class)->change_state)
112 return GST_ELEMENT_CLASS (parent_class)->change_state (element);
114 return GST_STATE_SUCCESS;
118 * Return: the amount of levels in the hierarchy that the
119 * current element lies higher than the previous one.
120 * The opposite isn't done - that's auto-done using master
125 gst_ebml_read_element_level_up (GstEbmlRead *ebml)
128 guint64 pos = gst_bytestream_tell (ebml->bs);
130 while (ebml->level != NULL) {
131 GList *last = g_list_last (ebml->level);
132 GstEbmlLevel *level = last->data;
134 if (pos >= level->start + level->length) {
135 ebml->level = g_list_remove (ebml->level, level);
146 * Read: the element content data ID.
147 * Return: the number of bytes read or -1 on error.
151 gst_ebml_read_element_id (GstEbmlRead *ebml,
156 gint len_mask = 0x80, read = 1, n = 1;
159 if (gst_bytestream_peek_bytes (ebml->bs, &data, 1) != 1) {
160 GstEvent *event = NULL;
163 /* Here, we might encounter EOS */
164 gst_bytestream_get_status (ebml->bs, &remaining, &event);
165 if (event && GST_EVENT_TYPE (event) == GST_EVENT_EOS) {
166 gst_pad_event_default (ebml->sinkpad, event);
168 guint64 pos = gst_bytestream_tell (ebml->bs);
169 gst_event_unref (event);
170 gst_element_error (ebml, RESOURCE, READ, NULL,
171 ("Read error at position %llu (0x%llx)",
177 while (read <= 4 && !(total & len_mask)) {
182 guint64 pos = gst_bytestream_tell (ebml->bs);
183 gst_element_error (ebml, STREAM, DEMUX, NULL,
184 ("Invalid EBML ID size tag (0x%x) at position %llu (0x%llx)",
189 if (gst_bytestream_peek_bytes (ebml->bs, &data, read) != read) {
190 guint64 pos = gst_bytestream_tell (ebml->bs);
191 gst_element_error (ebml, RESOURCE, READ, NULL,
192 ("Read error at position %llu (0x%llx)", pos, pos));
196 total = (total << 8) | data[n++];
202 *level_up = gst_ebml_read_element_level_up (ebml);
208 * Read: element content length.
209 * Return: the number of bytes read or -1 on error.
213 gst_ebml_read_element_length (GstEbmlRead *ebml,
217 gint len_mask = 0x80, read = 1, n = 1, num_ffs = 0;
220 if (gst_bytestream_peek_bytes (ebml->bs, &data, 1) != 1) {
221 guint64 pos = gst_bytestream_tell (ebml->bs);
222 gst_element_error (ebml, RESOURCE, READ, NULL,
223 ("Read error at position %llu (0x%llx)", pos, pos));
227 while (read <= 8 && !(total & len_mask)) {
232 guint64 pos = gst_bytestream_tell (ebml->bs);
233 gst_element_error (ebml, STREAM, DEMUX, NULL,
234 ("Invalid EBML length size tag (0x%x) at position %llu (0x%llx)",
239 if ((total &= (len_mask - 1)) == len_mask - 1)
241 if (gst_bytestream_peek_bytes (ebml->bs, &data, read) != read) {
242 guint64 pos = gst_bytestream_tell (ebml->bs);
243 gst_element_error (ebml, RESOURCE, READ, NULL,
244 ("Read error at position %llu (0x%llx)", pos, pos));
250 total = (total << 8) | data[n];
255 *length = G_MAXUINT64;
263 * Read: the actual data.
264 * Return: the data, as a GstBuffer.
268 gst_ebml_read_element_data (GstEbmlRead *ebml,
271 GstBuffer *buf = NULL;
273 if (gst_bytestream_peek (ebml->bs, &buf, length) != length) {
274 guint64 pos = gst_bytestream_tell (ebml->bs);
275 gst_element_error (ebml, RESOURCE, READ, NULL,
276 ("Read error at position %llu (0x%llx)", pos, pos));
278 gst_buffer_unref (buf);
282 gst_bytestream_flush_fast (ebml->bs, length);
288 * Return: the ID of the next element.
289 * Level_up contains the amount of levels that this
290 * next element lies higher than the previous one.
294 gst_ebml_peek_id (GstEbmlRead *ebml,
301 if (gst_ebml_read_element_id (ebml, &id, level_up) < 0)
308 * Seek to a given offset.
312 gst_ebml_read_seek (GstEbmlRead *ebml,
319 /* first, flush remaining buffers */
320 gst_bytestream_get_status (ebml->bs, &remaining, &event);
322 g_warning ("Unexpected event before seek");
323 gst_event_unref (event);
326 gst_bytestream_flush_fast (ebml->bs, remaining);
329 if (!gst_bytestream_seek (ebml->bs, offset, GST_SEEK_METHOD_SET)) {
330 gst_element_error (ebml, RESOURCE, SEEK, NULL,
331 ("Seek to position %llu (0x%llx) failed", offset, offset));
335 /* and now, peek a new byte. This will fail because there's a
336 * pending event. Then, take the event and return it. */
337 if (gst_bytestream_peek_bytes (ebml->bs, &data, 1))
338 g_warning ("Unexpected data after seek");
340 /* get the discont event and return */
341 gst_bytestream_get_status (ebml->bs, &remaining, &event);
342 if (!event || GST_EVENT_TYPE (event) != GST_EVENT_DISCONTINUOUS) {
343 gst_element_error (ebml, CORE, SEEK, NULL,
344 ("No discontinuity event after seek"));
346 gst_event_unref (event);
354 * Skip the next element.
358 gst_ebml_read_skip (GstEbmlRead *ebml)
361 guint32 id, remaining;
365 if ((bytes = gst_ebml_read_element_id (ebml, &id, NULL)) < 0)
367 gst_bytestream_flush_fast (ebml->bs, bytes);
369 if ((bytes = gst_ebml_read_element_length (ebml, &length)) < 0)
371 gst_bytestream_flush_fast (ebml->bs, bytes);
373 /* do we have enough bytes left to skip? */
374 gst_bytestream_get_status (ebml->bs, &remaining, &event);
376 g_warning ("Unexpected event before skip");
377 gst_event_unref (event);
380 if (remaining >= length)
381 return gst_bytestream_flush (ebml->bs, length);
383 if (!(event = gst_ebml_read_seek (ebml,
384 gst_bytestream_tell (ebml->bs) + length)))
387 gst_event_unref (event);
393 * Read the next element as a GstBuffer (binary).
397 gst_ebml_read_buffer (GstEbmlRead *ebml,
404 if ((bytes = gst_ebml_read_element_id (ebml, id, NULL)) < 0)
406 gst_bytestream_flush_fast (ebml->bs, bytes);
408 if ((bytes = gst_ebml_read_element_length (ebml, &length)) < 0)
410 gst_bytestream_flush_fast (ebml->bs, bytes);
412 return ((*buf = gst_ebml_read_element_data (ebml, length)) != NULL);
416 * Read the next element as an unsigned int.
420 gst_ebml_read_uint (GstEbmlRead *ebml,
428 if (!gst_ebml_read_buffer (ebml, id, &buf))
431 data = GST_BUFFER_DATA (buf);
432 size = GST_BUFFER_SIZE (buf);
433 if (size < 1 || size > 8) {
434 gst_element_error (ebml, STREAM, DEMUX, NULL,
435 ("Invalid integer element size %d at position %llu (0x%llu)",
436 size, GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET (buf)));
437 gst_buffer_unref (buf);
442 *num = (*num << 8) | data[GST_BUFFER_SIZE (buf) - size];
446 gst_buffer_unref (buf);
452 * Read the next element as a signed int.
456 gst_ebml_read_sint (GstEbmlRead *ebml,
462 guint size, negative = 0, n = 0;
464 if (!gst_ebml_read_buffer (ebml, id, &buf))
467 data = GST_BUFFER_DATA (buf);
468 size = GST_BUFFER_SIZE (buf);
469 if (size < 1 || size > 8) {
470 gst_element_error (ebml, STREAM, DEMUX, NULL,
471 ("Invalid integer element size %d at position %llu (0x%llx)",
472 size, GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET (buf)));
473 gst_buffer_unref (buf);
476 if (data[0] & 0x80) {
482 *num = (*num << 8) | data[n++];
487 *num = *num - (1LL << ((8 * size) - 1));
490 gst_buffer_unref (buf);
496 * Read the next element as a float.
500 gst_ebml_read_float (GstEbmlRead *ebml,
508 if (!gst_ebml_read_buffer (ebml, id, &buf))
511 data = GST_BUFFER_DATA (buf);
512 size = GST_BUFFER_SIZE (buf);
514 if (size != 4 && size != 8 && size != 10) {
515 gst_element_error (ebml, STREAM, DEMUX, NULL,
516 ("Invalid float element size %d at position %llu (0x%llx)",
517 size, GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET (buf)));
518 gst_buffer_unref (buf);
523 gst_element_error (ebml, CORE, NOT_IMPLEMENTED, NULL,
524 ("FIXME! 10-byte floats unimplemented"));
525 gst_buffer_unref (buf);
532 #if (G_BYTE_ORDER == G_BIG_ENDIAN)
533 f = * (gfloat *) data;
536 ((guint8 *) &f)[size - 1] = data[4 - size];
545 #if (G_BYTE_ORDER == G_BIG_ENDIAN)
546 d = * (gdouble *) data;
549 ((guint8 *) &d)[size - 1] = data[8 - size];
557 gst_buffer_unref (buf);
563 * Read the next element as an ASCII string.
567 gst_ebml_read_ascii (GstEbmlRead *ebml,
573 if (!gst_ebml_read_buffer (ebml, id, &buf))
576 *str = g_malloc (GST_BUFFER_SIZE (buf) + 1);
577 memcpy (*str, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf));
578 (*str)[GST_BUFFER_SIZE (buf)] = '\0';
580 gst_buffer_unref (buf);
586 * Read the next element as a UTF-8 string.
590 gst_ebml_read_utf8 (GstEbmlRead *ebml,
594 return gst_ebml_read_ascii (ebml, id, str);
598 * Read the next element as a date (nanoseconds since 1/1/2000).
602 gst_ebml_read_date (GstEbmlRead *ebml,
606 return gst_ebml_read_sint (ebml, id, date);
610 * Read the next element, but only the header. The contents
611 * are supposed to be sub-elements which can be read separately.
615 gst_ebml_read_master (GstEbmlRead *ebml,
622 if ((bytes = gst_ebml_read_element_id (ebml, id, NULL)) < 0)
624 gst_bytestream_flush_fast (ebml->bs, bytes);
626 if ((bytes = gst_ebml_read_element_length (ebml, &length)) < 0)
628 gst_bytestream_flush_fast (ebml->bs, bytes);
631 level = g_new (GstEbmlLevel, 1);
632 level->start = gst_bytestream_tell (ebml->bs);
633 level->length = length;
634 ebml->level = g_list_append (ebml->level, level);
640 * Read the next element as binary data.
644 gst_ebml_read_binary (GstEbmlRead *ebml,
651 if (!gst_ebml_read_buffer (ebml, id, &buf))
654 *length = GST_BUFFER_SIZE (buf);
655 *binary = g_memdup (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf));
657 gst_buffer_unref (buf);
663 * Read an EBML header.
667 gst_ebml_read_header (GstEbmlRead *ebml,
671 /* this function is the first to be called */
681 if (!(id = gst_ebml_peek_id (ebml, &level_up)))
683 if (level_up != 0 || id != GST_EBML_ID_HEADER) {
684 gst_element_error (ebml, STREAM, WRONG_TYPE, NULL, NULL);
687 if (!gst_ebml_read_master (ebml, &id))
689 g_assert (id == GST_EBML_ID_HEADER);
692 if (!(id = gst_ebml_peek_id (ebml, &level_up)))
700 /* is our read version uptodate? */
701 case GST_EBML_ID_EBMLREADVERSION: {
704 if (!gst_ebml_read_uint (ebml, &id, &num))
706 g_assert (id == GST_EBML_ID_EBMLREADVERSION);
707 if (num != GST_EBML_VERSION)
712 /* we only handle 8 byte lengths at max */
713 case GST_EBML_ID_EBMLMAXSIZELENGTH: {
716 if (!gst_ebml_read_uint (ebml, &id, &num))
718 g_assert (id == GST_EBML_ID_EBMLMAXSIZELENGTH);
719 if (num != sizeof (guint64))
724 /* we handle 4 byte IDs at max */
725 case GST_EBML_ID_EBMLMAXIDLENGTH: {
728 if (!gst_ebml_read_uint (ebml, &id, &num))
730 g_assert (id == GST_EBML_ID_EBMLMAXIDLENGTH);
731 if (num != sizeof (guint32))
736 case GST_EBML_ID_DOCTYPE: {
739 if (!gst_ebml_read_ascii (ebml, &id, &text))
741 g_assert (id == GST_EBML_ID_DOCTYPE);
751 case GST_EBML_ID_DOCTYPEREADVERSION: {
754 if (!gst_ebml_read_uint (ebml, &id, &num))
756 g_assert (id == GST_EBML_ID_DOCTYPEREADVERSION);
763 GST_WARNING ("Unknown data type 0x%x in EBML header (ignored)", id);
766 /* we ignore these two, as they don't tell us anything we care about */
767 case GST_EBML_ID_VOID:
768 case GST_EBML_ID_EBMLVERSION:
769 case GST_EBML_ID_DOCTYPEVERSION:
770 if (!gst_ebml_read_skip (ebml))