diff options
author | Thomas Vander Stichele <thomas@apestaart.org> | 2004-03-14 22:34:33 +0000 |
---|---|---|
committer | Thomas Vander Stichele <thomas@apestaart.org> | 2004-03-14 22:34:33 +0000 |
commit | 5d25c00e4b613b9cdf2c04fa3a68dffa03834a68 (patch) | |
tree | 74a5b1eaf3a324b520e64e87404fd0b3018a7829 /gst/matroska | |
parent | 1e83b097f7b732ae49e294a5a398bdc3e88854a8 (diff) |
gst-indent
Original commit message from CVS:
gst-indent
Diffstat (limited to 'gst/matroska')
-rw-r--r-- | gst/matroska/ebml-ids.h | 8 | ||||
-rw-r--r-- | gst/matroska/ebml-read.c | 253 | ||||
-rw-r--r-- | gst/matroska/ebml-read.h | 68 | ||||
-rw-r--r-- | gst/matroska/ebml-write.c | 126 | ||||
-rw-r--r-- | gst/matroska/ebml-write.h | 72 | ||||
-rw-r--r-- | gst/matroska/matroska-demux.c | 2670 | ||||
-rw-r--r-- | gst/matroska/matroska-demux.h | 61 | ||||
-rw-r--r-- | gst/matroska/matroska-ids.h | 92 | ||||
-rw-r--r-- | gst/matroska/matroska-mux.c | 443 | ||||
-rw-r--r-- | gst/matroska/matroska-mux.h | 51 | ||||
-rw-r--r-- | gst/matroska/matroska.c | 20 |
11 files changed, 1849 insertions, 2015 deletions
diff --git a/gst/matroska/ebml-ids.h b/gst/matroska/ebml-ids.h index 329f036c..eb396b23 100644 --- a/gst/matroska/ebml-ids.h +++ b/gst/matroska/ebml-ids.h @@ -23,13 +23,10 @@ #define __GST_EBML_IDS_H__ G_BEGIN_DECLS - /* EBML version supported */ #define GST_EBML_VERSION 1 - /* top-level master-IDs */ #define GST_EBML_ID_HEADER 0x1A45DFA3 - /* IDs in the HEADER master */ #define GST_EBML_ID_EBMLVERSION 0x4286 #define GST_EBML_ID_EBMLREADVERSION 0x42F7 @@ -38,10 +35,7 @@ G_BEGIN_DECLS #define GST_EBML_ID_DOCTYPE 0x4282 #define GST_EBML_ID_DOCTYPEVERSION 0x4287 #define GST_EBML_ID_DOCTYPEREADVERSION 0x4285 - /* general EBML types */ #define GST_EBML_ID_VOID 0xEC - -G_END_DECLS - + G_END_DECLS #endif /* __GST_EBML_IDS_H__ */ diff --git a/gst/matroska/ebml-read.c b/gst/matroska/ebml-read.c index 4661ef80..6fa53565 100644 --- a/gst/matroska/ebml-read.c +++ b/gst/matroska/ebml-read.c @@ -28,26 +28,26 @@ #include "ebml-read.h" #include "ebml-ids.h" -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -static void gst_ebml_read_class_init (GstEbmlReadClass *klass); -static void gst_ebml_read_init (GstEbmlRead *ebml); -static GstElementStateReturn - gst_ebml_read_change_state (GstElement *element); +static void gst_ebml_read_class_init (GstEbmlReadClass * klass); +static void gst_ebml_read_init (GstEbmlRead * ebml); +static GstElementStateReturn gst_ebml_read_change_state (GstElement * element); static GstElementClass *parent_class = NULL; GType -gst_ebml_read_get_type (void) +gst_ebml_read_get_type (void) { static GType gst_ebml_read_type = 0; if (!gst_ebml_read_type) { static const GTypeInfo gst_ebml_read_info = { - sizeof (GstEbmlReadClass), + sizeof (GstEbmlReadClass), NULL, NULL, (GClassInitFunc) gst_ebml_read_class_init, @@ -60,14 +60,14 @@ gst_ebml_read_get_type (void) gst_ebml_read_type = g_type_register_static (GST_TYPE_ELEMENT, "GstEbmlRead", - &gst_ebml_read_info, 0); + &gst_ebml_read_info, 0); } return gst_ebml_read_type; } static void -gst_ebml_read_class_init (GstEbmlReadClass *klass) +gst_ebml_read_class_init (GstEbmlReadClass * klass) { GstElementClass *gstelement_class = (GstElementClass *) klass; @@ -77,7 +77,7 @@ gst_ebml_read_class_init (GstEbmlReadClass *klass) } static void -gst_ebml_read_init (GstEbmlRead *ebml) +gst_ebml_read_init (GstEbmlRead * ebml) { ebml->sinkpad = NULL; ebml->bs = NULL; @@ -85,23 +85,23 @@ gst_ebml_read_init (GstEbmlRead *ebml) } static GstElementStateReturn -gst_ebml_read_change_state (GstElement *element) +gst_ebml_read_change_state (GstElement * element) { GstEbmlRead *ebml = GST_EBML_READ (element); switch (GST_STATE_TRANSITION (element)) { case GST_STATE_READY_TO_PAUSED: if (!ebml->sinkpad) - return GST_STATE_FAILURE; + return GST_STATE_FAILURE; ebml->bs = gst_bytestream_new (ebml->sinkpad); break; case GST_STATE_PAUSED_TO_READY: gst_bytestream_destroy (ebml->bs); while (ebml->level) { - GstEbmlLevel *level = ebml->level->data; + GstEbmlLevel *level = ebml->level->data; - ebml->level = g_list_remove (ebml->level, level); - g_free (level); + ebml->level = g_list_remove (ebml->level, level); + g_free (level); } break; default: @@ -122,7 +122,7 @@ gst_ebml_read_change_state (GstElement *element) */ static guint -gst_ebml_read_element_level_up (GstEbmlRead *ebml) +gst_ebml_read_element_level_up (GstEbmlRead * ebml) { guint num = 0; guint64 pos = gst_bytestream_tell (ebml->bs); @@ -148,9 +148,7 @@ gst_ebml_read_element_level_up (GstEbmlRead *ebml) */ static gint -gst_ebml_read_element_id (GstEbmlRead *ebml, - guint32 *id, - guint *level_up) +gst_ebml_read_element_id (GstEbmlRead * ebml, guint32 * id, guint * level_up) { guint8 *data; gint len_mask = 0x80, read = 1, n = 1; @@ -166,10 +164,10 @@ gst_ebml_read_element_id (GstEbmlRead *ebml, gst_pad_event_default (ebml->sinkpad, event); } else { guint64 pos = gst_bytestream_tell (ebml->bs); + gst_event_unref (event); GST_ELEMENT_ERROR (ebml, RESOURCE, READ, (NULL), - ("Read error at position %llu (0x%llx)", - pos, pos)); + ("Read error at position %llu (0x%llx)", pos, pos)); return -1; } } @@ -180,16 +178,18 @@ gst_ebml_read_element_id (GstEbmlRead *ebml, } if (read > 4) { guint64 pos = gst_bytestream_tell (ebml->bs); + GST_ELEMENT_ERROR (ebml, STREAM, DEMUX, (NULL), - ("Invalid EBML ID size tag (0x%x) at position %llu (0x%llx)", - data[0], pos, pos)); + ("Invalid EBML ID size tag (0x%x) at position %llu (0x%llx)", + data[0], pos, pos)); return -1; } if (gst_bytestream_peek_bytes (ebml->bs, &data, read) != read) { guint64 pos = gst_bytestream_tell (ebml->bs); + GST_ELEMENT_ERROR (ebml, RESOURCE, READ, (NULL), - ("Read error at position %llu (0x%llx)", pos, pos)); + ("Read error at position %llu (0x%llx)", pos, pos)); return -1; } while (n < read) @@ -210,8 +210,7 @@ gst_ebml_read_element_id (GstEbmlRead *ebml, */ static gint -gst_ebml_read_element_length (GstEbmlRead *ebml, - guint64 *length) +gst_ebml_read_element_length (GstEbmlRead * ebml, guint64 * length) { guint8 *data; gint len_mask = 0x80, read = 1, n = 1, num_ffs = 0; @@ -219,8 +218,9 @@ gst_ebml_read_element_length (GstEbmlRead *ebml, if (gst_bytestream_peek_bytes (ebml->bs, &data, 1) != 1) { guint64 pos = gst_bytestream_tell (ebml->bs); + GST_ELEMENT_ERROR (ebml, RESOURCE, READ, (NULL), - ("Read error at position %llu (0x%llx)", pos, pos)); + ("Read error at position %llu (0x%llx)", pos, pos)); return -1; } total = data[0]; @@ -230,9 +230,10 @@ gst_ebml_read_element_length (GstEbmlRead *ebml, } if (read > 8) { guint64 pos = gst_bytestream_tell (ebml->bs); + GST_ELEMENT_ERROR (ebml, STREAM, DEMUX, (NULL), - ("Invalid EBML length size tag (0x%x) at position %llu (0x%llx)", - data[0], pos, pos)); + ("Invalid EBML length size tag (0x%x) at position %llu (0x%llx)", + data[0], pos, pos)); return -1; } @@ -240,8 +241,9 @@ gst_ebml_read_element_length (GstEbmlRead *ebml, num_ffs++; if (gst_bytestream_peek_bytes (ebml->bs, &data, read) != read) { guint64 pos = gst_bytestream_tell (ebml->bs); + GST_ELEMENT_ERROR (ebml, RESOURCE, READ, (NULL), - ("Read error at position %llu (0x%llx)", pos, pos)); + ("Read error at position %llu (0x%llx)", pos, pos)); return -1; } while (n < read) { @@ -265,15 +267,15 @@ gst_ebml_read_element_length (GstEbmlRead *ebml, */ static GstBuffer * -gst_ebml_read_element_data (GstEbmlRead *ebml, - guint64 length) +gst_ebml_read_element_data (GstEbmlRead * ebml, guint64 length) { GstBuffer *buf = NULL; if (gst_bytestream_peek (ebml->bs, &buf, length) != length) { guint64 pos = gst_bytestream_tell (ebml->bs); + GST_ELEMENT_ERROR (ebml, RESOURCE, READ, (NULL), - ("Read error at position %llu (0x%llx)", pos, pos)); + ("Read error at position %llu (0x%llx)", pos, pos)); if (buf) gst_buffer_unref (buf); return NULL; @@ -291,8 +293,7 @@ gst_ebml_read_element_data (GstEbmlRead *ebml, */ guint32 -gst_ebml_peek_id (GstEbmlRead *ebml, - guint *level_up) +gst_ebml_peek_id (GstEbmlRead * ebml, guint * level_up) { guint32 id; @@ -309,8 +310,7 @@ gst_ebml_peek_id (GstEbmlRead *ebml, */ GstEvent * -gst_ebml_read_seek (GstEbmlRead *ebml, - guint64 offset) +gst_ebml_read_seek (GstEbmlRead * ebml, guint64 offset) { guint32 remaining; GstEvent *event = NULL; @@ -328,7 +328,7 @@ gst_ebml_read_seek (GstEbmlRead *ebml, /* now seek */ if (!gst_bytestream_seek (ebml->bs, offset, GST_SEEK_METHOD_SET)) { GST_ELEMENT_ERROR (ebml, RESOURCE, SEEK, (NULL), - ("Seek to position %llu (0x%llx) failed", offset, offset)); + ("Seek to position %llu (0x%llx) failed", offset, offset)); return NULL; } @@ -359,7 +359,7 @@ gst_ebml_read_seek (GstEbmlRead *ebml, */ gboolean -gst_ebml_read_skip (GstEbmlRead *ebml) +gst_ebml_read_skip (GstEbmlRead * ebml) { gint bytes; guint32 id, remaining; @@ -385,7 +385,7 @@ gst_ebml_read_skip (GstEbmlRead *ebml) return gst_bytestream_flush (ebml->bs, length); if (!(event = gst_ebml_read_seek (ebml, - gst_bytestream_tell (ebml->bs) + length))) + gst_bytestream_tell (ebml->bs) + length))) return FALSE; gst_event_unref (event); @@ -398,9 +398,7 @@ gst_ebml_read_skip (GstEbmlRead *ebml) */ gboolean -gst_ebml_read_buffer (GstEbmlRead *ebml, - guint32 *id, - GstBuffer **buf) +gst_ebml_read_buffer (GstEbmlRead * ebml, guint32 * id, GstBuffer ** buf) { gint bytes; guint64 length; @@ -421,9 +419,7 @@ gst_ebml_read_buffer (GstEbmlRead *ebml, */ gboolean -gst_ebml_read_uint (GstEbmlRead *ebml, - guint32 *id, - guint64 *num) +gst_ebml_read_uint (GstEbmlRead * ebml, guint32 * id, guint64 * num) { GstBuffer *buf; guint8 *data; @@ -436,8 +432,8 @@ gst_ebml_read_uint (GstEbmlRead *ebml, size = GST_BUFFER_SIZE (buf); if (size < 1 || size > 8) { GST_ELEMENT_ERROR (ebml, STREAM, DEMUX, (NULL), - ("Invalid integer element size %d at position %llu (0x%llu)", - size, GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET (buf))); + ("Invalid integer element size %d at position %llu (0x%llu)", + size, GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET (buf))); gst_buffer_unref (buf); return FALSE; } @@ -457,9 +453,7 @@ gst_ebml_read_uint (GstEbmlRead *ebml, */ gboolean -gst_ebml_read_sint (GstEbmlRead *ebml, - guint32 *id, - gint64 *num) +gst_ebml_read_sint (GstEbmlRead * ebml, guint32 * id, gint64 * num) { GstBuffer *buf; guint8 *data; @@ -472,8 +466,8 @@ gst_ebml_read_sint (GstEbmlRead *ebml, size = GST_BUFFER_SIZE (buf); if (size < 1 || size > 8) { GST_ELEMENT_ERROR (ebml, STREAM, DEMUX, (NULL), - ("Invalid integer element size %d at position %llu (0x%llx)", - size, GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET (buf))); + ("Invalid integer element size %d at position %llu (0x%llx)", + size, GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET (buf))); gst_buffer_unref (buf); return FALSE; } @@ -501,9 +495,7 @@ gst_ebml_read_sint (GstEbmlRead *ebml, */ gboolean -gst_ebml_read_float (GstEbmlRead *ebml, - guint32 *id, - gdouble *num) +gst_ebml_read_float (GstEbmlRead * ebml, guint32 * id, gdouble * num) { GstBuffer *buf; guint8 *data; @@ -517,15 +509,15 @@ gst_ebml_read_float (GstEbmlRead *ebml, if (size != 4 && size != 8 && size != 10) { GST_ELEMENT_ERROR (ebml, STREAM, DEMUX, (NULL), - ("Invalid float element size %d at position %llu (0x%llx)", - size, GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET (buf))); + ("Invalid float element size %d at position %llu (0x%llx)", + size, GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET (buf))); gst_buffer_unref (buf); return FALSE; } if (size == 10) { GST_ELEMENT_ERROR (ebml, CORE, NOT_IMPLEMENTED, (NULL), - ("FIXME! 10-byte floats unimplemented")); + ("FIXME! 10-byte floats unimplemented")); gst_buffer_unref (buf); return FALSE; } @@ -534,10 +526,10 @@ gst_ebml_read_float (GstEbmlRead *ebml, gfloat f; #if (G_BYTE_ORDER == G_BIG_ENDIAN) - f = * (gfloat *) data; + f = *(gfloat *) data; #else while (size > 0) { - ((guint8 *) &f)[size - 1] = data[4 - size]; + ((guint8 *) & f)[size - 1] = data[4 - size]; size--; } #endif @@ -547,10 +539,10 @@ gst_ebml_read_float (GstEbmlRead *ebml, gdouble d; #if (G_BYTE_ORDER == G_BIG_ENDIAN) - d = * (gdouble *) data; + d = *(gdouble *) data; #else while (size > 0) { - ((guint8 *) &d)[size - 1] = data[8 - size]; + ((guint8 *) & d)[size - 1] = data[8 - size]; size--; } #endif @@ -568,9 +560,7 @@ gst_ebml_read_float (GstEbmlRead *ebml, */ gboolean -gst_ebml_read_ascii (GstEbmlRead *ebml, - guint32 *id, - gchar **str) +gst_ebml_read_ascii (GstEbmlRead * ebml, guint32 * id, gchar ** str) { GstBuffer *buf; @@ -591,9 +581,7 @@ gst_ebml_read_ascii (GstEbmlRead *ebml, */ gboolean -gst_ebml_read_utf8 (GstEbmlRead *ebml, - guint32 *id, - gchar **str) +gst_ebml_read_utf8 (GstEbmlRead * ebml, guint32 * id, gchar ** str) { return gst_ebml_read_ascii (ebml, id, str); } @@ -603,9 +591,7 @@ gst_ebml_read_utf8 (GstEbmlRead *ebml, */ gboolean -gst_ebml_read_date (GstEbmlRead *ebml, - guint32 *id, - gint64 *date) +gst_ebml_read_date (GstEbmlRead * ebml, guint32 * id, gint64 * date) { return gst_ebml_read_sint (ebml, id, date); } @@ -616,8 +602,7 @@ gst_ebml_read_date (GstEbmlRead *ebml, */ gboolean -gst_ebml_read_master (GstEbmlRead *ebml, - guint32 *id) +gst_ebml_read_master (GstEbmlRead * ebml, guint32 * id) { gint bytes; guint64 length; @@ -645,10 +630,8 @@ gst_ebml_read_master (GstEbmlRead *ebml, */ gboolean -gst_ebml_read_binary (GstEbmlRead *ebml, - guint32 *id, - guint8 **binary, - guint64 *length) +gst_ebml_read_binary (GstEbmlRead * ebml, + guint32 * id, guint8 ** binary, guint64 * length) { GstBuffer *buf; @@ -668,9 +651,7 @@ gst_ebml_read_binary (GstEbmlRead *ebml, */ gboolean -gst_ebml_read_header (GstEbmlRead *ebml, - gchar **doctype, - guint *version) +gst_ebml_read_header (GstEbmlRead * ebml, gchar ** doctype, guint * version) { /* this function is the first to be called */ guint32 id; @@ -701,79 +682,79 @@ gst_ebml_read_header (GstEbmlRead *ebml, break; switch (id) { - /* is our read version uptodate? */ - case GST_EBML_ID_EBMLREADVERSION: { - guint64 num; - - if (!gst_ebml_read_uint (ebml, &id, &num)) - return FALSE; - g_assert (id == GST_EBML_ID_EBMLREADVERSION); - if (num != GST_EBML_VERSION) - return FALSE; - break; + /* is our read version uptodate? */ + case GST_EBML_ID_EBMLREADVERSION:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) + return FALSE; + g_assert (id == GST_EBML_ID_EBMLREADVERSION); + if (num != GST_EBML_VERSION) + return FALSE; + break; } - /* we only handle 8 byte lengths at max */ - case GST_EBML_ID_EBMLMAXSIZELENGTH: { - guint64 num; + /* we only handle 8 byte lengths at max */ + case GST_EBML_ID_EBMLMAXSIZELENGTH:{ + guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) - return FALSE; - g_assert (id == GST_EBML_ID_EBMLMAXSIZELENGTH); - if (num != sizeof (guint64)) - return FALSE; - break; + if (!gst_ebml_read_uint (ebml, &id, &num)) + return FALSE; + g_assert (id == GST_EBML_ID_EBMLMAXSIZELENGTH); + if (num != sizeof (guint64)) + return FALSE; + break; } - /* we handle 4 byte IDs at max */ - case GST_EBML_ID_EBMLMAXIDLENGTH: { - guint64 num; + /* we handle 4 byte IDs at max */ + case GST_EBML_ID_EBMLMAXIDLENGTH:{ + guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) - return FALSE; - g_assert (id == GST_EBML_ID_EBMLMAXIDLENGTH); - if (num != sizeof (guint32)) - return FALSE; - break; + if (!gst_ebml_read_uint (ebml, &id, &num)) + return FALSE; + g_assert (id == GST_EBML_ID_EBMLMAXIDLENGTH); + if (num != sizeof (guint32)) + return FALSE; + break; } - case GST_EBML_ID_DOCTYPE: { - gchar *text; - - if (!gst_ebml_read_ascii (ebml, &id, &text)) - return FALSE; - g_assert (id == GST_EBML_ID_DOCTYPE); - if (doctype) { - if (doctype) - g_free (*doctype); - *doctype = text; - } else - g_free (text); - break; + case GST_EBML_ID_DOCTYPE:{ + gchar *text; + + if (!gst_ebml_read_ascii (ebml, &id, &text)) + return FALSE; + g_assert (id == GST_EBML_ID_DOCTYPE); + if (doctype) { + if (doctype) + g_free (*doctype); + *doctype = text; + } else + g_free (text); + break; } - case GST_EBML_ID_DOCTYPEREADVERSION: { - guint64 num; + case GST_EBML_ID_DOCTYPEREADVERSION:{ + guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) - return FALSE; - g_assert (id == GST_EBML_ID_DOCTYPEREADVERSION); - if (version) - *version = num; - break; + if (!gst_ebml_read_uint (ebml, &id, &num)) + return FALSE; + g_assert (id == GST_EBML_ID_DOCTYPEREADVERSION); + if (version) + *version = num; + break; } default: - GST_WARNING ("Unknown data type 0x%x in EBML header (ignored)", id); - /* pass-through */ + GST_WARNING ("Unknown data type 0x%x in EBML header (ignored)", id); + /* pass-through */ - /* we ignore these two, as they don't tell us anything we care about */ + /* we ignore these two, as they don't tell us anything we care about */ case GST_EBML_ID_VOID: case GST_EBML_ID_EBMLVERSION: case GST_EBML_ID_DOCTYPEVERSION: - if (!gst_ebml_read_skip (ebml)) - return FALSE; - break; + if (!gst_ebml_read_skip (ebml)) + return FALSE; + break; } } diff --git a/gst/matroska/ebml-read.h b/gst/matroska/ebml-read.h index d78d13ce..c7a981dc 100644 --- a/gst/matroska/ebml-read.h +++ b/gst/matroska/ebml-read.h @@ -27,7 +27,6 @@ #include <gst/bytestream/bytestream.h> G_BEGIN_DECLS - #define GST_TYPE_EBML_READ \ (gst_ebml_read_get_type ()) #define GST_EBML_READ(obj) \ @@ -40,13 +39,13 @@ G_BEGIN_DECLS (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_EBML_READ)) #define GST_EBML_READ_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_EBML_READ, GstEbmlReadClass)) - -typedef struct _GstEbmlLevel { - guint64 start, - length; + typedef struct _GstEbmlLevel +{ + guint64 start, length; } GstEbmlLevel; -typedef struct _GstEbmlRead { +typedef struct _GstEbmlRead +{ GstElement parent; GstPad *sinkpad; @@ -55,48 +54,29 @@ typedef struct _GstEbmlRead { GList *level; } GstEbmlRead; -typedef struct _GstEbmlReadClass { +typedef struct _GstEbmlReadClass +{ GstElementClass parent; } GstEbmlReadClass; -GType gst_ebml_read_get_type (void); +GType gst_ebml_read_get_type (void); -guint32 gst_ebml_peek_id (GstEbmlRead *ebml, - guint *level_up); -GstEvent *gst_ebml_read_seek (GstEbmlRead *ebml, - guint64 offset); -gboolean gst_ebml_read_skip (GstEbmlRead *ebml); -gboolean gst_ebml_read_buffer (GstEbmlRead *ebml, - guint32 *id, - GstBuffer **buf); -gboolean gst_ebml_read_uint (GstEbmlRead *ebml, - guint32 *id, - guint64 *num); -gboolean gst_ebml_read_sint (GstEbmlRead *ebml, - guint32 *id, - gint64 *num); -gboolean gst_ebml_read_float (GstEbmlRead *ebml, - guint32 *id, - gdouble *num); -gboolean gst_ebml_read_ascii (GstEbmlRead *ebml, - guint32 *id, - gchar **str); -gboolean gst_ebml_read_utf8 (GstEbmlRead *ebml, - guint32 *id, - gchar **str); -gboolean gst_ebml_read_date (GstEbmlRead *ebml, - guint32 *id, - gint64 *date); -gboolean gst_ebml_read_master (GstEbmlRead *ebml, - guint32 *id); -gboolean gst_ebml_read_binary (GstEbmlRead *ebml, - guint32 *id, - guint8 **binary, - guint64 *length); -gboolean gst_ebml_read_header (GstEbmlRead *read, - gchar **doctype, - guint *version); +guint32 gst_ebml_peek_id (GstEbmlRead * ebml, guint * level_up); +GstEvent *gst_ebml_read_seek (GstEbmlRead * ebml, guint64 offset); +gboolean gst_ebml_read_skip (GstEbmlRead * ebml); +gboolean gst_ebml_read_buffer (GstEbmlRead * ebml, + guint32 * id, GstBuffer ** buf); +gboolean gst_ebml_read_uint (GstEbmlRead * ebml, guint32 * id, guint64 * num); +gboolean gst_ebml_read_sint (GstEbmlRead * ebml, guint32 * id, gint64 * num); +gboolean gst_ebml_read_float (GstEbmlRead * ebml, guint32 * id, gdouble * num); +gboolean gst_ebml_read_ascii (GstEbmlRead * ebml, guint32 * id, gchar ** str); +gboolean gst_ebml_read_utf8 (GstEbmlRead * ebml, guint32 * id, gchar ** str); +gboolean gst_ebml_read_date (GstEbmlRead * ebml, guint32 * id, gint64 * date); +gboolean gst_ebml_read_master (GstEbmlRead * ebml, guint32 * id); +gboolean gst_ebml_read_binary (GstEbmlRead * ebml, + guint32 * id, guint8 ** binary, guint64 * length); +gboolean gst_ebml_read_header (GstEbmlRead * read, + gchar ** doctype, guint * version); G_END_DECLS - #endif /* __GST_EBML_READ_H__ */ diff --git a/gst/matroska/ebml-write.c b/gst/matroska/ebml-write.c index b6504867..d136a8d4 100644 --- a/gst/matroska/ebml-write.c +++ b/gst/matroska/ebml-write.c @@ -28,26 +28,26 @@ #include "ebml-write.h" #include "ebml-ids.h" -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -static void gst_ebml_write_class_init (GstEbmlWriteClass *klass); -static void gst_ebml_write_init (GstEbmlWrite *ebml); -static GstElementStateReturn - gst_ebml_write_change_state (GstElement *element); +static void gst_ebml_write_class_init (GstEbmlWriteClass * klass); +static void gst_ebml_write_init (GstEbmlWrite * ebml); +static GstElementStateReturn gst_ebml_write_change_state (GstElement * element); static GstElementClass *parent_class = NULL; GType -gst_ebml_write_get_type (void) +gst_ebml_write_get_type (void) { static GType gst_ebml_write_type = 0; if (!gst_ebml_write_type) { static const GTypeInfo gst_ebml_write_info = { - sizeof (GstEbmlWriteClass), + sizeof (GstEbmlWriteClass), NULL, NULL, (GClassInitFunc) gst_ebml_write_class_init, @@ -60,14 +60,14 @@ gst_ebml_write_get_type (void) gst_ebml_write_type = g_type_register_static (GST_TYPE_ELEMENT, "GstEbmlWrite", - &gst_ebml_write_info, 0); + &gst_ebml_write_info, 0); } return gst_ebml_write_type; } static void -gst_ebml_write_class_init (GstEbmlWriteClass *klass) +gst_ebml_write_class_init (GstEbmlWriteClass * klass) { GstElementClass *gstelement_class = (GstElementClass *) klass; @@ -77,7 +77,7 @@ gst_ebml_write_class_init (GstEbmlWriteClass *klass) } static void -gst_ebml_write_init (GstEbmlWrite *ebml) +gst_ebml_write_init (GstEbmlWrite * ebml) { ebml->srcpad = NULL; ebml->pos = 0; @@ -86,7 +86,7 @@ gst_ebml_write_init (GstEbmlWrite *ebml) } static GstElementStateReturn -gst_ebml_write_change_state (GstElement *element) +gst_ebml_write_change_state (GstElement * element) { GstEbmlWrite *ebml = GST_EBML_WRITE (element); @@ -115,8 +115,7 @@ gst_ebml_write_change_state (GstElement *element) */ void -gst_ebml_write_set_cache (GstEbmlWrite *ebml, - guint size) +gst_ebml_write_set_cache (GstEbmlWrite * ebml, guint size) { /* This is currently broken. I don't know why yet. */ return; @@ -130,7 +129,7 @@ gst_ebml_write_set_cache (GstEbmlWrite *ebml, } void -gst_ebml_write_flush_cache (GstEbmlWrite *ebml) +gst_ebml_write_flush_cache (GstEbmlWrite * ebml) { if (!ebml->cache) return; @@ -139,7 +138,7 @@ gst_ebml_write_flush_cache (GstEbmlWrite *ebml) * programmer didn't use the cache somewhere. That's fatal. */ g_assert (ebml->handled == GST_BUFFER_SIZE (ebml->cache)); g_assert (GST_BUFFER_SIZE (ebml->cache) + - GST_BUFFER_OFFSET (ebml->cache) == ebml->pos); + GST_BUFFER_OFFSET (ebml->cache) == ebml->pos); gst_pad_push (ebml->srcpad, GST_DATA (ebml->cache)); ebml->cache = NULL; @@ -152,8 +151,7 @@ gst_ebml_write_flush_cache (GstEbmlWrite *ebml) */ static GstBuffer * -gst_ebml_write_element_new (GstEbmlWrite *ebml, - guint size) +gst_ebml_write_element_new (GstEbmlWrite * ebml, guint size) { /* Create new buffer of size + ID + length */ GstBuffer *buf; @@ -163,8 +161,7 @@ gst_ebml_write_element_new (GstEbmlWrite *ebml, /* prefer cache */ if (ebml->cache) { - if (GST_BUFFER_MAXSIZE (ebml->cache) - - GST_BUFFER_SIZE (ebml->cache) < size) { + if (GST_BUFFER_MAXSIZE (ebml->cache) - GST_BUFFER_SIZE (ebml->cache) < size) { GST_LOG ("Cache available, but too small. Clearing..."); gst_ebml_write_flush_cache (ebml); } else { @@ -184,8 +181,7 @@ gst_ebml_write_element_new (GstEbmlWrite *ebml, */ static void -gst_ebml_write_element_id (GstBuffer *buf, - guint32 id) +gst_ebml_write_element_id (GstBuffer * buf, guint32 id) { guint8 *data = GST_BUFFER_DATA (buf) + GST_BUFFER_SIZE (buf); guint bytes = 4, mask = 0x10; @@ -216,8 +212,7 @@ gst_ebml_write_element_id (GstBuffer *buf, */ static void -gst_ebml_write_element_size (GstBuffer *buf, - guint64 size) +gst_ebml_write_element_size (GstBuffer * buf, guint64 size) { guint8 *data = GST_BUFFER_DATA (buf) + GST_BUFFER_SIZE (buf); guint bytes = 1, mask = 0x80; @@ -252,9 +247,7 @@ gst_ebml_write_element_size (GstBuffer *buf, */ static void -gst_ebml_write_element_data (GstBuffer *buf, - guint8 *write, - guint64 length) +gst_ebml_write_element_data (GstBuffer * buf, guint8 * write, guint64 length) { guint8 *data = GST_BUFFER_DATA (buf) + GST_BUFFER_SIZE (buf); @@ -267,8 +260,7 @@ gst_ebml_write_element_data (GstBuffer *buf, */ static void -gst_ebml_write_element_push (GstEbmlWrite *ebml, - GstBuffer *buf) +gst_ebml_write_element_push (GstEbmlWrite * ebml, GstBuffer * buf) { guint data_size = GST_BUFFER_SIZE (buf) - ebml->handled; @@ -291,8 +283,7 @@ gst_ebml_write_element_push (GstEbmlWrite *ebml, */ void -gst_ebml_write_seek (GstEbmlWrite *ebml, - guint64 pos) +gst_ebml_write_seek (GstEbmlWrite * ebml, guint64 pos) { GstEvent *seek; @@ -301,12 +292,13 @@ gst_ebml_write_seek (GstEbmlWrite *ebml, if (ebml->cache) { /* within bounds? */ if (pos >= GST_BUFFER_OFFSET (ebml->cache) && - pos < GST_BUFFER_OFFSET (ebml->cache) + GST_BUFFER_MAXSIZE (ebml->cache)) { + pos < + GST_BUFFER_OFFSET (ebml->cache) + GST_BUFFER_MAXSIZE (ebml->cache)) { GST_BUFFER_SIZE (ebml->cache) = pos - GST_BUFFER_OFFSET (ebml->cache); if (ebml->pos > pos) - ebml->handled -= ebml->pos - pos; + ebml->handled -= ebml->pos - pos; else - ebml->handled += pos - ebml->pos; + ebml->handled += pos - ebml->pos; ebml->pos = pos; } else { GST_LOG ("Seek outside cache range. Clearing..."); @@ -314,9 +306,7 @@ gst_ebml_write_seek (GstEbmlWrite *ebml, } } - seek = gst_event_new_seek (GST_FORMAT_BYTES | - GST_SEEK_METHOD_SET, - pos); + seek = gst_event_new_seek (GST_FORMAT_BYTES | GST_SEEK_METHOD_SET, pos); gst_pad_push (ebml->srcpad, GST_DATA (seek)); ebml->pos = pos; } @@ -344,9 +334,7 @@ gst_ebml_write_get_uint_size (guint64 num) */ static void -gst_ebml_write_set_uint (GstBuffer *buf, - guint64 num, - guint size) +gst_ebml_write_set_uint (GstBuffer * buf, guint64 num, guint size) { guint8 *data; @@ -363,9 +351,7 @@ gst_ebml_write_set_uint (GstBuffer *buf, */ void -gst_ebml_write_uint (GstEbmlWrite *ebml, - guint32 id, - guint64 num) +gst_ebml_write_uint (GstEbmlWrite * ebml, guint32 id, guint64 num) { GstBuffer *buf = gst_ebml_write_element_new (ebml, sizeof (num)); guint size = gst_ebml_write_get_uint_size (num); @@ -378,11 +364,10 @@ gst_ebml_write_uint (GstEbmlWrite *ebml, } void -gst_ebml_write_sint (GstEbmlWrite *ebml, - guint32 id, - gint64 num) +gst_ebml_write_sint (GstEbmlWrite * ebml, guint32 id, gint64 num) { GstBuffer *buf = gst_ebml_write_element_new (ebml, sizeof (num)); + /* if the signed number is on the edge of a extra-byte, * then we'll fall over when detecting it. Example: if I * have a number (-)0x8000 (G_MINSHORT), then my abs()<<1 @@ -407,9 +392,7 @@ gst_ebml_write_sint (GstEbmlWrite *ebml, } void -gst_ebml_write_float (GstEbmlWrite *ebml, - guint32 id, - gdouble num) +gst_ebml_write_float (GstEbmlWrite * ebml, guint32 id, gdouble num) { #if (G_BYTE_ORDER == G_LITTLE_ENDIAN) gint n; @@ -420,20 +403,18 @@ gst_ebml_write_float (GstEbmlWrite *ebml, gst_ebml_write_element_size (buf, 8); #if (G_BYTE_ORDER == G_LITTLE_ENDIAN) for (n = 0; n < 8; n++) - GST_BUFFER_DATA (buf)[GST_BUFFER_SIZE (buf)] = ((guint8 *) &num)[7-n]; + GST_BUFFER_DATA (buf)[GST_BUFFER_SIZE (buf)] = ((guint8 *) & num)[7 - n]; GST_BUFFER_SIZE (buf) += 8; #else - gst_ebml_write_element_data (buf, (guint8 *) &num, 8); + gst_ebml_write_element_data (buf, (guint8 *) & num, 8); #endif gst_ebml_write_element_push (ebml, buf); } void -gst_ebml_write_ascii (GstEbmlWrite *ebml, - guint32 id, - const gchar *str) +gst_ebml_write_ascii (GstEbmlWrite * ebml, guint32 id, const gchar * str) { - gint len = strlen (str) + 1; /* add trailing '\0' */ + gint len = strlen (str) + 1; /* add trailing '\0' */ GstBuffer *buf = gst_ebml_write_element_new (ebml, len); gst_ebml_write_element_id (buf, id); @@ -443,17 +424,13 @@ gst_ebml_write_ascii (GstEbmlWrite *ebml, } void -gst_ebml_write_utf8 (GstEbmlWrite *ebml, - guint32 id, - const gchar *str) +gst_ebml_write_utf8 (GstEbmlWrite * ebml, guint32 id, const gchar * str) { gst_ebml_write_ascii (ebml, id, str); } void -gst_ebml_write_date (GstEbmlWrite *ebml, - guint32 id, - gint64 date) +gst_ebml_write_date (GstEbmlWrite * ebml, guint32 id, gint64 date) { gst_ebml_write_sint (ebml, id, date); } @@ -465,8 +442,7 @@ gst_ebml_write_date (GstEbmlWrite *ebml, */ guint64 -gst_ebml_write_master_start (GstEbmlWrite *ebml, - guint32 id) +gst_ebml_write_master_start (GstEbmlWrite * ebml, guint32 id) { guint64 pos = ebml->pos, t; GstBuffer *buf = gst_ebml_write_element_new (ebml, 0); @@ -481,8 +457,7 @@ gst_ebml_write_master_start (GstEbmlWrite *ebml, } void -gst_ebml_write_master_finish (GstEbmlWrite *ebml, - guint64 startpos) +gst_ebml_write_master_finish (GstEbmlWrite * ebml, guint64 startpos) { guint64 pos = ebml->pos; GstBuffer *buf; @@ -491,17 +466,15 @@ gst_ebml_write_master_finish (GstEbmlWrite *ebml, buf = gst_ebml_write_element_new (ebml, 0); startpos = GUINT64_TO_BE ((1LLU << 56) | (pos - startpos - 8)); memcpy (GST_BUFFER_DATA (buf) + GST_BUFFER_SIZE (buf), - (guint8 *) &startpos, 8); + (guint8 *) & startpos, 8); GST_BUFFER_SIZE (buf) += 8; gst_ebml_write_element_push (ebml, buf); gst_ebml_write_seek (ebml, pos); } void -gst_ebml_write_binary (GstEbmlWrite *ebml, - guint32 id, - guint8 *binary, - guint64 length) +gst_ebml_write_binary (GstEbmlWrite * ebml, + guint32 id, guint8 * binary, guint64 length) { GstBuffer *buf = gst_ebml_write_element_new (ebml, length); @@ -519,9 +492,7 @@ gst_ebml_write_binary (GstEbmlWrite *ebml, */ void -gst_ebml_write_buffer_header (GstEbmlWrite *ebml, - guint32 id, - guint64 length) +gst_ebml_write_buffer_header (GstEbmlWrite * ebml, guint32 id, guint64 length) { GstBuffer *buf = gst_ebml_write_element_new (ebml, 0); @@ -531,8 +502,7 @@ gst_ebml_write_buffer_header (GstEbmlWrite *ebml, } void -gst_ebml_write_buffer (GstEbmlWrite *ebml, - GstBuffer *data) +gst_ebml_write_buffer (GstEbmlWrite * ebml, GstBuffer * data) { gst_ebml_write_element_push (ebml, data); } @@ -547,9 +517,7 @@ gst_ebml_write_buffer (GstEbmlWrite *ebml, */ void -gst_ebml_replace_uint (GstEbmlWrite *ebml, - guint64 pos, - guint64 num) +gst_ebml_replace_uint (GstEbmlWrite * ebml, guint64 pos, guint64 num) { guint64 oldpos = ebml->pos; GstBuffer *buf = gst_buffer_new_and_alloc (8); @@ -566,9 +534,7 @@ gst_ebml_replace_uint (GstEbmlWrite *ebml, */ void -gst_ebml_write_header (GstEbmlWrite *ebml, - gchar *doctype, - guint version) +gst_ebml_write_header (GstEbmlWrite * ebml, gchar * doctype, guint version) { guint64 pos; diff --git a/gst/matroska/ebml-write.h b/gst/matroska/ebml-write.h index 43d2f8b2..8974ecbe 100644 --- a/gst/matroska/ebml-write.h +++ b/gst/matroska/ebml-write.h @@ -26,7 +26,6 @@ #include <gst/gst.h> G_BEGIN_DECLS - #define GST_TYPE_EBML_WRITE \ (gst_ebml_write_get_type ()) #define GST_EBML_WRITE(obj) \ @@ -39,8 +38,8 @@ G_BEGIN_DECLS (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_EBML_WRITE)) #define GST_EBML_WRITE_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_EBML_WRITE, GstEbmlWriteClass)) - -typedef struct _GstEbmlWrite { + typedef struct _GstEbmlWrite +{ GstElement parent; GstPad *srcpad; @@ -50,77 +49,54 @@ typedef struct _GstEbmlWrite { guint handled; } GstEbmlWrite; -typedef struct _GstEbmlWriteClass { +typedef struct _GstEbmlWriteClass +{ GstElementClass parent; } GstEbmlWriteClass; -GType gst_ebml_write_get_type (void); +GType gst_ebml_write_get_type (void); /* * Caching means that we do not push one buffer for * each element, but fill this one until a flush. */ -void gst_ebml_write_set_cache (GstEbmlWrite *ebml, - guint size); -void gst_ebml_write_flush_cache (GstEbmlWrite *ebml); +void gst_ebml_write_set_cache (GstEbmlWrite * ebml, guint size); +void gst_ebml_write_flush_cache (GstEbmlWrite * ebml); /* * Seeking. */ -void gst_ebml_write_seek (GstEbmlWrite *ebml, - guint64 pos); +void gst_ebml_write_seek (GstEbmlWrite * ebml, guint64 pos); /* * Data writing. */ -void gst_ebml_write_uint (GstEbmlWrite *ebml, - guint32 id, - guint64 num); -void gst_ebml_write_sint (GstEbmlWrite *ebml, - guint32 id, - gint64 num); -void gst_ebml_write_float (GstEbmlWrite *ebml, - guint32 id, - gdouble num); -void gst_ebml_write_ascii (GstEbmlWrite *ebml, - guint32 id, - const gchar *str); -void gst_ebml_write_utf8 (GstEbmlWrite *ebml, - guint32 id, - const gchar *str); -void gst_ebml_write_date (GstEbmlWrite *ebml, - guint32 id, - gint64 date); -guint64 gst_ebml_write_master_start (GstEbmlWrite *ebml, - guint32 id); -void gst_ebml_write_master_finish (GstEbmlWrite *ebml, - guint64 startpos); -void gst_ebml_write_binary (GstEbmlWrite *ebml, - guint32 id, - guchar *binary, - guint64 length); -void gst_ebml_write_header (GstEbmlWrite *ebml, - gchar *doctype, - guint version); +void gst_ebml_write_uint (GstEbmlWrite * ebml, guint32 id, guint64 num); +void gst_ebml_write_sint (GstEbmlWrite * ebml, guint32 id, gint64 num); +void gst_ebml_write_float (GstEbmlWrite * ebml, guint32 id, gdouble num); +void gst_ebml_write_ascii (GstEbmlWrite * ebml, guint32 id, const gchar * str); +void gst_ebml_write_utf8 (GstEbmlWrite * ebml, guint32 id, const gchar * str); +void gst_ebml_write_date (GstEbmlWrite * ebml, guint32 id, gint64 date); +guint64 gst_ebml_write_master_start (GstEbmlWrite * ebml, guint32 id); +void gst_ebml_write_master_finish (GstEbmlWrite * ebml, guint64 startpos); +void gst_ebml_write_binary (GstEbmlWrite * ebml, + guint32 id, guchar * binary, guint64 length); +void gst_ebml_write_header (GstEbmlWrite * ebml, + gchar * doctype, guint version); /* * Note: this is supposed to be used only for media data. */ -void gst_ebml_write_buffer_header (GstEbmlWrite *ebml, - guint32 id, - guint64 length); -void gst_ebml_write_buffer (GstEbmlWrite *ebml, - GstBuffer *data); +void gst_ebml_write_buffer_header (GstEbmlWrite * ebml, + guint32 id, guint64 length); +void gst_ebml_write_buffer (GstEbmlWrite * ebml, GstBuffer * data); /* * A hack, basically... See matroska-mux.c. I should actually * make a nice _replace_element_with_size() or so, but this * works for now. */ -void gst_ebml_replace_uint (GstEbmlWrite *ebml, - guint64 pos, - guint64 num); +void gst_ebml_replace_uint (GstEbmlWrite * ebml, guint64 pos, guint64 num); G_END_DECLS - #endif /* __GST_EBML_WRITE_H__ */ diff --git a/gst/matroska/matroska-demux.c b/gst/matroska/matroska-demux.c index 66537966..383ec020 100644 --- a/gst/matroska/matroska-demux.c +++ b/gst/matroska/matroska-demux.c @@ -33,101 +33,87 @@ #include "matroska-demux.h" #include "matroska-ids.h" -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_METADATA, ARG_STREAMINFO, /* FILL ME */ }; -static GstStaticPadTemplate sink_templ = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ( "video/x-matroska" ) -); +static GstStaticPadTemplate sink_templ = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-matroska") + ); /* gobject magic foo */ -static void gst_matroska_demux_base_init (GstMatroskaDemuxClass *klass); -static void gst_matroska_demux_class_init (GstMatroskaDemuxClass *klass); -static void gst_matroska_demux_init (GstMatroskaDemux *demux); +static void gst_matroska_demux_base_init (GstMatroskaDemuxClass * klass); +static void gst_matroska_demux_class_init (GstMatroskaDemuxClass * klass); +static void gst_matroska_demux_init (GstMatroskaDemux * demux); /* element functions */ -static void gst_matroska_demux_loop (GstElement *element); -static gboolean gst_matroska_demux_send_event (GstElement *element, - GstEvent *event); +static void gst_matroska_demux_loop (GstElement * element); +static gboolean gst_matroska_demux_send_event (GstElement * element, + GstEvent * event); /* pad functions */ -static const GstEventMask * - gst_matroska_demux_get_event_mask (GstPad *pad); -static gboolean gst_matroska_demux_handle_src_event (GstPad *pad, - GstEvent *event); -static const GstFormat * - gst_matroska_demux_get_src_formats (GstPad *pad); -static const GstQueryType* - gst_matroska_demux_get_src_query_types(GstPad *pad); -static gboolean gst_matroska_demux_handle_src_query (GstPad *pad, - GstQueryType type, - GstFormat *format, - gint64 *value); +static const GstEventMask *gst_matroska_demux_get_event_mask (GstPad * pad); +static gboolean gst_matroska_demux_handle_src_event (GstPad * pad, + GstEvent * event); +static const GstFormat *gst_matroska_demux_get_src_formats (GstPad * pad); +static const GstQueryType *gst_matroska_demux_get_src_query_types (GstPad * + pad); +static gboolean gst_matroska_demux_handle_src_query (GstPad * pad, + GstQueryType type, GstFormat * format, gint64 * value); /* gst internal change state handler */ static GstElementStateReturn - gst_matroska_demux_change_state (GstElement *element); -static void gst_matroska_demux_set_clock (GstElement *element, - GstClock *clock); +gst_matroska_demux_change_state (GstElement * element); +static void gst_matroska_demux_set_clock (GstElement * element, + GstClock * clock); /* gobject bla bla */ -static void gst_matroska_demux_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); +static void gst_matroska_demux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); /* caps functions */ -static GstCaps *gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext - *videocontext, - const gchar *codec_id, - gpointer data, - guint size, - GstMatroskaDemux *demux); -static GstCaps *gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext - *audiocontext, - const gchar *codec_id, - gpointer data, - guint size, - GstMatroskaDemux *demux); -static GstCaps *gst_matroska_demux_complex_caps (GstMatroskaTrackComplexContext - *complexcontext, - const gchar *codec_id, - gpointer data, - guint size); -static GstCaps *gst_matroska_demux_subtitle_caps (GstMatroskaTrackSubtitleContext - *subtitlecontext, - const gchar *codec_id, - gpointer data, - guint size); +static GstCaps *gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext + * videocontext, + const gchar * codec_id, + gpointer data, guint size, GstMatroskaDemux * demux); +static GstCaps *gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext + * audiocontext, + const gchar * codec_id, + gpointer data, guint size, GstMatroskaDemux * demux); +static GstCaps *gst_matroska_demux_complex_caps (GstMatroskaTrackComplexContext + * complexcontext, const gchar * codec_id, gpointer data, guint size); +static GstCaps + * gst_matroska_demux_subtitle_caps (GstMatroskaTrackSubtitleContext * + subtitlecontext, const gchar * codec_id, gpointer data, guint size); /* stream methods */ -static void gst_matroska_demux_reset (GstElement *element); +static void gst_matroska_demux_reset (GstElement * element); static GstEbmlReadClass *parent_class = NULL; static GstPadTemplate *videosrctempl, *audiosrctempl, *subtitlesrctempl; + /*static guint gst_matroska_demux_signals[LAST_SIGNAL] = { 0 };*/ GType -gst_matroska_demux_get_type (void) +gst_matroska_demux_get_type (void) { static GType gst_matroska_demux_type = 0; if (!gst_matroska_demux_type) { static const GTypeInfo gst_matroska_demux_info = { - sizeof (GstMatroskaDemuxClass), + sizeof (GstMatroskaDemuxClass), (GBaseInitFunc) gst_matroska_demux_base_init, NULL, (GClassInitFunc) gst_matroska_demux_class_init, @@ -140,15 +126,14 @@ gst_matroska_demux_get_type (void) gst_matroska_demux_type = g_type_register_static (GST_TYPE_EBML_READ, - "GstMatroskaDemux", - &gst_matroska_demux_info, 0); + "GstMatroskaDemux", &gst_matroska_demux_info, 0); } return gst_matroska_demux_type; } static void -gst_matroska_demux_base_init (GstMatroskaDemuxClass *klass) +gst_matroska_demux_base_init (GstMatroskaDemuxClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); static GstElementDetails gst_matroska_demux_details = { @@ -162,13 +147,12 @@ gst_matroska_demux_base_init (GstMatroskaDemuxClass *klass) gst_element_class_add_pad_template (element_class, audiosrctempl); gst_element_class_add_pad_template (element_class, subtitlesrctempl); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&sink_templ)); - gst_element_class_set_details (element_class, - &gst_matroska_demux_details); + gst_static_pad_template_get (&sink_templ)); + gst_element_class_set_details (element_class, &gst_matroska_demux_details); } static void -gst_matroska_demux_class_init (GstMatroskaDemuxClass *klass) +gst_matroska_demux_class_init (GstMatroskaDemuxClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; @@ -177,11 +161,11 @@ gst_matroska_demux_class_init (GstMatroskaDemuxClass *klass) gstelement_class = (GstElementClass *) klass; g_object_class_install_property (gobject_class, ARG_METADATA, - g_param_spec_boxed ("metadata", "Metadata", "Metadata", - GST_TYPE_STRUCTURE, G_PARAM_READABLE)); + g_param_spec_boxed ("metadata", "Metadata", "Metadata", + GST_TYPE_STRUCTURE, G_PARAM_READABLE)); g_object_class_install_property (gobject_class, ARG_STREAMINFO, - g_param_spec_boxed ("streaminfo", "Streaminfo", "Streaminfo", - GST_TYPE_STRUCTURE, G_PARAM_READABLE)); + g_param_spec_boxed ("streaminfo", "Streaminfo", "Streaminfo", + GST_TYPE_STRUCTURE, G_PARAM_READABLE)); parent_class = g_type_class_ref (GST_TYPE_EBML_READ); @@ -192,21 +176,21 @@ gst_matroska_demux_class_init (GstMatroskaDemuxClass *klass) gstelement_class->set_clock = gst_matroska_demux_set_clock; } -static void -gst_matroska_demux_init (GstMatroskaDemux *demux) +static void +gst_matroska_demux_init (GstMatroskaDemux * demux) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (demux); gint i; GST_FLAG_SET (GST_OBJECT (demux), GST_ELEMENT_EVENT_AWARE); - demux->sinkpad = gst_pad_new_from_template ( - gst_element_class_get_pad_template (klass, "sink"), "sink"); + demux->sinkpad = + gst_pad_new_from_template (gst_element_class_get_pad_template (klass, + "sink"), "sink"); gst_element_add_pad (GST_ELEMENT (demux), demux->sinkpad); GST_EBML_READ (demux)->sinkpad = demux->sinkpad; - gst_element_set_loop_function (GST_ELEMENT (demux), - gst_matroska_demux_loop); + gst_element_set_loop_function (GST_ELEMENT (demux), gst_matroska_demux_loop); /* initial stream no. */ for (i = 0; i < GST_MATROSKA_DEMUX_MAX_STREAMS; i++) { @@ -221,7 +205,7 @@ gst_matroska_demux_init (GstMatroskaDemux *demux) } static void -gst_matroska_demux_reset (GstElement *element) +gst_matroska_demux_reset (GstElement * element) { GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (element); guint i; @@ -233,7 +217,7 @@ gst_matroska_demux_reset (GstElement *element) for (i = 0; i < GST_MATROSKA_DEMUX_MAX_STREAMS; i++) { if (demux->src[i] != NULL) { if (demux->src[i]->pad != NULL) { - gst_element_remove_pad (GST_ELEMENT (demux), demux->src[i]->pad); + gst_element_remove_pad (GST_ELEMENT (demux), demux->src[i]->pad); } g_free (demux->src[i]->codec_id); g_free (demux->src[i]->codec_name); @@ -277,39 +261,35 @@ gst_matroska_demux_reset (GstElement *element) } static void -gst_matroska_demux_set_clock (GstElement *element, - GstClock *clock) +gst_matroska_demux_set_clock (GstElement * element, GstClock * clock) { GST_MATROSKA_DEMUX (element)->clock = clock; } static gint -gst_matroska_demux_stream_from_num (GstMatroskaDemux *demux, - guint track_num) +gst_matroska_demux_stream_from_num (GstMatroskaDemux * demux, guint track_num) { guint n; for (n = 0; n < demux->num_streams; n++) { - if (demux->src[n] != NULL && - demux->src[n]->num == track_num) { + if (demux->src[n] != NULL && demux->src[n]->num == track_num) { return n; } } if (n == demux->num_streams) { - GST_WARNING ("Failed to find corresponding pad for tracknum %d", - track_num); + GST_WARNING ("Failed to find corresponding pad for tracknum %d", track_num); } return -1; } static GstCaps * -gst_matroska_demux_src_getcaps (GstPad *pad) +gst_matroska_demux_src_getcaps (GstPad * pad) { GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (gst_pad_get_parent (pad)); guint n; - + for (n = 0; n < demux->num_streams; n++) { if (demux->src[n] != NULL && demux->src[n]->pad == pad) { break; @@ -317,13 +297,13 @@ gst_matroska_demux_src_getcaps (GstPad *pad) } if (n == demux->num_streams) - return gst_caps_new_empty(); + return gst_caps_new_empty (); return gst_caps_copy (demux->src[n]->caps); } static gboolean -gst_matroska_demux_add_stream (GstMatroskaDemux *demux) +gst_matroska_demux_add_stream (GstMatroskaDemux * demux) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (demux); GstEbmlRead *ebml = GST_EBML_READ (demux); @@ -336,8 +316,8 @@ gst_matroska_demux_add_stream (GstMatroskaDemux *demux) if (demux->num_streams >= GST_MATROSKA_DEMUX_MAX_STREAMS) { GST_WARNING ("Maximum number of streams (%d) exceeded, skipping", - GST_MATROSKA_DEMUX_MAX_STREAMS); - return gst_ebml_read_skip (ebml); /* skip-and-continue */ + GST_MATROSKA_DEMUX_MAX_STREAMS); + return gst_ebml_read_skip (ebml); /* skip-and-continue */ } /* allocate generic... if we know the type, we'll g_renew() @@ -345,7 +325,7 @@ gst_matroska_demux_add_stream (GstMatroskaDemux *demux) context = g_new0 (GstMatroskaTrackContext, 1); demux->src[demux->num_streams] = context; context->index = demux->num_streams; - context->type = 0; /* no type yet */ + context->type = 0; /* no type yet */ demux->num_streams++; /* start with the master */ @@ -363,445 +343,474 @@ gst_matroska_demux_add_stream (GstMatroskaDemux *demux) } switch (id) { - /* track number (unique stream ID) */ - case GST_MATROSKA_ID_TRACKNUMBER: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - context->num = num; - break; + /* track number (unique stream ID) */ + case GST_MATROSKA_ID_TRACKNUMBER:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + context->num = num; + break; } - /* track UID (unique identifier) */ - case GST_MATROSKA_ID_TRACKUID: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - context->uid = num; - break; + /* track UID (unique identifier) */ + case GST_MATROSKA_ID_TRACKUID:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + context->uid = num; + break; } - /* track type (video, audio, combined, subtitle, etc.) */ - case GST_MATROSKA_ID_TRACKTYPE: { - guint64 num; - if (context->type != 0) { - GST_WARNING ("More than one tracktype defined in a trackentry - skipping"); - break; - } - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - context->type = num; - - /* ok, so we're actually going to reallocate this thing */ - switch (context->type) { - case GST_MATROSKA_TRACK_TYPE_VIDEO: - context = (GstMatroskaTrackContext *) - g_renew (GstMatroskaTrackVideoContext, context, 1); - break; - case GST_MATROSKA_TRACK_TYPE_AUDIO: - context = (GstMatroskaTrackContext *) - g_renew (GstMatroskaTrackAudioContext, context, 1); - /* defaults */ - ((GstMatroskaTrackAudioContext *) context)->channels = 1; - ((GstMatroskaTrackAudioContext *) context)->samplerate = 8000; - break; - case GST_MATROSKA_TRACK_TYPE_COMPLEX: - context = (GstMatroskaTrackContext *) - g_renew (GstMatroskaTrackComplexContext, context, 1); - break; - case GST_MATROSKA_TRACK_TYPE_SUBTITLE: - context = (GstMatroskaTrackContext *) - g_renew (GstMatroskaTrackSubtitleContext, context, 1); - break; - case GST_MATROSKA_TRACK_TYPE_LOGO: - case GST_MATROSKA_TRACK_TYPE_CONTROL: - default: - GST_WARNING ("Unknown or unsupported track type 0x%x", - context->type); - context->type = 0; - break; - } - demux->src[demux->num_streams-1] = context; - break; + /* track type (video, audio, combined, subtitle, etc.) */ + case GST_MATROSKA_ID_TRACKTYPE:{ + guint64 num; + + if (context->type != 0) { + GST_WARNING + ("More than one tracktype defined in a trackentry - skipping"); + break; + } + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + context->type = num; + + /* ok, so we're actually going to reallocate this thing */ + switch (context->type) { + case GST_MATROSKA_TRACK_TYPE_VIDEO: + context = (GstMatroskaTrackContext *) + g_renew (GstMatroskaTrackVideoContext, context, 1); + break; + case GST_MATROSKA_TRACK_TYPE_AUDIO: + context = (GstMatroskaTrackContext *) + g_renew (GstMatroskaTrackAudioContext, context, 1); + /* defaults */ + ((GstMatroskaTrackAudioContext *) context)->channels = 1; + ((GstMatroskaTrackAudioContext *) context)->samplerate = 8000; + break; + case GST_MATROSKA_TRACK_TYPE_COMPLEX: + context = (GstMatroskaTrackContext *) + g_renew (GstMatroskaTrackComplexContext, context, 1); + break; + case GST_MATROSKA_TRACK_TYPE_SUBTITLE: + context = (GstMatroskaTrackContext *) + g_renew (GstMatroskaTrackSubtitleContext, context, 1); + break; + case GST_MATROSKA_TRACK_TYPE_LOGO: + case GST_MATROSKA_TRACK_TYPE_CONTROL: + default: + GST_WARNING ("Unknown or unsupported track type 0x%x", + context->type); + context->type = 0; + break; + } + demux->src[demux->num_streams - 1] = context; + break; } - /* tracktype specific stuff for video */ - case GST_MATROSKA_ID_TRACKVIDEO: { - GstMatroskaTrackVideoContext *videocontext; - if (context->type != GST_MATROSKA_TRACK_TYPE_VIDEO) { - GST_WARNING ("trackvideo EBML entry in non-video track - ignoring track"); - res = FALSE; - break; - } else if (!gst_ebml_read_master (ebml, &id)) { - res = FALSE; - break; - } - videocontext = (GstMatroskaTrackVideoContext *) context; - - while (res) { - if (!(id = gst_ebml_peek_id (ebml, &demux->level_up))) { - res = FALSE; - break; - } else if (demux->level_up > 0) { - demux->level_up--; - break; - } - - switch (id) { - /* fixme, this should be one-up, but I get it here (?) */ - case GST_MATROSKA_ID_TRACKDEFAULTDURATION: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - context->default_duration = num; - break; - } - - /* video framerate */ - case GST_MATROSKA_ID_VIDEOFRAMERATE: { - gdouble num; - if (!gst_ebml_read_float (ebml, &id, &num)) { - res = FALSE; - break; - } - context->default_duration = GST_SECOND * (1. / num); - break; - } - - /* width of the size to display the video at */ - case GST_MATROSKA_ID_VIDEODISPLAYWIDTH: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - videocontext->display_width = num; - break; - } - - /* height of the size to display the video at */ - case GST_MATROSKA_ID_VIDEODISPLAYHEIGHT: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - videocontext->display_height = num; - break; - } - - /* width of the video in the file */ - case GST_MATROSKA_ID_VIDEOPIXELWIDTH: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - videocontext->pixel_width = num; - break; - } - - /* height of the video in the file */ - case GST_MATROSKA_ID_VIDEOPIXELHEIGHT: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - videocontext->pixel_height = num; - break; - } - - /* whether the video is interlaced */ - case GST_MATROSKA_ID_VIDEOFLAGINTERLACED: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - if (num) - context->flags |= GST_MATROSKA_VIDEOTRACK_INTERLACED; - else - context->flags &= ~GST_MATROSKA_VIDEOTRACK_INTERLACED; - break; - } - - /* stereo mode (whether the video has two streams, where - * one is for the left eye and the other for the right eye, - * which creates a 3D-like effect) */ - case GST_MATROSKA_ID_VIDEOSTEREOMODE: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - if (num != GST_MATROSKA_EYE_MODE_MONO && - num != GST_MATROSKA_EYE_MODE_LEFT && - num != GST_MATROSKA_EYE_MODE_RIGHT && - num != GST_MATROSKA_EYE_MODE_BOTH) { - GST_WARNING ("Unknown eye mode 0x%x - ignoring", - (guint) num); - break; - } - videocontext->eye_mode = num; - break; - } - - /* aspect ratio behaviour */ - case GST_MATROSKA_ID_VIDEOASPECTRATIO: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - if (num != GST_MATROSKA_ASPECT_RATIO_MODE_FREE && - num != GST_MATROSKA_ASPECT_RATIO_MODE_KEEP && - num != GST_MATROSKA_ASPECT_RATIO_MODE_FIXED) { - GST_WARNING ("Unknown aspect ratio mode 0x%x - ignoring", - (guint) num); - break; - } - videocontext->asr_mode = num; - break; - } - - /* colourspace (only matters for raw video) fourcc */ - case GST_MATROSKA_ID_VIDEOCOLOURSPACE: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - videocontext->fourcc = num; - break; - } - - default: - GST_WARNING ("Unknown video track header entry 0x%x - ignoring", - id); - /* pass-through */ - - case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; - } - - if (demux->level_up) { - demux->level_up--; - break; - } - } - break; + /* tracktype specific stuff for video */ + case GST_MATROSKA_ID_TRACKVIDEO:{ + GstMatroskaTrackVideoContext *videocontext; + + if (context->type != GST_MATROSKA_TRACK_TYPE_VIDEO) { + GST_WARNING + ("trackvideo EBML entry in non-video track - ignoring track"); + res = FALSE; + break; + } else if (!gst_ebml_read_master (ebml, &id)) { + res = FALSE; + break; + } + videocontext = (GstMatroskaTrackVideoContext *) context; + + while (res) { + if (!(id = gst_ebml_peek_id (ebml, &demux->level_up))) { + res = FALSE; + break; + } else if (demux->level_up > 0) { + demux->level_up--; + break; + } + + switch (id) { + /* fixme, this should be one-up, but I get it here (?) */ + case GST_MATROSKA_ID_TRACKDEFAULTDURATION:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + context->default_duration = num; + break; + } + + /* video framerate */ + case GST_MATROSKA_ID_VIDEOFRAMERATE:{ + gdouble num; + + if (!gst_ebml_read_float (ebml, &id, &num)) { + res = FALSE; + break; + } + context->default_duration = GST_SECOND * (1. / num); + break; + } + + /* width of the size to display the video at */ + case GST_MATROSKA_ID_VIDEODISPLAYWIDTH:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + videocontext->display_width = num; + break; + } + + /* height of the size to display the video at */ + case GST_MATROSKA_ID_VIDEODISPLAYHEIGHT:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + videocontext->display_height = num; + break; + } + + /* width of the video in the file */ + case GST_MATROSKA_ID_VIDEOPIXELWIDTH:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + videocontext->pixel_width = num; + break; + } + + /* height of the video in the file */ + case GST_MATROSKA_ID_VIDEOPIXELHEIGHT:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + videocontext->pixel_height = num; + break; + } + + /* whether the video is interlaced */ + case GST_MATROSKA_ID_VIDEOFLAGINTERLACED:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + if (num) + context->flags |= GST_MATROSKA_VIDEOTRACK_INTERLACED; + else + context->flags &= ~GST_MATROSKA_VIDEOTRACK_INTERLACED; + break; + } + + /* stereo mode (whether the video has two streams, where + * one is for the left eye and the other for the right eye, + * which creates a 3D-like effect) */ + case GST_MATROSKA_ID_VIDEOSTEREOMODE:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + if (num != GST_MATROSKA_EYE_MODE_MONO && + num != GST_MATROSKA_EYE_MODE_LEFT && + num != GST_MATROSKA_EYE_MODE_RIGHT && + num != GST_MATROSKA_EYE_MODE_BOTH) { + GST_WARNING ("Unknown eye mode 0x%x - ignoring", (guint) num); + break; + } + videocontext->eye_mode = num; + break; + } + + /* aspect ratio behaviour */ + case GST_MATROSKA_ID_VIDEOASPECTRATIO:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + if (num != GST_MATROSKA_ASPECT_RATIO_MODE_FREE && + num != GST_MATROSKA_ASPECT_RATIO_MODE_KEEP && + num != GST_MATROSKA_ASPECT_RATIO_MODE_FIXED) { + GST_WARNING ("Unknown aspect ratio mode 0x%x - ignoring", + (guint) num); + break; + } + videocontext->asr_mode = num; + break; + } + + /* colourspace (only matters for raw video) fourcc */ + case GST_MATROSKA_ID_VIDEOCOLOURSPACE:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + videocontext->fourcc = num; + break; + } + + default: + GST_WARNING ("Unknown video track header entry 0x%x - ignoring", + id); + /* pass-through */ + + case GST_EBML_ID_VOID: + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; + } + + if (demux->level_up) { + demux->level_up--; + break; + } + } + break; } - /* tracktype specific stuff for audio */ - case GST_MATROSKA_ID_TRACKAUDIO: { - GstMatroskaTrackAudioContext *audiocontext; - if (context->type != GST_MATROSKA_TRACK_TYPE_AUDIO) { - GST_WARNING ("trackaudio EBML entry in non-audio track - ignoring track"); - res = FALSE; - break; - } else if (!gst_ebml_read_master (ebml, &id)) { - res = FALSE; - break; - } - audiocontext = (GstMatroskaTrackAudioContext *) context; - - while (res) { - if (!(id = gst_ebml_peek_id (ebml, &demux->level_up))) { - res = FALSE; - break; - } else if (demux->level_up > 0) { - demux->level_up--; - break; - } - - switch (id) { - /* samplerate */ - case GST_MATROSKA_ID_AUDIOSAMPLINGFREQ: { - gdouble num; - if (!gst_ebml_read_float (ebml, &id, &num)) { - res = FALSE; - break; - } - audiocontext->samplerate = num; - break; - } - - /* bitdepth */ - case GST_MATROSKA_ID_AUDIOBITDEPTH: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - audiocontext->bitdepth = num; - break; - } - - /* channels */ - case GST_MATROSKA_ID_AUDIOCHANNELS: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - audiocontext->channels = num; - break; - } - - default: - GST_WARNING ("Unknown audio track header entry 0x%x - ignoring", - id); - /* pass-through */ - - case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; - } - - if (demux->level_up) { - demux->level_up--; - break; - } - } - break; + /* tracktype specific stuff for audio */ + case GST_MATROSKA_ID_TRACKAUDIO:{ + GstMatroskaTrackAudioContext *audiocontext; + + if (context->type != GST_MATROSKA_TRACK_TYPE_AUDIO) { + GST_WARNING + ("trackaudio EBML entry in non-audio track - ignoring track"); + res = FALSE; + break; + } else if (!gst_ebml_read_master (ebml, &id)) { + res = FALSE; + break; + } + audiocontext = (GstMatroskaTrackAudioContext *) context; + + while (res) { + if (!(id = gst_ebml_peek_id (ebml, &demux->level_up))) { + res = FALSE; + break; + } else if (demux->level_up > 0) { + demux->level_up--; + break; + } + + switch (id) { + /* samplerate */ + case GST_MATROSKA_ID_AUDIOSAMPLINGFREQ:{ + gdouble num; + + if (!gst_ebml_read_float (ebml, &id, &num)) { + res = FALSE; + break; + } + audiocontext->samplerate = num; + break; + } + + /* bitdepth */ + case GST_MATROSKA_ID_AUDIOBITDEPTH:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + audiocontext->bitdepth = num; + break; + } + + /* channels */ + case GST_MATROSKA_ID_AUDIOCHANNELS:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + audiocontext->channels = num; + break; + } + + default: + GST_WARNING ("Unknown audio track header entry 0x%x - ignoring", + id); + /* pass-through */ + + case GST_EBML_ID_VOID: + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; + } + + if (demux->level_up) { + demux->level_up--; + break; + } + } + break; } - /* codec identifier */ - case GST_MATROSKA_ID_CODECID: { - gchar *text; - if (!gst_ebml_read_ascii (ebml, &id, &text)) { - res = FALSE; - break; - } - context->codec_id = text; - break; + /* codec identifier */ + case GST_MATROSKA_ID_CODECID:{ + gchar *text; + + if (!gst_ebml_read_ascii (ebml, &id, &text)) { + res = FALSE; + break; + } + context->codec_id = text; + break; } - /* codec private data */ - case GST_MATROSKA_ID_CODECPRIVATE: { - guint8 *data; - guint64 size; - if (!gst_ebml_read_binary (ebml, &id, &data, &size)) { - res = FALSE; - break; - } - context->codec_priv = data; - context->codec_priv_size = size; - break; + /* codec private data */ + case GST_MATROSKA_ID_CODECPRIVATE:{ + guint8 *data; + guint64 size; + + if (!gst_ebml_read_binary (ebml, &id, &data, &size)) { + res = FALSE; + break; + } + context->codec_priv = data; + context->codec_priv_size = size; + break; } - /* name of the codec */ - case GST_MATROSKA_ID_CODECNAME: { - gchar *text; - if (!gst_ebml_read_utf8 (ebml, &id, &text)) { - res = FALSE; - break; - } - context->codec_name = text; - break; + /* name of the codec */ + case GST_MATROSKA_ID_CODECNAME:{ + gchar *text; + + if (!gst_ebml_read_utf8 (ebml, &id, &text)) { + res = FALSE; + break; + } + context->codec_name = text; + break; } - /* name of this track */ - case GST_MATROSKA_ID_TRACKNAME: { - gchar *text; - if (!gst_ebml_read_utf8 (ebml, &id, &text)) { - res = FALSE; - break; - } - context->name = text; - break; + /* name of this track */ + case GST_MATROSKA_ID_TRACKNAME:{ + gchar *text; + + if (!gst_ebml_read_utf8 (ebml, &id, &text)) { + res = FALSE; + break; + } + context->name = text; + break; } - /* language (matters for audio/subtitles, mostly) */ - case GST_MATROSKA_ID_TRACKLANGUAGE: { - gchar *text; - if (!gst_ebml_read_utf8 (ebml, &id, &text)) { - res = FALSE; - break; - } - context->language = text; - break; + /* language (matters for audio/subtitles, mostly) */ + case GST_MATROSKA_ID_TRACKLANGUAGE:{ + gchar *text; + + if (!gst_ebml_read_utf8 (ebml, &id, &text)) { + res = FALSE; + break; + } + context->language = text; + break; } - /* whether this is actually used */ - case GST_MATROSKA_ID_TRACKFLAGENABLED: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - if (num) - context->flags |= GST_MATROSKA_TRACK_ENABLED; - else - context->flags &= ~GST_MATROSKA_TRACK_ENABLED; - break; + /* whether this is actually used */ + case GST_MATROSKA_ID_TRACKFLAGENABLED:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + if (num) + context->flags |= GST_MATROSKA_TRACK_ENABLED; + else + context->flags &= ~GST_MATROSKA_TRACK_ENABLED; + break; } - /* whether it's the default for this track type */ - case GST_MATROSKA_ID_TRACKFLAGDEFAULT: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - if (num) - context->flags |= GST_MATROSKA_TRACK_DEFAULT; - else - context->flags &= ~GST_MATROSKA_TRACK_DEFAULT; - break; + /* whether it's the default for this track type */ + case GST_MATROSKA_ID_TRACKFLAGDEFAULT:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + if (num) + context->flags |= GST_MATROSKA_TRACK_DEFAULT; + else + context->flags &= ~GST_MATROSKA_TRACK_DEFAULT; + break; } - /* lacing (like MPEG, where blocks don't end/start on frame - * boundaries) */ - case GST_MATROSKA_ID_TRACKFLAGLACING: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - if (num) - context->flags |= GST_MATROSKA_TRACK_LACING; - else - context->flags &= ~GST_MATROSKA_TRACK_LACING; - break; + /* lacing (like MPEG, where blocks don't end/start on frame + * boundaries) */ + case GST_MATROSKA_ID_TRACKFLAGLACING:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + if (num) + context->flags |= GST_MATROSKA_TRACK_LACING; + else + context->flags &= ~GST_MATROSKA_TRACK_LACING; + break; } - /* default length (in time) of one data block in this track */ - case GST_MATROSKA_ID_TRACKDEFAULTDURATION: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - context->default_duration = num; - break; + /* default length (in time) of one data block in this track */ + case GST_MATROSKA_ID_TRACKDEFAULTDURATION:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + context->default_duration = num; + break; } default: - GST_WARNING ("Unknown track header entry 0x%x - ignoring", id); - /* pass-through */ + GST_WARNING ("Unknown track header entry 0x%x - ignoring", id); + /* pass-through */ - /* we ignore these because they're nothing useful (i.e. crap). */ + /* we ignore these because they're nothing useful (i.e. crap). */ case GST_MATROSKA_ID_CODECINFOURL: case GST_MATROSKA_ID_CODECDOWNLOADURL: case GST_MATROSKA_ID_TRACKMINCACHE: case GST_MATROSKA_ID_TRACKMAXCACHE: case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; } if (demux->level_up) { @@ -830,53 +839,45 @@ gst_matroska_demux_add_stream (GstMatroskaDemux *demux) /* now create the GStreamer connectivity */ switch (context->type) { - case GST_MATROSKA_TRACK_TYPE_VIDEO: { + case GST_MATROSKA_TRACK_TYPE_VIDEO:{ GstMatroskaTrackVideoContext *videocontext = - (GstMatroskaTrackVideoContext *) context; + (GstMatroskaTrackVideoContext *) context; padname = g_strdup_printf ("video_%02d", demux->num_v_streams++); templ = gst_element_class_get_pad_template (klass, "video_%02d"); caps = gst_matroska_demux_video_caps (videocontext, - context->codec_id, - context->codec_priv, - context->codec_priv_size, - demux); + context->codec_id, + context->codec_priv, context->codec_priv_size, demux); break; } - case GST_MATROSKA_TRACK_TYPE_AUDIO: { + case GST_MATROSKA_TRACK_TYPE_AUDIO:{ GstMatroskaTrackAudioContext *audiocontext = - (GstMatroskaTrackAudioContext *) context; + (GstMatroskaTrackAudioContext *) context; padname = g_strdup_printf ("audio_%02d", demux->num_a_streams++); templ = gst_element_class_get_pad_template (klass, "audio_%02d"); caps = gst_matroska_demux_audio_caps (audiocontext, - context->codec_id, - context->codec_priv, - context->codec_priv_size, - demux); + context->codec_id, + context->codec_priv, context->codec_priv_size, demux); break; } - case GST_MATROSKA_TRACK_TYPE_COMPLEX: { + case GST_MATROSKA_TRACK_TYPE_COMPLEX:{ GstMatroskaTrackComplexContext *complexcontext = - (GstMatroskaTrackComplexContext *) context; + (GstMatroskaTrackComplexContext *) context; padname = g_strdup_printf ("video_%02d", demux->num_v_streams++); templ = gst_element_class_get_pad_template (klass, "video_%02d"); caps = gst_matroska_demux_complex_caps (complexcontext, - context->codec_id, - context->codec_priv, - context->codec_priv_size); + context->codec_id, context->codec_priv, context->codec_priv_size); break; } - case GST_MATROSKA_TRACK_TYPE_SUBTITLE: { + case GST_MATROSKA_TRACK_TYPE_SUBTITLE:{ GstMatroskaTrackSubtitleContext *subtitlecontext = - (GstMatroskaTrackSubtitleContext *) context; + (GstMatroskaTrackSubtitleContext *) context; padname = g_strdup_printf ("subtitle_%02d", demux->num_t_streams++); templ = gst_element_class_get_pad_template (klass, "subtitle_%02d"); caps = gst_matroska_demux_subtitle_caps (subtitlecontext, - context->codec_id, - context->codec_priv, - context->codec_priv_size); + context->codec_id, context->codec_priv, context->codec_priv_size); break; } @@ -888,24 +889,23 @@ gst_matroska_demux_add_stream (GstMatroskaDemux *demux) } /* the pad in here */ - context->pad = gst_pad_new_from_template (templ, padname); + context->pad = gst_pad_new_from_template (templ, padname); context->caps = caps ? caps : gst_caps_new_empty (); g_free (padname); /* set some functions */ gst_pad_set_formats_function (context->pad, - gst_matroska_demux_get_src_formats); + gst_matroska_demux_get_src_formats); gst_pad_set_event_mask_function (context->pad, - gst_matroska_demux_get_event_mask); + gst_matroska_demux_get_event_mask); gst_pad_set_event_function (context->pad, - gst_matroska_demux_handle_src_event); + gst_matroska_demux_handle_src_event); gst_pad_set_query_type_function (context->pad, - gst_matroska_demux_get_src_query_types); + gst_matroska_demux_get_src_query_types); gst_pad_set_query_function (context->pad, - gst_matroska_demux_handle_src_query); - gst_pad_set_getcaps_function (context->pad, - gst_matroska_demux_src_getcaps); + gst_matroska_demux_handle_src_query); + gst_pad_set_getcaps_function (context->pad, gst_matroska_demux_src_getcaps); gst_element_add_pad (GST_ELEMENT (demux), context->pad); @@ -914,9 +914,9 @@ gst_matroska_demux_add_stream (GstMatroskaDemux *demux) } static const GstFormat * -gst_matroska_demux_get_src_formats (GstPad *pad) +gst_matroska_demux_get_src_formats (GstPad * pad) { - /*GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (gst_pad_get_parent (pad));*/ + /*GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (gst_pad_get_parent (pad)); */ /* we could try to look for units (i.e. samples) in audio streams * or video streams, but both samplerate and framerate are not @@ -932,7 +932,7 @@ gst_matroska_demux_get_src_formats (GstPad *pad) } static const GstQueryType * -gst_matroska_demux_get_src_query_types (GstPad *pad) +gst_matroska_demux_get_src_query_types (GstPad * pad) { static const GstQueryType src_types[] = { GST_QUERY_TOTAL, @@ -944,10 +944,8 @@ gst_matroska_demux_get_src_query_types (GstPad *pad) } static gboolean -gst_matroska_demux_handle_src_query (GstPad *pad, - GstQueryType type, - GstFormat *format, - gint64 *value) +gst_matroska_demux_handle_src_query (GstPad * pad, + GstQueryType type, GstFormat * format, gint64 * value) { gboolean res = TRUE; GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (gst_pad_get_parent (pad)); @@ -955,28 +953,28 @@ gst_matroska_demux_handle_src_query (GstPad *pad, switch (type) { case GST_QUERY_TOTAL: switch (*format) { - case GST_FORMAT_DEFAULT: - *format = GST_FORMAT_TIME; - /* fall through */ - case GST_FORMAT_TIME: - *value = demux->duration; + case GST_FORMAT_DEFAULT: + *format = GST_FORMAT_TIME; + /* fall through */ + case GST_FORMAT_TIME: + *value = demux->duration; break; default: - res = FALSE; + res = FALSE; break; } break; case GST_QUERY_POSITION: switch (*format) { - case GST_FORMAT_DEFAULT: - *format = GST_FORMAT_TIME; - /* fall through */ - case GST_FORMAT_TIME: - *value = demux->pos; + case GST_FORMAT_DEFAULT: + *format = GST_FORMAT_TIME; + /* fall through */ + case GST_FORMAT_TIME: + *value = demux->pos; break; default: - res = FALSE; + res = FALSE; break; } break; @@ -990,9 +988,9 @@ gst_matroska_demux_handle_src_query (GstPad *pad, } static GstMatroskaIndex * -gst_matroskademux_seek (GstMatroskaDemux *demux) +gst_matroskademux_seek (GstMatroskaDemux * demux) { - guint entry = (guint) -1; + guint entry = (guint) - 1; guint64 offset = demux->seek_pending; guint n; @@ -1000,19 +998,19 @@ gst_matroskademux_seek (GstMatroskaDemux *demux) demux->seek_pending = GST_CLOCK_TIME_NONE; for (n = 0; n < demux->num_indexes; n++) { - if (entry == (guint) -1) { + if (entry == (guint) - 1) { entry = n; } else { gfloat diff_old = fabs (1. * (demux->index[entry].time - offset)), - diff_new = fabs (1. * (demux->index[n].time - offset)); + diff_new = fabs (1. * (demux->index[n].time - offset)); if (diff_new < diff_old) { - entry = n; + entry = n; } } } - if (entry != (guint) -1) { + if (entry != (guint) - 1) { return &demux->index[entry]; } @@ -1020,8 +1018,7 @@ gst_matroskademux_seek (GstMatroskaDemux *demux) } static gboolean -gst_matroska_demux_send_event (GstElement *element, - GstEvent *event) +gst_matroska_demux_send_event (GstElement * element, GstEvent * event) { GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (element); gboolean res = TRUE; @@ -1029,20 +1026,19 @@ gst_matroska_demux_send_event (GstElement *element, switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: switch (GST_EVENT_SEEK_FORMAT (event)) { - case GST_FORMAT_TIME: - demux->seek_pending = GST_EVENT_SEEK_OFFSET (event); - break; - - default: - GST_WARNING ("Only time seek is supported"); - res = FALSE; - break; + case GST_FORMAT_TIME: + demux->seek_pending = GST_EVENT_SEEK_OFFSET (event); + break; + + default: + GST_WARNING ("Only time seek is supported"); + res = FALSE; + break; } break; default: - GST_WARNING ("Unhandled event of type %d", - GST_EVENT_TYPE (event)); + GST_WARNING ("Unhandled event of type %d", GST_EVENT_TYPE (event)); res = FALSE; break; } @@ -1053,34 +1049,32 @@ gst_matroska_demux_send_event (GstElement *element, } static const GstEventMask * -gst_matroska_demux_get_event_mask (GstPad *pad) +gst_matroska_demux_get_event_mask (GstPad * pad) { static const GstEventMask masks[] = { - { GST_EVENT_SEEK, (GstEventFlag) ((gint) GST_SEEK_METHOD_SET | - (gint) GST_SEEK_FLAG_KEY_UNIT) }, - { GST_EVENT_SEEK_SEGMENT, (GstEventFlag) ((gint) GST_SEEK_METHOD_SET | - (gint) GST_SEEK_FLAG_KEY_UNIT) }, - { (GstEventType) 0, (GstEventFlag) 0 } + {GST_EVENT_SEEK, (GstEventFlag) ((gint) GST_SEEK_METHOD_SET | + (gint) GST_SEEK_FLAG_KEY_UNIT)}, + {GST_EVENT_SEEK_SEGMENT, (GstEventFlag) ((gint) GST_SEEK_METHOD_SET | + (gint) GST_SEEK_FLAG_KEY_UNIT)}, + {(GstEventType) 0, (GstEventFlag) 0} }; return masks; } - + static gboolean -gst_matroska_demux_handle_src_event (GstPad *pad, - GstEvent *event) +gst_matroska_demux_handle_src_event (GstPad * pad, GstEvent * event) { GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (gst_pad_get_parent (pad)); gboolean res = TRUE; - + switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK_SEGMENT: case GST_EVENT_SEEK: return gst_matroska_demux_send_event (GST_ELEMENT (demux), event); default: - GST_WARNING ("Unhandled event of type %d", - GST_EVENT_TYPE (event)); + GST_WARNING ("Unhandled event of type %d", GST_EVENT_TYPE (event)); res = FALSE; break; } @@ -1091,7 +1085,7 @@ gst_matroska_demux_handle_src_event (GstPad *pad, } static gboolean -gst_matroska_demux_handle_seek_event (GstMatroskaDemux *demux) +gst_matroska_demux_handle_seek_event (GstMatroskaDemux * demux) { GstEbmlRead *ebml = GST_EBML_READ (demux); GstMatroskaIndex *entry = gst_matroskademux_seek (demux); @@ -1102,12 +1096,10 @@ gst_matroska_demux_handle_seek_event (GstMatroskaDemux *demux) return FALSE; /* seek (relative to segment) */ - if (!(event = gst_ebml_read_seek (ebml, - entry->pos + demux->segment_start))) + if (!(event = gst_ebml_read_seek (ebml, entry->pos + demux->segment_start))) return FALSE; - gst_event_unref (event); /* byte - we want time */ - event = gst_event_new_discontinuous (FALSE, GST_FORMAT_TIME, - entry->time); + gst_event_unref (event); /* byte - we want time */ + event = gst_event_new_discontinuous (FALSE, GST_FORMAT_TIME, entry->time); /* forward to all src pads */ for (i = 0; i < demux->num_streams; i++) { @@ -1123,7 +1115,7 @@ gst_matroska_demux_handle_seek_event (GstMatroskaDemux *demux) } static gboolean -gst_matroska_demux_init_stream (GstMatroskaDemux *demux) +gst_matroska_demux_init_stream (GstMatroskaDemux * demux) { GstEbmlRead *ebml = GST_EBML_READ (demux); guint32 id; @@ -1135,16 +1127,15 @@ gst_matroska_demux_init_stream (GstMatroskaDemux *demux) if (!doctype || strcmp (doctype, "matroska") != 0) { GST_ELEMENT_ERROR (demux, STREAM, WRONG_TYPE, (NULL), - ("Input is not a matroska stream (doctype=%s)", - doctype ? doctype : "none")); + ("Input is not a matroska stream (doctype=%s)", + doctype ? doctype : "none")); g_free (doctype); return FALSE; } g_free (doctype); if (version > 1) { GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), - ("Demuxer version (1) is too old to read stream version %d", - version)); + ("Demuxer version (1) is too old to read stream version %d", version)); return FALSE; } @@ -1160,7 +1151,7 @@ gst_matroska_demux_init_stream (GstMatroskaDemux *demux) /* oi! */ GST_WARNING ("Expected a Segment ID (0x%x), but received 0x%x!", - GST_MATROSKA_ID_SEGMENT, id); + GST_MATROSKA_ID_SEGMENT, id); if (!gst_ebml_read_skip (ebml)) return FALSE; } @@ -1176,7 +1167,7 @@ gst_matroska_demux_init_stream (GstMatroskaDemux *demux) } static gboolean -gst_matroska_demux_parse_tracks (GstMatroskaDemux *demux) +gst_matroska_demux_parse_tracks (GstMatroskaDemux * demux) { GstEbmlRead *ebml = GST_EBML_READ (demux); gboolean res = TRUE; @@ -1192,20 +1183,20 @@ gst_matroska_demux_parse_tracks (GstMatroskaDemux *demux) } switch (id) { - /* one track within the "all-tracks" header */ + /* one track within the "all-tracks" header */ case GST_MATROSKA_ID_TRACKENTRY: - if (!gst_matroska_demux_add_stream (demux)) - res = FALSE; - break; + if (!gst_matroska_demux_add_stream (demux)) + res = FALSE; + break; default: - GST_WARNING ("Unknown entry 0x%x in track header", id); - /* fall-through */ + GST_WARNING ("Unknown entry 0x%x in track header", id); + /* fall-through */ case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; } if (demux->level_up) { @@ -1218,8 +1209,7 @@ gst_matroska_demux_parse_tracks (GstMatroskaDemux *demux) } static gboolean -gst_matroska_demux_parse_index (GstMatroskaDemux *demux, - gboolean prevent_eos) +gst_matroska_demux_parse_index (GstMatroskaDemux * demux, gboolean prevent_eos) { GstEbmlRead *ebml = GST_EBML_READ (demux); gboolean res = TRUE; @@ -1247,145 +1237,147 @@ gst_matroska_demux_parse_index (GstMatroskaDemux *demux, } switch (id) { - /* one single index entry ('point') */ + /* one single index entry ('point') */ case GST_MATROSKA_ID_POINTENTRY: - if (!gst_ebml_read_master (ebml, &id)) { - res = FALSE; - break; - } + if (!gst_ebml_read_master (ebml, &id)) { + res = FALSE; + break; + } - /* in the end, we hope to fill one entry with a + /* in the end, we hope to fill one entry with a * timestamp, a file position and a tracknum */ - idx.pos = (guint64) -1; - idx.time = (guint64) -1; - idx.track = (guint16) -1; - - while (res) { - if (prevent_eos && length == gst_bytestream_tell (ebml->bs)) { - res = FALSE; - break; - } else if (!(id = gst_ebml_peek_id (ebml, &demux->level_up))) { - res = FALSE; - break; - } else if (demux->level_up) { - demux->level_up--; - break; - } - - switch (id) { - /* one single index entry ('point') */ - case GST_MATROSKA_ID_CUETIME: { - gint64 time; - if (!gst_ebml_read_uint (ebml, &id, &time)) { - res = FALSE; - break; - } - idx.time = time * demux->time_scale; - break; - } - - /* position in the file + track to which it belongs */ - case GST_MATROSKA_ID_CUETRACKPOSITION: - if (!gst_ebml_read_master (ebml, &id)) { - res = FALSE; - break; - } - - while (res) { - if (prevent_eos && length == gst_bytestream_tell (ebml->bs)) { - res = FALSE; - break; - } else if (!(id = gst_ebml_peek_id (ebml, - &demux->level_up))) { - res = FALSE; - break; - } else if (demux->level_up) { - demux->level_up--; - break; - } - - switch (id) { - /* track number */ - case GST_MATROSKA_ID_CUETRACK: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - idx.track = num; - break; - } - - /* position in file */ - case GST_MATROSKA_ID_CUECLUSTERPOSITION: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - idx.pos = num; - break; - } - - default: - GST_WARNING ("Unknown entry 0x%x in CuesTrackPositions", id); - /* fall-through */ - - case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; - } - - if (demux->level_up) { - demux->level_up--; - break; - } - } - - break; - - default: - GST_WARNING ("Unknown entry 0x%x in cuespoint index", id); - /* fall-through */ - - case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; - } - - if (demux->level_up) { - demux->level_up--; - break; - } - } - - /* so let's see if we got what we wanted */ - if (idx.pos != (guint64) -1 && - idx.time != (guint64) -1 && - idx.track != (guint16) -1) { - if (demux->num_indexes % 32 == 0) { - /* re-allocate bigger index */ - demux->index = g_renew (GstMatroskaIndex, demux->index, - demux->num_indexes + 32); - } - demux->index[demux->num_indexes].pos = idx.pos; - demux->index[demux->num_indexes].time = idx.time; - demux->index[demux->num_indexes].track = idx.track; - demux->num_indexes++; - } - - break; + idx.pos = (guint64) - 1; + idx.time = (guint64) - 1; + idx.track = (guint16) - 1; + + while (res) { + if (prevent_eos && length == gst_bytestream_tell (ebml->bs)) { + res = FALSE; + break; + } else if (!(id = gst_ebml_peek_id (ebml, &demux->level_up))) { + res = FALSE; + break; + } else if (demux->level_up) { + demux->level_up--; + break; + } + + switch (id) { + /* one single index entry ('point') */ + case GST_MATROSKA_ID_CUETIME:{ + gint64 time; + + if (!gst_ebml_read_uint (ebml, &id, &time)) { + res = FALSE; + break; + } + idx.time = time * demux->time_scale; + break; + } + + /* position in the file + track to which it belongs */ + case GST_MATROSKA_ID_CUETRACKPOSITION: + if (!gst_ebml_read_master (ebml, &id)) { + res = FALSE; + break; + } + + while (res) { + if (prevent_eos && length == gst_bytestream_tell (ebml->bs)) { + res = FALSE; + break; + } else if (!(id = gst_ebml_peek_id (ebml, &demux->level_up))) { + res = FALSE; + break; + } else if (demux->level_up) { + demux->level_up--; + break; + } + + switch (id) { + /* track number */ + case GST_MATROSKA_ID_CUETRACK:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + idx.track = num; + break; + } + + /* position in file */ + case GST_MATROSKA_ID_CUECLUSTERPOSITION:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + idx.pos = num; + break; + } + + default: + GST_WARNING ("Unknown entry 0x%x in CuesTrackPositions", + id); + /* fall-through */ + + case GST_EBML_ID_VOID: + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; + } + + if (demux->level_up) { + demux->level_up--; + break; + } + } + + break; + + default: + GST_WARNING ("Unknown entry 0x%x in cuespoint index", id); + /* fall-through */ + + case GST_EBML_ID_VOID: + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; + } + + if (demux->level_up) { + demux->level_up--; + break; + } + } + + /* so let's see if we got what we wanted */ + if (idx.pos != (guint64) - 1 && + idx.time != (guint64) - 1 && idx.track != (guint16) - 1) { + if (demux->num_indexes % 32 == 0) { + /* re-allocate bigger index */ + demux->index = g_renew (GstMatroskaIndex, demux->index, + demux->num_indexes + 32); + } + demux->index[demux->num_indexes].pos = idx.pos; + demux->index[demux->num_indexes].time = idx.time; + demux->index[demux->num_indexes].track = idx.track; + demux->num_indexes++; + } + + break; default: - GST_WARNING ("Unknown entry 0x%x in cues header", id); - /* fall-through */ + GST_WARNING ("Unknown entry 0x%x in cues header", id); + /* fall-through */ case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; } if (demux->level_up) { @@ -1398,7 +1390,7 @@ gst_matroska_demux_parse_index (GstMatroskaDemux *demux, } static gboolean -gst_matroska_demux_parse_info (GstMatroskaDemux *demux) +gst_matroska_demux_parse_info (GstMatroskaDemux * demux) { GstEbmlRead *ebml = GST_EBML_READ (demux); gboolean res = TRUE; @@ -1414,65 +1406,70 @@ gst_matroska_demux_parse_info (GstMatroskaDemux *demux) } switch (id) { - /* cluster timecode */ - case GST_MATROSKA_ID_TIMECODESCALE: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - demux->time_scale = num; - break; + /* cluster timecode */ + case GST_MATROSKA_ID_TIMECODESCALE:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + demux->time_scale = num; + break; } - case GST_MATROSKA_ID_DURATION: { - gdouble num; - if (!gst_ebml_read_float (ebml, &id, &num)) { - res = FALSE; - break; - } - demux->duration = num * demux->time_scale; - break; + case GST_MATROSKA_ID_DURATION:{ + gdouble num; + + if (!gst_ebml_read_float (ebml, &id, &num)) { + res = FALSE; + break; + } + demux->duration = num * demux->time_scale; + break; } - case GST_MATROSKA_ID_WRITINGAPP: { - gchar *text; - if (!gst_ebml_read_utf8 (ebml, &id, &text)) { - res = FALSE; - break; - } - demux->writing_app = text; - break; + case GST_MATROSKA_ID_WRITINGAPP:{ + gchar *text; + + if (!gst_ebml_read_utf8 (ebml, &id, &text)) { + res = FALSE; + break; + } + demux->writing_app = text; + break; } - case GST_MATROSKA_ID_MUXINGAPP: { - gchar *text; - if (!gst_ebml_read_utf8 (ebml, &id, &text)) { - res = FALSE; - break; - } - demux->muxing_app = text; - break; + case GST_MATROSKA_ID_MUXINGAPP:{ + gchar *text; + + if (!gst_ebml_read_utf8 (ebml, &id, &text)) { + res = FALSE; + break; + } + demux->muxing_app = text; + break; } - case GST_MATROSKA_ID_DATEUTC: { - gint64 time; - if (!gst_ebml_read_date (ebml, &id, &time)) { - res = FALSE; - break; - } - demux->created = time; - break; + case GST_MATROSKA_ID_DATEUTC:{ + gint64 time; + + if (!gst_ebml_read_date (ebml, &id, &time)) { + res = FALSE; + break; + } + demux->created = time; + break; } default: - GST_WARNING ("Unknown entry 0x%x in info header", id); - /* fall-through */ + GST_WARNING ("Unknown entry 0x%x in info header", id); + /* fall-through */ case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; } if (demux->level_up) { @@ -1485,8 +1482,8 @@ gst_matroska_demux_parse_info (GstMatroskaDemux *demux) } static gboolean -gst_matroska_demux_parse_metadata (GstMatroskaDemux *demux, - gboolean prevent_eos) +gst_matroska_demux_parse_metadata (GstMatroskaDemux * demux, + gboolean prevent_eos) { GstEbmlRead *ebml = GST_EBML_READ (demux); gboolean res = TRUE; @@ -1514,13 +1511,13 @@ gst_matroska_demux_parse_metadata (GstMatroskaDemux *demux, switch (id) { default: - GST_WARNING ("metadata unimplemented"); - /* fall-through */ + GST_WARNING ("metadata unimplemented"); + /* fall-through */ case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; } if (demux->level_up) { @@ -1538,9 +1535,7 @@ gst_matroska_demux_parse_metadata (GstMatroskaDemux *demux, */ static gint -gst_matroska_ebmlnum_uint (guint8 *data, - guint size, - guint64 *num) +gst_matroska_ebmlnum_uint (guint8 * data, guint size, guint64 * num) { gint len_mask = 0x80, read = 1, n = 1, num_ffs = 0; guint64 total; @@ -1548,7 +1543,7 @@ gst_matroska_ebmlnum_uint (guint8 *data, if (size <= 0) { return -1; } - + total = data[0]; while (read <= 8 && !(total & len_mask)) { read++; @@ -1556,7 +1551,7 @@ gst_matroska_ebmlnum_uint (guint8 *data, } if (read > 8) return -1; - + if ((total &= (len_mask - 1)) == len_mask - 1) num_ffs++; if (size < read) @@ -1580,9 +1575,7 @@ gst_matroska_ebmlnum_uint (guint8 *data, } static gint -gst_matroska_ebmlnum_sint (guint8 *data, - guint size, - gint64 *num) +gst_matroska_ebmlnum_sint (guint8 * data, guint size, gint64 * num) { guint64 unum; gint res; @@ -1601,8 +1594,8 @@ gst_matroska_ebmlnum_sint (guint8 *data, } static gboolean -gst_matroska_demux_parse_blockgroup (GstMatroskaDemux *demux, - guint64 cluster_time) +gst_matroska_demux_parse_blockgroup (GstMatroskaDemux * demux, + guint64 cluster_time) { GstEbmlRead *ebml = GST_EBML_READ (demux); gboolean res = TRUE; @@ -1618,165 +1611,178 @@ gst_matroska_demux_parse_blockgroup (GstMatroskaDemux *demux, } switch (id) { - /* one block inside the group. Note, block parsing is one - * of the harder things, so this code is a bit complicated. - * See http://www.matroska.org/ for documentation. */ - case GST_MATROSKA_ID_BLOCK: { - GstBuffer *buf; - guint8 *data; - gint64 time; - guint size, *lace_size = NULL; - gint n, stream, flags, laces = 0; - guint64 num; - - if (!gst_ebml_read_buffer (ebml, &id, &buf)) { - res = FALSE; - break; - } - data = GST_BUFFER_DATA (buf); - size = GST_BUFFER_SIZE (buf); - - /* first byte(s): blocknum */ - if ((n = gst_matroska_ebmlnum_uint (data, size, &num)) < 0) { - GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("Data error")); - gst_buffer_unref (buf); - res = FALSE; - break; - } - data += n; size -= n; - - /* fetch stream from num */ - stream = gst_matroska_demux_stream_from_num (demux, num); - if (size <= 3 || stream < 0 || stream >= demux->num_streams) { - gst_buffer_unref (buf); - GST_WARNING ("Invalid stream %d or size %u", stream, size); - break; - } - if (!GST_PAD_IS_USABLE (demux->src[stream]->pad)) { - gst_buffer_unref (buf); - break; - } - - /* time (relative to cluster time) */ - time = (GINT16_FROM_BE (* (gint16 *) data)) * demux->time_scale; - data += 2; size -= 2; - flags = * (guint8 *) data; - data += 1; size -= 1; - switch ((flags & 0x06) >> 1) { - case 0x0: /* no lacing */ - laces = 1; - lace_size = g_new (gint, 1); - lace_size[0] = size; - break; - - case 0x1: /* xiph lacing */ - case 0x2: /* fixed-size lacing */ - case 0x3: /* EBML lacing */ - if (size == 0) { - res = FALSE; - break; - } - laces = (* (guint8 *) data) + 1; - data += 1; size -= 1; - lace_size = g_new0 (gint, laces); - - switch ((flags & 0x06) >> 1) { - case 0x1: /* xiph lacing */ { - guint temp, total = 0; - for (n = 0; res && n < laces - 1; n++) { - while (1) { - if (size == 0) { - res = FALSE; - break; - } - temp = * (guint8 *) data; - lace_size[n] += temp; - data += 1; size -= 1; - if (temp != 0xff) - break; - } - total += lace_size[n]; - } - lace_size[n] = size - total; - break; - } - - case 0x2: /* fixed-size lacing */ - for (n = 0; n < laces; n++) - lace_size[n] = size / laces; - break; - - case 0x3: /* EBML lacing */ { - guint total; - if ((n = gst_matroska_ebmlnum_uint (data, size, &num)) < 0) { - GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("Data error")); - res = FALSE; - break; - } - data += n; size -= n; - total = lace_size[0] = num; - for (n = 1; res && n < laces - 1; n++) { - gint64 snum; - gint r; - if ((r = gst_matroska_ebmlnum_sint (data, size, &snum)) < 0) { - GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("Data error")); - res = FALSE; - break; - } - data += r; size -= r; - lace_size[n] = lace_size[n - 1] + snum; - total += lace_size[n]; - } - lace_size[n] = size - total; - break; - } - } - break; - } - - if (res) { - for (n = 0; n < laces; n++) { - GstBuffer *sub = gst_buffer_create_sub (buf, - GST_BUFFER_SIZE (buf) - size, - lace_size[n]); - - if (cluster_time != GST_CLOCK_TIME_NONE) { - if (time < 0 && (-time) > cluster_time) - GST_BUFFER_TIMESTAMP (sub) = cluster_time; - else - GST_BUFFER_TIMESTAMP (sub) = cluster_time + time; - } - /* FIXME: duration */ - - gst_pad_push (demux->src[stream]->pad, GST_DATA (sub)); - - size -= lace_size[n]; - } - } - - g_free (lace_size); - gst_buffer_unref (buf); - break; + /* one block inside the group. Note, block parsing is one + * of the harder things, so this code is a bit complicated. + * See http://www.matroska.org/ for documentation. */ + case GST_MATROSKA_ID_BLOCK:{ + GstBuffer *buf; + guint8 *data; + gint64 time; + guint size, *lace_size = NULL; + gint n, stream, flags, laces = 0; + guint64 num; + + if (!gst_ebml_read_buffer (ebml, &id, &buf)) { + res = FALSE; + break; + } + data = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); + + /* first byte(s): blocknum */ + if ((n = gst_matroska_ebmlnum_uint (data, size, &num)) < 0) { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), ("Data error")); + gst_buffer_unref (buf); + res = FALSE; + break; + } + data += n; + size -= n; + + /* fetch stream from num */ + stream = gst_matroska_demux_stream_from_num (demux, num); + if (size <= 3 || stream < 0 || stream >= demux->num_streams) { + gst_buffer_unref (buf); + GST_WARNING ("Invalid stream %d or size %u", stream, size); + break; + } + if (!GST_PAD_IS_USABLE (demux->src[stream]->pad)) { + gst_buffer_unref (buf); + break; + } + + /* time (relative to cluster time) */ + time = (GINT16_FROM_BE (*(gint16 *) data)) * demux->time_scale; + data += 2; + size -= 2; + flags = *(guint8 *) data; + data += 1; + size -= 1; + switch ((flags & 0x06) >> 1) { + case 0x0: /* no lacing */ + laces = 1; + lace_size = g_new (gint, 1); + lace_size[0] = size; + break; + + case 0x1: /* xiph lacing */ + case 0x2: /* fixed-size lacing */ + case 0x3: /* EBML lacing */ + if (size == 0) { + res = FALSE; + break; + } + laces = (*(guint8 *) data) + 1; + data += 1; + size -= 1; + lace_size = g_new0 (gint, laces); + + switch ((flags & 0x06) >> 1) { + case 0x1: /* xiph lacing */ { + guint temp, total = 0; + + for (n = 0; res && n < laces - 1; n++) { + while (1) { + if (size == 0) { + res = FALSE; + break; + } + temp = *(guint8 *) data; + lace_size[n] += temp; + data += 1; + size -= 1; + if (temp != 0xff) + break; + } + total += lace_size[n]; + } + lace_size[n] = size - total; + break; + } + + case 0x2: /* fixed-size lacing */ + for (n = 0; n < laces; n++) + lace_size[n] = size / laces; + break; + + case 0x3: /* EBML lacing */ { + guint total; + + if ((n = gst_matroska_ebmlnum_uint (data, size, &num)) < 0) { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), + ("Data error")); + res = FALSE; + break; + } + data += n; + size -= n; + total = lace_size[0] = num; + for (n = 1; res && n < laces - 1; n++) { + gint64 snum; + gint r; + + if ((r = gst_matroska_ebmlnum_sint (data, size, &snum)) < 0) { + GST_ELEMENT_ERROR (demux, STREAM, DEMUX, (NULL), + ("Data error")); + res = FALSE; + break; + } + data += r; + size -= r; + lace_size[n] = lace_size[n - 1] + snum; + total += lace_size[n]; + } + lace_size[n] = size - total; + break; + } + } + break; + } + + if (res) { + for (n = 0; n < laces; n++) { + GstBuffer *sub = gst_buffer_create_sub (buf, + GST_BUFFER_SIZE (buf) - size, + lace_size[n]); + + if (cluster_time != GST_CLOCK_TIME_NONE) { + if (time < 0 && (-time) > cluster_time) + GST_BUFFER_TIMESTAMP (sub) = cluster_time; + else + GST_BUFFER_TIMESTAMP (sub) = cluster_time + time; + } + /* FIXME: duration */ + + gst_pad_push (demux->src[stream]->pad, GST_DATA (sub)); + + size -= lace_size[n]; + } + } + + g_free (lace_size); + gst_buffer_unref (buf); + break; } - case GST_MATROSKA_ID_BLOCKDURATION: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - GST_WARNING ("FIXME: implement support for BlockDuration"); - break; + case GST_MATROSKA_ID_BLOCKDURATION:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + GST_WARNING ("FIXME: implement support for BlockDuration"); + break; } default: - GST_WARNING ("Unknown entry 0x%x in blockgroup data", id); - /* fall-through */ + GST_WARNING ("Unknown entry 0x%x in blockgroup data", id); + /* fall-through */ case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; } if (demux->level_up) { @@ -1789,7 +1795,7 @@ gst_matroska_demux_parse_blockgroup (GstMatroskaDemux *demux, } static gboolean -gst_matroska_demux_parse_cluster (GstMatroskaDemux *demux) +gst_matroska_demux_parse_cluster (GstMatroskaDemux * demux) { GstEbmlRead *ebml = GST_EBML_READ (demux); gboolean res = TRUE; @@ -1814,34 +1820,35 @@ gst_matroska_demux_parse_cluster (GstMatroskaDemux *demux) } switch (id) { - /* cluster timecode */ - case GST_MATROSKA_ID_CLUSTERTIMECODE: { - guint64 num; - if (!gst_ebml_read_uint (ebml, &id, &num)) { - res = FALSE; - break; - } - cluster_time = num * demux->time_scale; - break; + /* cluster timecode */ + case GST_MATROSKA_ID_CLUSTERTIMECODE:{ + guint64 num; + + if (!gst_ebml_read_uint (ebml, &id, &num)) { + res = FALSE; + break; + } + cluster_time = num * demux->time_scale; + break; } - /* a group of blocks inside a cluster */ + /* a group of blocks inside a cluster */ case GST_MATROSKA_ID_BLOCKGROUP: - if (!gst_ebml_read_master (ebml, &id)) { - res = FALSE; - break; - } - res = gst_matroska_demux_parse_blockgroup (demux, cluster_time); - break; + if (!gst_ebml_read_master (ebml, &id)) { + res = FALSE; + break; + } + res = gst_matroska_demux_parse_blockgroup (demux, cluster_time); + break; default: - GST_WARNING ("Unknown entry 0x%x in cluster data", id); - /* fall-through */ + GST_WARNING ("Unknown entry 0x%x in cluster data", id); + /* fall-through */ case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; } if (demux->level_up) { @@ -1854,7 +1861,7 @@ gst_matroska_demux_parse_cluster (GstMatroskaDemux *demux) } static gboolean -gst_matroska_demux_parse_contents (GstMatroskaDemux *demux) +gst_matroska_demux_parse_contents (GstMatroskaDemux * demux) { GstEbmlRead *ebml = GST_EBML_READ (demux); gboolean res = TRUE; @@ -1870,162 +1877,163 @@ gst_matroska_demux_parse_contents (GstMatroskaDemux *demux) } switch (id) { - case GST_MATROSKA_ID_SEEKENTRY: { - guint32 seek_id = 0; - guint64 seek_pos = (guint64) -1, t; - - if (!gst_ebml_read_master (ebml, &id)) { - res = FALSE; - break; - } - - while (res) { - if (!(id = gst_ebml_peek_id (ebml, &demux->level_up))) { - res = FALSE; - break; - } else if (demux->level_up) { - demux->level_up--; - break; - } - - switch (id) { - case GST_MATROSKA_ID_SEEKID: - if (!gst_ebml_read_uint (ebml, &id, &t)) - res = FALSE; - seek_id = t; - break; - - case GST_MATROSKA_ID_SEEKPOSITION: - if (!gst_ebml_read_uint (ebml, &id, &seek_pos)) - res = FALSE; - break; - - default: - GST_WARNING ("Unknown seekhead ID 0x%x", id); - /* fall-through */ - - case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; - } - - if (demux->level_up) { - demux->level_up--; - break; - } - } - - if (!seek_id || seek_pos == (guint64) -1) { - GST_WARNING ("Incomplete seekhead entry (0x%x/%" - G_GUINT64_FORMAT ")", seek_id, seek_pos); - break; - } - - switch (seek_id) { - case GST_MATROSKA_ID_CUES: - case GST_MATROSKA_ID_TAGS: { - guint level_up = demux->level_up; - guint64 before_pos, length; - GstEbmlLevel *level; - GstEvent *event; - - /* remember */ - length = gst_bytestream_length (ebml->bs); - before_pos = gst_bytestream_tell (ebml->bs); - - /* check for validity */ - if (seek_pos + demux->segment_start + 12 >= length) { - g_warning ("Seekhead reference lies outside file!"); - break; - } - - /* seek */ - if (!(event = gst_ebml_read_seek (ebml, - seek_pos + demux->segment_start))) - return FALSE; - gst_event_unref (event); - - /* we don't want to lose our seekhead level, so we add - * a dummy. This is a crude hack. */ - level = g_new (GstEbmlLevel, 1); - level->start = 0; - level->length = G_MAXUINT64; - ebml->level = g_list_append (ebml->level, level); - - /* check ID */ - if (!(id = gst_ebml_peek_id (ebml, &demux->level_up))) { - res = FALSE; - break; - } - if (id != seek_id) { - g_warning ("We looked for ID=0x%x but got ID=0x%x (pos=%llu)", - seek_id, id, seek_pos + demux->segment_start); - goto finish; - } - - /* read master + parse */ - switch (id) { - case GST_MATROSKA_ID_CUES: - if (!gst_ebml_read_master (ebml, &id)) - res = FALSE; - else if (!gst_matroska_demux_parse_index (demux, TRUE) && - gst_bytestream_length (ebml->bs) != - gst_bytestream_tell (ebml->bs)) - res = FALSE; - else - demux->index_parsed = TRUE; - break; - case GST_MATROSKA_ID_TAGS: - if (!gst_ebml_read_master (ebml, &id)) - res = FALSE; - else if (!gst_matroska_demux_parse_metadata (demux, TRUE) && - gst_bytestream_length (ebml->bs) != - gst_bytestream_tell (ebml->bs)) - res = FALSE; - else - demux->metadata_parsed = TRUE; - break; - } - if (!res) - break; - - finish: - /* remove dummy level */ - while (ebml->level) { - guint64 length; - level = g_list_last (ebml->level)->data; - ebml->level = g_list_remove (ebml->level, level); - length = level->length; - g_free (level); - if (length == G_MAXUINT64) - break; - } - - /* seek back */ - if (!(event = gst_ebml_read_seek (ebml, before_pos))) - return FALSE; - gst_event_unref (event); - demux->level_up = level_up; - break; - } - - default: - GST_INFO ("Ignoring seekhead entry for ID=0x%x", seek_id); - break; - } - - break; + case GST_MATROSKA_ID_SEEKENTRY:{ + guint32 seek_id = 0; + guint64 seek_pos = (guint64) - 1, t; + + if (!gst_ebml_read_master (ebml, &id)) { + res = FALSE; + break; + } + + while (res) { + if (!(id = gst_ebml_peek_id (ebml, &demux->level_up))) { + res = FALSE; + break; + } else if (demux->level_up) { + demux->level_up--; + break; + } + + switch (id) { + case GST_MATROSKA_ID_SEEKID: + if (!gst_ebml_read_uint (ebml, &id, &t)) + res = FALSE; + seek_id = t; + break; + + case GST_MATROSKA_ID_SEEKPOSITION: + if (!gst_ebml_read_uint (ebml, &id, &seek_pos)) + res = FALSE; + break; + + default: + GST_WARNING ("Unknown seekhead ID 0x%x", id); + /* fall-through */ + + case GST_EBML_ID_VOID: + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; + } + + if (demux->level_up) { + demux->level_up--; + break; + } + } + + if (!seek_id || seek_pos == (guint64) - 1) { + GST_WARNING ("Incomplete seekhead entry (0x%x/%" + G_GUINT64_FORMAT ")", seek_id, seek_pos); + break; + } + + switch (seek_id) { + case GST_MATROSKA_ID_CUES: + case GST_MATROSKA_ID_TAGS:{ + guint level_up = demux->level_up; + guint64 before_pos, length; + GstEbmlLevel *level; + GstEvent *event; + + /* remember */ + length = gst_bytestream_length (ebml->bs); + before_pos = gst_bytestream_tell (ebml->bs); + + /* check for validity */ + if (seek_pos + demux->segment_start + 12 >= length) { + g_warning ("Seekhead reference lies outside file!"); + break; + } + + /* seek */ + if (!(event = gst_ebml_read_seek (ebml, + seek_pos + demux->segment_start))) + return FALSE; + gst_event_unref (event); + + /* we don't want to lose our seekhead level, so we add + * a dummy. This is a crude hack. */ + level = g_new (GstEbmlLevel, 1); + level->start = 0; + level->length = G_MAXUINT64; + ebml->level = g_list_append (ebml->level, level); + + /* check ID */ + if (!(id = gst_ebml_peek_id (ebml, &demux->level_up))) { + res = FALSE; + break; + } + if (id != seek_id) { + g_warning ("We looked for ID=0x%x but got ID=0x%x (pos=%llu)", + seek_id, id, seek_pos + demux->segment_start); + goto finish; + } + + /* read master + parse */ + switch (id) { + case GST_MATROSKA_ID_CUES: + if (!gst_ebml_read_master (ebml, &id)) + res = FALSE; + else if (!gst_matroska_demux_parse_index (demux, TRUE) && + gst_bytestream_length (ebml->bs) != + gst_bytestream_tell (ebml->bs)) + res = FALSE; + else + demux->index_parsed = TRUE; + break; + case GST_MATROSKA_ID_TAGS: + if (!gst_ebml_read_master (ebml, &id)) + res = FALSE; + else if (!gst_matroska_demux_parse_metadata (demux, TRUE) && + gst_bytestream_length (ebml->bs) != + gst_bytestream_tell (ebml->bs)) + res = FALSE; + else + demux->metadata_parsed = TRUE; + break; + } + if (!res) + break; + + finish: + /* remove dummy level */ + while (ebml->level) { + guint64 length; + + level = g_list_last (ebml->level)->data; + ebml->level = g_list_remove (ebml->level, level); + length = level->length; + g_free (level); + if (length == G_MAXUINT64) + break; + } + + /* seek back */ + if (!(event = gst_ebml_read_seek (ebml, before_pos))) + return FALSE; + gst_event_unref (event); + demux->level_up = level_up; + break; + } + + default: + GST_INFO ("Ignoring seekhead entry for ID=0x%x", seek_id); + break; + } + + break; } default: - GST_WARNING ("Unknown seekhead ID 0x%x", id); - /* fall-through */ + GST_WARNING ("Unknown seekhead ID 0x%x", id); + /* fall-through */ case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; } if (demux->level_up) { @@ -2038,7 +2046,7 @@ gst_matroska_demux_parse_contents (GstMatroskaDemux *demux) } static gboolean -gst_matroska_demux_loop_stream (GstMatroskaDemux *demux) +gst_matroska_demux_loop_stream (GstMatroskaDemux * demux) { GstEbmlRead *ebml = GST_EBML_READ (demux); gboolean res = TRUE; @@ -2055,88 +2063,88 @@ gst_matroska_demux_loop_stream (GstMatroskaDemux *demux) } switch (id) { - /* stream info */ - case GST_MATROSKA_ID_INFO: { - if (!gst_ebml_read_master (ebml, &id)) { - res = FALSE; - break; - } - res = gst_matroska_demux_parse_info (demux); - break; + /* stream info */ + case GST_MATROSKA_ID_INFO:{ + if (!gst_ebml_read_master (ebml, &id)) { + res = FALSE; + break; + } + res = gst_matroska_demux_parse_info (demux); + break; } - /* track info headers */ - case GST_MATROSKA_ID_TRACKS: { - if (!gst_ebml_read_master (ebml, &id)) { - res = FALSE; - break; - } - res = gst_matroska_demux_parse_tracks (demux); - break; + /* track info headers */ + case GST_MATROSKA_ID_TRACKS:{ + if (!gst_ebml_read_master (ebml, &id)) { + res = FALSE; + break; + } + res = gst_matroska_demux_parse_tracks (demux); + break; } - /* stream index */ - case GST_MATROSKA_ID_CUES: { - if (!demux->index_parsed) { - if (!gst_ebml_read_master (ebml, &id)) { - res = FALSE; - break; - } - res = gst_matroska_demux_parse_index (demux, FALSE); - } else - res = gst_ebml_read_skip (ebml); - break; + /* stream index */ + case GST_MATROSKA_ID_CUES:{ + if (!demux->index_parsed) { + if (!gst_ebml_read_master (ebml, &id)) { + res = FALSE; + break; + } + res = gst_matroska_demux_parse_index (demux, FALSE); + } else + res = gst_ebml_read_skip (ebml); + break; } - /* metadata */ - case GST_MATROSKA_ID_TAGS: { - if (!demux->index_parsed) { - if (!gst_ebml_read_master (ebml, &id)) { - res = FALSE; - break; - } - res = gst_matroska_demux_parse_metadata (demux, FALSE); - } else - res = gst_ebml_read_skip (ebml); - break; + /* metadata */ + case GST_MATROSKA_ID_TAGS:{ + if (!demux->index_parsed) { + if (!gst_ebml_read_master (ebml, &id)) { + res = FALSE; + break; + } + res = gst_matroska_demux_parse_metadata (demux, FALSE); + } else + res = gst_ebml_read_skip (ebml); + break; } - /* file index (if seekable, seek to Cues/Tags to parse it) */ - case GST_MATROSKA_ID_SEEKHEAD: { - if (!gst_ebml_read_master (ebml, &id)) { - res = FALSE; - break; - } - res = gst_matroska_demux_parse_contents (demux); - break; + /* file index (if seekable, seek to Cues/Tags to parse it) */ + case GST_MATROSKA_ID_SEEKHEAD:{ + if (!gst_ebml_read_master (ebml, &id)) { + res = FALSE; + break; + } + res = gst_matroska_demux_parse_contents (demux); + break; } - case GST_MATROSKA_ID_CLUSTER: { - if (!gst_ebml_read_master (ebml, &id)) { - res = FALSE; - break; - } - /* The idea is that we parse one cluster per loop and - * then break out of the loop here. In the next call - * of the loopfunc, we will get back here with the - * next cluster. If an error occurs, we didn't - * actually push a buffer, but we still want to break - * out of the loop to handle a possible error. We'll - * get back here if it's recoverable. */ - gst_matroska_demux_parse_cluster (demux); - demux->state = GST_MATROSKA_DEMUX_STATE_DATA; - res = FALSE; - break; + case GST_MATROSKA_ID_CLUSTER:{ + if (!gst_ebml_read_master (ebml, &id)) { + res = FALSE; + break; + } + /* The idea is that we parse one cluster per loop and + * then break out of the loop here. In the next call + * of the loopfunc, we will get back here with the + * next cluster. If an error occurs, we didn't + * actually push a buffer, but we still want to break + * out of the loop to handle a possible error. We'll + * get back here if it's recoverable. */ + gst_matroska_demux_parse_cluster (demux); + demux->state = GST_MATROSKA_DEMUX_STATE_DATA; + res = FALSE; + break; } default: - GST_WARNING ("Unknown matroska file header ID 0x%x", id); - /* fall-through */ + GST_WARNING ("Unknown matroska file header ID 0x%x", id); + /* fall-through */ case GST_EBML_ID_VOID: - if (!gst_ebml_read_skip (ebml)) - res = FALSE; - break; + if (!gst_ebml_read_skip (ebml)) + res = FALSE; + break; } if (demux->level_up) { @@ -2149,7 +2157,7 @@ gst_matroska_demux_loop_stream (GstMatroskaDemux *demux) } static void -gst_matroska_demux_loop (GstElement *element) +gst_matroska_demux_loop (GstElement * element) { GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (element); @@ -2165,14 +2173,10 @@ gst_matroska_demux_loop (GstElement *element) } static GstCaps * -gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext *videocontext, - const gchar *codec_id, - gpointer data, - guint size, - GstMatroskaDemux *demux) +gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext * videocontext, + const gchar * codec_id, gpointer data, guint size, GstMatroskaDemux * demux) { - GstMatroskaTrackContext *context = - (GstMatroskaTrackContext *) videocontext; + GstMatroskaTrackContext *context = (GstMatroskaTrackContext *) videocontext; GstCaps *caps = NULL; if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_VFW_FOURCC)) { @@ -2181,39 +2185,42 @@ gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext *videocontext, if (data) { char *codec_name = NULL; GstTagList *list = gst_tag_list_new (); - + vids = (gst_riff_strf_vids *) data; /* assure size is big enough */ if (size < 24) { - GST_WARNING ("Too small BITMAPINFOHEADER (%d bytes)", size); - return NULL; + GST_WARNING ("Too small BITMAPINFOHEADER (%d bytes)", size); + return NULL; } if (size < sizeof (gst_riff_strf_vids)) { - vids = (gst_riff_strf_vids *) g_realloc (vids, sizeof (gst_riff_strf_vids)); + vids = + (gst_riff_strf_vids *) g_realloc (vids, + sizeof (gst_riff_strf_vids)); } /* little-endian -> byte-order */ - vids->size = GUINT32_FROM_LE (vids->size); - vids->width = GUINT32_FROM_LE (vids->width); - vids->height = GUINT32_FROM_LE (vids->height); - vids->planes = GUINT16_FROM_LE (vids->planes); - vids->bit_cnt = GUINT16_FROM_LE (vids->bit_cnt); + vids->size = GUINT32_FROM_LE (vids->size); + vids->width = GUINT32_FROM_LE (vids->width); + vids->height = GUINT32_FROM_LE (vids->height); + vids->planes = GUINT16_FROM_LE (vids->planes); + vids->bit_cnt = GUINT16_FROM_LE (vids->bit_cnt); vids->compression = GUINT32_FROM_LE (vids->compression); - vids->image_size = GUINT32_FROM_LE (vids->image_size); + vids->image_size = GUINT32_FROM_LE (vids->image_size); vids->xpels_meter = GUINT32_FROM_LE (vids->xpels_meter); vids->ypels_meter = GUINT32_FROM_LE (vids->ypels_meter); - vids->num_colors = GUINT32_FROM_LE (vids->num_colors); - vids->imp_colors = GUINT32_FROM_LE (vids->imp_colors); + vids->num_colors = GUINT32_FROM_LE (vids->num_colors); + vids->imp_colors = GUINT32_FROM_LE (vids->imp_colors); caps = gst_riff_create_video_caps (vids->compression, NULL, vids, - &codec_name); + &codec_name); gst_tag_list_add (list, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC, - codec_name, NULL); + codec_name, NULL); if (GST_IS_ELEMENT (demux)) - gst_element_found_tags (GST_ELEMENT (demux), list); + gst_element_found_tags (GST_ELEMENT (demux), list); gst_tag_list_free (list); - if (codec_name) g_free (codec_name); + if (codec_name) + g_free (codec_name); } else { caps = gst_riff_create_video_template_caps (); } @@ -2223,15 +2230,15 @@ gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext *videocontext, guint32 fourcc = 0; switch (videocontext->fourcc) { - case GST_MAKE_FOURCC ('I','4','2','0'): - case GST_MAKE_FOURCC ('Y','U','Y','2'): - fourcc = videocontext->fourcc; - break; - - default: - GST_DEBUG ("Unknown fourcc " GST_FOURCC_FORMAT, - GST_FOURCC_ARGS (videocontext->fourcc)); - return NULL; + case GST_MAKE_FOURCC ('I', '4', '2', '0'): + case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): + fourcc = videocontext->fourcc; + break; + + default: + GST_DEBUG ("Unknown fourcc " GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (videocontext->fourcc)); + return NULL; } caps = gst_caps_new_simple ("video/x-raw-yuv", @@ -2244,24 +2251,20 @@ gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext *videocontext, caps = gst_caps_new_simple ("video/x-divx", "divxversion", G_TYPE_INT, 4, NULL); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_ASP) || - !strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_AP)) { - caps = gst_caps_new_full ( - gst_structure_new ("video/x-divx", - "divxversion", G_TYPE_INT, 5, NULL), + !strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_AP)) { + caps = gst_caps_new_full (gst_structure_new ("video/x-divx", + "divxversion", G_TYPE_INT, 5, NULL), gst_structure_new ("video/x-xvid", NULL), gst_structure_new ("video/mpeg", - "mpegversion", G_TYPE_INT, 4, - "systemstream", G_TYPE_BOOLEAN, FALSE, NULL), - NULL); + "mpegversion", G_TYPE_INT, 4, + "systemstream", G_TYPE_BOOLEAN, FALSE, NULL), NULL); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MSMPEG4V3)) { - caps = gst_caps_new_full ( - gst_structure_new ("video/x-divx", - "divxversion", G_TYPE_INT, 3, NULL), + caps = gst_caps_new_full (gst_structure_new ("video/x-divx", + "divxversion", G_TYPE_INT, 3, NULL), gst_structure_new ("video/x-msmpeg", - "msmpegversion", G_TYPE_INT, 43, NULL), - NULL); + "msmpegversion", G_TYPE_INT, 43, NULL), NULL); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG1) || - !strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG2)) { + !strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG2)) { gint mpegversion = -1; if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MPEG1)) @@ -2273,12 +2276,11 @@ gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext *videocontext, caps = gst_caps_new_simple ("video/mpeg", "systemstream", G_TYPE_BOOLEAN, FALSE, - "mpegversion", G_TYPE_INT, mpegversion, NULL); + "mpegversion", G_TYPE_INT, mpegversion, NULL); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_MJPEG)) { caps = gst_caps_new_simple ("video/x-jpeg", NULL); } else { - GST_WARNING ("Unknown codec '%s', cannot build Caps", - codec_id); + GST_WARNING ("Unknown codec '%s', cannot build Caps", codec_id); return NULL; } @@ -2286,54 +2288,49 @@ gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext *videocontext, int i; GstStructure *structure; - for (i=0;i<gst_caps_get_size(caps);i++){ + for (i = 0; i < gst_caps_get_size (caps); i++) { structure = gst_caps_get_structure (caps, i); if (videocontext != NULL) { - if (videocontext->pixel_width > 0 && - videocontext->pixel_height > 0) { - gint w = videocontext->pixel_width; - gint h = videocontext->pixel_height; + if (videocontext->pixel_width > 0 && videocontext->pixel_height > 0) { + gint w = videocontext->pixel_width; + gint h = videocontext->pixel_height; gst_structure_set (structure, - "width", G_TYPE_INT, w, - "height", G_TYPE_INT, h, NULL); - } else { + "width", G_TYPE_INT, w, "height", G_TYPE_INT, h, NULL); + } else { gst_structure_set (structure, "width", GST_TYPE_INT_RANGE, 16, 4096, - "height", GST_TYPE_INT_RANGE, 16, 4096, - NULL); - } + "height", GST_TYPE_INT_RANGE, 16, 4096, NULL); + } #if 0 - if (videocontext->display_width > 0 && - videocontext->display_height > 0) { - gint w = 100 * videocontext->display_width / videocontext->pixel_width; - gint h = 100 * videocontext->display_height / videocontext->pixel_height; + if (videocontext->display_width > 0 && videocontext->display_height > 0) { + gint w = + 100 * videocontext->display_width / videocontext->pixel_width; + gint h = + 100 * videocontext->display_height / videocontext->pixel_height; gst_structure_set (structure, "pixel_width", G_TYPE_INT, w, - "pixel_height", G_TYPE_INT, h, - NULL); - } + "pixel_height", G_TYPE_INT, h, NULL); + } #endif - if (context->default_duration > 0) { - gfloat framerate = 1. * GST_SECOND / context->default_duration; + if (context->default_duration > 0) { + gfloat framerate = 1. * GST_SECOND / context->default_duration; gst_structure_set (structure, "framerate", G_TYPE_DOUBLE, framerate, NULL); - } else { - /* sort of a hack to get most codecs to support, + } else { + /* sort of a hack to get most codecs to support, * even if the default_duration is missing */ - gst_structure_set (structure, - "framerate", G_TYPE_DOUBLE, 25.0, NULL); - } + gst_structure_set (structure, "framerate", G_TYPE_DOUBLE, 25.0, NULL); + } } else { gst_structure_set (structure, "width", GST_TYPE_INT_RANGE, 16, 4096, "height", GST_TYPE_INT_RANGE, 16, 4096, "pixel_width", GST_TYPE_INT_RANGE, 0, 255, "pixel_height", GST_TYPE_INT_RANGE, 0, 255, - "framerate", GST_TYPE_DOUBLE_RANGE, 0.0, G_MAXDOUBLE, - NULL); + "framerate", GST_TYPE_DOUBLE_RANGE, 0.0, G_MAXDOUBLE, NULL); } } } @@ -2342,14 +2339,10 @@ gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext *videocontext, } static GstCaps * -gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext *audiocontext, - const gchar *codec_id, - gpointer data, - guint size, - GstMatroskaDemux *demux) +gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext * audiocontext, + const gchar * codec_id, gpointer data, guint size, GstMatroskaDemux * demux) { - GstMatroskaTrackContext *context = - (GstMatroskaTrackContext *) audiocontext; + GstMatroskaTrackContext *context = (GstMatroskaTrackContext *) audiocontext; GstCaps *caps = NULL; if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L1) || @@ -2367,10 +2360,9 @@ gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext *audiocontext, g_assert (0); caps = gst_caps_new_simple ("audio/mpeg", - "mpegversion", G_TYPE_INT, 1, - "layer", G_TYPE_INT, layer, NULL); + "mpegversion", G_TYPE_INT, 1, "layer", G_TYPE_INT, layer, NULL); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_BE) || - !strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_LE)) { + !strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_LE)) { gint endianness = -1; if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_BE)) @@ -2388,8 +2380,7 @@ gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext *audiocontext, } else { caps = gst_caps_from_string ("audio/x-raw-int, " "signed = (boolean) { TRUE, FALSE }, " - "depth = (int) { 8, 16 }, " - "width = (int) { 8, 16 }"); + "depth = (int) { 8, 16 }, " "width = (int) { 8, 16 }"); } gst_caps_set_simple (caps, "endianness", G_TYPE_INT, endianness, NULL); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_PCM_FLOAT)) { @@ -2400,11 +2391,10 @@ gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext *audiocontext, gst_caps_set_simple (caps, "width", G_TYPE_INT, audiocontext->bitdepth, NULL); } else { - gst_caps_set_simple (caps, - "width", GST_TYPE_INT_RANGE, 32, 64, NULL); + gst_caps_set_simple (caps, "width", GST_TYPE_INT_RANGE, 32, 64, NULL); } } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_AC3) || - !strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_DTS)) { + !strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_DTS)) { caps = gst_caps_new_simple ("audio/x-ac3", NULL); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_VORBIS)) { caps = gst_caps_new_simple ("audio/x-vorbis", NULL); @@ -2414,47 +2404,47 @@ gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext *audiocontext, if (data) { char *codec_name = NULL; GstTagList *list = gst_tag_list_new (); - + auds = (gst_riff_strf_auds *) data; /* little-endian -> byte-order */ - auds->format = GUINT16_FROM_LE (auds->format); - auds->channels = GUINT16_FROM_LE (auds->channels); - auds->rate = GUINT32_FROM_LE (auds->rate); - auds->av_bps = GUINT32_FROM_LE (auds->av_bps); + auds->format = GUINT16_FROM_LE (auds->format); + auds->channels = GUINT16_FROM_LE (auds->channels); + auds->rate = GUINT32_FROM_LE (auds->rate); + auds->av_bps = GUINT32_FROM_LE (auds->av_bps); auds->blockalign = GUINT16_FROM_LE (auds->blockalign); - auds->size = GUINT16_FROM_LE (auds->size); + auds->size = GUINT16_FROM_LE (auds->size); caps = gst_riff_create_audio_caps (auds->format, NULL, auds, &codec_name); gst_tag_list_add (list, GST_TAG_MERGE_APPEND, GST_TAG_AUDIO_CODEC, - codec_name, NULL); + codec_name, NULL); if (GST_IS_ELEMENT (demux)) - gst_element_found_tags (GST_ELEMENT (demux), list); + gst_element_found_tags (GST_ELEMENT (demux), list); gst_tag_list_free (list); - if (codec_name) g_free (codec_name); + if (codec_name) + g_free (codec_name); } else { caps = gst_riff_create_audio_template_caps (); } } else if (!strncmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG2, - strlen (GST_MATROSKA_CODEC_ID_AUDIO_MPEG2)) || - !strncmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG4, - strlen (GST_MATROSKA_CODEC_ID_AUDIO_MPEG4))) { + strlen (GST_MATROSKA_CODEC_ID_AUDIO_MPEG2)) || + !strncmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG4, + strlen (GST_MATROSKA_CODEC_ID_AUDIO_MPEG4))) { gint mpegversion = -1; if (!strncmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG2, - strlen (GST_MATROSKA_CODEC_ID_AUDIO_MPEG2))) + strlen (GST_MATROSKA_CODEC_ID_AUDIO_MPEG2))) mpegversion = 2; else if (!strncmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_MPEG4, - strlen (GST_MATROSKA_CODEC_ID_AUDIO_MPEG4))) + strlen (GST_MATROSKA_CODEC_ID_AUDIO_MPEG4))) mpegversion = 4; else g_assert (0); caps = gst_caps_new_simple ("audio/mpeg", - "mpegversion", G_TYPE_INT, mpegversion, NULL); + "mpegversion", G_TYPE_INT, mpegversion, NULL); } else { - GST_WARNING ("Unknown codec '%s', cannot build Caps", - codec_id); + GST_WARNING ("Unknown codec '%s', cannot build Caps", codec_id); return NULL; } @@ -2462,21 +2452,18 @@ gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext *audiocontext, GstStructure *structure; int i; - for (i=0; i<gst_caps_get_size(caps); i++){ + for (i = 0; i < gst_caps_get_size (caps); i++) { structure = gst_caps_get_structure (caps, i); if (audiocontext != NULL) { - if (audiocontext->samplerate > 0 && - audiocontext->channels > 0) { + if (audiocontext->samplerate > 0 && audiocontext->channels > 0) { gst_structure_set (structure, "channels", G_TYPE_INT, audiocontext->channels, - "rate", G_TYPE_INT, audiocontext->samplerate, - NULL); - } + "rate", G_TYPE_INT, audiocontext->samplerate, NULL); + } } else { gst_structure_set (structure, "channels", GST_TYPE_INT_RANGE, 1, 6, - "rate", GST_TYPE_INT_RANGE, 4000, 96000, - NULL); + "rate", GST_TYPE_INT_RANGE, 4000, 96000, NULL); } } } @@ -2485,10 +2472,8 @@ gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext *audiocontext, } static GstCaps * -gst_matroska_demux_complex_caps (GstMatroskaTrackComplexContext *complexcontext, - const gchar *codec_id, - gpointer data, - guint size) +gst_matroska_demux_complex_caps (GstMatroskaTrackComplexContext * + complexcontext, const gchar * codec_id, gpointer data, guint size) { GstCaps *caps = NULL; @@ -2498,10 +2483,8 @@ gst_matroska_demux_complex_caps (GstMatroskaTrackComplexContext *complexcontext, } static GstCaps * -gst_matroska_demux_subtitle_caps (GstMatroskaTrackSubtitleContext *subtitlecontext, - const gchar *codec_id, - gpointer data, - guint size) +gst_matroska_demux_subtitle_caps (GstMatroskaTrackSubtitleContext * + subtitlecontext, const gchar * codec_id, gpointer data, guint size) { GstCaps *caps = NULL; @@ -2511,7 +2494,7 @@ gst_matroska_demux_subtitle_caps (GstMatroskaTrackSubtitleContext *subtitleconte } static GstElementStateReturn -gst_matroska_demux_change_state (GstElement *element) +gst_matroska_demux_change_state (GstElement * element) { GstMatroskaDemux *demux = GST_MATROSKA_DEMUX (element); @@ -2530,10 +2513,8 @@ gst_matroska_demux_change_state (GstElement *element) } static void -gst_matroska_demux_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) +gst_matroska_demux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) { GstMatroskaDemux *demux; @@ -2554,7 +2535,7 @@ gst_matroska_demux_get_property (GObject *object, } gboolean -gst_matroska_demux_plugin_init (GstPlugin *plugin) +gst_matroska_demux_plugin_init (GstPlugin * plugin) { gint i; GstCaps *videosrccaps, *audiosrccaps, *subtitlesrccaps, *temp; @@ -2572,30 +2553,25 @@ gst_matroska_demux_plugin_init (GstPlugin *plugin) NULL, }, *audio_id[] = { GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L1, - GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L2, - GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L3, - GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_BE, - GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_LE, - GST_MATROSKA_CODEC_ID_AUDIO_PCM_FLOAT, - GST_MATROSKA_CODEC_ID_AUDIO_AC3, - GST_MATROSKA_CODEC_ID_AUDIO_ACM, - GST_MATROSKA_CODEC_ID_AUDIO_VORBIS, - GST_MATROSKA_CODEC_ID_AUDIO_MPEG2, - GST_MATROSKA_CODEC_ID_AUDIO_MPEG4, - /* TODO: AC3-9/10, Real, Musepack, Quicktime */ + GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L2, + GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L3, + GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_BE, + GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_LE, + GST_MATROSKA_CODEC_ID_AUDIO_PCM_FLOAT, + GST_MATROSKA_CODEC_ID_AUDIO_AC3, + GST_MATROSKA_CODEC_ID_AUDIO_ACM, + GST_MATROSKA_CODEC_ID_AUDIO_VORBIS, + GST_MATROSKA_CODEC_ID_AUDIO_MPEG2, GST_MATROSKA_CODEC_ID_AUDIO_MPEG4, + /* TODO: AC3-9/10, Real, Musepack, Quicktime */ + /* FILLME */ + NULL,}, *complex_id[] = { /* FILLME */ - NULL, - }, *complex_id[] = { - /* FILLME */ - NULL, - }, *subtitle_id[] = { + NULL,}, *subtitle_id[] = { /* FILLME */ - NULL, - }; + NULL,}; /* this filter needs the riff parser */ - if (!gst_library_load ("gstbytestream") || - !gst_library_load ("riff")) /* for fourcc stuff */ + if (!gst_library_load ("gstbytestream") || !gst_library_load ("riff")) /* for fourcc stuff */ return FALSE; /* video src template */ @@ -2609,9 +2585,7 @@ gst_matroska_demux_plugin_init (GstPlugin *plugin) gst_caps_append (videosrccaps, temp); } videosrctempl = gst_pad_template_new ("video_%02d", - GST_PAD_SRC, - GST_PAD_SOMETIMES, - videosrccaps); + GST_PAD_SRC, GST_PAD_SOMETIMES, videosrccaps); audiosrccaps = gst_caps_new_empty (); /* audio src template */ @@ -2620,9 +2594,7 @@ gst_matroska_demux_plugin_init (GstPlugin *plugin) gst_caps_append (audiosrccaps, temp); } audiosrctempl = gst_pad_template_new ("audio_%02d", - GST_PAD_SRC, - GST_PAD_SOMETIMES, - audiosrccaps); + GST_PAD_SRC, GST_PAD_SOMETIMES, audiosrccaps); subtitlesrccaps = gst_caps_new_empty (); /* subtitle src template */ @@ -2631,13 +2603,11 @@ gst_matroska_demux_plugin_init (GstPlugin *plugin) gst_caps_append (subtitlesrccaps, temp); } subtitlesrctempl = gst_pad_template_new ("subtitle_%02d", - GST_PAD_SRC, - GST_PAD_SOMETIMES, - subtitlesrccaps); + GST_PAD_SRC, GST_PAD_SOMETIMES, subtitlesrccaps); /* create an elementfactory for the matroska_demux element */ if (!gst_element_register (plugin, "matroskademux", - GST_RANK_PRIMARY, GST_TYPE_MATROSKA_DEMUX)) + GST_RANK_PRIMARY, GST_TYPE_MATROSKA_DEMUX)) return FALSE; return TRUE; diff --git a/gst/matroska/matroska-demux.h b/gst/matroska/matroska-demux.h index e393a52a..7d55a223 100644 --- a/gst/matroska/matroska-demux.h +++ b/gst/matroska/matroska-demux.h @@ -29,7 +29,6 @@ #include "matroska-ids.h" G_BEGIN_DECLS - #define GST_TYPE_MATROSKA_DEMUX \ (gst_matroska_demux_get_type ()) #define GST_MATROSKA_DEMUX(obj) \ @@ -40,71 +39,69 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MATROSKA_DEMUX)) #define GST_IS_MATROSKA_DEMUX_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MATROSKA_DEMUX)) - -#define GST_MATROSKA_DEMUX_MAX_STREAMS 64 - -typedef enum { +#define GST_MATROSKA_DEMUX_MAX_STREAMS 64 + typedef enum +{ GST_MATROSKA_DEMUX_STATE_START, GST_MATROSKA_DEMUX_STATE_HEADER, GST_MATROSKA_DEMUX_STATE_DATA } GstMatroskaDemuxState; -typedef struct _GstMatroskaDemuxIndex { - guint64 pos; /* of the corresponding *cluster*! */ - guint16 track; /* reference to 'num' */ - guint64 time; /* in nanoseconds */ +typedef struct _GstMatroskaDemuxIndex +{ + guint64 pos; /* of the corresponding *cluster*! */ + guint16 track; /* reference to 'num' */ + guint64 time; /* in nanoseconds */ } GstMatroskaDemuxIndex; -typedef struct _GstMatroskaDemux { - GstEbmlRead parent; +typedef struct _GstMatroskaDemux +{ + GstEbmlRead parent; /* pads */ - GstPad *sinkpad; + GstPad *sinkpad; GstMatroskaTrackContext *src[GST_MATROSKA_DEMUX_MAX_STREAMS]; - guint num_streams, - num_v_streams, num_a_streams, num_t_streams; - GstClock *clock; + guint num_streams, num_v_streams, num_a_streams, num_t_streams; + GstClock *clock; /* metadata */ - GstCaps *metadata; - GstCaps *streaminfo; - gchar *muxing_app, *writing_app; - gint64 created; + GstCaps *metadata; + GstCaps *streaminfo; + gchar *muxing_app, *writing_app; + gint64 created; /* state */ GstMatroskaDemuxState state; - guint level_up; + guint level_up; /* did we parse metadata/cues already? */ - gboolean metadata_parsed, - index_parsed; + gboolean metadata_parsed, index_parsed; /* start-of-segment */ - guint64 segment_start; + guint64 segment_start; /* a cue (index) table */ GstMatroskaIndex *index; - guint num_indexes; + guint num_indexes; /* timescale in the file */ - guint64 time_scale; + guint64 time_scale; /* length, position (time, ns) */ - guint64 duration, - pos; + guint64 duration, pos; /* a possible pending seek */ - guint64 seek_pending; + guint64 seek_pending; } GstMatroskaDemux; -typedef struct _GstMatroskaDemuxClass { +typedef struct _GstMatroskaDemuxClass +{ GstEbmlReadClass parent; } GstMatroskaDemuxClass; -GType gst_matroska_demux_get_type (void); +GType gst_matroska_demux_get_type (void); -gboolean gst_matroska_demux_plugin_init (GstPlugin *plugin); +gboolean gst_matroska_demux_plugin_init (GstPlugin * plugin); G_END_DECLS - #endif /* __GST_MATROSKA_DEMUX_H__ */ diff --git a/gst/matroska/matroska-ids.h b/gst/matroska/matroska-ids.h index 64f25c0f..eb4fb315 100644 --- a/gst/matroska/matroska-ids.h +++ b/gst/matroska/matroska-ids.h @@ -148,25 +148,28 @@ * value to what it actually means). */ -typedef enum { - GST_MATROSKA_TRACK_TYPE_VIDEO = 0x1, - GST_MATROSKA_TRACK_TYPE_AUDIO = 0x2, - GST_MATROSKA_TRACK_TYPE_COMPLEX = 0x3, - GST_MATROSKA_TRACK_TYPE_LOGO = 0x10, +typedef enum +{ + GST_MATROSKA_TRACK_TYPE_VIDEO = 0x1, + GST_MATROSKA_TRACK_TYPE_AUDIO = 0x2, + GST_MATROSKA_TRACK_TYPE_COMPLEX = 0x3, + GST_MATROSKA_TRACK_TYPE_LOGO = 0x10, GST_MATROSKA_TRACK_TYPE_SUBTITLE = 0x11, - GST_MATROSKA_TRACK_TYPE_CONTROL = 0x20, + GST_MATROSKA_TRACK_TYPE_CONTROL = 0x20, } GstMatroskaTrackType; -typedef enum { - GST_MATROSKA_EYE_MODE_MONO = 0x0, +typedef enum +{ + GST_MATROSKA_EYE_MODE_MONO = 0x0, GST_MATROSKA_EYE_MODE_RIGHT = 0x1, - GST_MATROSKA_EYE_MODE_LEFT = 0x2, - GST_MATROSKA_EYE_MODE_BOTH = 0x3, + GST_MATROSKA_EYE_MODE_LEFT = 0x2, + GST_MATROSKA_EYE_MODE_BOTH = 0x3, } GstMatroskaEyeMode; -typedef enum { - GST_MATROSKA_ASPECT_RATIO_MODE_FREE = 0x0, - GST_MATROSKA_ASPECT_RATIO_MODE_KEEP = 0x1, +typedef enum +{ + GST_MATROSKA_ASPECT_RATIO_MODE_FREE = 0x0, + GST_MATROSKA_ASPECT_RATIO_MODE_KEEP = 0x1, GST_MATROSKA_ASPECT_RATIO_MODE_FIXED = 0x2, } GstMatroskaAspectRatioMode; @@ -175,64 +178,71 @@ typedef enum { * it's just something I use in the muxer/demuxer. */ -typedef enum { - GST_MATROSKA_TRACK_ENABLED = (1<<0), - GST_MATROSKA_TRACK_DEFAULT = (1<<1), - GST_MATROSKA_TRACK_LACING = (1<<2), - GST_MATROSKA_TRACK_SHIFT = (1<<16) +typedef enum +{ + GST_MATROSKA_TRACK_ENABLED = (1 << 0), + GST_MATROSKA_TRACK_DEFAULT = (1 << 1), + GST_MATROSKA_TRACK_LACING = (1 << 2), + GST_MATROSKA_TRACK_SHIFT = (1 << 16) } GstMatroskaTrackFlags; -typedef enum { - GST_MATROSKA_VIDEOTRACK_INTERLACED = (GST_MATROSKA_TRACK_SHIFT<<0) +typedef enum +{ + GST_MATROSKA_VIDEOTRACK_INTERLACED = (GST_MATROSKA_TRACK_SHIFT << 0) } GstMatroskaVideoTrackFlags; -typedef struct _GstMatroskaTrackContext { - GstPad *pad; - GstCaps *caps; - guint index; +typedef struct _GstMatroskaTrackContext +{ + GstPad *pad; + GstCaps *caps; + guint index; /* some often-used info */ - gchar *codec_id, *codec_name, *name, *language; - gpointer codec_priv; - guint codec_priv_size; + gchar *codec_id, *codec_name, *name, *language; + gpointer codec_priv; + guint codec_priv_size; GstMatroskaTrackType type; - guint uid, num; + guint uid, num; GstMatroskaTrackFlags flags; - guint64 default_duration; + guint64 default_duration; } GstMatroskaTrackContext; -typedef struct _GstMatroskaTrackVideoContext { +typedef struct _GstMatroskaTrackVideoContext +{ GstMatroskaTrackContext parent; - guint pixel_width, pixel_height, - display_width, display_height; + guint pixel_width, pixel_height, display_width, display_height; GstMatroskaEyeMode eye_mode; GstMatroskaAspectRatioMode asr_mode; - guint32 fourcc; + guint32 fourcc; } GstMatroskaTrackVideoContext; -typedef struct _GstMatroskaTrackAudioContext { +typedef struct _GstMatroskaTrackAudioContext +{ GstMatroskaTrackContext parent; - guint samplerate, channels, bitdepth; + guint samplerate, channels, bitdepth; } GstMatroskaTrackAudioContext; -typedef struct _GstMatroskaTrackComplexContext { +typedef struct _GstMatroskaTrackComplexContext +{ GstMatroskaTrackContext parent; /* nothing special goes here, apparently */ } GstMatroskaTrackComplexContext; -typedef struct _GstMatroskaTrackSubtitleContext { +typedef struct _GstMatroskaTrackSubtitleContext +{ GstMatroskaTrackContext parent; /* or here... */ } GstMatroskaTrackSubtitleContext; -typedef struct _GstMatroskaIndex { - guint64 pos; /* of the corresponding *cluster*! */ - guint16 track; /* reference to 'num' */ - guint64 time; /* in nanoseconds */ +typedef struct _GstMatroskaIndex +{ + guint64 pos; /* of the corresponding *cluster*! */ + guint16 track; /* reference to 'num' */ + guint64 time; /* in nanoseconds */ } GstMatroskaIndex; #endif /* __GST_MATROSKA_IDS_H__ */ diff --git a/gst/matroska/matroska-mux.c b/gst/matroska/matroska-mux.c index a80be303..ebaff887 100644 --- a/gst/matroska/matroska-mux.c +++ b/gst/matroska/matroska-mux.c @@ -29,24 +29,24 @@ #include "matroska-mux.h" #include "matroska-ids.h" -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_METADATA, /* FILL ME */ }; -static GstStaticPadTemplate src_templ = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-matroska") -); +static GstStaticPadTemplate src_templ = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-matroska") + ); #define COMMON_VIDEO_CAPS \ "width = (int) [ 16, 4096 ], " \ @@ -54,28 +54,24 @@ GST_STATIC_PAD_TEMPLATE ( "framerate = (double) [ 0, MAX ]" static GstStaticPadTemplate videosink_templ = -GST_STATIC_PAD_TEMPLATE ( - "video_%d", - GST_PAD_SINK, - GST_PAD_REQUEST, - GST_STATIC_CAPS ( - "video/mpeg, " - "mpegversion = (int) { 1, 2, 4 }, " - "systemstream = (boolean) false, " - COMMON_VIDEO_CAPS "; " - "video/x-divx, " - COMMON_VIDEO_CAPS "; " - "video/x-xvid, " - COMMON_VIDEO_CAPS "; " - "video/x-msmpeg, " - COMMON_VIDEO_CAPS "; " - "video/x-jpeg, " - COMMON_VIDEO_CAPS "; " - "video/x-raw-yuv, " - "format = (fourcc) { YUY2, I420 }, " - COMMON_VIDEO_CAPS - ) -); + GST_STATIC_PAD_TEMPLATE ("video_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("video/mpeg, " + "mpegversion = (int) { 1, 2, 4 }, " + "systemstream = (boolean) false, " + COMMON_VIDEO_CAPS "; " + "video/x-divx, " + COMMON_VIDEO_CAPS "; " + "video/x-xvid, " + COMMON_VIDEO_CAPS "; " + "video/x-msmpeg, " + COMMON_VIDEO_CAPS "; " + "video/x-jpeg, " + COMMON_VIDEO_CAPS "; " + "video/x-raw-yuv, " + "format = (fourcc) { YUY2, I420 }, " COMMON_VIDEO_CAPS) + ); #define COMMON_AUDIO_CAPS \ "channels = (int) [ 1, 8 ], " \ @@ -86,78 +82,68 @@ GST_STATIC_PAD_TEMPLATE ( * * audio/x-vorbis: private data setup needs work. */ static GstStaticPadTemplate audiosink_templ = -GST_STATIC_PAD_TEMPLATE ( - "audio_%d", - GST_PAD_SINK, - GST_PAD_REQUEST, - GST_STATIC_CAPS ( - "audio/mpeg, " - "mpegversion = (int) 1, " - "layer = (int) [ 1, 3 ], " - COMMON_AUDIO_CAPS "; " - "audio/mpeg, " - "mpegversion = (int) { 2, 4 }, " - COMMON_AUDIO_CAPS "; " - "audio/x-ac3, " - COMMON_AUDIO_CAPS "; " - "audio/x-raw-int, " - "width = (int) { 8, 16, 24 }, " - "depth = (int) { 8, 16, 24 }, " - "endianness = (int) { BIG_ENDIAN, LITTLE_ENDIAN }, " - "signed = (boolean) { true, false }, " - COMMON_AUDIO_CAPS - ) -); + GST_STATIC_PAD_TEMPLATE ("audio_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("audio/mpeg, " + "mpegversion = (int) 1, " + "layer = (int) [ 1, 3 ], " + COMMON_AUDIO_CAPS "; " + "audio/mpeg, " + "mpegversion = (int) { 2, 4 }, " + COMMON_AUDIO_CAPS "; " + "audio/x-ac3, " + COMMON_AUDIO_CAPS "; " + "audio/x-raw-int, " + "width = (int) { 8, 16, 24 }, " + "depth = (int) { 8, 16, 24 }, " + "endianness = (int) { BIG_ENDIAN, LITTLE_ENDIAN }, " + "signed = (boolean) { true, false }, " COMMON_AUDIO_CAPS) + ); static GstStaticPadTemplate subtitlesink_templ = -GST_STATIC_PAD_TEMPLATE ( - "subtitle_%d", - GST_PAD_SINK, - GST_PAD_REQUEST, - GST_STATIC_CAPS_ANY -); +GST_STATIC_PAD_TEMPLATE ("subtitle_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS_ANY); /* gobject magic foo */ -static void gst_matroska_mux_base_init (GstMatroskaMuxClass *klass); -static void gst_matroska_mux_class_init (GstMatroskaMuxClass *klass); -static void gst_matroska_mux_init (GstMatroskaMux *mux); +static void gst_matroska_mux_base_init (GstMatroskaMuxClass * klass); +static void gst_matroska_mux_class_init (GstMatroskaMuxClass * klass); +static void gst_matroska_mux_init (GstMatroskaMux * mux); /* element functions */ -static void gst_matroska_mux_loop (GstElement *element); +static void gst_matroska_mux_loop (GstElement * element); /* pad functions */ -static GstPad * gst_matroska_mux_request_new_pad (GstElement *element, - GstPadTemplate *templ, - const gchar *name); +static GstPad *gst_matroska_mux_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * name); /* gst internal change state handler */ static GstElementStateReturn - gst_matroska_mux_change_state (GstElement *element); +gst_matroska_mux_change_state (GstElement * element); /* gobject bla bla */ -static void gst_matroska_mux_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec); -static void gst_matroska_mux_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); +static void gst_matroska_mux_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_matroska_mux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); /* reset muxer */ -static void gst_matroska_mux_reset (GstElement *element); +static void gst_matroska_mux_reset (GstElement * element); static GstEbmlWriteClass *parent_class = NULL; + /*static guint gst_matroska_mux_signals[LAST_SIGNAL] = { 0 };*/ GType -gst_matroska_mux_get_type (void) +gst_matroska_mux_get_type (void) { static GType gst_matroska_mux_type = 0; if (!gst_matroska_mux_type) { static const GTypeInfo gst_matroska_mux_info = { - sizeof (GstMatroskaMuxClass), + sizeof (GstMatroskaMuxClass), (GBaseInitFunc) gst_matroska_mux_base_init, NULL, (GClassInitFunc) gst_matroska_mux_class_init, @@ -170,15 +156,14 @@ gst_matroska_mux_get_type (void) gst_matroska_mux_type = g_type_register_static (GST_TYPE_EBML_WRITE, - "GstMatroskaMmux", - &gst_matroska_mux_info, 0); + "GstMatroskaMmux", &gst_matroska_mux_info, 0); } return gst_matroska_mux_type; } static void -gst_matroska_mux_base_init (GstMatroskaMuxClass *klass) +gst_matroska_mux_base_init (GstMatroskaMuxClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); static GstElementDetails gst_matroska_mux_details = { @@ -189,19 +174,18 @@ gst_matroska_mux_base_init (GstMatroskaMuxClass *klass) }; gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&videosink_templ)); + gst_static_pad_template_get (&videosink_templ)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&audiosink_templ)); + gst_static_pad_template_get (&audiosink_templ)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&subtitlesink_templ)); + gst_static_pad_template_get (&subtitlesink_templ)); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&src_templ)); - gst_element_class_set_details (element_class, - &gst_matroska_mux_details); + gst_static_pad_template_get (&src_templ)); + gst_element_class_set_details (element_class, &gst_matroska_mux_details); } static void -gst_matroska_mux_class_init (GstMatroskaMuxClass *klass) +gst_matroska_mux_class_init (GstMatroskaMuxClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; @@ -210,8 +194,8 @@ gst_matroska_mux_class_init (GstMatroskaMuxClass *klass) gstelement_class = (GstElementClass *) klass; g_object_class_install_property (gobject_class, ARG_METADATA, - g_param_spec_boxed ("metadata", "Metadata", "Metadata", - GST_TYPE_CAPS, G_PARAM_READWRITE)); + g_param_spec_boxed ("metadata", "Metadata", "Metadata", + GST_TYPE_CAPS, G_PARAM_READWRITE)); parent_class = g_type_class_ref (GST_TYPE_EBML_WRITE); @@ -222,19 +206,19 @@ gst_matroska_mux_class_init (GstMatroskaMuxClass *klass) gstelement_class->request_new_pad = gst_matroska_mux_request_new_pad; } -static void -gst_matroska_mux_init (GstMatroskaMux *mux) +static void +gst_matroska_mux_init (GstMatroskaMux * mux) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (mux); gint i; - mux->srcpad = gst_pad_new_from_template ( - gst_element_class_get_pad_template (klass, "src"), "src"); + mux->srcpad = + gst_pad_new_from_template (gst_element_class_get_pad_template (klass, + "src"), "src"); gst_element_add_pad (GST_ELEMENT (mux), mux->srcpad); GST_EBML_WRITE (mux)->srcpad = mux->srcpad; - gst_element_set_loop_function (GST_ELEMENT (mux), - gst_matroska_mux_loop); + gst_element_set_loop_function (GST_ELEMENT (mux), gst_matroska_mux_loop); /* initial stream no. */ for (i = 0; i < GST_MATROSKA_MUX_MAX_STREAMS; i++) { @@ -248,7 +232,7 @@ gst_matroska_mux_init (GstMatroskaMux *mux) } static void -gst_matroska_mux_reset (GstElement *element) +gst_matroska_mux_reset (GstElement * element) { GstMatroskaMux *mux = GST_MATROSKA_MUX (element); guint i; @@ -260,7 +244,7 @@ gst_matroska_mux_reset (GstElement *element) for (i = 0; i < GST_MATROSKA_MUX_MAX_STREAMS; i++) { if (mux->sink[i].track != NULL) { if (mux->sink[i].track->pad != NULL) { - gst_element_remove_pad (GST_ELEMENT (mux), mux->sink[i].track->pad); + gst_element_remove_pad (GST_ELEMENT (mux), mux->sink[i].track->pad); } g_free (mux->sink[i].track->codec_id); g_free (mux->sink[i].track->codec_name); @@ -284,8 +268,7 @@ gst_matroska_mux_reset (GstElement *element) /* reset media info (to default) */ gst_caps_replace (&mux->metadata, gst_caps_new_simple ("application/x-gst-metadata", - "application", G_TYPE_STRING, "", - "date", G_TYPE_STRING, "", NULL)); + "application", G_TYPE_STRING, "", "date", G_TYPE_STRING, "", NULL)); /* reset indexes */ mux->num_indexes = 0; @@ -298,7 +281,7 @@ gst_matroska_mux_reset (GstElement *element) } static GstPadLinkReturn -gst_matroska_mux_video_pad_link (GstPad *pad, const GstCaps *caps) +gst_matroska_mux_video_pad_link (GstPad * pad, const GstCaps * caps) { GstMatroskaTrackContext *context = NULL; GstMatroskaTrackVideoContext *videocontext; @@ -312,7 +295,7 @@ gst_matroska_mux_video_pad_link (GstPad *pad, const GstCaps *caps) /* find context */ for (i = 0; i < mux->num_streams; i++) { if (mux->sink[i].track && mux->sink[i].track->pad && - mux->sink[i].track->pad == pad) { + mux->sink[i].track->pad == pad) { context = mux->sink[i].track; break; } @@ -373,14 +356,14 @@ gst_matroska_mux_video_pad_link (GstPad *pad, const GstCaps *caps) gst_structure_get_int (structure, "divxversion", &divxversion); switch (divxversion) { case 3: - context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MSMPEG4V3); - break; + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MSMPEG4V3); + break; case 4: - context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_SP); - break; + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_SP); + break; case 5: - context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_ASP); - break; + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_ASP); + break; } return GST_PAD_LINK_OK; @@ -394,14 +377,14 @@ gst_matroska_mux_video_pad_link (GstPad *pad, const GstCaps *caps) gst_structure_get_int (structure, "mpegversion", &mpegversion); switch (mpegversion) { case 1: - context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG1); - break; + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG1); + break; case 2: - context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG2); - break; + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG2); + break; case 3: - context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_ASP); - break; + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_ASP); + break; } return GST_PAD_LINK_OK; @@ -415,8 +398,7 @@ gst_matroska_mux_video_pad_link (GstPad *pad, const GstCaps *caps) } static GstPadLinkReturn -gst_matroska_mux_audio_pad_link (GstPad *pad, - const GstCaps *caps) +gst_matroska_mux_audio_pad_link (GstPad * pad, const GstCaps * caps) { GstMatroskaTrackContext *context = NULL; GstMatroskaTrackAudioContext *audiocontext; @@ -428,7 +410,7 @@ gst_matroska_mux_audio_pad_link (GstPad *pad, /* find context */ for (i = 0; i < mux->num_streams; i++) { if (mux->sink[i].track && mux->sink[i].track->pad && - mux->sink[i].track->pad == pad) { + mux->sink[i].track->pad == pad) { context = mux->sink[i].track; break; } @@ -453,31 +435,29 @@ gst_matroska_mux_audio_pad_link (GstPad *pad, gst_structure_get_int (structure, "mpegversion", &mpegversion); switch (mpegversion) { - case 1: { - gint layer; - - gst_structure_get_int (structure, "layer", &layer); - switch (layer) { - case 1: - context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L1); - break; - case 2: - context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L2); - break; - case 3: - context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L3); - break; - } - break; + case 1:{ + gint layer; + + gst_structure_get_int (structure, "layer", &layer); + switch (layer) { + case 1: + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L1); + break; + case 2: + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L2); + break; + case 3: + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L3); + break; + } + break; } case 2: - context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG2 - "MAIN"); - break; + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG2 "MAIN"); + break; case 4: - context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG4 - "MAIN"); - break; + context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_MPEG4 "MAIN"); + break; } return GST_PAD_LINK_OK; @@ -490,7 +470,7 @@ gst_matroska_mux_audio_pad_link (GstPad *pad, gst_structure_get_int (structure, "depth", &depth); gst_structure_get_int (structure, "signed", &signedness); if (width != depth || - (width == 8 && signedness) || (width == 16 && !signedness)) + (width == 8 && signedness) || (width == 16 && !signedness)) return GST_PAD_LINK_REFUSED; audiocontext->bitdepth = depth; @@ -514,8 +494,7 @@ gst_matroska_mux_audio_pad_link (GstPad *pad, } static GstPadLinkReturn -gst_matroska_mux_subtitle_pad_link (GstPad *pad, - const GstCaps *caps) +gst_matroska_mux_subtitle_pad_link (GstPad * pad, const GstCaps * caps) { /* Consider this as boilerplate code for now. There is * no single subtitle creation element in GStreamer, @@ -525,9 +504,8 @@ gst_matroska_mux_subtitle_pad_link (GstPad *pad, } static GstPad * -gst_matroska_mux_request_new_pad (GstElement *element, - GstPadTemplate *templ, - const gchar *pad_name) +gst_matroska_mux_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * pad_name) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (element); GstMatroskaMux *mux = GST_MATROSKA_MUX (element); @@ -540,21 +518,21 @@ gst_matroska_mux_request_new_pad (GstElement *element, name = g_strdup_printf ("audio_%d", mux->num_a_streams++); linkfunc = gst_matroska_mux_audio_pad_link; context = (GstMatroskaTrackContext *) - g_new0 (GstMatroskaTrackAudioContext, 1); + g_new0 (GstMatroskaTrackAudioContext, 1); context->type = GST_MATROSKA_TRACK_TYPE_AUDIO; context->name = g_strdup ("Audio"); } else if (templ == gst_element_class_get_pad_template (klass, "video_%d")) { name = g_strdup_printf ("video_%d", mux->num_v_streams++); linkfunc = gst_matroska_mux_video_pad_link; context = (GstMatroskaTrackContext *) - g_new0 (GstMatroskaTrackVideoContext, 1); + g_new0 (GstMatroskaTrackVideoContext, 1); context->type = GST_MATROSKA_TRACK_TYPE_VIDEO; context->name = g_strdup ("Video"); } else if (templ == gst_element_class_get_pad_template (klass, "subtitle_%d")) { name = g_strdup_printf ("subtitle_%d", mux->num_t_streams++); linkfunc = gst_matroska_mux_subtitle_pad_link; context = (GstMatroskaTrackContext *) - g_new0 (GstMatroskaTrackSubtitleContext, 1); + g_new0 (GstMatroskaTrackSubtitleContext, 1); context->type = GST_MATROSKA_TRACK_TYPE_SUBTITLE; context->name = g_strdup ("Subtitle"); } else { @@ -569,15 +547,14 @@ gst_matroska_mux_request_new_pad (GstElement *element, context->index = mux->num_streams++; mux->sink[context->index].track = context; context->pad = pad; - context->flags = GST_MATROSKA_TRACK_ENABLED | - GST_MATROSKA_TRACK_DEFAULT; - + context->flags = GST_MATROSKA_TRACK_ENABLED | GST_MATROSKA_TRACK_DEFAULT; + return pad; } static void -gst_matroska_mux_track_header (GstMatroskaMux *mux, - GstMatroskaTrackContext *context) +gst_matroska_mux_track_header (GstMatroskaMux * mux, + GstMatroskaTrackContext * context) { GstEbmlWrite *ebml = GST_EBML_WRITE (mux); guint64 master; @@ -588,53 +565,52 @@ gst_matroska_mux_track_header (GstMatroskaMux *mux, /* type-specific stuff */ switch (context->type) { - case GST_MATROSKA_TRACK_TYPE_VIDEO: { + case GST_MATROSKA_TRACK_TYPE_VIDEO:{ GstMatroskaTrackVideoContext *videocontext = - (GstMatroskaTrackVideoContext *) context; + (GstMatroskaTrackVideoContext *) context; /* framerate, but not in the video part */ gst_ebml_write_uint (ebml, GST_MATROSKA_ID_TRACKDEFAULTDURATION, - context->default_duration); + context->default_duration); - master = gst_ebml_write_master_start (ebml, - GST_MATROSKA_ID_TRACKVIDEO); + master = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_TRACKVIDEO); gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEOPIXELWIDTH, - videocontext->pixel_width); + videocontext->pixel_width); gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEOPIXELHEIGHT, - videocontext->pixel_height); + videocontext->pixel_height); if (videocontext->display_width && videocontext->display_height) { - gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEODISPLAYWIDTH, - videocontext->display_width); - gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEODISPLAYHEIGHT, - videocontext->display_height); + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEODISPLAYWIDTH, + videocontext->display_width); + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEODISPLAYHEIGHT, + videocontext->display_height); } if (context->flags & GST_MATROSKA_VIDEOTRACK_INTERLACED) - gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEOFLAGINTERLACED, 1); + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_VIDEOFLAGINTERLACED, 1); if (videocontext->fourcc) { - guint32 fcc_le = GUINT32_TO_LE (videocontext->fourcc); - gst_ebml_write_binary (ebml, GST_MATROSKA_ID_VIDEOCOLOURSPACE, - (gpointer) &fcc_le, 4); + guint32 fcc_le = GUINT32_TO_LE (videocontext->fourcc); + + gst_ebml_write_binary (ebml, GST_MATROSKA_ID_VIDEOCOLOURSPACE, + (gpointer) & fcc_le, 4); } gst_ebml_write_master_finish (ebml, master); break; } - case GST_MATROSKA_TRACK_TYPE_AUDIO: { + case GST_MATROSKA_TRACK_TYPE_AUDIO:{ GstMatroskaTrackAudioContext *audiocontext = - (GstMatroskaTrackAudioContext *) context; + (GstMatroskaTrackAudioContext *) context; - master = gst_ebml_write_master_start (ebml, - GST_MATROSKA_ID_TRACKAUDIO); + master = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_TRACKAUDIO); if (audiocontext->samplerate != 8000) - gst_ebml_write_float (ebml, GST_MATROSKA_ID_AUDIOSAMPLINGFREQ, - audiocontext->samplerate); + gst_ebml_write_float (ebml, GST_MATROSKA_ID_AUDIOSAMPLINGFREQ, + audiocontext->samplerate); if (audiocontext->channels != 1) - gst_ebml_write_uint (ebml, GST_MATROSKA_ID_AUDIOCHANNELS, - audiocontext->channels); + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_AUDIOCHANNELS, + audiocontext->channels); if (audiocontext->bitdepth) { - gst_ebml_write_uint (ebml, GST_MATROSKA_ID_AUDIOBITDEPTH, - audiocontext->bitdepth); + gst_ebml_write_uint (ebml, GST_MATROSKA_ID_AUDIOBITDEPTH, + audiocontext->bitdepth); } gst_ebml_write_master_finish (ebml, master); @@ -646,31 +622,30 @@ gst_matroska_mux_track_header (GstMatroskaMux *mux, break; } - gst_ebml_write_ascii (ebml, GST_MATROSKA_ID_CODECID, - context->codec_id); + gst_ebml_write_ascii (ebml, GST_MATROSKA_ID_CODECID, context->codec_id); if (context->codec_priv) gst_ebml_write_binary (ebml, GST_MATROSKA_ID_CODECPRIVATE, - context->codec_priv, context->codec_priv_size); + context->codec_priv, context->codec_priv_size); /* FIXME: until we have a nice way of getting the codecname * out of the caps, I'm not going to enable this. Too much * (useless, double, boring) work... */ /*gst_ebml_write_utf8 (ebml, GST_MATROSKA_ID_CODECNAME, - context->codec_name);*/ - gst_ebml_write_utf8 (ebml, GST_MATROSKA_ID_TRACKNAME, - context->name); + context->codec_name); */ + gst_ebml_write_utf8 (ebml, GST_MATROSKA_ID_TRACKNAME, context->name); } static void -gst_matroska_mux_start (GstMatroskaMux *mux) +gst_matroska_mux_start (GstMatroskaMux * mux) { GstEbmlWrite *ebml = GST_EBML_WRITE (mux); guint32 seekhead_id[] = { GST_MATROSKA_ID_INFO, - GST_MATROSKA_ID_TRACKS, - GST_MATROSKA_ID_CUES, + GST_MATROSKA_ID_TRACKS, + GST_MATROSKA_ID_CUES, #if 0 - GST_MATROSKA_ID_TAGS, + GST_MATROSKA_ID_TAGS, #endif - 0 }; + 0 + }; guint64 master, child; gint i; guint tracknum = 1; @@ -679,7 +654,8 @@ gst_matroska_mux_start (GstMatroskaMux *mux) gst_ebml_write_header (ebml, "matroska", 1); /* start a segment */ - mux->segment_pos = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_SEGMENT); + mux->segment_pos = + gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_SEGMENT); mux->segment_master = ebml->pos; /* the rest of the header is cached */ @@ -704,18 +680,18 @@ gst_matroska_mux_start (GstMatroskaMux *mux) gst_ebml_write_float (ebml, GST_MATROSKA_ID_DURATION, 0); gst_ebml_write_utf8 (ebml, GST_MATROSKA_ID_MUXINGAPP, "GStreamer"); if (mux->metadata && - gst_structure_has_field (gst_caps_get_structure(mux->metadata,0), - "application")) { + gst_structure_has_field (gst_caps_get_structure (mux->metadata, 0), + "application")) { const gchar *app; - app = gst_structure_get_string (gst_caps_get_structure(mux->metadata, 0), - "application"); + app = gst_structure_get_string (gst_caps_get_structure (mux->metadata, 0), + "application"); if (app && app[0]) { gst_ebml_write_utf8 (ebml, GST_MATROSKA_ID_WRITINGAPP, app); } } /* FIXME: how do I get this? Automatic? Via tags? */ - /*gst_ebml_write_date (ebml, GST_MATROSKA_ID_DATEUTC, 0);*/ + /*gst_ebml_write_date (ebml, GST_MATROSKA_ID_DATEUTC, 0); */ gst_ebml_write_master_finish (ebml, master); /* tracks */ @@ -736,7 +712,7 @@ gst_matroska_mux_start (GstMatroskaMux *mux) } static void -gst_matroska_mux_finish (GstMatroskaMux *mux) +gst_matroska_mux_finish (GstMatroskaMux * mux) { GstEbmlWrite *ebml = GST_EBML_WRITE (mux); guint64 pos; @@ -754,14 +730,14 @@ gst_matroska_mux_finish (GstMatroskaMux *mux) GstMatroskaIndex *idx = &mux->index[n]; pointentry_master = gst_ebml_write_master_start (ebml, - GST_MATROSKA_ID_POINTENTRY); + GST_MATROSKA_ID_POINTENTRY); gst_ebml_write_date (ebml, GST_MATROSKA_ID_CUETIME, - idx->time / mux->time_scale); + idx->time / mux->time_scale); trackpos_master = gst_ebml_write_master_start (ebml, - GST_MATROSKA_ID_CUETRACKPOSITION); + GST_MATROSKA_ID_CUETRACKPOSITION); gst_ebml_write_uint (ebml, GST_MATROSKA_ID_CUETRACK, idx->track); gst_ebml_write_uint (ebml, GST_MATROSKA_ID_CUECLUSTERPOSITION, - idx->pos - mux->segment_master); + idx->pos - mux->segment_master); gst_ebml_write_master_finish (ebml, trackpos_master); gst_ebml_write_master_finish (ebml, pointentry_master); } @@ -783,29 +759,30 @@ gst_matroska_mux_finish (GstMatroskaMux *mux) * - all entries are local to the segment (so pos - segment_master). * - so each entry is at 12 + 20 + num * 28. */ gst_ebml_replace_uint (ebml, mux->seekhead_pos + 32, - mux->info_pos - mux->segment_master); + mux->info_pos - mux->segment_master); gst_ebml_replace_uint (ebml, mux->seekhead_pos + 60, - mux->tracks_pos - mux->segment_master); + mux->tracks_pos - mux->segment_master); if (mux->index != NULL) { gst_ebml_replace_uint (ebml, mux->seekhead_pos + 88, - mux->cues_pos - mux->segment_master); + mux->cues_pos - mux->segment_master); } else { /* void'ify */ guint64 my_pos = ebml->pos; + gst_ebml_write_seek (ebml, mux->seekhead_pos + 68); gst_ebml_write_buffer_header (ebml, GST_EBML_ID_VOID, 26); gst_ebml_write_seek (ebml, my_pos); } #if 0 gst_ebml_replace_uint (ebml, mux->seekhead_pos + 116, - mux->tags_pos - mux->segment_master); + mux->tags_pos - mux->segment_master); #endif /* update duration */ pos = GST_EBML_WRITE (mux)->pos; gst_ebml_write_seek (ebml, mux->duration_pos); gst_ebml_write_float (ebml, GST_MATROSKA_ID_DURATION, - mux->duration / mux->time_scale); + mux->duration / mux->time_scale); gst_ebml_write_seek (ebml, pos); /* finish segment - this also writes element length */ @@ -813,30 +790,30 @@ gst_matroska_mux_finish (GstMatroskaMux *mux) } static gint -gst_matroska_mux_prepare_data (GstMatroskaMux *mux) +gst_matroska_mux_prepare_data (GstMatroskaMux * mux) { gint i, first = -1; for (i = 0; i < mux->num_streams; i++) { while (!mux->sink[i].eos && !mux->sink[i].buffer && - mux->sink[i].track->num > 0 && - GST_PAD_IS_USABLE (mux->sink[i].track->pad)) { + mux->sink[i].track->num > 0 && + GST_PAD_IS_USABLE (mux->sink[i].track->pad)) { GstData *data; data = gst_pad_pull (mux->sink[i].track->pad); if (GST_IS_EVENT (data)) { - if (GST_EVENT_TYPE (GST_EVENT (data)) == GST_EVENT_EOS) - mux->sink[i].eos = TRUE; - gst_event_unref (GST_EVENT (data)); + if (GST_EVENT_TYPE (GST_EVENT (data)) == GST_EVENT_EOS) + mux->sink[i].eos = TRUE; + gst_event_unref (GST_EVENT (data)); } else { - mux->sink[i].buffer = GST_BUFFER (data); + mux->sink[i].buffer = GST_BUFFER (data); } } if (mux->sink[i].buffer) { if (first < 0 || GST_BUFFER_TIMESTAMP (mux->sink[i].buffer) < - GST_BUFFER_TIMESTAMP (mux->sink[first].buffer)) - first = i; + GST_BUFFER_TIMESTAMP (mux->sink[first].buffer)) + first = i; } } @@ -844,7 +821,7 @@ gst_matroska_mux_prepare_data (GstMatroskaMux *mux) } static void -gst_matroska_mux_write_data (GstMatroskaMux *mux) +gst_matroska_mux_write_data (GstMatroskaMux * mux) { GstEbmlWrite *ebml = GST_EBML_WRITE (mux); GstBuffer *buf, *hdr; @@ -877,12 +854,12 @@ gst_matroska_mux_write_data (GstMatroskaMux *mux) if (mux->num_indexes % 32 == 0) { mux->index = g_renew (GstMatroskaIndex, mux->index, - mux->num_indexes + 32); + mux->num_indexes + 32); } idx = &mux->index[mux->num_indexes++]; - idx->pos = ebml->pos; - idx->time = GST_BUFFER_TIMESTAMP (buf); + idx->pos = ebml->pos; + idx->time = GST_BUFFER_TIMESTAMP (buf); idx->track = mux->sink[i].track->num; } @@ -891,15 +868,15 @@ gst_matroska_mux_write_data (GstMatroskaMux *mux) * FIXME: lacing, multiple frames/cluster, etc. */ cluster = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_CLUSTER); gst_ebml_write_uint (ebml, GST_MATROSKA_ID_CLUSTERTIMECODE, - GST_BUFFER_TIMESTAMP (buf) / mux->time_scale); + GST_BUFFER_TIMESTAMP (buf) / mux->time_scale); blockgroup = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_BLOCKGROUP); gst_ebml_write_buffer_header (ebml, GST_MATROSKA_ID_BLOCK, - GST_BUFFER_SIZE (buf) + 4); + GST_BUFFER_SIZE (buf) + 4); hdr = gst_buffer_new_and_alloc (4); /* track num - FIXME: what if num >= 0x80 (unlikely)? */ GST_BUFFER_DATA (hdr)[0] = mux->sink[i].track->num | 0x80; /* time relative to clustertime - we don't use this yet */ - * (guint16 *) &GST_BUFFER_DATA (hdr)[1] = GUINT16_TO_BE (0); + *(guint16 *) & GST_BUFFER_DATA (hdr)[1] = GUINT16_TO_BE (0); /* flags - no lacing (yet) */ GST_BUFFER_DATA (hdr)[3] = 0; gst_ebml_write_buffer (ebml, hdr); @@ -909,7 +886,7 @@ gst_matroska_mux_write_data (GstMatroskaMux *mux) } static void -gst_matroska_mux_loop (GstElement *element) +gst_matroska_mux_loop (GstElement * element) { GstMatroskaMux *mux = GST_MATROSKA_MUX (element); @@ -925,7 +902,7 @@ gst_matroska_mux_loop (GstElement *element) } static GstElementStateReturn -gst_matroska_mux_change_state (GstElement *element) +gst_matroska_mux_change_state (GstElement * element) { GstMatroskaMux *mux = GST_MATROSKA_MUX (element); @@ -944,10 +921,8 @@ gst_matroska_mux_change_state (GstElement *element) } static void -gst_matroska_mux_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) +gst_matroska_mux_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) { GstMatroskaMux *mux; @@ -956,8 +931,7 @@ gst_matroska_mux_set_property (GObject *object, switch (prop_id) { case ARG_METADATA: - gst_caps_replace (&mux->metadata, - g_value_get_boxed (value)); + gst_caps_replace (&mux->metadata, g_value_get_boxed (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -966,10 +940,8 @@ gst_matroska_mux_set_property (GObject *object, } static void -gst_matroska_mux_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) +gst_matroska_mux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) { GstMatroskaMux *mux; @@ -987,9 +959,8 @@ gst_matroska_mux_get_property (GObject *object, } gboolean -gst_matroska_mux_plugin_init (GstPlugin *plugin) +gst_matroska_mux_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "matroskamux", - GST_RANK_NONE, - GST_TYPE_MATROSKA_MUX); + GST_RANK_NONE, GST_TYPE_MATROSKA_MUX); } diff --git a/gst/matroska/matroska-mux.h b/gst/matroska/matroska-mux.h index 119237c9..ab018688 100644 --- a/gst/matroska/matroska-mux.h +++ b/gst/matroska/matroska-mux.h @@ -28,7 +28,6 @@ #include "matroska-ids.h" G_BEGIN_DECLS - #define GST_TYPE_MATROSKA_MUX \ (gst_matroska_mux_get_type ()) #define GST_MATROSKA_MUX(obj) \ @@ -39,65 +38,61 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MATROSKA_MUX)) #define GST_IS_MATROSKA_MUX_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MATROSKA_MUX)) - #define GST_MATROSKA_MUX_MAX_STREAMS 64 - -typedef enum { + typedef enum +{ GST_MATROSKA_MUX_STATE_START, GST_MATROSKA_MUX_STATE_HEADER, GST_MATROSKA_MUX_STATE_DATA, } GstMatroskaMuxState; -typedef struct _GstMatroskaMux { - GstEbmlWrite parent; +typedef struct _GstMatroskaMux +{ + GstEbmlWrite parent; /* pads */ - GstPad *srcpad; - struct { + GstPad *srcpad; + struct + { GstMatroskaTrackContext *track; - GstBuffer *buffer; - gboolean eos; + GstBuffer *buffer; + gboolean eos; } sink[GST_MATROSKA_MUX_MAX_STREAMS]; - guint num_streams, - num_v_streams, num_a_streams, num_t_streams; + guint num_streams, num_v_streams, num_a_streams, num_t_streams; /* metadata - includes writing_app and creation_time */ - GstCaps *metadata; + GstCaps *metadata; /* state */ GstMatroskaMuxState state; /* a cue (index) table */ GstMatroskaIndex *index; - guint num_indexes; + guint num_indexes; /* timescale in the file */ - guint64 time_scale; + guint64 time_scale; /* length, position (time, ns) */ - guint64 duration; + guint64 duration; /* byte-positions of master-elements (for replacing contents) */ - guint64 segment_pos, - seekhead_pos, - cues_pos, + guint64 segment_pos, seekhead_pos, cues_pos, #if 0 - tags_pos, + tags_pos, #endif - info_pos, - tracks_pos, - duration_pos; - guint64 segment_master; + info_pos, tracks_pos, duration_pos; + guint64 segment_master; } GstMatroskaMux; -typedef struct _GstMatroskaMuxClass { +typedef struct _GstMatroskaMuxClass +{ GstEbmlWriteClass parent; } GstMatroskaMuxClass; -GType gst_matroska_mux_get_type (void); +GType gst_matroska_mux_get_type (void); -gboolean gst_matroska_mux_plugin_init (GstPlugin *plugin); +gboolean gst_matroska_mux_plugin_init (GstPlugin * plugin); G_END_DECLS - #endif /* __GST_MATROSKA_MUX_H__ */ diff --git a/gst/matroska/matroska.c b/gst/matroska/matroska.c index 49657818..67b5f267 100644 --- a/gst/matroska/matroska.c +++ b/gst/matroska/matroska.c @@ -27,20 +27,14 @@ #include "matroska-mux.h" static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { return (gst_matroska_demux_plugin_init (plugin) && - gst_matroska_mux_plugin_init (plugin)); + gst_matroska_mux_plugin_init (plugin)); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "matroska", - "Matroska stream handling", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "matroska", + "Matroska stream handling", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) |