From 8012622e1bddb6477d5ea32ad2cdf45fd8d19806 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Sun, 15 Jun 2008 14:08:41 +0000 Subject: [PATCH] gst/matroska/: Make sure that every Tags element is only parsed once and it's containing tags are only posted once. Original commit message from CVS: * gst/matroska/ebml-read.c: * gst/matroska/ebml-read.h: * gst/matroska/matroska-demux.c: (gst_matroska_demux_reset), (gst_matroska_demux_parse_metadata): * gst/matroska/matroska-demux.h: Make sure that every Tags element is only parsed once and it's containing tags are only posted once. --- ChangeLog | 10 ++++++++++ gst/matroska/ebml-read.c | 2 +- gst/matroska/ebml-read.h | 2 ++ gst/matroska/matroska-demux.c | 37 +++++++++++++++++++++++++++++++++++++ gst/matroska/matroska-demux.h | 1 + 5 files changed, 51 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 3c3777f..3c541eb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ 2008-06-15 Sebastian Dröge + * gst/matroska/ebml-read.c: + * gst/matroska/ebml-read.h: + * gst/matroska/matroska-demux.c: (gst_matroska_demux_reset), + (gst_matroska_demux_parse_metadata): + * gst/matroska/matroska-demux.h: + Make sure that every Tags element is only parsed once and it's + containing tags are only posted once. + +2008-06-15 Sebastian Dröge + * gst/matroska/ebml-read.c: (gst_ebml_peek_id), (gst_ebml_read_header): * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), diff --git a/gst/matroska/ebml-read.c b/gst/matroska/ebml-read.c index fce3ff6..87d6234 100644 --- a/gst/matroska/ebml-read.c +++ b/gst/matroska/ebml-read.c @@ -75,7 +75,7 @@ gst_ebml_read_get_type (void) return gst_ebml_read_type; } -static void +void gst_ebml_level_free (GstEbmlLevel * level) { g_slice_free (GstEbmlLevel, level); diff --git a/gst/matroska/ebml-read.h b/gst/matroska/ebml-read.h index 54782b2..2d5a5a1 100644 --- a/gst/matroska/ebml-read.h +++ b/gst/matroska/ebml-read.h @@ -61,6 +61,8 @@ typedef struct _GstEbmlReadClass { GType gst_ebml_read_get_type (void); +void gst_ebml_level_free (GstEbmlLevel *level); + GstFlowReturn gst_ebml_peek_id (GstEbmlRead *ebml, guint *level_up, guint32 *id); diff --git a/gst/matroska/matroska-demux.c b/gst/matroska/matroska-demux.c index 4cbef28..409c6c5 100644 --- a/gst/matroska/matroska-demux.c +++ b/gst/matroska/matroska-demux.c @@ -312,6 +312,10 @@ gst_matroska_demux_reset (GstElement * element) demux->tracks_parsed = FALSE; demux->segmentinfo_parsed = FALSE; + g_list_foreach (demux->tags_parsed, (GFunc) gst_ebml_level_free, NULL); + g_list_free (demux->tags_parsed); + demux->tags_parsed = NULL; + gst_segment_init (&demux->segment, GST_FORMAT_TIME); } @@ -2318,6 +2322,39 @@ gst_matroska_demux_parse_metadata (GstMatroskaDemux * demux, guint32 id; + GList *l; + + GstEbmlLevel *curlevel; + + /* Can't be NULL at this point */ + g_assert (ebml->level != NULL); + curlevel = ebml->level->data; + + /* Make sure we don't parse a tags element twice and + * post it's tags twice */ + for (l = demux->tags_parsed; l; l = l->next) { + GstEbmlLevel *level = l->data; + + if (ebml->level) + curlevel = ebml->level->data; + else + break; + + if (level->start == curlevel->start && level->length == curlevel->length) { + GST_DEBUG_OBJECT (demux, "Skipping already parsed Tags at offset %" + G_GUINT64_FORMAT, ebml->offset); + ret = gst_ebml_read_skip (ebml); + return ret; + } + } + + GST_DEBUG_OBJECT (demux, "Parsing Tags at offset %" G_GUINT64_FORMAT, + ebml->offset); + /* TODO: g_slice_dup() if we depend on GLib 2.14 */ + curlevel = g_slice_new (GstEbmlLevel); + memcpy (curlevel, ebml->level->data, sizeof (GstEbmlLevel)); + demux->tags_parsed = g_list_prepend (demux->tags_parsed, curlevel); + /* TODO: review length/eos logic */ if (prevent_eos) { length = gst_ebml_read_get_length (ebml); diff --git a/gst/matroska/matroska-demux.h b/gst/matroska/matroska-demux.h index 413cdc8..8ea9c3a 100644 --- a/gst/matroska/matroska-demux.h +++ b/gst/matroska/matroska-demux.h @@ -81,6 +81,7 @@ typedef struct _GstMatroskaDemux { gboolean index_parsed; gboolean tracks_parsed; gboolean segmentinfo_parsed; + GList *tags_parsed; /* start-of-segment */ guint64 ebml_segment_start; -- 2.7.4