mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-19 16:21:17 +00:00
gstpad: Probes that return HANDLED can reset the data info field
Before GST_PAD_PROBE_HANDLED was introduced, we had to handle the case where some probes would reset the probe info data field to NULL. This would be considered an invalid use-case. But with GST_PAD_PROBE_HANDLED it is totally fine to reset that, since the probe has "handled" it.
This commit is contained in:
parent
eec9bd8db3
commit
7aee718394
2 changed files with 33 additions and 1 deletions
|
@ -3569,7 +3569,8 @@ probe_hook_marshal (GHook * hook, ProbeMarshall * data)
|
||||||
if ((flags & GST_PAD_PROBE_TYPE_IDLE))
|
if ((flags & GST_PAD_PROBE_TYPE_IDLE))
|
||||||
pad->priv->idle_running--;
|
pad->priv->idle_running--;
|
||||||
|
|
||||||
if (original_data != NULL && info->data == NULL) {
|
if (ret != GST_PAD_PROBE_HANDLED && original_data != NULL
|
||||||
|
&& info->data == NULL) {
|
||||||
GST_DEBUG_OBJECT (pad, "data item in pad probe info was dropped");
|
GST_DEBUG_OBJECT (pad, "data item in pad probe info was dropped");
|
||||||
info->type = GST_PAD_PROBE_TYPE_INVALID;
|
info->type = GST_PAD_PROBE_TYPE_INVALID;
|
||||||
data->dropped = TRUE;
|
data->dropped = TRUE;
|
||||||
|
|
|
@ -622,6 +622,21 @@ _handled_probe_handler (GstPad * pad, GstPadProbeInfo * info, gpointer userdata)
|
||||||
return GST_PAD_PROBE_HANDLED;
|
return GST_PAD_PROBE_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GstPadProbeReturn
|
||||||
|
_cleaning_handled_probe_handler (GstPad * pad, GstPadProbeInfo * info,
|
||||||
|
gpointer userdata)
|
||||||
|
{
|
||||||
|
GstFlowReturn customflow = (GstFlowReturn) GPOINTER_TO_INT (userdata);
|
||||||
|
|
||||||
|
/* We are handling the data, we unref it and we reset the data field */
|
||||||
|
if (!(GST_PAD_PROBE_INFO_TYPE (info) & GST_PAD_PROBE_TYPE_QUERY_BOTH))
|
||||||
|
gst_mini_object_unref (info->data);
|
||||||
|
GST_PAD_PROBE_INFO_FLOW_RETURN (info) = customflow;
|
||||||
|
GST_PAD_PROBE_INFO_DATA (info) = NULL;
|
||||||
|
|
||||||
|
return GST_PAD_PROBE_HANDLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GST_START_TEST (test_events_query_unlinked)
|
GST_START_TEST (test_events_query_unlinked)
|
||||||
|
@ -786,6 +801,22 @@ GST_START_TEST (test_push_unlinked)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Same thing, except that this time we also set the info data field
|
||||||
|
* to NULL in the probe. We can because we are returning _HANDLED */
|
||||||
|
GST_DEBUG ("push buffer handled and custom return (with info data NULL'ed)");
|
||||||
|
for (fl = GST_FLOW_NOT_SUPPORTED; fl <= GST_FLOW_OK; fl += 1) {
|
||||||
|
GST_DEBUG ("Testing with %s", gst_flow_get_name (fl));
|
||||||
|
id = gst_pad_add_probe (src, GST_PAD_PROBE_TYPE_BUFFER,
|
||||||
|
_cleaning_handled_probe_handler, GINT_TO_POINTER (fl), NULL);
|
||||||
|
buffer = gst_buffer_new ();
|
||||||
|
gst_buffer_ref (buffer);
|
||||||
|
fail_unless (gst_pad_push (src, buffer) == fl);
|
||||||
|
ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
|
||||||
|
gst_buffer_unref (buffer);
|
||||||
|
gst_pad_remove_probe (src, id);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* cleanup */
|
/* cleanup */
|
||||||
ASSERT_CAPS_REFCOUNT (caps, "caps", 2);
|
ASSERT_CAPS_REFCOUNT (caps, "caps", 2);
|
||||||
|
|
Loading…
Reference in a new issue