scheduling: port to new scheduling query
authorWim Taymans <wim.taymans@collabora.co.uk>
Tue, 24 May 2011 15:36:24 +0000 (17:36 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Tue, 24 May 2011 15:39:56 +0000 (17:39 +0200)
14 files changed:
gst/gstghostpad.c
gst/gstghostpad.h
gst/gstpad.c
gst/gstpad.h
gst/gstquery.c
libs/gst/base/gstbaseparse.c
libs/gst/base/gstbasesink.c
libs/gst/base/gstbasesrc.c
libs/gst/base/gstbasesrc.h
libs/gst/base/gstbasetransform.c
libs/gst/base/gstpushsrc.c
plugins/elements/gstqueue2.c
plugins/elements/gsttee.c
plugins/elements/gsttypefindelement.c

index 23ed3ba2b7f85708961cd0578ca4d6cdd1056827..2dc086753d698e6da11f6632d7160c2ceb0abf0a 100644 (file)
@@ -282,30 +282,6 @@ gst_proxy_pad_getrange_default (GstPad * pad, guint64 offset, guint size,
   return res;
 }
 
-/**
- * gst_proxy_pad_checkgetrange_default:
- * @pad: a src #GstPad, returns #GST_FLOW_ERROR if not.
- *
- * Invoke the default checkgetrange function of the proxy pad.
- *
- * Returns: a #gboolean from the pad.
- *
- * Since: 0.10.35
- */
-gboolean
-gst_proxy_pad_checkgetrange_default (GstPad * pad)
-{
-  gboolean result;
-  GstPad *internal;
-
-  g_return_val_if_fail (GST_IS_PROXY_PAD (pad), FALSE);
-
-  internal = GST_PROXY_PAD_INTERNAL (pad);
-  result = gst_pad_check_pull_range (internal);
-
-  return result;
-}
-
 /**
  * gst_proxy_pad_getcaps_default:
  * @pad: a #GstPad to get the capabilities of.
@@ -615,7 +591,6 @@ gst_proxy_pad_class_init (GstProxyPadClass * klass)
   GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_chain_default);
   GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_chain_list_default);
   GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_getrange_default);
-  GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_checkgetrange_default);
 }
 
 static void
@@ -1045,8 +1020,6 @@ gst_ghost_pad_construct (GstGhostPad * gpad)
     gst_pad_set_chain_list_function (pad, gst_proxy_pad_chain_list_default);
   } else {
     gst_pad_set_getrange_function (pad, gst_proxy_pad_getrange_default);
-    gst_pad_set_checkgetrange_function (pad,
-        gst_proxy_pad_checkgetrange_default);
   }
 
   /* link/unlink functions */
@@ -1075,8 +1048,6 @@ gst_ghost_pad_construct (GstGhostPad * gpad)
         gst_proxy_pad_chain_list_default);
   } else {
     gst_pad_set_getrange_function (internal, gst_proxy_pad_getrange_default);
-    gst_pad_set_checkgetrange_function (internal,
-        gst_proxy_pad_checkgetrange_default);
   }
 
   GST_PROXY_LOCK (pad);
index 3225e2aa1f427d9cec3bbf3f815665331f596091..1fa2c187f5db16b791428fcb94f0329c2f51bb91 100644 (file)
@@ -69,7 +69,6 @@ GstIterator*        gst_proxy_pad_iterate_internal_links_default (GstPad *pad);
 GstFlowReturn       gst_proxy_pad_chain_default                  (GstPad *pad, GstBuffer *buffer);
 GstFlowReturn       gst_proxy_pad_chain_list_default             (GstPad *pad, GstBufferList *list);
 GstFlowReturn       gst_proxy_pad_getrange_default               (GstPad *pad, guint64 offset, guint size, GstBuffer **buffer);
-gboolean            gst_proxy_pad_checkgetrange_default          (GstPad *pad);
 GstCaps*            gst_proxy_pad_getcaps_default                (GstPad *pad, GstCaps * filter);
 gboolean            gst_proxy_pad_acceptcaps_default             (GstPad *pad, GstCaps *caps);
 void                gst_proxy_pad_fixatecaps_default             (GstPad *pad, GstCaps *caps);
index 715ec632dccee9811023cb4012df69c052aa4bb8..041944f6600165a605c81f4de76c874d780a0ea6 100644 (file)
@@ -1401,27 +1401,6 @@ gst_pad_set_getrange_function (GstPad * pad, GstPadGetRangeFunction get)
       GST_DEBUG_FUNCPTR_NAME (get));
 }
 
-/**
- * gst_pad_set_checkgetrange_function:
- * @pad: a source #GstPad.
- * @check: the #GstPadCheckGetRangeFunction to set.
- *
- * Sets the given checkgetrange function for the pad. Implement this function
- * on a pad if you dynamically support getrange based scheduling on the pad.
- */
-void
-gst_pad_set_checkgetrange_function (GstPad * pad,
-    GstPadCheckGetRangeFunction check)
-{
-  g_return_if_fail (GST_IS_PAD (pad));
-  g_return_if_fail (GST_PAD_IS_SRC (pad));
-
-  GST_PAD_CHECKGETRANGEFUNC (pad) = check;
-
-  GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "checkgetrangefunc set to %s",
-      GST_DEBUG_FUNCPTR_NAME (check));
-}
-
 /**
  * gst_pad_set_event_function:
  * @pad: a #GstPad of either direction.
@@ -3412,14 +3391,16 @@ gst_pad_query (GstPad * pad, GstQuery * query)
   g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
   g_return_val_if_fail (GST_IS_QUERY (query), FALSE);
 
-  GST_DEBUG_OBJECT (pad, "sending query %p", query);
+  GST_DEBUG_OBJECT (pad, "sending query %p (%s)", query,
+      GST_QUERY_TYPE_NAME (query));
 
   if ((func = GST_PAD_QUERYFUNC (pad)) == NULL)
     goto no_func;
 
   res = func (pad, query);
 
-  GST_DEBUG_OBJECT (pad, "sent query %p, result %d", query, res);
+  GST_DEBUG_OBJECT (pad, "sent query %p (%s), result %d", query,
+      GST_QUERY_TYPE_NAME (query), res);
 
   return res;
 
@@ -3456,7 +3437,8 @@ gst_pad_peer_query (GstPad * pad, GstQuery * query)
 
   GST_OBJECT_LOCK (pad);
 
-  GST_DEBUG_OBJECT (pad, "peer query");
+  GST_DEBUG_OBJECT (pad, "peer query %p (%s)", query,
+      GST_QUERY_TYPE_NAME (query));
 
   peerpad = GST_PAD_PEER (pad);
   if (G_UNLIKELY (peerpad == NULL))
@@ -4363,76 +4345,6 @@ invalid:
   }
 }
 
-/**
- * gst_pad_check_pull_range:
- * @pad: a sink #GstPad.
- *
- * Checks if a gst_pad_pull_range() can be performed on the peer
- * source pad. This function is used by plugins that want to check
- * if they can use random access on the peer source pad.
- *
- * The peer sourcepad can implement a custom #GstPadCheckGetRangeFunction
- * if it needs to perform some logic to determine if pull_range is
- * possible.
- *
- * Returns: a gboolean with the result.
- *
- * MT safe.
- */
-gboolean
-gst_pad_check_pull_range (GstPad * pad)
-{
-  GstPad *peer;
-  gboolean ret;
-  GstPadCheckGetRangeFunction checkgetrangefunc;
-
-  g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
-
-  GST_OBJECT_LOCK (pad);
-  if (!GST_PAD_IS_SINK (pad))
-    goto wrong_direction;
-
-  if (G_UNLIKELY ((peer = GST_PAD_PEER (pad)) == NULL))
-    goto not_connected;
-
-  gst_object_ref (peer);
-  GST_OBJECT_UNLOCK (pad);
-
-  /* see note in above function */
-  if (G_LIKELY ((checkgetrangefunc = peer->checkgetrangefunc) == NULL)) {
-    /* FIXME, kindoff ghetto */
-    ret = GST_PAD_GETRANGEFUNC (peer) != NULL;
-    GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
-        "no checkgetrangefunc, assuming %d", ret);
-  } else {
-    GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
-        "calling checkgetrangefunc %s of peer pad %s:%s",
-        GST_DEBUG_FUNCPTR_NAME (checkgetrangefunc), GST_DEBUG_PAD_NAME (peer));
-
-    ret = checkgetrangefunc (peer);
-  }
-
-  gst_object_unref (peer);
-
-  return ret;
-
-  /* ERROR recovery here */
-wrong_direction:
-  {
-    GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
-        "checking pull range, but pad must be a sinkpad");
-    GST_OBJECT_UNLOCK (pad);
-    return FALSE;
-  }
-not_connected:
-  {
-    GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
-        "checking pull range, but it was not linked");
-    GST_OBJECT_UNLOCK (pad);
-    return FALSE;
-  }
-}
-
 static GstFlowReturn
 gst_pad_get_range_unchecked (GstPad * pad, guint64 offset, guint size,
     GstBuffer ** buffer)
index f45106666300eb92d1ae6c34b81c4f21b94da2f0..aaecf8cafe319389fbaa3459083d92019ad8ba13 100644 (file)
@@ -342,20 +342,6 @@ typedef GstFlowReturn              (*GstPadGetRangeFunction)       (GstPad *pad, guint64 offset,
 typedef gboolean               (*GstPadEventFunction)          (GstPad *pad, GstEvent *event);
 
 
-/* FIXME: 0.11: deprecate me, check range should use seeking query */
-/**
- * GstPadCheckGetRangeFunction:
- * @pad: a #GstPad
- *
- * Check if @pad can be activated in pull mode.
- *
- * This function will be deprecated after 0.10; use the seeking query to check
- * if a pad can support random access.
- *
- * Returns: TRUE if the pad can operate in pull mode.
- */
-typedef gboolean               (*GstPadCheckGetRangeFunction)  (GstPad *pad);
-
 /* internal links */
 /**
  * GstPadIterIntLinkFunction:
@@ -638,7 +624,6 @@ struct _GstPad {
   /* data transport functions */
   GstPadChainFunction           chainfunc;
   GstPadChainListFunction        chainlistfunc;
-  GstPadCheckGetRangeFunction   checkgetrangefunc;
   GstPadGetRangeFunction        getrangefunc;
   GstPadEventFunction           eventfunc;
 
@@ -843,7 +828,6 @@ void                        gst_pad_set_activatepush_function       (GstPad *pad, GstPadActivateModeFunctio
 void                   gst_pad_set_chain_function              (GstPad *pad, GstPadChainFunction chain);
 void                   gst_pad_set_chain_list_function (GstPad *pad, GstPadChainListFunction chainlist);
 void                   gst_pad_set_getrange_function           (GstPad *pad, GstPadGetRangeFunction get);
-void                   gst_pad_set_checkgetrange_function      (GstPad *pad, GstPadCheckGetRangeFunction check);
 void                   gst_pad_set_event_function              (GstPad *pad, GstPadEventFunction event);
 
 /* pad links */
@@ -888,7 +872,6 @@ void                    gst_pad_set_offset                      (GstPad *pad, gi
 /* data passing functions to peer */
 GstFlowReturn          gst_pad_push                            (GstPad *pad, GstBuffer *buffer);
 GstFlowReturn          gst_pad_push_list                       (GstPad *pad, GstBufferList *list);
-gboolean               gst_pad_check_pull_range                (GstPad *pad);
 GstFlowReturn          gst_pad_pull_range                      (GstPad *pad, guint64 offset, guint size,
                                                                 GstBuffer **buffer);
 gboolean               gst_pad_push_event                      (GstPad *pad, GstEvent *event);
index ad31fb08174fd6963cbf627192090526a8d46fd7..7efa34cb06438be0a43aa919b3d57ab562166def 100644 (file)
@@ -104,6 +104,7 @@ static GstQueryTypeDefinition standard_definitions[] = {
   {GST_QUERY_CUSTOM, "custom", "Custom query", 0},
   {GST_QUERY_URI, "uri", "URI of the source or sink", 0},
   {GST_QUERY_ALLOCATION, "allocation", "Allocation properties", 0},
+  {GST_QUERY_SCHEDULING, "scheduling", "Scheduling properties", 0},
   {0, NULL, NULL, 0}
 };
 
index 15a0b06f4cfe74ee8a78132a7d95274ec1de57d0..d6d49a1b9e8241464cfd30e282db03be41a7cdf3 100644 (file)
@@ -2749,12 +2749,24 @@ gst_base_parse_sink_activate (GstPad * sinkpad)
 {
   GstBaseParse *parse;
   gboolean result = TRUE;
+  GstQuery *query;
+  gboolean pull_mode;
 
   parse = GST_BASE_PARSE (gst_pad_get_parent (sinkpad));
 
   GST_DEBUG_OBJECT (parse, "sink activate");
 
-  if (gst_pad_check_pull_range (sinkpad)) {
+  query = gst_query_new_scheduling ();
+  result = gst_pad_peer_query (sinkpad, query);
+  if (result) {
+    gst_query_parse_scheduling (query, &pull_mode, NULL, NULL, NULL, NULL,
+        NULL);
+  } else {
+    pull_mode = FALSE;
+  }
+  gst_query_unref (query);
+
+  if (pull_mode) {
     GST_DEBUG_OBJECT (parse, "trying to activate in pull mode");
     result = gst_pad_activate_pull (sinkpad, TRUE);
   } else {
index fd9f949171040e6380016771671d6f94c3403d56..ce664fbc87abeca194276140c4ca77731f901ee6 100644 (file)
@@ -4098,6 +4098,8 @@ gst_base_sink_pad_activate (GstPad * pad)
 {
   gboolean result = FALSE;
   GstBaseSink *basesink;
+  GstQuery *query;
+  gboolean pull_mode;
 
   basesink = GST_BASE_SINK (gst_pad_get_parent (pad));
 
@@ -4112,7 +4114,19 @@ gst_base_sink_pad_activate (GstPad * pad)
   }
 
   /* check if downstreams supports pull mode at all */
-  if (!gst_pad_check_pull_range (pad)) {
+  query = gst_query_new_scheduling ();
+
+  if (!gst_pad_peer_query (pad, query)) {
+    gst_query_unref (query);
+    GST_DEBUG_OBJECT (basesink, "peer query faild, no pull mode");
+    goto fallback;
+  }
+
+  /* parse result of the query */
+  gst_query_parse_scheduling (query, &pull_mode, NULL, NULL, NULL, NULL, NULL);
+  gst_query_unref (query);
+
+  if (!pull_mode) {
     GST_DEBUG_OBJECT (basesink, "pull mode not supported");
     goto fallback;
   }
index b68fd0224d41033c67f8894f65d6b791bcb70fac..d13105c37d708ce1efa250ddc4e2aa64128b5a89 100644 (file)
@@ -283,6 +283,7 @@ gst_base_src_get_type (void)
 static GstCaps *gst_base_src_getcaps (GstPad * pad, GstCaps * filter);
 static void gst_base_src_fixate (GstPad * pad, GstCaps * caps);
 
+static gboolean gst_base_src_is_random_access (GstBaseSrc * src);
 static gboolean gst_base_src_activate_push (GstPad * pad, gboolean active);
 static gboolean gst_base_src_activate_pull (GstPad * pad, gboolean active);
 static void gst_base_src_set_property (GObject * object, guint prop_id,
@@ -312,8 +313,6 @@ static GstStateChangeReturn gst_base_src_change_state (GstElement * element,
     GstStateChange transition);
 
 static void gst_base_src_loop (GstPad * pad);
-static gboolean gst_base_src_pad_check_get_range (GstPad * pad);
-static gboolean gst_base_src_default_check_get_range (GstBaseSrc * bsrc);
 static GstFlowReturn gst_base_src_pad_get_range (GstPad * pad, guint64 offset,
     guint length, GstBuffer ** buf);
 static GstFlowReturn gst_base_src_get_range (GstBaseSrc * src, guint64 offset,
@@ -369,8 +368,6 @@ gst_base_src_class_init (GstBaseSrcClass * klass)
   klass->event = GST_DEBUG_FUNCPTR (gst_base_src_default_event);
   klass->do_seek = GST_DEBUG_FUNCPTR (gst_base_src_default_do_seek);
   klass->query = GST_DEBUG_FUNCPTR (gst_base_src_default_query);
-  klass->check_get_range =
-      GST_DEBUG_FUNCPTR (gst_base_src_default_check_get_range);
   klass->prepare_seek_segment =
       GST_DEBUG_FUNCPTR (gst_base_src_default_prepare_seek_segment);
 
@@ -380,7 +377,6 @@ gst_base_src_class_init (GstBaseSrcClass * klass)
   GST_DEBUG_REGISTER_FUNCPTR (gst_base_src_event_handler);
   GST_DEBUG_REGISTER_FUNCPTR (gst_base_src_query);
   GST_DEBUG_REGISTER_FUNCPTR (gst_base_src_pad_get_range);
-  GST_DEBUG_REGISTER_FUNCPTR (gst_base_src_pad_check_get_range);
   GST_DEBUG_REGISTER_FUNCPTR (gst_base_src_getcaps);
   GST_DEBUG_REGISTER_FUNCPTR (gst_base_src_fixate);
 }
@@ -414,7 +410,6 @@ gst_base_src_init (GstBaseSrc * basesrc, gpointer g_class)
   gst_pad_set_activatepull_function (pad, gst_base_src_activate_pull);
   gst_pad_set_event_function (pad, gst_base_src_event_handler);
   gst_pad_set_query_function (pad, gst_base_src_query);
-  gst_pad_set_checkgetrange_function (pad, gst_base_src_pad_check_get_range);
   gst_pad_set_getrange_function (pad, gst_base_src_pad_get_range);
   gst_pad_set_getcaps_function (pad, gst_base_src_getcaps);
   gst_pad_set_fixatecaps_function (pad, gst_base_src_fixate);
@@ -1077,6 +1072,20 @@ gst_base_src_default_query (GstBaseSrc * src, GstQuery * query)
       gst_query_set_buffering_range (query, format, start, stop, estimated);
       break;
     }
+    case GST_QUERY_SCHEDULING:
+    {
+      gboolean random_access;
+
+      random_access = gst_base_src_is_random_access (src);
+
+      /* we can operate in getrange mode if the native format is bytes
+       * and we are seekable, this condition is set in the random_access
+       * flag and is set in the _start() method. */
+      gst_query_set_scheduling (query, random_access, TRUE, FALSE, 1, -1, 1);
+
+      res = TRUE;
+      break;
+    }
     default:
       res = FALSE;
       break;
@@ -2240,60 +2249,16 @@ flushing:
 }
 
 static gboolean
-gst_base_src_default_check_get_range (GstBaseSrc * src)
+gst_base_src_is_random_access (GstBaseSrc * src)
 {
-  gboolean res;
-
+  /* we need to start the basesrc to check random access */
   if (!GST_OBJECT_FLAG_IS_SET (src, GST_BASE_SRC_STARTED)) {
     GST_LOG_OBJECT (src, "doing start/stop to check get_range support");
     if (G_LIKELY (gst_base_src_start (src)))
       gst_base_src_stop (src);
   }
 
-  /* we can operate in getrange mode if the native format is bytes
-   * and we are seekable, this condition is set in the random_access
-   * flag and is set in the _start() method. */
-  res = src->random_access;
-
-  return res;
-}
-
-static gboolean
-gst_base_src_check_get_range (GstBaseSrc * src)
-{
-  GstBaseSrcClass *bclass;
-  gboolean res;
-
-  bclass = GST_BASE_SRC_GET_CLASS (src);
-
-  if (bclass->check_get_range == NULL)
-    goto no_function;
-
-  res = bclass->check_get_range (src);
-  GST_LOG_OBJECT (src, "%s() returned %d",
-      GST_DEBUG_FUNCPTR_NAME (bclass->check_get_range), (gint) res);
-
-  return res;
-
-  /* ERRORS */
-no_function:
-  {
-    GST_WARNING_OBJECT (src, "no check_get_range function set");
-    return FALSE;
-  }
-}
-
-static gboolean
-gst_base_src_pad_check_get_range (GstPad * pad)
-{
-  GstBaseSrc *src;
-  gboolean res;
-
-  src = GST_BASE_SRC (GST_OBJECT_PARENT (pad));
-
-  res = gst_base_src_check_get_range (src);
-
-  return res;
+  return src->random_access;
 }
 
 static void
@@ -2316,6 +2281,7 @@ gst_base_src_loop (GstPad * pad)
   reconfigure = GST_PAD_NEEDS_RECONFIGURE (pad);
   GST_OBJECT_FLAG_UNSET (pad, GST_PAD_NEED_RECONFIGURE);
   GST_OBJECT_UNLOCK (pad);
+
   /* check if we need to renegotiate */
   if (reconfigure) {
     if (!gst_base_src_negotiate (src))
@@ -2976,7 +2942,7 @@ gst_base_src_activate_pull (GstPad * pad, gboolean active)
       goto error_start;
 
     /* if not random_access, we cannot operate in pull mode for now */
-    if (G_UNLIKELY (!gst_base_src_check_get_range (basesrc)))
+    if (G_UNLIKELY (!gst_base_src_is_random_access (basesrc)))
       goto no_get_range;
 
     /* stop flushing now but for live sources, still block in the LIVE lock when
index f1fb7e5231d32bc688c617abee5631f2a5d9d6d1..6cd85087d1ddd014d71a90183824d71acccf64eb 100644 (file)
@@ -191,13 +191,6 @@ struct _GstBaseSrcClass {
 
   /* check if the resource is seekable */
   gboolean      (*is_seekable)  (GstBaseSrc *src);
-  /* check whether the source would support pull-based operation if
-   * it were to be opened now. This vfunc is optional, but should be
-   * implemented if possible to avoid unnecessary start/stop cycles.
-   * The default implementation will open and close the resource to
-   * find out whether get_range is supported and that is usually
-   * undesirable. */
-  gboolean      (*check_get_range) (GstBaseSrc *src);
 
   /* Prepare the segment on which to perform do_seek(), converting to the
    * current basesrc format. */
index 3a57bac2b6d8a7591d598cd0090552269605e052..f5423d73785a676e1c391cde616f909d574025a7 100644 (file)
@@ -309,7 +309,6 @@ static gboolean gst_base_transform_src_eventfunc (GstBaseTransform * trans,
 static gboolean gst_base_transform_sink_event (GstPad * pad, GstEvent * event);
 static gboolean gst_base_transform_sink_eventfunc (GstBaseTransform * trans,
     GstEvent * event);
-static gboolean gst_base_transform_check_get_range (GstPad * pad);
 static GstFlowReturn gst_base_transform_getrange (GstPad * pad, guint64 offset,
     guint length, GstBuffer ** buffer);
 static GstFlowReturn gst_base_transform_chain (GstPad * pad,
@@ -409,8 +408,6 @@ gst_base_transform_init (GstBaseTransform * trans,
       GST_DEBUG_FUNCPTR (gst_base_transform_acceptcaps));
   gst_pad_set_event_function (trans->srcpad,
       GST_DEBUG_FUNCPTR (gst_base_transform_src_event));
-  gst_pad_set_checkgetrange_function (trans->srcpad,
-      GST_DEBUG_FUNCPTR (gst_base_transform_check_get_range));
   gst_pad_set_getrange_function (trans->srcpad,
       GST_DEBUG_FUNCPTR (gst_base_transform_getrange));
   gst_pad_set_activatepull_function (trans->srcpad,
@@ -1945,21 +1942,6 @@ no_buffer:
   }
 }
 
-static gboolean
-gst_base_transform_check_get_range (GstPad * pad)
-{
-  GstBaseTransform *trans;
-  gboolean ret;
-
-  trans = GST_BASE_TRANSFORM (gst_pad_get_parent (pad));
-
-  ret = gst_pad_check_pull_range (trans->sinkpad);
-
-  gst_object_unref (trans);
-
-  return ret;
-}
-
 /* FIXME, getrange is broken, need to pull range from the other
  * end based on the transform_size result.
  */
index 19eb37f902bae5deb3fbd1cd406428c900a24d00..6fcd50ba553f565633814dfec3efb1b1360aefda 100644 (file)
@@ -69,7 +69,7 @@ GST_DEBUG_CATEGORY_STATIC (gst_push_src_debug);
 #define gst_push_src_parent_class parent_class
 G_DEFINE_TYPE_WITH_CODE (GstPushSrc, gst_push_src, GST_TYPE_BASE_SRC, _do_init);
 
-static gboolean gst_push_src_check_get_range (GstBaseSrc * src);
+static gboolean gst_push_src_query (GstBaseSrc * src, GstQuery * query);
 static GstFlowReturn gst_push_src_create (GstBaseSrc * bsrc, guint64 offset,
     guint length, GstBuffer ** ret);
 
@@ -79,8 +79,7 @@ gst_push_src_class_init (GstPushSrcClass * klass)
   GstBaseSrcClass *gstbasesrc_class = (GstBaseSrcClass *) klass;
 
   gstbasesrc_class->create = GST_DEBUG_FUNCPTR (gst_push_src_create);
-  gstbasesrc_class->check_get_range =
-      GST_DEBUG_FUNCPTR (gst_push_src_check_get_range);
+  gstbasesrc_class->query = GST_DEBUG_FUNCPTR (gst_push_src_query);
 }
 
 static void
@@ -90,13 +89,33 @@ gst_push_src_init (GstPushSrc * pushsrc)
 }
 
 static gboolean
-gst_push_src_check_get_range (GstBaseSrc * src)
+gst_push_src_query (GstBaseSrc * src, GstQuery * query)
 {
-  /* a pushsrc can by default never operate in pull mode override
-   * if you want something different. */
-  return FALSE;
+  gboolean ret;
+  GstBaseSrcClass *bclass;
+
+  bclass = GST_BASE_SRC_GET_CLASS (src);
+
+  switch (GST_QUERY_TYPE (query)) {
+    case GST_QUERY_SCHEDULING:
+    {
+      /* a pushsrc can by default never operate in pull mode override
+       * if you want something different. */
+      gst_query_set_scheduling (query, FALSE, FALSE, TRUE, 1, -1, 1);
+      ret = TRUE;
+      break;
+    }
+    default:
+      if (bclass->query)
+        ret = bclass->query (src, query);
+      else
+        ret = FALSE;
+      break;
+  }
+  return ret;
 }
 
+
 static GstFlowReturn
 gst_push_src_create (GstBaseSrc * bsrc, guint64 offset, guint length,
     GstBuffer ** ret)
index 65f3613f667216eff69f154ddbb6586cadf565f7..0b7ca8cae8f02d087429f8a78f63219e31258f95 100644 (file)
@@ -239,7 +239,6 @@ static gboolean gst_queue2_acceptcaps (GstPad * pad, GstCaps * caps);
 
 static GstFlowReturn gst_queue2_get_range (GstPad * pad, guint64 offset,
     guint length, GstBuffer ** buffer);
-static gboolean gst_queue2_src_checkgetrange_function (GstPad * pad);
 
 static gboolean gst_queue2_src_activate_pull (GstPad * pad, gboolean active);
 static gboolean gst_queue2_src_activate_push (GstPad * pad, gboolean active);
@@ -394,8 +393,6 @@ gst_queue2_init (GstQueue2 * queue)
       GST_DEBUG_FUNCPTR (gst_queue2_src_activate_push));
   gst_pad_set_getrange_function (queue->srcpad,
       GST_DEBUG_FUNCPTR (gst_queue2_get_range));
-  gst_pad_set_checkgetrange_function (queue->srcpad,
-      GST_DEBUG_FUNCPTR (gst_queue2_src_checkgetrange_function));
   gst_pad_set_getcaps_function (queue->srcpad,
       GST_DEBUG_FUNCPTR (gst_queue2_getcaps));
   gst_pad_set_acceptcaps_function (queue->srcpad,
@@ -2598,6 +2595,16 @@ gst_queue2_handle_src_query (GstPad * pad, GstQuery * query)
       }
       break;
     }
+    case GST_QUERY_SCHEDULING:
+    {
+      gboolean pull_mode;
+
+      /* we can operate in pull mode when we are using a tempfile */
+      pull_mode = !QUEUE_IS_USING_QUEUE (queue);
+
+      gst_query_set_scheduling (query, pull_mode, pull_mode, FALSE, 0, -1, 1);
+      break;
+    }
     default:
       /* peer handled other queries */
       if (!gst_queue2_peer_query (queue, queue->sinkpad, query))
@@ -2698,22 +2705,6 @@ out_unexpected:
   }
 }
 
-static gboolean
-gst_queue2_src_checkgetrange_function (GstPad * pad)
-{
-  GstQueue2 *queue;
-  gboolean ret;
-
-  queue = GST_QUEUE2 (gst_pad_get_parent (pad));
-
-  /* we can operate in pull mode when we are using a tempfile */
-  ret = !QUEUE_IS_USING_QUEUE (queue);
-
-  gst_object_unref (GST_OBJECT (queue));
-
-  return ret;
-}
-
 /* sink currently only operates in push mode */
 static gboolean
 gst_queue2_sink_activate_push (GstPad * pad, gboolean active)
@@ -2802,7 +2793,7 @@ gst_queue2_src_activate_pull (GstPad * pad, gboolean active)
         result = gst_queue2_open_temp_location_file (queue);
       } else if (!queue->ring_buffer) {
         queue->ring_buffer = g_malloc (queue->ring_buffer_max_size);
-        result = ! !queue->ring_buffer;
+        result = !!queue->ring_buffer;
       } else {
         result = TRUE;
       }
index 699f10c92a4b21c2093a79094102376e592f0eb1..4f2c8f11924dafe9075c731a85ad31272888b696 100644 (file)
@@ -139,7 +139,7 @@ static GstFlowReturn gst_tee_chain (GstPad * pad, GstBuffer * buffer);
 static GstFlowReturn gst_tee_chain_list (GstPad * pad, GstBufferList * list);
 static gboolean gst_tee_sink_acceptcaps (GstPad * pad, GstCaps * caps);
 static gboolean gst_tee_sink_activate_push (GstPad * pad, gboolean active);
-static gboolean gst_tee_src_check_get_range (GstPad * pad);
+static gboolean gst_tee_src_query (GstPad * pad, GstQuery * query);
 static gboolean gst_tee_src_activate_pull (GstPad * pad, gboolean active);
 static GstFlowReturn gst_tee_src_get_range (GstPad * pad, guint64 offset,
     guint length, GstBuffer ** buf);
@@ -333,8 +333,7 @@ gst_tee_request_new_pad (GstElement * element, GstPadTemplate * templ,
       GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps));
   gst_pad_set_activatepull_function (srcpad,
       GST_DEBUG_FUNCPTR (gst_tee_src_activate_pull));
-  gst_pad_set_checkgetrange_function (srcpad,
-      GST_DEBUG_FUNCPTR (gst_tee_src_check_get_range));
+  gst_pad_set_query_function (srcpad, GST_DEBUG_FUNCPTR (gst_tee_src_query));
   gst_pad_set_getrange_function (srcpad,
       GST_DEBUG_FUNCPTR (gst_tee_src_get_range));
   /* Forward sticky events to the new srcpad */
@@ -827,7 +826,7 @@ sink_activate_failed:
 }
 
 static gboolean
-gst_tee_src_check_get_range (GstPad * pad)
+gst_tee_src_query (GstPad * pad, GstQuery * query)
 {
   GstTee *tee;
   gboolean res;
@@ -835,42 +834,43 @@ gst_tee_src_check_get_range (GstPad * pad)
 
   tee = GST_TEE (gst_pad_get_parent (pad));
 
-  GST_OBJECT_LOCK (tee);
-
-  if (tee->pull_mode == GST_TEE_PULL_MODE_NEVER)
-    goto cannot_pull;
-
-  if (tee->pull_mode == GST_TEE_PULL_MODE_SINGLE && tee->pull_pad)
-    goto cannot_pull_multiple_srcs;
+  switch (GST_QUERY_TYPE (query)) {
+    case GST_QUERY_SCHEDULING:
+    {
+      gboolean pull_mode;
 
-  sinkpad = gst_object_ref (tee->sinkpad);
+      GST_OBJECT_LOCK (tee);
+      pull_mode = TRUE;
+      if (tee->pull_mode == GST_TEE_PULL_MODE_NEVER) {
+        GST_INFO_OBJECT (tee, "Cannot activate in pull mode, pull-mode "
+            "set to NEVER");
+        pull_mode = FALSE;
+      } else if (tee->pull_mode == GST_TEE_PULL_MODE_SINGLE && tee->pull_pad) {
+        GST_INFO_OBJECT (tee, "Cannot activate multiple src pads in pull mode, "
+            "pull-mode set to SINGLE");
+        pull_mode = FALSE;
+      }
 
-  GST_OBJECT_UNLOCK (tee);
+      sinkpad = gst_object_ref (tee->sinkpad);
+      GST_OBJECT_UNLOCK (tee);
 
-  res = gst_pad_check_pull_range (sinkpad);
-  gst_object_unref (sinkpad);
+      if (pull_mode) {
+        /* ask peer if we can operate in pull mode */
+        res = gst_pad_peer_query (sinkpad, query);
+      } else {
+        res = TRUE;
+      }
+      gst_object_unref (sinkpad);
+      break;
+    }
+    default:
+      res = gst_pad_query_default (pad, query);
+      break;
+  }
 
   gst_object_unref (tee);
 
   return res;
-
-  /* ERRORS */
-cannot_pull:
-  {
-    GST_OBJECT_UNLOCK (tee);
-    GST_INFO_OBJECT (tee, "Cannot activate in pull mode, pull-mode "
-        "set to NEVER");
-    gst_object_unref (tee);
-    return FALSE;
-  }
-cannot_pull_multiple_srcs:
-  {
-    GST_OBJECT_UNLOCK (tee);
-    GST_INFO_OBJECT (tee, "Cannot activate multiple src pads in pull mode, "
-        "pull-mode set to SINGLE");
-    gst_object_unref (tee);
-    return FALSE;
-  }
 }
 
 static void
index b34c3bd5b52456373b62914f2cf9648696a6afab..7438c52675d40e4def80de27873e7fa335da87b3 100644 (file)
@@ -151,7 +151,6 @@ static GstFlowReturn gst_type_find_element_chain (GstPad * sinkpad,
     GstBuffer * buffer);
 static GstFlowReturn gst_type_find_element_getrange (GstPad * srcpad,
     guint64 offset, guint length, GstBuffer ** buffer);
-static gboolean gst_type_find_element_checkgetrange (GstPad * srcpad);
 
 static GstStateChangeReturn
 gst_type_find_element_change_state (GstElement * element,
@@ -273,8 +272,6 @@ gst_type_find_element_init (GstTypeFindElement * typefind)
 
   gst_pad_set_activatepull_function (typefind->src,
       GST_DEBUG_FUNCPTR (gst_type_find_element_activate_src_pull));
-  gst_pad_set_checkgetrange_function (typefind->src,
-      GST_DEBUG_FUNCPTR (gst_type_find_element_checkgetrange));
   gst_pad_set_getrange_function (typefind->src,
       GST_DEBUG_FUNCPTR (gst_type_find_element_getrange));
   gst_pad_set_event_function (typefind->src,
@@ -851,16 +848,6 @@ low_probability:
   }
 }
 
-static gboolean
-gst_type_find_element_checkgetrange (GstPad * srcpad)
-{
-  GstTypeFindElement *typefind;
-
-  typefind = GST_TYPE_FIND_ELEMENT (GST_PAD_PARENT (srcpad));
-
-  return gst_pad_check_pull_range (typefind->sink);
-}
-
 static GstFlowReturn
 gst_type_find_element_getrange (GstPad * srcpad,
     guint64 offset, guint length, GstBuffer ** buffer)
@@ -891,6 +878,8 @@ gst_type_find_element_activate (GstPad * pad)
   GstTypeFindProbability probability = 0;
   GstCaps *found_caps = NULL;
   GstTypeFindElement *typefind;
+  GstQuery *query;
+  gboolean pull_mode;
 
   typefind = GST_TYPE_FIND_ELEMENT (GST_OBJECT_PARENT (pad));
 
@@ -917,14 +906,25 @@ gst_type_find_element_activate (GstPad * pad)
    */
 
   /* 1 */
-  if (!gst_pad_check_pull_range (pad) || !gst_pad_activate_pull (pad, TRUE)) {
-    start_typefinding (typefind);
-    return gst_pad_activate_push (pad, TRUE);
+  query = gst_query_new_scheduling ();
+
+  if (!gst_pad_peer_query (pad, query)) {
+    gst_query_unref (query);
+    goto typefind_push;
   }
 
-  GST_DEBUG_OBJECT (typefind, "find type in pull mode");
+  gst_query_parse_scheduling (query, &pull_mode, NULL, NULL, NULL, NULL, NULL);
+  gst_query_unref (query);
+
+  if (!pull_mode)
+    goto typefind_push;
+
+  if (!gst_pad_activate_pull (pad, TRUE))
+    goto typefind_push;
 
   /* 2 */
+  GST_DEBUG_OBJECT (typefind, "find type in pull mode");
+
   {
     GstPad *peer;
 
@@ -1010,6 +1010,11 @@ really_done:
     ret &= gst_pad_activate_push (pad, TRUE);
     return ret;
   }
+typefind_push:
+  {
+    start_typefinding (typefind);
+    return gst_pad_activate_push (pad, TRUE);
+  }
 }
 
 static GstStateChangeReturn