tagdemux: also read tags if downstream activates us in pull mode right away
authorTim-Philipp Müller <tim@centricular.net>
Tue, 11 Sep 2012 19:53:16 +0000 (20:53 +0100)
committerTim-Philipp Müller <tim@centricular.net>
Tue, 11 Sep 2012 19:53:16 +0000 (20:53 +0100)
Fix reading of tags for the case filsrc ! footagdemux ! fooparse ! ..
where we would not read the tags because we never start our own
streaming thread.

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

gst-libs/gst/tag/gsttagdemux.c

index 48c5141..14b8447 100644 (file)
@@ -1153,14 +1153,17 @@ gst_tag_demux_element_find (GstTagDemux * demux)
       demux->priv->strip_start + demux->priv->strip_end)
     goto no_data;
 
-  /* 2 - Do typefinding on data */
+  /* 2 - Do typefinding on data, but not if downstream is in charge */
+  if (GST_PAD_MODE (demux->priv->srcpad) == GST_PAD_MODE_PULL)
+    goto skip_typefinding;
+
   caps = gst_type_find_helper_get_range (GST_OBJECT (demux), NULL,
       (GstTypeFindHelperGetRangeFunction) gst_tag_demux_read_range,
       demux->priv->upstream_size
       - (demux->priv->strip_start + demux->priv->strip_end), NULL,
       &probability);
 
-  GST_DEBUG_OBJECT (demux, "Found type %" GST_PTR_FORMAT " with a "
+  GST_INFO_OBJECT (demux, "Found type %" GST_PTR_FORMAT " with a "
       "probability of %u", caps, probability);
 
   /* 3 - If we didn't find the caps, fail */
@@ -1175,6 +1178,11 @@ gst_tag_demux_element_find (GstTagDemux * demux)
   gst_tag_demux_set_src_caps (demux, caps);
   gst_caps_unref (caps);
 
+skip_typefinding:
+
+  /* set it again, in case we skipped typefinding */
+  demux->priv->state = GST_TAG_DEMUX_STREAMING;
+
   return ret;
 
   /* ERRORS */
@@ -1321,6 +1329,10 @@ gst_tag_demux_sink_activate_mode (GstPad * pad, GstObject * parent,
       res = TRUE;
       break;
   }
+
+  if (active)
+    GST_TAG_DEMUX (parent)->priv->state = GST_TAG_DEMUX_READ_START_TAG;
+
   return res;
 }
 
@@ -1364,7 +1376,6 @@ activate_push:
   {
     GST_DEBUG_OBJECT (demux, "No pull mode. Changing to push, but won't be "
         "able to read end tags");
-    demux->priv->state = GST_TAG_DEMUX_READ_START_TAG;
     return gst_pad_activate_mode (sinkpad, GST_PAD_MODE_PUSH, TRUE);
   }
 }
@@ -1489,6 +1500,7 @@ gst_tag_demux_pad_query (GstPad * pad, GstObject * parent, GstQuery * query)
   gint64 result;
   gboolean res = TRUE;
 
+  /* FIXME: locking ? */
   switch (GST_QUERY_TYPE (query)) {
     case GST_QUERY_SCHEDULING:
       res = gst_pad_peer_query (demux->priv->sinkpad, query);
@@ -1512,7 +1524,20 @@ gst_tag_demux_pad_query (GstPad * pad, GstObject * parent, GstQuery * query)
 
       gst_query_parse_duration (query, &format, &result);
       if (format == GST_FORMAT_BYTES) {
+        /* if downstream activated us in pull mode right away, e.g. in case of
+         * filesrc ! id3demux ! xyzparse ! .., read tags here, since we don't
+         * have a streaming thread of our own to do that. We do it here and
+         * not in get_range(), so we can return the right size in bytes.. */
+        if (demux->priv->state == GST_TAG_DEMUX_READ_START_TAG &&
+            GST_PAD_MODE (demux->priv->srcpad) == GST_PAD_MODE_PULL) {
+          GstFlowReturn flow G_GNUC_UNUSED;
+
+          flow = gst_tag_demux_element_find (demux);
+          GST_INFO_OBJECT (demux, "pulled tags: %s", gst_flow_get_name (flow));
+        }
         result -= demux->priv->strip_start + demux->priv->strip_end;
+        if (result < 0)
+          result = 0;
         gst_query_set_duration (query, format, result);
       }
       break;