matroska: refactor code common to matroskademux and matroskaparse
authorDebarshi Ray <rishi@gnu.org>
Sun, 5 Jun 2011 04:45:23 +0000 (10:15 +0530)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Mon, 6 Jun 2011 12:42:46 +0000 (14:42 +0200)
Move the following function to matroska-read-common.[ch] from
matroska-demux.c and matroska-parse.c:
    - gst_matroska_{demux,parse}_parse_metadata

https://bugzilla.gnome.org/show_bug.cgi?id=650877

gst/matroska/matroska-demux.c
gst/matroska/matroska-demux.h
gst/matroska/matroska-parse.c
gst/matroska/matroska-parse.h
gst/matroska/matroska-read-common.c
gst/matroska/matroska-read-common.h

index d294ecc..423cdcd 100644 (file)
@@ -404,10 +404,10 @@ gst_matroska_demux_reset (GstElement * element)
   demux->segmentinfo_parsed = FALSE;
   demux->attachments_parsed = FALSE;
 
-  g_list_foreach (demux->tags_parsed,
+  g_list_foreach (demux->common.tags_parsed,
       (GFunc) gst_matroska_demux_free_parsed_el, NULL);
-  g_list_free (demux->tags_parsed);
-  demux->tags_parsed = NULL;
+  g_list_free (demux->common.tags_parsed);
+  demux->common.tags_parsed = NULL;
 
   g_list_foreach (demux->seek_parsed,
       (GFunc) gst_matroska_demux_free_parsed_el, NULL);
@@ -2388,71 +2388,6 @@ gst_matroska_demux_parse_info (GstMatroskaDemux * demux, GstEbmlRead * ebml)
 }
 
 static GstFlowReturn
-gst_matroska_demux_parse_metadata (GstMatroskaDemux * demux, GstEbmlRead * ebml)
-{
-  GstTagList *taglist;
-  GstFlowReturn ret = GST_FLOW_OK;
-  guint32 id;
-  GList *l;
-  guint64 curpos;
-
-  curpos = gst_ebml_read_get_pos (ebml);
-
-  /* Make sure we don't parse a tags element twice and
-   * post it's tags twice */
-  curpos = gst_ebml_read_get_pos (ebml);
-  for (l = demux->tags_parsed; l; l = l->next) {
-    guint64 *pos = l->data;
-
-    if (*pos == curpos) {
-      GST_DEBUG_OBJECT (demux, "Skipping already parsed Tags at offset %"
-          G_GUINT64_FORMAT, curpos);
-      return GST_FLOW_OK;
-    }
-  }
-
-  demux->tags_parsed =
-      g_list_prepend (demux->tags_parsed, g_slice_new (guint64));
-  *((guint64 *) demux->tags_parsed->data) = curpos;
-  /* fall-through */
-
-  if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) {
-    DEBUG_ELEMENT_STOP (demux, ebml, "Tags", ret);
-    return ret;
-  }
-
-  taglist = gst_tag_list_new ();
-
-  while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) {
-    if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK)
-      break;
-
-    switch (id) {
-      case GST_MATROSKA_ID_TAG:
-        ret = gst_matroska_read_common_parse_metadata_id_tag (&demux->common,
-            ebml, &taglist);
-        break;
-
-      default:
-        ret = gst_matroska_read_common_parse_skip (&demux->common, ebml,
-            "Tags", id);
-        break;
-        /* FIXME: Use to limit the tags to specific pads */
-      case GST_MATROSKA_ID_TARGETS:
-        ret = gst_ebml_read_skip (ebml);
-        break;
-    }
-  }
-
-  DEBUG_ELEMENT_STOP (demux, ebml, "Tags", ret);
-
-  gst_matroska_read_common_found_global_tag (&demux->common,
-      GST_ELEMENT_CAST (demux), taglist);
-
-  return ret;
-}
-
-static GstFlowReturn
 gst_matroska_demux_parse_attached_file (GstMatroskaDemux * demux,
     GstEbmlRead * ebml, GstTagList * taglist)
 {
@@ -4556,7 +4491,8 @@ gst_matroska_demux_parse_id (GstMatroskaDemux * demux, guint32 id,
           break;
         case GST_MATROSKA_ID_TAGS:
           GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml));
-          ret = gst_matroska_demux_parse_metadata (demux, &ebml);
+          ret = gst_matroska_read_common_parse_metadata (&demux->common,
+              GST_ELEMENT_CAST (demux), &ebml);
           break;
         case GST_MATROSKA_ID_CHAPTERS:
           GST_READ_CHECK (gst_matroska_demux_take (demux, read, &ebml));
index 109f301..e9637f5 100644 (file)
@@ -70,7 +70,6 @@ typedef struct _GstMatroskaDemux {
   gboolean                 tracks_parsed;
   gboolean                 segmentinfo_parsed;
   gboolean                 attachments_parsed;
-  GList                   *tags_parsed;
   GList                   *seek_parsed;
 
   /* cluster positions (optional) */
index 43c87ca..ef60d67 100644 (file)
@@ -327,10 +327,10 @@ gst_matroska_parse_reset (GstElement * element)
   parse->segmentinfo_parsed = FALSE;
   parse->attachments_parsed = FALSE;
 
-  g_list_foreach (parse->tags_parsed,
+  g_list_foreach (parse->common.tags_parsed,
       (GFunc) gst_matroska_parse_free_parsed_el, NULL);
-  g_list_free (parse->tags_parsed);
-  parse->tags_parsed = NULL;
+  g_list_free (parse->common.tags_parsed);
+  parse->common.tags_parsed = NULL;
 
   g_list_foreach (parse->seek_parsed,
       (GFunc) gst_matroska_parse_free_parsed_el, NULL);
@@ -1690,71 +1690,6 @@ gst_matroska_parse_parse_info (GstMatroskaParse * parse, GstEbmlRead * ebml)
 }
 
 static GstFlowReturn
-gst_matroska_parse_parse_metadata (GstMatroskaParse * parse, GstEbmlRead * ebml)
-{
-  GstTagList *taglist;
-  GstFlowReturn ret = GST_FLOW_OK;
-  guint32 id;
-  GList *l;
-  guint64 curpos;
-
-  curpos = gst_ebml_read_get_pos (ebml);
-
-  /* Make sure we don't parse a tags element twice and
-   * post it's tags twice */
-  curpos = gst_ebml_read_get_pos (ebml);
-  for (l = parse->tags_parsed; l; l = l->next) {
-    guint64 *pos = l->data;
-
-    if (*pos == curpos) {
-      GST_DEBUG_OBJECT (parse, "Skipping already parsed Tags at offset %"
-          G_GUINT64_FORMAT, curpos);
-      return GST_FLOW_OK;
-    }
-  }
-
-  parse->tags_parsed =
-      g_list_prepend (parse->tags_parsed, g_slice_new (guint64));
-  *((guint64 *) parse->tags_parsed->data) = curpos;
-  /* fall-through */
-
-  if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) {
-    DEBUG_ELEMENT_STOP (parse, ebml, "Tags", ret);
-    return ret;
-  }
-
-  taglist = gst_tag_list_new ();
-
-  while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) {
-    if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK)
-      break;
-
-    switch (id) {
-      case GST_MATROSKA_ID_TAG:
-        ret = gst_matroska_read_common_parse_metadata_id_tag (&parse->common,
-            ebml, &taglist);
-        break;
-
-      default:
-        ret = gst_matroska_read_common_parse_skip (&parse->common, ebml,
-            "Tags", id);
-        break;
-        /* FIXME: Use to limit the tags to specific pads */
-      case GST_MATROSKA_ID_TARGETS:
-        ret = gst_ebml_read_skip (ebml);
-        break;
-    }
-  }
-
-  DEBUG_ELEMENT_STOP (parse, ebml, "Tags", ret);
-
-  gst_matroska_read_common_found_global_tag (&parse->common,
-      GST_ELEMENT_CAST (parse), taglist);
-
-  return ret;
-}
-
-static GstFlowReturn
 gst_matroska_parse_parse_attached_file (GstMatroskaParse * parse,
     GstEbmlRead * ebml, GstTagList * taglist)
 {
@@ -3176,7 +3111,8 @@ gst_matroska_parse_parse_id (GstMatroskaParse * parse, guint32 id,
           break;
         case GST_MATROSKA_ID_TAGS:
           GST_READ_CHECK (gst_matroska_parse_take (parse, read, &ebml));
-          ret = gst_matroska_parse_parse_metadata (parse, &ebml);
+          ret = gst_matroska_read_common_parse_metadata (&parse->common,
+              GST_ELEMENT_CAST (parse), &ebml);
           gst_matroska_parse_output (parse, ebml.buf, FALSE);
           break;
         case GST_MATROSKA_ID_CHAPTERS:
index 14c9129..453510a 100644 (file)
@@ -75,7 +75,6 @@ typedef struct _GstMatroskaParse {
   gboolean                 tracks_parsed;
   gboolean                 segmentinfo_parsed;
   gboolean                 attachments_parsed;
-  GList                   *tags_parsed;
   GList                   *seek_parsed;
 
   /* keeping track of playback position */
index e58f981..f7cc0cf 100644 (file)
@@ -1076,7 +1076,7 @@ gst_matroska_read_common_parse_metadata_id_simple_tag (GstMatroskaReadCommon *
   return ret;
 }
 
-GstFlowReturn
+static GstFlowReturn
 gst_matroska_read_common_parse_metadata_id_tag (GstMatroskaReadCommon * common,
     GstEbmlRead * ebml, GstTagList ** p_taglist)
 {
@@ -1113,6 +1113,70 @@ gst_matroska_read_common_parse_metadata_id_tag (GstMatroskaReadCommon * common,
   return ret;
 }
 
+GstFlowReturn
+gst_matroska_read_common_parse_metadata (GstMatroskaReadCommon * common,
+    GstElement * el, GstEbmlRead * ebml)
+{
+  GstTagList *taglist;
+  GstFlowReturn ret = GST_FLOW_OK;
+  guint32 id;
+  GList *l;
+  guint64 curpos;
+
+  curpos = gst_ebml_read_get_pos (ebml);
+
+  /* Make sure we don't parse a tags element twice and
+   * post it's tags twice */
+  curpos = gst_ebml_read_get_pos (ebml);
+  for (l = common->tags_parsed; l; l = l->next) {
+    guint64 *pos = l->data;
+
+    if (*pos == curpos) {
+      GST_DEBUG_OBJECT (common, "Skipping already parsed Tags at offset %"
+          G_GUINT64_FORMAT, curpos);
+      return GST_FLOW_OK;
+    }
+  }
+
+  common->tags_parsed =
+      g_list_prepend (common->tags_parsed, g_slice_new (guint64));
+  *((guint64 *) common->tags_parsed->data) = curpos;
+  /* fall-through */
+
+  if ((ret = gst_ebml_read_master (ebml, &id)) != GST_FLOW_OK) {
+    DEBUG_ELEMENT_STOP (common, ebml, "Tags", ret);
+    return ret;
+  }
+
+  taglist = gst_tag_list_new ();
+
+  while (ret == GST_FLOW_OK && gst_ebml_read_has_remaining (ebml, 1, TRUE)) {
+    if ((ret = gst_ebml_peek_id (ebml, &id)) != GST_FLOW_OK)
+      break;
+
+    switch (id) {
+      case GST_MATROSKA_ID_TAG:
+        ret = gst_matroska_read_common_parse_metadata_id_tag (common, ebml,
+            &taglist);
+        break;
+
+      default:
+        ret = gst_matroska_read_common_parse_skip (common, ebml, "Tags", id);
+        break;
+        /* FIXME: Use to limit the tags to specific pads */
+      case GST_MATROSKA_ID_TARGETS:
+        ret = gst_ebml_read_skip (ebml);
+        break;
+    }
+  }
+
+  DEBUG_ELEMENT_STOP (common, ebml, "Tags", ret);
+
+  gst_matroska_read_common_found_global_tag (common, el, taglist);
+
+  return ret;
+}
+
 static const guint8 *
 gst_matroska_read_common_peek_adapter (GstMatroskaReadCommon * common, guint
     peek)
index 7feb6b0..f1b9684 100644 (file)
@@ -54,6 +54,7 @@ typedef struct _GstMatroskaReadCommon {
 
   /* did we parse cues/tracks/segmentinfo already? */
   gboolean                 index_parsed;
+  GList                   *tags_parsed;
 
   /* start-of-segment */
   guint64                  ebml_segment_start;
@@ -93,9 +94,8 @@ GstFlowReturn gst_matroska_read_common_parse_index (GstMatroskaReadCommon *
     common, GstEbmlRead * ebml);
 GstFlowReturn gst_matroska_read_common_parse_header (GstMatroskaReadCommon *
     common, GstEbmlRead * ebml);
-GstFlowReturn gst_matroska_read_common_parse_metadata_id_tag (
-    GstMatroskaReadCommon * common, GstEbmlRead * ebml, GstTagList **
-    p_taglist);
+GstFlowReturn gst_matroska_read_common_parse_metadata (GstMatroskaReadCommon *
+    common, GstElement * el, GstEbmlRead * ebml);
 GstFlowReturn gst_matroska_read_common_parse_skip (GstMatroskaReadCommon *
     common, GstEbmlRead * ebml, const gchar * parent_name, guint id);
 GstFlowReturn gst_matroska_read_common_peek_bytes (GstMatroskaReadCommon *