From: <sl...@ke...> - 2008-06-15 14:08:48
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: slomo Date: Sun Jun 15 2008 14:08:56 UTC Log message: * 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. Modified files: . : ChangeLog gst/matroska : ebml-read.c ebml-read.h matroska-demux.c matroska-demux.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3545&r2=1.3546 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/matroska/ebml-read.c.diff?r1=1.31&r2=1.32 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/matroska/ebml-read.h.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/matroska/matroska-demux.c.diff?r1=1.106&r2=1.107 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/matroska/matroska-demux.h.diff?r1=1.13&r2=1.14 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3545 retrieving revision 1.3546 diff -u -d -r1.3545 -r1.3546 --- ChangeLog 15 Jun 2008 09:43:23 -0000 1.3545 +++ ChangeLog 15 Jun 2008 14:08:39 -0000 1.3546 @@ -1,5 +1,15 @@ 2008-06-15 Sebastian Dröge <sl...@ci...> + * 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 <sl...@ci...> * gst/matroska/ebml-read.c: (gst_ebml_peek_id), (gst_ebml_read_header): * gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream), Index: ebml-read.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/matroska/ebml-read.c,v retrieving revision 1.31 retrieving revision 1.32 diff -u -d -r1.31 -r1.32 --- ebml-read.c 15 Jun 2008 09:43:25 -0000 1.31 +++ ebml-read.c 15 Jun 2008 14:08:41 -0000 1.32 @@ -75,7 +75,7 @@ return gst_ebml_read_type; } -static void +void gst_ebml_level_free (GstEbmlLevel * level) { g_slice_free (GstEbmlLevel, level); Index: ebml-read.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/matroska/ebml-read.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- ebml-read.h 6 Mar 2008 19:47:47 -0000 1.8 +++ ebml-read.h 15 Jun 2008 14:08:41 -0000 1.9 @@ -61,6 +61,8 @@ 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); Index: matroska-demux.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/matroska/matroska-demux.c,v retrieving revision 1.106 retrieving revision 1.107 diff -u -d -r1.106 -r1.107 --- matroska-demux.c 15 Jun 2008 09:43:25 -0000 1.106 +++ matroska-demux.c 15 Jun 2008 14:08:41 -0000 1.107 @@ -312,6 +312,10 @@ 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 @@ 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); Index: matroska-demux.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/matroska/matroska-demux.h,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- matroska-demux.h 13 Jun 2008 19:07:03 -0000 1.13 +++ matroska-demux.h 15 Jun 2008 14:08:41 -0000 1.14 @@ -81,6 +81,7 @@ gboolean index_parsed; gboolean tracks_parsed; gboolean segmentinfo_parsed; + GList *tags_parsed; /* start-of-segment */ guint64 ebml_segment_start; |