2000-12-28 22:12:02 +00:00
|
|
|
/* GStreamer
|
|
|
|
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
|
|
|
|
* 2000 Wim Taymans <wtay@chello.be>
|
|
|
|
*
|
2003-01-09 14:15:37 +00:00
|
|
|
* gstpad.c: Pads for linking elements together
|
2000-01-30 09:03:00 +00:00
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Library General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Library General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Library General Public
|
|
|
|
* License along with this library; if not, write to the
|
2012-11-03 20:44:48 +00:00
|
|
|
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
|
|
|
* Boston, MA 02110-1301, USA.
|
2000-01-30 09:03:00 +00:00
|
|
|
*/
|
inlined two more docs factored gstpadtemplate out of gstpad
Original commit message from CVS:
* docs/gst/gstreamer-sections.txt:
* docs/gst/tmpl/.cvsignore:
* docs/gst/tmpl/gstpad.sgml:
* docs/gst/tmpl/gstpadtemplate.sgml:
* gst/Makefile.am:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_finalize), (gst_pad_set_pad_template):
* gst/gstpad.h:
* gst/gstpadtemplate.c: (gst_pad_template_get_type),
(gst_pad_template_class_init), (gst_pad_template_init),
(gst_pad_template_dispose), (name_is_valid),
(gst_static_pad_template_get), (gst_pad_template_new),
(gst_static_pad_template_get_caps), (gst_pad_template_get_caps),
(gst_pad_template_pad_created):
* gst/gstpadtemplate.h:
inlined two more docs
factored gstpadtemplate out of gstpad
2005-09-25 11:19:22 +00:00
|
|
|
/**
|
|
|
|
* SECTION:gstpad
|
2017-01-16 14:26:16 +00:00
|
|
|
* @title: GstPad
|
2005-10-15 16:01:57 +00:00
|
|
|
* @short_description: Object contained by elements that allows links to
|
|
|
|
* other elements
|
2012-03-29 11:34:50 +00:00
|
|
|
* @see_also: #GstPadTemplate, #GstElement, #GstEvent, #GstQuery, #GstBuffer
|
inlined two more docs factored gstpadtemplate out of gstpad
Original commit message from CVS:
* docs/gst/gstreamer-sections.txt:
* docs/gst/tmpl/.cvsignore:
* docs/gst/tmpl/gstpad.sgml:
* docs/gst/tmpl/gstpadtemplate.sgml:
* gst/Makefile.am:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_finalize), (gst_pad_set_pad_template):
* gst/gstpad.h:
* gst/gstpadtemplate.c: (gst_pad_template_get_type),
(gst_pad_template_class_init), (gst_pad_template_init),
(gst_pad_template_dispose), (name_is_valid),
(gst_static_pad_template_get), (gst_pad_template_new),
(gst_static_pad_template_get_caps), (gst_pad_template_get_caps),
(gst_pad_template_pad_created):
* gst/gstpadtemplate.h:
inlined two more docs
factored gstpadtemplate out of gstpad
2005-09-25 11:19:22 +00:00
|
|
|
*
|
2005-10-15 15:30:24 +00:00
|
|
|
* A #GstElement is linked to other elements via "pads", which are extremely
|
|
|
|
* light-weight generic link points.
|
inlined two more docs factored gstpadtemplate out of gstpad
Original commit message from CVS:
* docs/gst/gstreamer-sections.txt:
* docs/gst/tmpl/.cvsignore:
* docs/gst/tmpl/gstpad.sgml:
* docs/gst/tmpl/gstpadtemplate.sgml:
* gst/Makefile.am:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_finalize), (gst_pad_set_pad_template):
* gst/gstpad.h:
* gst/gstpadtemplate.c: (gst_pad_template_get_type),
(gst_pad_template_class_init), (gst_pad_template_init),
(gst_pad_template_dispose), (name_is_valid),
(gst_static_pad_template_get), (gst_pad_template_new),
(gst_static_pad_template_get_caps), (gst_pad_template_get_caps),
(gst_pad_template_pad_created):
* gst/gstpadtemplate.h:
inlined two more docs
factored gstpadtemplate out of gstpad
2005-09-25 11:19:22 +00:00
|
|
|
*
|
2012-03-29 11:34:50 +00:00
|
|
|
* Pads have a #GstPadDirection, source pads produce data, sink pads consume
|
|
|
|
* data.
|
inlined two more docs factored gstpadtemplate out of gstpad
Original commit message from CVS:
* docs/gst/gstreamer-sections.txt:
* docs/gst/tmpl/.cvsignore:
* docs/gst/tmpl/gstpad.sgml:
* docs/gst/tmpl/gstpadtemplate.sgml:
* gst/Makefile.am:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_finalize), (gst_pad_set_pad_template):
* gst/gstpad.h:
* gst/gstpadtemplate.c: (gst_pad_template_get_type),
(gst_pad_template_class_init), (gst_pad_template_init),
(gst_pad_template_dispose), (name_is_valid),
(gst_static_pad_template_get), (gst_pad_template_new),
(gst_static_pad_template_get_caps), (gst_pad_template_get_caps),
(gst_pad_template_pad_created):
* gst/gstpadtemplate.h:
inlined two more docs
factored gstpadtemplate out of gstpad
2005-09-25 11:19:22 +00:00
|
|
|
*
|
2012-03-29 11:34:50 +00:00
|
|
|
* Pads are typically created from a #GstPadTemplate with
|
|
|
|
* gst_pad_new_from_template() and are then added to a #GstElement. This usually
|
|
|
|
* happens when the element is created but it can also happen dynamically based
|
|
|
|
* on the data that the element is processing or based on the pads that the
|
|
|
|
* application requests.
|
inlined two more docs factored gstpadtemplate out of gstpad
Original commit message from CVS:
* docs/gst/gstreamer-sections.txt:
* docs/gst/tmpl/.cvsignore:
* docs/gst/tmpl/gstpad.sgml:
* docs/gst/tmpl/gstpadtemplate.sgml:
* gst/Makefile.am:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_finalize), (gst_pad_set_pad_template):
* gst/gstpad.h:
* gst/gstpadtemplate.c: (gst_pad_template_get_type),
(gst_pad_template_class_init), (gst_pad_template_init),
(gst_pad_template_dispose), (name_is_valid),
(gst_static_pad_template_get), (gst_pad_template_new),
(gst_static_pad_template_get_caps), (gst_pad_template_get_caps),
(gst_pad_template_pad_created):
* gst/gstpadtemplate.h:
inlined two more docs
factored gstpadtemplate out of gstpad
2005-09-25 11:19:22 +00:00
|
|
|
*
|
|
|
|
* Pads without pad templates can be created with gst_pad_new(),
|
2014-05-29 21:54:34 +00:00
|
|
|
* which takes a direction and a name as an argument. If the name is %NULL,
|
inlined two more docs factored gstpadtemplate out of gstpad
Original commit message from CVS:
* docs/gst/gstreamer-sections.txt:
* docs/gst/tmpl/.cvsignore:
* docs/gst/tmpl/gstpad.sgml:
* docs/gst/tmpl/gstpadtemplate.sgml:
* gst/Makefile.am:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_finalize), (gst_pad_set_pad_template):
* gst/gstpad.h:
* gst/gstpadtemplate.c: (gst_pad_template_get_type),
(gst_pad_template_class_init), (gst_pad_template_init),
(gst_pad_template_dispose), (name_is_valid),
(gst_static_pad_template_get), (gst_pad_template_new),
(gst_static_pad_template_get_caps), (gst_pad_template_get_caps),
(gst_pad_template_pad_created):
* gst/gstpadtemplate.h:
inlined two more docs
factored gstpadtemplate out of gstpad
2005-09-25 11:19:22 +00:00
|
|
|
* then a guaranteed unique name will be assigned to it.
|
|
|
|
*
|
2012-03-29 11:34:50 +00:00
|
|
|
* A #GstElement creating a pad will typically use the various
|
|
|
|
* gst_pad_set_*_function() calls to register callbacks for events, queries or
|
|
|
|
* dataflow on the pads.
|
|
|
|
*
|
inlined two more docs factored gstpadtemplate out of gstpad
Original commit message from CVS:
* docs/gst/gstreamer-sections.txt:
* docs/gst/tmpl/.cvsignore:
* docs/gst/tmpl/gstpad.sgml:
* docs/gst/tmpl/gstpadtemplate.sgml:
* gst/Makefile.am:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_finalize), (gst_pad_set_pad_template):
* gst/gstpad.h:
* gst/gstpadtemplate.c: (gst_pad_template_get_type),
(gst_pad_template_class_init), (gst_pad_template_init),
(gst_pad_template_dispose), (name_is_valid),
(gst_static_pad_template_get), (gst_pad_template_new),
(gst_static_pad_template_get_caps), (gst_pad_template_get_caps),
(gst_pad_template_pad_created):
* gst/gstpadtemplate.h:
inlined two more docs
factored gstpadtemplate out of gstpad
2005-09-25 11:19:22 +00:00
|
|
|
* gst_pad_get_parent() will retrieve the #GstElement that owns the pad.
|
|
|
|
*
|
2013-11-30 13:52:40 +00:00
|
|
|
* After two pads are retrieved from an element by gst_element_get_static_pad(),
|
2012-03-29 11:34:50 +00:00
|
|
|
* the pads can be linked with gst_pad_link(). (For quick links,
|
|
|
|
* you can also use gst_element_link(), which will make the obvious
|
|
|
|
* link for you if it's straightforward.). Pads can be unlinked again with
|
|
|
|
* gst_pad_unlink(). gst_pad_get_peer() can be used to check what the pad is
|
|
|
|
* linked to.
|
|
|
|
*
|
|
|
|
* Before dataflow is possible on the pads, they need to be activated with
|
|
|
|
* gst_pad_set_active().
|
|
|
|
*
|
|
|
|
* gst_pad_query() and gst_pad_peer_query() can be used to query various
|
|
|
|
* properties of the pad and the stream.
|
|
|
|
*
|
|
|
|
* To send a #GstEvent on a pad, use gst_pad_send_event() and
|
|
|
|
* gst_pad_push_event(). Some events will be sticky on the pad, meaning that
|
|
|
|
* after they pass on the pad they can be queried later with
|
|
|
|
* gst_pad_get_sticky_event() and gst_pad_sticky_events_foreach().
|
|
|
|
* gst_pad_get_current_caps() and gst_pad_has_current_caps() are convenience
|
|
|
|
* functions to query the current sticky CAPS event on a pad.
|
inlined two more docs factored gstpadtemplate out of gstpad
Original commit message from CVS:
* docs/gst/gstreamer-sections.txt:
* docs/gst/tmpl/.cvsignore:
* docs/gst/tmpl/gstpad.sgml:
* docs/gst/tmpl/gstpadtemplate.sgml:
* gst/Makefile.am:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_finalize), (gst_pad_set_pad_template):
* gst/gstpad.h:
* gst/gstpadtemplate.c: (gst_pad_template_get_type),
(gst_pad_template_class_init), (gst_pad_template_init),
(gst_pad_template_dispose), (name_is_valid),
(gst_static_pad_template_get), (gst_pad_template_new),
(gst_static_pad_template_get_caps), (gst_pad_template_get_caps),
(gst_pad_template_pad_created):
* gst/gstpadtemplate.h:
inlined two more docs
factored gstpadtemplate out of gstpad
2005-09-25 11:19:22 +00:00
|
|
|
*
|
2005-11-24 09:44:07 +00:00
|
|
|
* GstElements will use gst_pad_push() and gst_pad_pull_range() to push out
|
inlined two more docs factored gstpadtemplate out of gstpad
Original commit message from CVS:
* docs/gst/gstreamer-sections.txt:
* docs/gst/tmpl/.cvsignore:
* docs/gst/tmpl/gstpad.sgml:
* docs/gst/tmpl/gstpadtemplate.sgml:
* gst/Makefile.am:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_finalize), (gst_pad_set_pad_template):
* gst/gstpad.h:
* gst/gstpadtemplate.c: (gst_pad_template_get_type),
(gst_pad_template_class_init), (gst_pad_template_init),
(gst_pad_template_dispose), (name_is_valid),
(gst_static_pad_template_get), (gst_pad_template_new),
(gst_static_pad_template_get_caps), (gst_pad_template_get_caps),
(gst_pad_template_pad_created):
* gst/gstpadtemplate.h:
inlined two more docs
factored gstpadtemplate out of gstpad
2005-09-25 11:19:22 +00:00
|
|
|
* or pull in a buffer.
|
|
|
|
*
|
2012-03-29 11:34:50 +00:00
|
|
|
* The dataflow, events and queries that happen on a pad can be monitored with
|
|
|
|
* probes that can be installed with gst_pad_add_probe(). gst_pad_is_blocked()
|
|
|
|
* can be used to check if a block probe is installed on the pad.
|
|
|
|
* gst_pad_is_blocking() checks if the blocking probe is currently blocking the
|
|
|
|
* pad. gst_pad_remove_probe() is used to remove a previously installed probe
|
|
|
|
* and unblock blocking probes if any.
|
|
|
|
*
|
|
|
|
* Pad have an offset that can be retrieved with gst_pad_get_offset(). This
|
|
|
|
* offset will be applied to the running_time of all data passing over the pad.
|
|
|
|
* gst_pad_set_offset() can be used to change the offset.
|
|
|
|
*
|
|
|
|
* Convenience functions exist to start, pause and stop the task on a pad with
|
|
|
|
* gst_pad_start_task(), gst_pad_pause_task() and gst_pad_stop_task()
|
|
|
|
* respectively.
|
inlined two more docs factored gstpadtemplate out of gstpad
Original commit message from CVS:
* docs/gst/gstreamer-sections.txt:
* docs/gst/tmpl/.cvsignore:
* docs/gst/tmpl/gstpad.sgml:
* docs/gst/tmpl/gstpadtemplate.sgml:
* gst/Makefile.am:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_finalize), (gst_pad_set_pad_template):
* gst/gstpad.h:
* gst/gstpadtemplate.c: (gst_pad_template_get_type),
(gst_pad_template_class_init), (gst_pad_template_init),
(gst_pad_template_dispose), (name_is_valid),
(gst_static_pad_template_get), (gst_pad_template_new),
(gst_static_pad_template_get_caps), (gst_pad_template_get_caps),
(gst_pad_template_pad_created):
* gst/gstpadtemplate.h:
inlined two more docs
factored gstpadtemplate out of gstpad
2005-09-25 11:19:22 +00:00
|
|
|
*/
|
2000-01-30 09:03:00 +00:00
|
|
|
|
2000-12-28 21:12:40 +00:00
|
|
|
#include "gst_private.h"
|
|
|
|
|
2000-12-15 01:57:34 +00:00
|
|
|
#include "gstpad.h"
|
inlined two more docs factored gstpadtemplate out of gstpad
Original commit message from CVS:
* docs/gst/gstreamer-sections.txt:
* docs/gst/tmpl/.cvsignore:
* docs/gst/tmpl/gstpad.sgml:
* docs/gst/tmpl/gstpadtemplate.sgml:
* gst/Makefile.am:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_finalize), (gst_pad_set_pad_template):
* gst/gstpad.h:
* gst/gstpadtemplate.c: (gst_pad_template_get_type),
(gst_pad_template_class_init), (gst_pad_template_init),
(gst_pad_template_dispose), (name_is_valid),
(gst_static_pad_template_get), (gst_pad_template_new),
(gst_static_pad_template_get_caps), (gst_pad_template_get_caps),
(gst_pad_template_pad_created):
* gst/gstpadtemplate.h:
inlined two more docs
factored gstpadtemplate out of gstpad
2005-09-25 11:19:22 +00:00
|
|
|
#include "gstpadtemplate.h"
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
#include "gstenumtypes.h"
|
2001-09-17 23:44:58 +00:00
|
|
|
#include "gstutils.h"
|
2003-06-29 14:05:49 +00:00
|
|
|
#include "gstinfo.h"
|
2004-01-18 21:36:20 +00:00
|
|
|
#include "gsterror.h"
|
2014-07-18 05:49:38 +00:00
|
|
|
#include "gsttracerutils.h"
|
2003-12-22 01:39:35 +00:00
|
|
|
#include "gstvalue.h"
|
2005-11-21 18:03:22 +00:00
|
|
|
#include "glib-compat-private.h"
|
2003-12-22 01:39:35 +00:00
|
|
|
|
gst/elements/gstfilesrc.c: compute mapsize correctly
Original commit message from CVS:
* gst/elements/gstfilesrc.c: (gst_filesrc_get_mmap):
compute mapsize correctly
* gst/elements/gstfilesrc.c: (gst_filesrc_get_mmap):
use correct datatypes when calling a varargs function
* gst/elements/gsttypefindelement.c: (stop_typefinding):
push a DISCONT event as first thing
* gst/gst_private.h:
* gst/gstinfo.c: (_gst_debug_init):
remove GST_DATAFLOW debugging category
* gst/gstbin.c: (gst_bin_iterate):
use GST_SCHEDULING category
* gst/gstpad.c: (gst_pad_get_type), (_invent_event),
(gst_pad_push), (gst_pad_pull), (gst_pad_call_chain_function),
(gst_pad_call_get_function):
add GST_DATAFLOW to easily track flow of buffers or events.
* gst/gstqueue.c: (gst_queue_get_type),
(gst_queue_handle_pending_events), (gst_queue_chain),
(gst_queue_get), (gst_queue_handle_src_event):
use own static debugging category GST_DATAFLOW for dataflow,
use DEBUG category for showing which path events go, use LOG
category for buffers.
2004-05-11 16:20:41 +00:00
|
|
|
GST_DEBUG_CATEGORY_STATIC (debug_dataflow);
|
2003-12-23 21:39:35 +00:00
|
|
|
#define GST_CAT_DEFAULT GST_CAT_PADS
|
|
|
|
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
/* Pad signals and args */
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
PAD_LINKED,
|
|
|
|
PAD_UNLINKED,
|
|
|
|
/* FILL ME */
|
inlined two more docs factored gstpadtemplate out of gstpad
Original commit message from CVS:
* docs/gst/gstreamer-sections.txt:
* docs/gst/tmpl/.cvsignore:
* docs/gst/tmpl/gstpad.sgml:
* docs/gst/tmpl/gstpadtemplate.sgml:
* gst/Makefile.am:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_finalize), (gst_pad_set_pad_template):
* gst/gstpad.h:
* gst/gstpadtemplate.c: (gst_pad_template_get_type),
(gst_pad_template_class_init), (gst_pad_template_init),
(gst_pad_template_dispose), (name_is_valid),
(gst_static_pad_template_get), (gst_pad_template_new),
(gst_static_pad_template_get_caps), (gst_pad_template_get_caps),
(gst_pad_template_pad_created):
* gst/gstpadtemplate.h:
inlined two more docs
factored gstpadtemplate out of gstpad
2005-09-25 11:19:22 +00:00
|
|
|
LAST_SIGNAL
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
PAD_PROP_0,
|
|
|
|
PAD_PROP_CAPS,
|
|
|
|
PAD_PROP_DIRECTION,
|
|
|
|
PAD_PROP_TEMPLATE,
|
2015-02-05 13:49:47 +00:00
|
|
|
PAD_PROP_OFFSET
|
|
|
|
/* FILL ME */
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
};
|
|
|
|
|
2009-05-28 14:36:32 +00:00
|
|
|
#define GST_PAD_GET_PRIVATE(obj) \
|
|
|
|
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_PAD, GstPadPrivate))
|
|
|
|
|
2016-03-24 15:13:39 +00:00
|
|
|
#define _PAD_PROBE_TYPE_ALL_BOTH_AND_FLUSH (GST_PAD_PROBE_TYPE_ALL_BOTH | GST_PAD_PROBE_TYPE_EVENT_FLUSH)
|
|
|
|
|
2011-05-20 09:36:25 +00:00
|
|
|
/* we have a pending and an active event on the pad. On source pads only the
|
|
|
|
* active event is used. On sinkpads, events are copied to the pending entry and
|
2014-05-29 21:54:34 +00:00
|
|
|
* moved to the active event when the eventfunc returned %TRUE. */
|
2011-05-18 09:08:52 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
2011-11-22 17:32:51 +00:00
|
|
|
gboolean received;
|
2011-05-18 09:08:52 +00:00
|
|
|
GstEvent *event;
|
|
|
|
} PadEvent;
|
|
|
|
|
2009-05-28 14:36:32 +00:00
|
|
|
struct _GstPadPrivate
|
|
|
|
{
|
2011-11-23 16:50:17 +00:00
|
|
|
guint events_cookie;
|
|
|
|
GArray *events;
|
2013-09-26 09:32:50 +00:00
|
|
|
guint last_cookie;
|
2011-05-26 15:50:15 +00:00
|
|
|
|
|
|
|
gint using;
|
2011-11-07 16:04:13 +00:00
|
|
|
guint probe_list_cookie;
|
|
|
|
guint probe_cookie;
|
2015-04-14 20:06:36 +00:00
|
|
|
|
|
|
|
/* counter of how many idle probes are running directly from the add_probe
|
|
|
|
* call. Used to block any data flowing in the pad while the idle callback
|
|
|
|
* Doesn't finish its work */
|
|
|
|
gint idle_running;
|
2017-11-16 09:47:46 +00:00
|
|
|
|
|
|
|
/* conditional and variable used to ensure pads only get (de)activated
|
|
|
|
* by a single thread at a time. Protected by the object lock */
|
|
|
|
GCond activation_cond;
|
|
|
|
gboolean in_activation;
|
2009-05-28 14:36:32 +00:00
|
|
|
};
|
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
GHook hook;
|
|
|
|
guint cookie;
|
|
|
|
} GstProbe;
|
|
|
|
|
|
|
|
#define PROBE_COOKIE(h) (((GstProbe *)(h))->cookie)
|
2015-04-14 20:06:36 +00:00
|
|
|
#define GST_PAD_IS_RUNNING_IDLE_PROBE(p) \
|
|
|
|
(((GstPad *)(p))->priv->idle_running > 0)
|
2011-05-31 17:16:09 +00:00
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
GstPad *pad;
|
2011-11-08 10:04:19 +00:00
|
|
|
GstPadProbeInfo *info;
|
2011-11-07 16:04:13 +00:00
|
|
|
gboolean dropped;
|
2011-05-31 17:16:09 +00:00
|
|
|
gboolean pass;
|
2015-04-29 13:49:17 +00:00
|
|
|
gboolean handled;
|
2011-11-07 16:04:13 +00:00
|
|
|
gboolean marshalled;
|
2011-05-31 17:16:09 +00:00
|
|
|
guint cookie;
|
|
|
|
} ProbeMarshall;
|
|
|
|
|
2004-03-13 15:27:01 +00:00
|
|
|
static void gst_pad_dispose (GObject * object);
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
static void gst_pad_finalize (GObject * object);
|
|
|
|
static void gst_pad_set_property (GObject * object, guint prop_id,
|
|
|
|
const GValue * value, GParamSpec * pspec);
|
|
|
|
static void gst_pad_get_property (GObject * object, guint prop_id,
|
|
|
|
GValue * value, GParamSpec * pspec);
|
2001-01-29 00:06:02 +00:00
|
|
|
|
2004-03-13 15:27:01 +00:00
|
|
|
static void gst_pad_set_pad_template (GstPad * pad, GstPadTemplate * templ);
|
2011-11-18 12:46:46 +00:00
|
|
|
static gboolean gst_pad_activate_default (GstPad * pad, GstObject * parent);
|
2011-05-26 14:48:14 +00:00
|
|
|
static GstFlowReturn gst_pad_chain_list_default (GstPad * pad,
|
2011-11-17 11:40:45 +00:00
|
|
|
GstObject * parent, GstBufferList * list);
|
2002-01-13 22:22:42 +00:00
|
|
|
|
2011-11-28 12:54:43 +00:00
|
|
|
static GstFlowReturn gst_pad_send_event_unchecked (GstPad * pad,
|
|
|
|
GstEvent * event, GstPadProbeType type);
|
|
|
|
static GstFlowReturn gst_pad_push_event_unchecked (GstPad * pad,
|
2012-03-09 10:53:54 +00:00
|
|
|
GstEvent * event, GstPadProbeType type);
|
2011-11-28 12:54:43 +00:00
|
|
|
|
2016-01-27 10:46:06 +00:00
|
|
|
static gboolean activate_mode_internal (GstPad * pad, GstObject * parent,
|
|
|
|
GstPadMode mode, gboolean active);
|
|
|
|
|
inlined two more docs factored gstpadtemplate out of gstpad
Original commit message from CVS:
* docs/gst/gstreamer-sections.txt:
* docs/gst/tmpl/.cvsignore:
* docs/gst/tmpl/gstpad.sgml:
* docs/gst/tmpl/gstpadtemplate.sgml:
* gst/Makefile.am:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_finalize), (gst_pad_set_pad_template):
* gst/gstpad.h:
* gst/gstpadtemplate.c: (gst_pad_template_get_type),
(gst_pad_template_class_init), (gst_pad_template_init),
(gst_pad_template_dispose), (name_is_valid),
(gst_static_pad_template_get), (gst_pad_template_new),
(gst_static_pad_template_get_caps), (gst_pad_template_get_caps),
(gst_pad_template_pad_created):
* gst/gstpadtemplate.h:
inlined two more docs
factored gstpadtemplate out of gstpad
2005-09-25 11:19:22 +00:00
|
|
|
static guint gst_pad_signals[LAST_SIGNAL] = { 0 };
|
2000-01-30 09:03:00 +00:00
|
|
|
|
2010-10-07 16:23:10 +00:00
|
|
|
static GParamSpec *pspec_caps = NULL;
|
|
|
|
|
docs/design/part-states.txt: Some more docs.
Original commit message from CVS:
* docs/design/part-states.txt:
Some more docs.
* gst/gstbin.c: (gst_bin_set_clock_func), (gst_bin_recalc_state),
(gst_bin_change_state_func), (bin_bus_handler):
Doc updates. Don't distribute the same clock over and over again.
* gst/gstclock.c:
* gst/gstclock.h:
Doc updates.
* gst/gstpad.c: (gst_flow_get_name), (gst_flow_to_quark),
(gst_pad_get_type), (gst_pad_push), (gst_pad_push_event),
(gst_pad_send_event):
* gst/gstpad.h:
Make probe emission threadsafe again.
Register quarks and move _get_name() from utils.
Doc updates.
* gst/gstpipeline.c: (gst_pipeline_class_init),
(gst_pipeline_change_state), (gst_pipeline_provide_clock_func):
Only redistribute the clock of it changed.
* gst/gstsystemclock.h:
Doc updates.
* gst/gstutils.c:
* gst/gstutils.h:
Moved the _flow_get_name() to GstPad.
2005-10-11 11:08:52 +00:00
|
|
|
/* quarks for probe signals */
|
2005-09-21 12:21:10 +00:00
|
|
|
static GQuark buffer_quark;
|
2011-05-26 14:48:14 +00:00
|
|
|
static GQuark buffer_list_quark;
|
2005-09-21 12:21:10 +00:00
|
|
|
static GQuark event_quark;
|
|
|
|
|
docs/design/part-states.txt: Some more docs.
Original commit message from CVS:
* docs/design/part-states.txt:
Some more docs.
* gst/gstbin.c: (gst_bin_set_clock_func), (gst_bin_recalc_state),
(gst_bin_change_state_func), (bin_bus_handler):
Doc updates. Don't distribute the same clock over and over again.
* gst/gstclock.c:
* gst/gstclock.h:
Doc updates.
* gst/gstpad.c: (gst_flow_get_name), (gst_flow_to_quark),
(gst_pad_get_type), (gst_pad_push), (gst_pad_push_event),
(gst_pad_send_event):
* gst/gstpad.h:
Make probe emission threadsafe again.
Register quarks and move _get_name() from utils.
Doc updates.
* gst/gstpipeline.c: (gst_pipeline_class_init),
(gst_pipeline_change_state), (gst_pipeline_provide_clock_func):
Only redistribute the clock of it changed.
* gst/gstsystemclock.h:
Doc updates.
* gst/gstutils.c:
* gst/gstutils.h:
Moved the _flow_get_name() to GstPad.
2005-10-11 11:08:52 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
2006-06-12 09:28:35 +00:00
|
|
|
const gint ret;
|
|
|
|
const gchar *name;
|
docs/design/part-states.txt: Some more docs.
Original commit message from CVS:
* docs/design/part-states.txt:
Some more docs.
* gst/gstbin.c: (gst_bin_set_clock_func), (gst_bin_recalc_state),
(gst_bin_change_state_func), (bin_bus_handler):
Doc updates. Don't distribute the same clock over and over again.
* gst/gstclock.c:
* gst/gstclock.h:
Doc updates.
* gst/gstpad.c: (gst_flow_get_name), (gst_flow_to_quark),
(gst_pad_get_type), (gst_pad_push), (gst_pad_push_event),
(gst_pad_send_event):
* gst/gstpad.h:
Make probe emission threadsafe again.
Register quarks and move _get_name() from utils.
Doc updates.
* gst/gstpipeline.c: (gst_pipeline_class_init),
(gst_pipeline_change_state), (gst_pipeline_provide_clock_func):
Only redistribute the clock of it changed.
* gst/gstsystemclock.h:
Doc updates.
* gst/gstutils.c:
* gst/gstutils.h:
Moved the _flow_get_name() to GstPad.
2005-10-11 11:08:52 +00:00
|
|
|
GQuark quark;
|
|
|
|
} GstFlowQuarks;
|
|
|
|
|
|
|
|
static GstFlowQuarks flow_quarks[] = {
|
2006-05-23 11:13:51 +00:00
|
|
|
{GST_FLOW_CUSTOM_SUCCESS, "custom-success", 0},
|
docs/design/part-states.txt: Some more docs.
Original commit message from CVS:
* docs/design/part-states.txt:
Some more docs.
* gst/gstbin.c: (gst_bin_set_clock_func), (gst_bin_recalc_state),
(gst_bin_change_state_func), (bin_bus_handler):
Doc updates. Don't distribute the same clock over and over again.
* gst/gstclock.c:
* gst/gstclock.h:
Doc updates.
* gst/gstpad.c: (gst_flow_get_name), (gst_flow_to_quark),
(gst_pad_get_type), (gst_pad_push), (gst_pad_push_event),
(gst_pad_send_event):
* gst/gstpad.h:
Make probe emission threadsafe again.
Register quarks and move _get_name() from utils.
Doc updates.
* gst/gstpipeline.c: (gst_pipeline_class_init),
(gst_pipeline_change_state), (gst_pipeline_provide_clock_func):
Only redistribute the clock of it changed.
* gst/gstsystemclock.h:
Doc updates.
* gst/gstutils.c:
* gst/gstutils.h:
Moved the _flow_get_name() to GstPad.
2005-10-11 11:08:52 +00:00
|
|
|
{GST_FLOW_OK, "ok", 0},
|
|
|
|
{GST_FLOW_NOT_LINKED, "not-linked", 0},
|
2012-02-08 14:16:46 +00:00
|
|
|
{GST_FLOW_FLUSHING, "flushing", 0},
|
2011-10-10 09:33:51 +00:00
|
|
|
{GST_FLOW_EOS, "eos", 0},
|
docs/design/part-states.txt: Some more docs.
Original commit message from CVS:
* docs/design/part-states.txt:
Some more docs.
* gst/gstbin.c: (gst_bin_set_clock_func), (gst_bin_recalc_state),
(gst_bin_change_state_func), (bin_bus_handler):
Doc updates. Don't distribute the same clock over and over again.
* gst/gstclock.c:
* gst/gstclock.h:
Doc updates.
* gst/gstpad.c: (gst_flow_get_name), (gst_flow_to_quark),
(gst_pad_get_type), (gst_pad_push), (gst_pad_push_event),
(gst_pad_send_event):
* gst/gstpad.h:
Make probe emission threadsafe again.
Register quarks and move _get_name() from utils.
Doc updates.
* gst/gstpipeline.c: (gst_pipeline_class_init),
(gst_pipeline_change_state), (gst_pipeline_provide_clock_func):
Only redistribute the clock of it changed.
* gst/gstsystemclock.h:
Doc updates.
* gst/gstutils.c:
* gst/gstutils.h:
Moved the _flow_get_name() to GstPad.
2005-10-11 11:08:52 +00:00
|
|
|
{GST_FLOW_NOT_NEGOTIATED, "not-negotiated", 0},
|
|
|
|
{GST_FLOW_ERROR, "error", 0},
|
|
|
|
{GST_FLOW_NOT_SUPPORTED, "not-supported", 0},
|
2009-06-29 09:20:12 +00:00
|
|
|
{GST_FLOW_CUSTOM_ERROR, "custom-error", 0}
|
docs/design/part-states.txt: Some more docs.
Original commit message from CVS:
* docs/design/part-states.txt:
Some more docs.
* gst/gstbin.c: (gst_bin_set_clock_func), (gst_bin_recalc_state),
(gst_bin_change_state_func), (bin_bus_handler):
Doc updates. Don't distribute the same clock over and over again.
* gst/gstclock.c:
* gst/gstclock.h:
Doc updates.
* gst/gstpad.c: (gst_flow_get_name), (gst_flow_to_quark),
(gst_pad_get_type), (gst_pad_push), (gst_pad_push_event),
(gst_pad_send_event):
* gst/gstpad.h:
Make probe emission threadsafe again.
Register quarks and move _get_name() from utils.
Doc updates.
* gst/gstpipeline.c: (gst_pipeline_class_init),
(gst_pipeline_change_state), (gst_pipeline_provide_clock_func):
Only redistribute the clock of it changed.
* gst/gstsystemclock.h:
Doc updates.
* gst/gstutils.c:
* gst/gstutils.h:
Moved the _flow_get_name() to GstPad.
2005-10-11 11:08:52 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gst_flow_get_name:
|
|
|
|
* @ret: a #GstFlowReturn to get the name of.
|
|
|
|
*
|
|
|
|
* Gets a string representing the given flow return.
|
|
|
|
*
|
2006-05-23 11:13:51 +00:00
|
|
|
* Returns: a static string with the name of the flow return.
|
docs/design/part-states.txt: Some more docs.
Original commit message from CVS:
* docs/design/part-states.txt:
Some more docs.
* gst/gstbin.c: (gst_bin_set_clock_func), (gst_bin_recalc_state),
(gst_bin_change_state_func), (bin_bus_handler):
Doc updates. Don't distribute the same clock over and over again.
* gst/gstclock.c:
* gst/gstclock.h:
Doc updates.
* gst/gstpad.c: (gst_flow_get_name), (gst_flow_to_quark),
(gst_pad_get_type), (gst_pad_push), (gst_pad_push_event),
(gst_pad_send_event):
* gst/gstpad.h:
Make probe emission threadsafe again.
Register quarks and move _get_name() from utils.
Doc updates.
* gst/gstpipeline.c: (gst_pipeline_class_init),
(gst_pipeline_change_state), (gst_pipeline_provide_clock_func):
Only redistribute the clock of it changed.
* gst/gstsystemclock.h:
Doc updates.
* gst/gstutils.c:
* gst/gstutils.h:
Moved the _flow_get_name() to GstPad.
2005-10-11 11:08:52 +00:00
|
|
|
*/
|
2011-06-09 16:13:35 +00:00
|
|
|
const gchar *
|
docs/design/part-states.txt: Some more docs.
Original commit message from CVS:
* docs/design/part-states.txt:
Some more docs.
* gst/gstbin.c: (gst_bin_set_clock_func), (gst_bin_recalc_state),
(gst_bin_change_state_func), (bin_bus_handler):
Doc updates. Don't distribute the same clock over and over again.
* gst/gstclock.c:
* gst/gstclock.h:
Doc updates.
* gst/gstpad.c: (gst_flow_get_name), (gst_flow_to_quark),
(gst_pad_get_type), (gst_pad_push), (gst_pad_push_event),
(gst_pad_send_event):
* gst/gstpad.h:
Make probe emission threadsafe again.
Register quarks and move _get_name() from utils.
Doc updates.
* gst/gstpipeline.c: (gst_pipeline_class_init),
(gst_pipeline_change_state), (gst_pipeline_provide_clock_func):
Only redistribute the clock of it changed.
* gst/gstsystemclock.h:
Doc updates.
* gst/gstutils.c:
* gst/gstutils.h:
Moved the _flow_get_name() to GstPad.
2005-10-11 11:08:52 +00:00
|
|
|
gst_flow_get_name (GstFlowReturn ret)
|
|
|
|
{
|
|
|
|
gint i;
|
|
|
|
|
2006-05-23 11:13:51 +00:00
|
|
|
ret = CLAMP (ret, GST_FLOW_CUSTOM_ERROR, GST_FLOW_CUSTOM_SUCCESS);
|
|
|
|
|
2009-06-29 09:20:12 +00:00
|
|
|
for (i = 0; i < G_N_ELEMENTS (flow_quarks); i++) {
|
docs/design/part-states.txt: Some more docs.
Original commit message from CVS:
* docs/design/part-states.txt:
Some more docs.
* gst/gstbin.c: (gst_bin_set_clock_func), (gst_bin_recalc_state),
(gst_bin_change_state_func), (bin_bus_handler):
Doc updates. Don't distribute the same clock over and over again.
* gst/gstclock.c:
* gst/gstclock.h:
Doc updates.
* gst/gstpad.c: (gst_flow_get_name), (gst_flow_to_quark),
(gst_pad_get_type), (gst_pad_push), (gst_pad_push_event),
(gst_pad_send_event):
* gst/gstpad.h:
Make probe emission threadsafe again.
Register quarks and move _get_name() from utils.
Doc updates.
* gst/gstpipeline.c: (gst_pipeline_class_init),
(gst_pipeline_change_state), (gst_pipeline_provide_clock_func):
Only redistribute the clock of it changed.
* gst/gstsystemclock.h:
Doc updates.
* gst/gstutils.c:
* gst/gstutils.h:
Moved the _flow_get_name() to GstPad.
2005-10-11 11:08:52 +00:00
|
|
|
if (ret == flow_quarks[i].ret)
|
|
|
|
return flow_quarks[i].name;
|
|
|
|
}
|
|
|
|
return "unknown";
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gst_flow_to_quark:
|
|
|
|
* @ret: a #GstFlowReturn to get the quark of.
|
|
|
|
*
|
|
|
|
* Get the unique quark for the given GstFlowReturn.
|
|
|
|
*
|
|
|
|
* Returns: the quark associated with the flow return or 0 if an
|
|
|
|
* invalid return was specified.
|
|
|
|
*/
|
|
|
|
GQuark
|
|
|
|
gst_flow_to_quark (GstFlowReturn ret)
|
|
|
|
{
|
|
|
|
gint i;
|
|
|
|
|
2006-05-23 11:13:51 +00:00
|
|
|
ret = CLAMP (ret, GST_FLOW_CUSTOM_ERROR, GST_FLOW_CUSTOM_SUCCESS);
|
|
|
|
|
2009-06-29 09:20:12 +00:00
|
|
|
for (i = 0; i < G_N_ELEMENTS (flow_quarks); i++) {
|
docs/design/part-states.txt: Some more docs.
Original commit message from CVS:
* docs/design/part-states.txt:
Some more docs.
* gst/gstbin.c: (gst_bin_set_clock_func), (gst_bin_recalc_state),
(gst_bin_change_state_func), (bin_bus_handler):
Doc updates. Don't distribute the same clock over and over again.
* gst/gstclock.c:
* gst/gstclock.h:
Doc updates.
* gst/gstpad.c: (gst_flow_get_name), (gst_flow_to_quark),
(gst_pad_get_type), (gst_pad_push), (gst_pad_push_event),
(gst_pad_send_event):
* gst/gstpad.h:
Make probe emission threadsafe again.
Register quarks and move _get_name() from utils.
Doc updates.
* gst/gstpipeline.c: (gst_pipeline_class_init),
(gst_pipeline_change_state), (gst_pipeline_provide_clock_func):
Only redistribute the clock of it changed.
* gst/gstsystemclock.h:
Doc updates.
* gst/gstutils.c:
* gst/gstutils.h:
Moved the _flow_get_name() to GstPad.
2005-10-11 11:08:52 +00:00
|
|
|
if (ret == flow_quarks[i].ret)
|
|
|
|
return flow_quarks[i].quark;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2014-03-11 20:46:14 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_link_get_name:
|
|
|
|
* @ret: a #GstPadLinkReturn to get the name of.
|
|
|
|
*
|
|
|
|
* Gets a string representing the given pad-link return.
|
|
|
|
*
|
|
|
|
* Returns: a static string with the name of the pad-link return.
|
|
|
|
*
|
2014-03-11 21:44:39 +00:00
|
|
|
* Since: 1.4
|
2014-03-11 20:46:14 +00:00
|
|
|
*/
|
|
|
|
const gchar *
|
|
|
|
gst_pad_link_get_name (GstPadLinkReturn ret)
|
|
|
|
{
|
2014-03-11 21:44:39 +00:00
|
|
|
switch (ret) {
|
|
|
|
case GST_PAD_LINK_OK:
|
|
|
|
return "ok";
|
|
|
|
case GST_PAD_LINK_WRONG_HIERARCHY:
|
|
|
|
return "wrong hierarchy";
|
|
|
|
case GST_PAD_LINK_WAS_LINKED:
|
|
|
|
return "was linked";
|
|
|
|
case GST_PAD_LINK_WRONG_DIRECTION:
|
|
|
|
return "wrong direction";
|
|
|
|
case GST_PAD_LINK_NOFORMAT:
|
|
|
|
return "no common format";
|
|
|
|
case GST_PAD_LINK_NOSCHED:
|
|
|
|
return "incompatible scheduling";
|
|
|
|
case GST_PAD_LINK_REFUSED:
|
|
|
|
return "refused";
|
|
|
|
}
|
|
|
|
g_return_val_if_reached ("unknown");
|
2014-03-11 20:46:14 +00:00
|
|
|
}
|
|
|
|
|
2009-04-04 08:20:36 +00:00
|
|
|
#define _do_init \
|
|
|
|
{ \
|
|
|
|
gint i; \
|
|
|
|
\
|
|
|
|
buffer_quark = g_quark_from_static_string ("buffer"); \
|
2011-05-26 14:48:14 +00:00
|
|
|
buffer_list_quark = g_quark_from_static_string ("bufferlist"); \
|
2009-04-04 08:20:36 +00:00
|
|
|
event_quark = g_quark_from_static_string ("event"); \
|
|
|
|
\
|
2009-06-29 09:20:12 +00:00
|
|
|
for (i = 0; i < G_N_ELEMENTS (flow_quarks); i++) { \
|
2009-04-04 08:20:36 +00:00
|
|
|
flow_quarks[i].quark = g_quark_from_static_string (flow_quarks[i].name); \
|
|
|
|
} \
|
|
|
|
\
|
|
|
|
GST_DEBUG_CATEGORY_INIT (debug_dataflow, "GST_DATAFLOW", \
|
|
|
|
GST_DEBUG_BOLD | GST_DEBUG_FG_GREEN, "dataflow inside pads"); \
|
2000-01-30 09:03:00 +00:00
|
|
|
}
|
|
|
|
|
2011-10-14 10:57:38 +00:00
|
|
|
#define gst_pad_parent_class parent_class
|
2009-04-04 08:20:36 +00:00
|
|
|
G_DEFINE_TYPE_WITH_CODE (GstPad, gst_pad, GST_TYPE_OBJECT, _do_init);
|
|
|
|
|
2000-01-30 09:03:00 +00:00
|
|
|
static void
|
2004-03-13 15:27:01 +00:00
|
|
|
gst_pad_class_init (GstPadClass * klass)
|
2001-01-19 02:23:35 +00:00
|
|
|
{
|
2003-05-06 21:58:49 +00:00
|
|
|
GObjectClass *gobject_class;
|
2001-01-29 00:06:02 +00:00
|
|
|
GstObjectClass *gstobject_class;
|
2000-01-30 09:03:00 +00:00
|
|
|
|
2006-05-11 18:10:34 +00:00
|
|
|
gobject_class = G_OBJECT_CLASS (klass);
|
|
|
|
gstobject_class = GST_OBJECT_CLASS (klass);
|
2000-01-30 09:03:00 +00:00
|
|
|
|
2009-05-28 14:36:32 +00:00
|
|
|
g_type_class_add_private (klass, sizeof (GstPadPrivate));
|
|
|
|
|
2009-10-28 00:29:30 +00:00
|
|
|
gobject_class->dispose = gst_pad_dispose;
|
|
|
|
gobject_class->finalize = gst_pad_finalize;
|
|
|
|
gobject_class->set_property = gst_pad_set_property;
|
|
|
|
gobject_class->get_property = gst_pad_get_property;
|
2000-01-30 09:03:00 +00:00
|
|
|
|
2005-08-15 16:57:34 +00:00
|
|
|
/**
|
|
|
|
* GstPad::linked:
|
|
|
|
* @pad: the pad that emitted the signal
|
|
|
|
* @peer: the peer pad that has been connected
|
|
|
|
*
|
|
|
|
* Signals that a pad has been linked to the peer pad.
|
|
|
|
*/
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
gst_pad_signals[PAD_LINKED] =
|
2004-03-13 15:27:01 +00:00
|
|
|
g_signal_new ("linked", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
G_STRUCT_OFFSET (GstPadClass, linked), NULL, NULL,
|
2012-03-02 10:05:48 +00:00
|
|
|
g_cclosure_marshal_generic, G_TYPE_NONE, 1, GST_TYPE_PAD);
|
2005-08-15 16:57:34 +00:00
|
|
|
/**
|
|
|
|
* GstPad::unlinked:
|
|
|
|
* @pad: the pad that emitted the signal
|
|
|
|
* @peer: the peer pad that has been disconnected
|
|
|
|
*
|
|
|
|
* Signals that a pad has been unlinked from the peer pad.
|
|
|
|
*/
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
gst_pad_signals[PAD_UNLINKED] =
|
2004-03-13 15:27:01 +00:00
|
|
|
g_signal_new ("unlinked", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
G_STRUCT_OFFSET (GstPadClass, unlinked), NULL, NULL,
|
2012-03-02 10:05:48 +00:00
|
|
|
g_cclosure_marshal_generic, G_TYPE_NONE, 1, GST_TYPE_PAD);
|
2000-11-25 07:02:55 +00:00
|
|
|
|
2010-10-07 16:23:10 +00:00
|
|
|
pspec_caps = g_param_spec_boxed ("caps", "Caps",
|
|
|
|
"The capabilities of the pad", GST_TYPE_CAPS,
|
|
|
|
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
|
|
|
|
g_object_class_install_property (gobject_class, PAD_PROP_CAPS, pspec_caps);
|
|
|
|
|
2006-05-11 18:10:34 +00:00
|
|
|
g_object_class_install_property (gobject_class, PAD_PROP_DIRECTION,
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
g_param_spec_enum ("direction", "Direction", "The direction of the pad",
|
|
|
|
GST_TYPE_PAD_DIRECTION, GST_PAD_UNKNOWN,
|
2008-03-22 14:56:17 +00:00
|
|
|
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
|
2011-06-02 11:35:52 +00:00
|
|
|
|
gst/gstpad.c: Use _DEBUG_OBJECT when it makes sense.
Original commit message from CVS:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_get_property), (gst_pad_activate_pull),
(gst_pad_activate_push), (gst_pad_set_blocked_async),
(gst_pad_set_activate_function),
(gst_pad_set_activatepull_function),
(gst_pad_set_activatepush_function), (gst_pad_set_chain_function),
(gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_set_event_function),
(gst_pad_set_query_function), (gst_pad_set_query_type_function),
(gst_pad_set_internal_link_function), (gst_pad_set_link_function),
(gst_pad_set_unlink_function), (gst_pad_set_getcaps_function),
(gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_set_bufferalloc_function), (gst_pad_link_check_hierarchy),
(gst_pad_get_caps_unlocked), (gst_pad_get_caps),
(gst_pad_peer_get_caps), (gst_pad_accept_caps),
(gst_pad_peer_accept_caps), (gst_pad_set_caps),
(gst_pad_configure_sink), (gst_pad_configure_src),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_buffer_alloc_unchecked), (gst_pad_alloc_buffer_full),
(gst_pad_query), (gst_pad_load_and_link), (handle_pad_block),
(gst_pad_chain_unchecked), (gst_pad_push), (gst_pad_get_range),
(gst_pad_send_event):
Use _DEBUG_OBJECT when it makes sense.
Protect GST_PAD_CAPS with the OBJECT_LOCK.
Small cleanups and code reflows.
Avoid caps refcounting in _accept_caps.
Refactor alloc_buffer so that the code performed on the peer is in a
separate function. Also if the pad does not implement a buffer alloc
function, we should still check if the pad is flushing before falling
back to the default allocator.
2006-07-31 14:21:10 +00:00
|
|
|
/* FIXME, Make G_PARAM_CONSTRUCT_ONLY when we fix ghostpads. */
|
2006-05-11 18:10:34 +00:00
|
|
|
g_object_class_install_property (gobject_class, PAD_PROP_TEMPLATE,
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
g_param_spec_object ("template", "Template",
|
|
|
|
"The GstPadTemplate of this pad", GST_TYPE_PAD_TEMPLATE,
|
2008-03-22 14:56:17 +00:00
|
|
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
2001-01-29 00:06:02 +00:00
|
|
|
|
2015-02-05 13:49:47 +00:00
|
|
|
/**
|
|
|
|
* GstPad:offset:
|
|
|
|
*
|
|
|
|
* The offset that will be applied to the running time of the pad.
|
|
|
|
*
|
|
|
|
* Since: 1.6
|
|
|
|
*/
|
|
|
|
g_object_class_install_property (gobject_class, PAD_PROP_OFFSET,
|
|
|
|
g_param_spec_int64 ("offset", "Offset",
|
|
|
|
"The running time offset of the pad", 0, G_MAXINT64, 0,
|
|
|
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
|
|
|
|
2001-01-29 00:06:02 +00:00
|
|
|
gstobject_class->path_string_separator = ".";
|
gst/: Removed atomic operations, use existing LOCK.
Original commit message from CVS:
* gst/gstpad.c: (_gst_do_pass_data_accumulator),
(default_have_data), (gst_pad_class_init), (gst_pad_init),
(gst_pad_emit_have_data_signal), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range), (gst_pad_push_event), (gst_pad_send_event):
* gst/gstpad.h:
* gst/gstutils.c: (gst_atomic_int_set), (gst_pad_add_data_probe),
(gst_pad_add_event_probe), (gst_pad_add_buffer_probe),
(gst_pad_remove_data_probe), (gst_pad_remove_event_probe),
(gst_pad_remove_buffer_probe):
Removed atomic operations, use existing LOCK.
Move exception handling out of main code path.
2005-06-30 09:23:54 +00:00
|
|
|
|
2009-12-01 16:54:14 +00:00
|
|
|
/* Register common function pointer descriptions */
|
|
|
|
GST_DEBUG_REGISTER_FUNCPTR (gst_pad_activate_default);
|
|
|
|
GST_DEBUG_REGISTER_FUNCPTR (gst_pad_event_default);
|
|
|
|
GST_DEBUG_REGISTER_FUNCPTR (gst_pad_query_default);
|
|
|
|
GST_DEBUG_REGISTER_FUNCPTR (gst_pad_iterate_internal_links_default);
|
2011-05-26 14:48:14 +00:00
|
|
|
GST_DEBUG_REGISTER_FUNCPTR (gst_pad_chain_list_default);
|
2000-01-30 09:03:00 +00:00
|
|
|
}
|
|
|
|
|
2001-01-21 23:20:46 +00:00
|
|
|
static void
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
gst_pad_init (GstPad * pad)
|
2000-11-01 13:49:41 +00:00
|
|
|
{
|
2010-12-07 15:52:47 +00:00
|
|
|
pad->priv = GST_PAD_GET_PRIVATE (pad);
|
2009-05-28 14:36:32 +00:00
|
|
|
|
2006-07-09 13:26:06 +00:00
|
|
|
GST_PAD_DIRECTION (pad) = GST_PAD_UNKNOWN;
|
2002-05-26 21:54:27 +00:00
|
|
|
|
2009-12-01 16:54:14 +00:00
|
|
|
GST_PAD_ACTIVATEFUNC (pad) = gst_pad_activate_default;
|
|
|
|
GST_PAD_EVENTFUNC (pad) = gst_pad_event_default;
|
|
|
|
GST_PAD_QUERYFUNC (pad) = gst_pad_query_default;
|
|
|
|
GST_PAD_ITERINTLINKFUNC (pad) = gst_pad_iterate_internal_links_default;
|
2011-05-26 14:48:14 +00:00
|
|
|
GST_PAD_CHAINLISTFUNC (pad) = gst_pad_chain_list_default;
|
2002-07-24 21:04:50 +00:00
|
|
|
|
2006-11-03 13:57:28 +00:00
|
|
|
GST_PAD_SET_FLUSHING (pad);
|
2005-03-21 17:34:02 +00:00
|
|
|
|
2012-01-19 08:27:04 +00:00
|
|
|
g_rec_mutex_init (&pad->stream_rec_lock);
|
2005-03-21 17:34:02 +00:00
|
|
|
|
2012-01-19 08:27:04 +00:00
|
|
|
g_cond_init (&pad->block_cond);
|
2011-05-31 17:16:09 +00:00
|
|
|
|
|
|
|
g_hook_list_init (&pad->probes, sizeof (GstProbe));
|
2011-05-02 16:34:18 +00:00
|
|
|
|
2012-01-26 12:24:44 +00:00
|
|
|
pad->priv->events = g_array_sized_new (FALSE, TRUE, sizeof (PadEvent), 16);
|
2013-09-26 09:32:50 +00:00
|
|
|
pad->priv->events_cookie = 0;
|
|
|
|
pad->priv->last_cookie = -1;
|
2017-11-16 09:47:46 +00:00
|
|
|
g_cond_init (&pad->priv->activation_cond);
|
|
|
|
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = GST_FLOW_FLUSHING;
|
2011-11-02 11:37:15 +00:00
|
|
|
}
|
|
|
|
|
2011-05-18 09:08:52 +00:00
|
|
|
/* called when setting the pad inactive. It removes all sticky events from
|
2013-04-23 09:16:16 +00:00
|
|
|
* the pad. must be called with object lock */
|
2011-05-06 09:14:02 +00:00
|
|
|
static void
|
2011-11-23 16:50:17 +00:00
|
|
|
remove_events (GstPad * pad)
|
2011-05-06 09:14:02 +00:00
|
|
|
{
|
2011-11-23 16:50:17 +00:00
|
|
|
guint i, len;
|
|
|
|
GArray *events;
|
2014-07-01 10:22:56 +00:00
|
|
|
gboolean notify = FALSE;
|
2011-05-06 09:14:02 +00:00
|
|
|
|
2011-11-23 16:50:17 +00:00
|
|
|
events = pad->priv->events;
|
2011-11-22 17:32:51 +00:00
|
|
|
|
2011-11-23 16:50:17 +00:00
|
|
|
len = events->len;
|
|
|
|
for (i = 0; i < len; i++) {
|
|
|
|
PadEvent *ev = &g_array_index (events, PadEvent, i);
|
2013-04-23 09:17:05 +00:00
|
|
|
GstEvent *event = ev->event;
|
|
|
|
|
|
|
|
ev->event = NULL;
|
|
|
|
|
2014-07-01 10:22:56 +00:00
|
|
|
if (event && GST_EVENT_TYPE (event) == GST_EVENT_CAPS)
|
|
|
|
notify = TRUE;
|
2013-04-23 09:17:05 +00:00
|
|
|
|
|
|
|
gst_event_unref (event);
|
2011-11-23 16:50:17 +00:00
|
|
|
}
|
2014-07-01 10:22:56 +00:00
|
|
|
|
2011-11-22 17:32:51 +00:00
|
|
|
GST_OBJECT_FLAG_UNSET (pad, GST_PAD_FLAG_PENDING_EVENTS);
|
2011-11-23 16:50:17 +00:00
|
|
|
g_array_set_size (events, 0);
|
|
|
|
pad->priv->events_cookie++;
|
2014-07-01 10:22:56 +00:00
|
|
|
|
|
|
|
if (notify) {
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
|
|
|
|
GST_DEBUG_OBJECT (pad, "notify caps");
|
|
|
|
g_object_notify_by_pspec ((GObject *) pad, pspec_caps);
|
|
|
|
|
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
}
|
2011-05-08 10:43:26 +00:00
|
|
|
}
|
|
|
|
|
2013-04-23 09:16:16 +00:00
|
|
|
/* should be called with object lock */
|
2011-11-23 16:50:17 +00:00
|
|
|
static PadEvent *
|
|
|
|
find_event_by_type (GstPad * pad, GstEventType type, guint idx)
|
2011-05-06 09:14:02 +00:00
|
|
|
{
|
2011-11-23 16:50:17 +00:00
|
|
|
guint i, len;
|
|
|
|
GArray *events;
|
|
|
|
PadEvent *ev;
|
|
|
|
|
|
|
|
events = pad->priv->events;
|
|
|
|
len = events->len;
|
|
|
|
|
|
|
|
for (i = 0; i < len; i++) {
|
|
|
|
ev = &g_array_index (events, PadEvent, i);
|
|
|
|
if (ev->event == NULL)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (GST_EVENT_TYPE (ev->event) == type) {
|
|
|
|
if (idx == 0)
|
|
|
|
goto found;
|
|
|
|
idx--;
|
2015-08-15 15:59:21 +00:00
|
|
|
} else if (GST_EVENT_TYPE (ev->event) > type) {
|
|
|
|
break;
|
2011-11-23 16:50:17 +00:00
|
|
|
}
|
2011-05-06 09:14:02 +00:00
|
|
|
}
|
2011-11-23 16:50:17 +00:00
|
|
|
ev = NULL;
|
|
|
|
found:
|
|
|
|
return ev;
|
|
|
|
}
|
|
|
|
|
2013-04-23 09:16:16 +00:00
|
|
|
/* should be called with OBJECT lock */
|
2011-11-23 16:50:17 +00:00
|
|
|
static PadEvent *
|
|
|
|
find_event (GstPad * pad, GstEvent * event)
|
|
|
|
{
|
|
|
|
guint i, len;
|
|
|
|
GArray *events;
|
|
|
|
PadEvent *ev;
|
|
|
|
|
|
|
|
events = pad->priv->events;
|
|
|
|
len = events->len;
|
|
|
|
|
|
|
|
for (i = 0; i < len; i++) {
|
|
|
|
ev = &g_array_index (events, PadEvent, i);
|
|
|
|
if (event == ev->event)
|
|
|
|
goto found;
|
2015-08-15 15:59:21 +00:00
|
|
|
else if (GST_EVENT_TYPE (ev->event) > GST_EVENT_TYPE (event))
|
|
|
|
break;
|
2011-11-23 16:50:17 +00:00
|
|
|
}
|
|
|
|
ev = NULL;
|
|
|
|
found:
|
|
|
|
return ev;
|
2011-05-06 09:14:02 +00:00
|
|
|
}
|
|
|
|
|
2013-04-23 09:16:16 +00:00
|
|
|
/* should be called with OBJECT lock */
|
2011-05-26 17:45:14 +00:00
|
|
|
static void
|
2011-11-23 16:50:17 +00:00
|
|
|
remove_event_by_type (GstPad * pad, GstEventType type)
|
2011-05-26 17:45:14 +00:00
|
|
|
{
|
2011-11-23 16:50:17 +00:00
|
|
|
guint i, len;
|
|
|
|
GArray *events;
|
|
|
|
PadEvent *ev;
|
|
|
|
|
|
|
|
events = pad->priv->events;
|
|
|
|
len = events->len;
|
|
|
|
|
|
|
|
i = 0;
|
|
|
|
while (i < len) {
|
|
|
|
ev = &g_array_index (events, PadEvent, i);
|
|
|
|
if (ev->event == NULL)
|
|
|
|
goto next;
|
|
|
|
|
2015-08-15 15:59:21 +00:00
|
|
|
if (GST_EVENT_TYPE (ev->event) > type)
|
|
|
|
break;
|
|
|
|
else if (GST_EVENT_TYPE (ev->event) != type)
|
2011-11-23 16:50:17 +00:00
|
|
|
goto next;
|
|
|
|
|
|
|
|
gst_event_unref (ev->event);
|
|
|
|
g_array_remove_index (events, i);
|
|
|
|
len--;
|
|
|
|
pad->priv->events_cookie++;
|
|
|
|
continue;
|
|
|
|
|
|
|
|
next:
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-03-09 10:52:11 +00:00
|
|
|
/* check all events on srcpad against those on sinkpad. All events that are not
|
2014-05-29 21:54:34 +00:00
|
|
|
* on sinkpad are marked as received=%FALSE and the PENDING_EVENTS is set on the
|
2012-03-09 10:52:11 +00:00
|
|
|
* srcpad so that the events will be sent next time */
|
2013-04-23 09:16:16 +00:00
|
|
|
/* should be called with srcpad and sinkpad LOCKS */
|
2011-11-23 16:50:17 +00:00
|
|
|
static void
|
|
|
|
schedule_events (GstPad * srcpad, GstPad * sinkpad)
|
|
|
|
{
|
|
|
|
gint i, len;
|
|
|
|
GArray *events;
|
|
|
|
PadEvent *ev;
|
2011-11-22 17:32:51 +00:00
|
|
|
gboolean pending = FALSE;
|
2011-05-26 17:45:14 +00:00
|
|
|
|
2011-11-23 16:50:17 +00:00
|
|
|
events = srcpad->priv->events;
|
|
|
|
len = events->len;
|
|
|
|
|
|
|
|
for (i = 0; i < len; i++) {
|
|
|
|
ev = &g_array_index (events, PadEvent, i);
|
|
|
|
if (ev->event == NULL)
|
|
|
|
continue;
|
2011-05-26 17:45:14 +00:00
|
|
|
|
2011-11-23 16:50:17 +00:00
|
|
|
if (sinkpad == NULL || !find_event (sinkpad, ev->event)) {
|
|
|
|
ev->received = FALSE;
|
|
|
|
pending = TRUE;
|
|
|
|
}
|
|
|
|
}
|
2011-05-26 17:45:14 +00:00
|
|
|
if (pending)
|
2011-11-23 16:50:17 +00:00
|
|
|
GST_OBJECT_FLAG_SET (srcpad, GST_PAD_FLAG_PENDING_EVENTS);
|
2011-11-22 17:32:51 +00:00
|
|
|
}
|
|
|
|
|
2011-11-23 16:50:17 +00:00
|
|
|
typedef gboolean (*PadEventFunction) (GstPad * pad, PadEvent * ev,
|
|
|
|
gpointer user_data);
|
|
|
|
|
2012-03-08 08:44:21 +00:00
|
|
|
/* should be called with pad LOCK */
|
2011-11-23 16:50:17 +00:00
|
|
|
static void
|
|
|
|
events_foreach (GstPad * pad, PadEventFunction func, gpointer user_data)
|
|
|
|
{
|
|
|
|
guint i, len;
|
|
|
|
GArray *events;
|
|
|
|
gboolean ret;
|
|
|
|
guint cookie;
|
|
|
|
|
|
|
|
events = pad->priv->events;
|
|
|
|
|
|
|
|
restart:
|
|
|
|
cookie = pad->priv->events_cookie;
|
|
|
|
i = 0;
|
|
|
|
len = events->len;
|
|
|
|
while (i < len) {
|
|
|
|
PadEvent *ev, ev_ret;
|
|
|
|
|
|
|
|
ev = &g_array_index (events, PadEvent, i);
|
|
|
|
if (G_UNLIKELY (ev->event == NULL))
|
|
|
|
goto next;
|
|
|
|
|
|
|
|
/* take aditional ref, func might release the lock */
|
|
|
|
ev_ret.event = gst_event_ref (ev->event);
|
|
|
|
ev_ret.received = ev->received;
|
|
|
|
|
|
|
|
ret = func (pad, &ev_ret, user_data);
|
|
|
|
|
|
|
|
/* recheck the cookie, lock might have been released and the list could have
|
|
|
|
* changed */
|
|
|
|
if (G_UNLIKELY (cookie != pad->priv->events_cookie)) {
|
|
|
|
if (G_LIKELY (ev_ret.event))
|
|
|
|
gst_event_unref (ev_ret.event);
|
|
|
|
goto restart;
|
|
|
|
}
|
|
|
|
|
2012-03-09 10:52:29 +00:00
|
|
|
/* store the received state */
|
|
|
|
ev->received = ev_ret.received;
|
|
|
|
|
2011-11-23 16:50:17 +00:00
|
|
|
/* if the event changed, we need to do something */
|
|
|
|
if (G_UNLIKELY (ev->event != ev_ret.event)) {
|
|
|
|
if (G_UNLIKELY (ev_ret.event == NULL)) {
|
|
|
|
/* function unreffed and set the event to NULL, remove it */
|
2014-01-18 01:53:01 +00:00
|
|
|
gst_event_unref (ev->event);
|
2011-11-23 16:50:17 +00:00
|
|
|
g_array_remove_index (events, i);
|
|
|
|
len--;
|
|
|
|
cookie = ++pad->priv->events_cookie;
|
|
|
|
continue;
|
|
|
|
} else {
|
|
|
|
/* function gave a new event for us */
|
|
|
|
gst_event_take (&ev->event, ev_ret.event);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
/* just unref, nothing changed */
|
|
|
|
gst_event_unref (ev_ret.event);
|
|
|
|
}
|
|
|
|
if (!ret)
|
|
|
|
break;
|
|
|
|
next:
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
}
|
2011-11-22 17:32:51 +00:00
|
|
|
|
|
|
|
/* should be called with LOCK */
|
|
|
|
static GstEvent *
|
2015-01-21 13:12:22 +00:00
|
|
|
_apply_pad_offset (GstPad * pad, GstEvent * event, gboolean upstream)
|
2011-11-22 17:32:51 +00:00
|
|
|
{
|
2015-01-21 13:12:22 +00:00
|
|
|
gint64 offset;
|
2014-04-04 15:15:25 +00:00
|
|
|
|
2016-06-11 19:18:06 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "apply pad offset %" GST_STIME_FORMAT,
|
|
|
|
GST_STIME_ARGS (pad->offset));
|
2014-04-04 15:15:25 +00:00
|
|
|
|
2015-01-21 13:12:22 +00:00
|
|
|
if (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT) {
|
|
|
|
GstSegment segment;
|
2014-04-04 15:15:25 +00:00
|
|
|
|
2015-01-21 13:12:22 +00:00
|
|
|
g_assert (!upstream);
|
2014-04-04 15:15:25 +00:00
|
|
|
|
2015-01-21 13:12:22 +00:00
|
|
|
/* copy segment values */
|
|
|
|
gst_event_copy_segment (event, &segment);
|
|
|
|
gst_event_unref (event);
|
2014-04-04 15:15:25 +00:00
|
|
|
|
2015-01-21 13:12:22 +00:00
|
|
|
gst_segment_offset_running_time (&segment, segment.format, pad->offset);
|
|
|
|
event = gst_event_new_segment (&segment);
|
2011-11-22 17:32:51 +00:00
|
|
|
}
|
2015-01-21 13:12:22 +00:00
|
|
|
|
|
|
|
event = gst_event_make_writable (event);
|
|
|
|
offset = gst_event_get_running_time_offset (event);
|
|
|
|
if (upstream)
|
|
|
|
offset -= pad->offset;
|
|
|
|
else
|
|
|
|
offset += pad->offset;
|
|
|
|
gst_event_set_running_time_offset (event, offset);
|
|
|
|
|
2011-11-22 17:32:51 +00:00
|
|
|
return event;
|
2011-05-26 17:45:14 +00:00
|
|
|
}
|
|
|
|
|
2015-01-21 13:12:22 +00:00
|
|
|
static inline GstEvent *
|
|
|
|
apply_pad_offset (GstPad * pad, GstEvent * event, gboolean upstream)
|
|
|
|
{
|
|
|
|
if (G_UNLIKELY (pad->offset != 0))
|
|
|
|
return _apply_pad_offset (pad, event, upstream);
|
|
|
|
return event;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-05-19 16:27:55 +00:00
|
|
|
/* should be called with the OBJECT_LOCK */
|
2011-05-06 15:30:24 +00:00
|
|
|
static GstCaps *
|
|
|
|
get_pad_caps (GstPad * pad)
|
|
|
|
{
|
|
|
|
GstCaps *caps = NULL;
|
2011-11-23 16:50:17 +00:00
|
|
|
PadEvent *ev;
|
2011-05-06 15:30:24 +00:00
|
|
|
|
2011-11-23 16:50:17 +00:00
|
|
|
ev = find_event_by_type (pad, GST_EVENT_CAPS, 0);
|
|
|
|
if (ev && ev->event)
|
|
|
|
gst_event_parse_caps (ev->event, &caps);
|
2011-05-06 15:30:24 +00:00
|
|
|
|
|
|
|
return caps;
|
|
|
|
}
|
2011-05-06 09:14:02 +00:00
|
|
|
|
2000-11-25 07:02:55 +00:00
|
|
|
static void
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
gst_pad_dispose (GObject * object)
|
|
|
|
{
|
2009-12-24 13:40:54 +00:00
|
|
|
GstPad *pad = GST_PAD_CAST (object);
|
2007-12-21 13:54:07 +00:00
|
|
|
GstPad *peer;
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
|
2015-05-15 12:36:04 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_REFCOUNTING, pad, "%p dispose", pad);
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
|
2007-12-21 13:54:07 +00:00
|
|
|
/* unlink the peer pad */
|
|
|
|
if ((peer = gst_pad_get_peer (pad))) {
|
|
|
|
/* window for MT unsafeness, someone else could unlink here
|
|
|
|
* and then we call unlink with wrong pads. The unlink
|
|
|
|
* function would catch this and safely return failed. */
|
|
|
|
if (GST_PAD_IS_SRC (pad))
|
|
|
|
gst_pad_unlink (pad, peer);
|
|
|
|
else
|
|
|
|
gst_pad_unlink (peer, pad);
|
|
|
|
|
|
|
|
gst_object_unref (peer);
|
|
|
|
}
|
2005-09-26 17:46:27 +00:00
|
|
|
|
gst/gstbin.c: Some documentation updates.
Original commit message from CVS:
* gst/gstbin.c: (add_to_queue), (clear_queue), (reset_outdegree),
(update_outdegree), (find_element), (gst_bin_sort_iterator_next),
(gst_bin_sort_iterator_resync), (gst_bin_sort_iterator_free),
(gst_bin_iterate_sorted), (gst_bin_element_set_state),
(gst_bin_change_state), (gst_bin_dispose):
Some documentation updates.
Clean up dispose handlers.
* gst/gstobject.c: (gst_object_ref), (gst_object_unref):
* gst/gstpad.c: (gst_pad_dispose):
Clean up dispose handler.
* gst/gstpipeline.c: (gst_pipeline_change_state):
Removed spurious UNLOCK.
2005-09-28 11:03:58 +00:00
|
|
|
gst_pad_set_pad_template (pad, NULL);
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
|
2013-04-23 09:16:16 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
2011-11-23 16:50:17 +00:00
|
|
|
remove_events (pad);
|
2013-04-23 09:16:16 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2011-05-02 16:34:18 +00:00
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
g_hook_list_clear (&pad->probes);
|
|
|
|
|
inlined two more docs factored gstpadtemplate out of gstpad
Original commit message from CVS:
* docs/gst/gstreamer-sections.txt:
* docs/gst/tmpl/.cvsignore:
* docs/gst/tmpl/gstpad.sgml:
* docs/gst/tmpl/gstpadtemplate.sgml:
* gst/Makefile.am:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_finalize), (gst_pad_set_pad_template):
* gst/gstpad.h:
* gst/gstpadtemplate.c: (gst_pad_template_get_type),
(gst_pad_template_class_init), (gst_pad_template_init),
(gst_pad_template_dispose), (name_is_valid),
(gst_static_pad_template_get), (gst_pad_template_new),
(gst_static_pad_template_get_caps), (gst_pad_template_get_caps),
(gst_pad_template_pad_created):
* gst/gstpadtemplate.h:
inlined two more docs
factored gstpadtemplate out of gstpad
2005-09-25 11:19:22 +00:00
|
|
|
G_OBJECT_CLASS (parent_class)->dispose (object);
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gst_pad_finalize (GObject * object)
|
|
|
|
{
|
2009-12-24 13:40:54 +00:00
|
|
|
GstPad *pad = GST_PAD_CAST (object);
|
check/generic/states.c: Make sure all tasks are stopped.
Original commit message from CVS:
* check/generic/states.c: (GST_START_TEST):
Make sure all tasks are stopped.
* check/gst/gstbin.c: (GST_START_TEST):
Unref after usage for proper valgrinding.
* gst/gstpad.c: (gst_pad_finalize), (gst_pad_stop_task):
Really wait for the task to stop before destroying the
mutex.
* gst/gstqueue.c: (gst_queue_sink_activate_push),
(gst_queue_src_activate_push):
Small cleanups. Don't stop the task when we did not start
it.
* gst/gsttask.c: (gst_task_get_type), (gst_task_init),
(gst_task_func), (gst_task_cleanup_all), (gst_task_set_lock),
(gst_task_get_state), (gst_task_start), (gst_task_pause),
(gst_task_join):
* gst/gsttask.h:
Protect the stream lock with the object lock.
Disallow setting the stream lock when running.
Add cleanup_all to wait for the threadpool to finish.
Remove code to autoallocate a mutex if none was provided.
Add _join() to wait for a task to stop.
Protect the thread pool with a global lock.
2005-08-24 20:49:53 +00:00
|
|
|
GstTask *task;
|
|
|
|
|
|
|
|
/* in case the task is still around, clean it up */
|
|
|
|
if ((task = GST_PAD_TASK (pad))) {
|
|
|
|
gst_task_join (task);
|
|
|
|
GST_PAD_TASK (pad) = NULL;
|
|
|
|
gst_object_unref (task);
|
|
|
|
}
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
|
2011-11-21 14:47:01 +00:00
|
|
|
if (pad->activatenotify)
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->activatenotify (pad->activatedata);
|
2011-11-21 14:47:01 +00:00
|
|
|
if (pad->activatemodenotify)
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->activatemodenotify (pad->activatemodedata);
|
2011-11-21 14:47:01 +00:00
|
|
|
if (pad->linknotify)
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->linknotify (pad->linkdata);
|
2011-11-21 14:47:01 +00:00
|
|
|
if (pad->unlinknotify)
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->unlinknotify (pad->unlinkdata);
|
2011-11-21 14:47:01 +00:00
|
|
|
if (pad->chainnotify)
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->chainnotify (pad->chaindata);
|
2011-11-21 14:47:01 +00:00
|
|
|
if (pad->chainlistnotify)
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->chainlistnotify (pad->chainlistdata);
|
2011-11-21 14:47:01 +00:00
|
|
|
if (pad->getrangenotify)
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->getrangenotify (pad->getrangedata);
|
2011-11-21 14:47:01 +00:00
|
|
|
if (pad->eventnotify)
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->eventnotify (pad->eventdata);
|
2011-11-21 14:47:01 +00:00
|
|
|
if (pad->querynotify)
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->querynotify (pad->querydata);
|
2011-11-21 14:47:01 +00:00
|
|
|
if (pad->iterintlinknotify)
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->iterintlinknotify (pad->iterintlinkdata);
|
2011-11-21 14:47:01 +00:00
|
|
|
|
2012-01-19 08:27:04 +00:00
|
|
|
g_rec_mutex_clear (&pad->stream_rec_lock);
|
|
|
|
g_cond_clear (&pad->block_cond);
|
2017-11-16 09:47:46 +00:00
|
|
|
g_cond_clear (&pad->priv->activation_cond);
|
2011-11-23 16:50:17 +00:00
|
|
|
g_array_free (pad->priv->events, TRUE);
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
|
inlined two more docs factored gstpadtemplate out of gstpad
Original commit message from CVS:
* docs/gst/gstreamer-sections.txt:
* docs/gst/tmpl/.cvsignore:
* docs/gst/tmpl/gstpad.sgml:
* docs/gst/tmpl/gstpadtemplate.sgml:
* gst/Makefile.am:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_finalize), (gst_pad_set_pad_template):
* gst/gstpad.h:
* gst/gstpadtemplate.c: (gst_pad_template_get_type),
(gst_pad_template_class_init), (gst_pad_template_init),
(gst_pad_template_dispose), (name_is_valid),
(gst_static_pad_template_get), (gst_pad_template_new),
(gst_static_pad_template_get_caps), (gst_pad_template_get_caps),
(gst_pad_template_pad_created):
* gst/gstpadtemplate.h:
inlined two more docs
factored gstpadtemplate out of gstpad
2005-09-25 11:19:22 +00:00
|
|
|
G_OBJECT_CLASS (parent_class)->finalize (object);
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gst_pad_set_property (GObject * object, guint prop_id,
|
2004-03-13 15:27:01 +00:00
|
|
|
const GValue * value, GParamSpec * pspec)
|
2001-01-19 02:23:35 +00:00
|
|
|
{
|
2002-01-13 22:22:42 +00:00
|
|
|
g_return_if_fail (GST_IS_PAD (object));
|
2000-11-25 07:02:55 +00:00
|
|
|
|
2001-06-25 01:20:11 +00:00
|
|
|
switch (prop_id) {
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
case PAD_PROP_DIRECTION:
|
2011-08-16 21:00:47 +00:00
|
|
|
GST_PAD_DIRECTION (object) = (GstPadDirection) g_value_get_enum (value);
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
break;
|
|
|
|
case PAD_PROP_TEMPLATE:
|
|
|
|
gst_pad_set_pad_template (GST_PAD_CAST (object),
|
2006-04-06 15:07:12 +00:00
|
|
|
(GstPadTemplate *) g_value_get_object (value));
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
break;
|
2015-02-05 13:49:47 +00:00
|
|
|
case PAD_PROP_OFFSET:
|
|
|
|
gst_pad_set_offset (GST_PAD_CAST (object), g_value_get_int64 (value));
|
|
|
|
break;
|
2000-11-25 07:02:55 +00:00
|
|
|
default:
|
2002-09-12 20:52:03 +00:00
|
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
2000-11-25 07:02:55 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
gst_pad_get_property (GObject * object, guint prop_id,
|
2004-03-13 15:27:01 +00:00
|
|
|
GValue * value, GParamSpec * pspec)
|
2000-11-25 07:02:55 +00:00
|
|
|
{
|
|
|
|
g_return_if_fail (GST_IS_PAD (object));
|
|
|
|
|
2001-06-25 01:20:11 +00:00
|
|
|
switch (prop_id) {
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
case PAD_PROP_CAPS:
|
gst/gstpad.c: Use _DEBUG_OBJECT when it makes sense.
Original commit message from CVS:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_get_property), (gst_pad_activate_pull),
(gst_pad_activate_push), (gst_pad_set_blocked_async),
(gst_pad_set_activate_function),
(gst_pad_set_activatepull_function),
(gst_pad_set_activatepush_function), (gst_pad_set_chain_function),
(gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_set_event_function),
(gst_pad_set_query_function), (gst_pad_set_query_type_function),
(gst_pad_set_internal_link_function), (gst_pad_set_link_function),
(gst_pad_set_unlink_function), (gst_pad_set_getcaps_function),
(gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_set_bufferalloc_function), (gst_pad_link_check_hierarchy),
(gst_pad_get_caps_unlocked), (gst_pad_get_caps),
(gst_pad_peer_get_caps), (gst_pad_accept_caps),
(gst_pad_peer_accept_caps), (gst_pad_set_caps),
(gst_pad_configure_sink), (gst_pad_configure_src),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_buffer_alloc_unchecked), (gst_pad_alloc_buffer_full),
(gst_pad_query), (gst_pad_load_and_link), (handle_pad_block),
(gst_pad_chain_unchecked), (gst_pad_push), (gst_pad_get_range),
(gst_pad_send_event):
Use _DEBUG_OBJECT when it makes sense.
Protect GST_PAD_CAPS with the OBJECT_LOCK.
Small cleanups and code reflows.
Avoid caps refcounting in _accept_caps.
Refactor alloc_buffer so that the code performed on the peer is in a
separate function. Also if the pad does not implement a buffer alloc
function, we should still check if the pad is flushing before falling
back to the default allocator.
2006-07-31 14:21:10 +00:00
|
|
|
GST_OBJECT_LOCK (object);
|
2011-05-06 15:30:24 +00:00
|
|
|
g_value_set_boxed (value, get_pad_caps (GST_PAD_CAST (object)));
|
gst/gstpad.c: Use _DEBUG_OBJECT when it makes sense.
Original commit message from CVS:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_get_property), (gst_pad_activate_pull),
(gst_pad_activate_push), (gst_pad_set_blocked_async),
(gst_pad_set_activate_function),
(gst_pad_set_activatepull_function),
(gst_pad_set_activatepush_function), (gst_pad_set_chain_function),
(gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_set_event_function),
(gst_pad_set_query_function), (gst_pad_set_query_type_function),
(gst_pad_set_internal_link_function), (gst_pad_set_link_function),
(gst_pad_set_unlink_function), (gst_pad_set_getcaps_function),
(gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_set_bufferalloc_function), (gst_pad_link_check_hierarchy),
(gst_pad_get_caps_unlocked), (gst_pad_get_caps),
(gst_pad_peer_get_caps), (gst_pad_accept_caps),
(gst_pad_peer_accept_caps), (gst_pad_set_caps),
(gst_pad_configure_sink), (gst_pad_configure_src),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_buffer_alloc_unchecked), (gst_pad_alloc_buffer_full),
(gst_pad_query), (gst_pad_load_and_link), (handle_pad_block),
(gst_pad_chain_unchecked), (gst_pad_push), (gst_pad_get_range),
(gst_pad_send_event):
Use _DEBUG_OBJECT when it makes sense.
Protect GST_PAD_CAPS with the OBJECT_LOCK.
Small cleanups and code reflows.
Avoid caps refcounting in _accept_caps.
Refactor alloc_buffer so that the code performed on the peer is in a
separate function. Also if the pad does not implement a buffer alloc
function, we should still check if the pad is flushing before falling
back to the default allocator.
2006-07-31 14:21:10 +00:00
|
|
|
GST_OBJECT_UNLOCK (object);
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
break;
|
|
|
|
case PAD_PROP_DIRECTION:
|
|
|
|
g_value_set_enum (value, GST_PAD_DIRECTION (object));
|
|
|
|
break;
|
|
|
|
case PAD_PROP_TEMPLATE:
|
2005-11-15 19:24:46 +00:00
|
|
|
g_value_set_object (value, GST_PAD_PAD_TEMPLATE (object));
|
2002-11-02 13:31:31 +00:00
|
|
|
break;
|
2015-02-05 13:49:47 +00:00
|
|
|
case PAD_PROP_OFFSET:
|
|
|
|
g_value_set_int64 (value, gst_pad_get_offset (GST_PAD_CAST (object)));
|
|
|
|
break;
|
2000-11-25 07:02:55 +00:00
|
|
|
default:
|
2002-09-12 20:52:03 +00:00
|
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
2000-11-25 07:02:55 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-12-13 19:29:35 +00:00
|
|
|
/**
|
2002-05-26 21:54:27 +00:00
|
|
|
* gst_pad_new:
|
2014-06-11 23:19:01 +00:00
|
|
|
* @name: (allow-none): the name of the new pad.
|
2002-09-01 20:11:14 +00:00
|
|
|
* @direction: the #GstPadDirection of the pad.
|
2002-05-26 21:54:27 +00:00
|
|
|
*
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
* Creates a new pad with the given name in the given direction.
|
2014-05-29 21:54:34 +00:00
|
|
|
* If name is %NULL, a guaranteed unique name (across all pads)
|
2002-09-01 20:11:14 +00:00
|
|
|
* will be assigned.
|
2005-03-07 18:27:42 +00:00
|
|
|
* This function makes a copy of the name so you can safely free the name.
|
2002-05-26 21:54:27 +00:00
|
|
|
*
|
2014-06-11 22:21:34 +00:00
|
|
|
* Returns: (transfer floating) (nullable): a new #GstPad, or %NULL in
|
|
|
|
* case of an error.
|
2005-03-07 18:27:42 +00:00
|
|
|
*
|
|
|
|
* MT safe.
|
2002-05-26 21:54:27 +00:00
|
|
|
*/
|
2004-03-13 15:27:01 +00:00
|
|
|
GstPad *
|
|
|
|
gst_pad_new (const gchar * name, GstPadDirection direction)
|
2002-05-26 21:54:27 +00:00
|
|
|
{
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
return g_object_new (GST_TYPE_PAD,
|
|
|
|
"name", name, "direction", direction, NULL);
|
2002-05-26 21:54:27 +00:00
|
|
|
}
|
2002-07-05 16:18:18 +00:00
|
|
|
|
2002-05-26 21:54:27 +00:00
|
|
|
/**
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
* gst_pad_new_from_template:
|
|
|
|
* @templ: the pad template to use
|
2014-08-12 14:33:06 +00:00
|
|
|
* @name: (allow-none): the name of the pad
|
2000-12-13 19:29:35 +00:00
|
|
|
*
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
* Creates a new pad with the given name from the given template.
|
2014-05-29 21:54:34 +00:00
|
|
|
* If name is %NULL, a guaranteed unique name (across all pads)
|
2002-09-01 20:11:14 +00:00
|
|
|
* will be assigned.
|
2005-03-07 18:27:42 +00:00
|
|
|
* This function makes a copy of the name so you can safely free the name.
|
2000-12-13 19:29:35 +00:00
|
|
|
*
|
2014-06-11 22:21:34 +00:00
|
|
|
* Returns: (transfer floating) (nullable): a new #GstPad, or %NULL in
|
|
|
|
* case of an error.
|
2000-12-13 19:29:35 +00:00
|
|
|
*/
|
2004-03-13 15:27:01 +00:00
|
|
|
GstPad *
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
gst_pad_new_from_template (GstPadTemplate * templ, const gchar * name)
|
2000-12-13 19:29:35 +00:00
|
|
|
{
|
2018-02-28 18:51:44 +00:00
|
|
|
GType pad_type =
|
|
|
|
GST_PAD_TEMPLATE_GTYPE (templ) ==
|
|
|
|
G_TYPE_NONE ? GST_TYPE_PAD : GST_PAD_TEMPLATE_GTYPE (templ);
|
2000-12-13 19:29:35 +00:00
|
|
|
|
2018-03-01 00:09:48 +00:00
|
|
|
g_return_val_if_fail (GST_IS_PAD_TEMPLATE (templ), NULL);
|
|
|
|
|
2018-02-28 18:51:44 +00:00
|
|
|
return g_object_new (pad_type,
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
"name", name, "direction", templ->direction, "template", templ, NULL);
|
2000-01-30 09:03:00 +00:00
|
|
|
}
|
|
|
|
|
2005-11-16 16:09:49 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_new_from_static_template:
|
|
|
|
* @templ: the #GstStaticPadTemplate to use
|
2014-08-12 14:33:06 +00:00
|
|
|
* @name: the name of the pad
|
2005-11-16 16:09:49 +00:00
|
|
|
*
|
|
|
|
* Creates a new pad with the given name from the given static template.
|
2014-05-29 21:54:34 +00:00
|
|
|
* If name is %NULL, a guaranteed unique name (across all pads)
|
2005-11-16 16:09:49 +00:00
|
|
|
* will be assigned.
|
|
|
|
* This function makes a copy of the name so you can safely free the name.
|
|
|
|
*
|
2014-06-11 22:21:34 +00:00
|
|
|
* Returns: (transfer floating) (nullable): a new #GstPad, or %NULL in
|
|
|
|
* case of an error.
|
2005-11-16 16:09:49 +00:00
|
|
|
*/
|
|
|
|
GstPad *
|
|
|
|
gst_pad_new_from_static_template (GstStaticPadTemplate * templ,
|
|
|
|
const gchar * name)
|
|
|
|
{
|
|
|
|
GstPad *pad;
|
|
|
|
GstPadTemplate *template;
|
|
|
|
|
|
|
|
template = gst_static_pad_template_get (templ);
|
|
|
|
pad = gst_pad_new_from_template (template, name);
|
|
|
|
gst_object_unref (template);
|
|
|
|
return pad;
|
|
|
|
}
|
|
|
|
|
2011-11-18 12:46:46 +00:00
|
|
|
#define ACQUIRE_PARENT(pad, parent, label) \
|
|
|
|
G_STMT_START { \
|
|
|
|
if (G_LIKELY ((parent = GST_OBJECT_PARENT (pad)))) \
|
|
|
|
gst_object_ref (parent); \
|
|
|
|
else if (G_LIKELY (GST_PAD_NEEDS_PARENT (pad))) \
|
|
|
|
goto label; \
|
|
|
|
} G_STMT_END
|
|
|
|
|
|
|
|
#define RELEASE_PARENT(parent) \
|
|
|
|
G_STMT_START { \
|
|
|
|
if (G_LIKELY (parent)) \
|
|
|
|
gst_object_unref (parent); \
|
|
|
|
} G_STMT_END
|
|
|
|
|
2000-03-27 19:53:43 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_get_direction:
|
2002-09-01 20:11:14 +00:00
|
|
|
* @pad: a #GstPad to get the direction of.
|
2000-03-27 19:53:43 +00:00
|
|
|
*
|
2005-03-07 18:27:42 +00:00
|
|
|
* Gets the direction of the pad. The direction of the pad is
|
2005-10-15 15:30:24 +00:00
|
|
|
* decided at construction time so this function does not take
|
2005-03-07 18:27:42 +00:00
|
|
|
* the LOCK.
|
2000-03-27 19:53:43 +00:00
|
|
|
*
|
2002-09-01 20:11:14 +00:00
|
|
|
* Returns: the #GstPadDirection of the pad.
|
2005-03-07 18:27:42 +00:00
|
|
|
*
|
|
|
|
* MT safe.
|
2000-03-27 19:53:43 +00:00
|
|
|
*/
|
2001-01-21 23:20:46 +00:00
|
|
|
GstPadDirection
|
2004-03-13 15:27:01 +00:00
|
|
|
gst_pad_get_direction (GstPad * pad)
|
2000-11-01 13:49:41 +00:00
|
|
|
{
|
2005-03-07 18:27:42 +00:00
|
|
|
GstPadDirection result;
|
|
|
|
|
2005-03-09 17:28:52 +00:00
|
|
|
/* PAD_UNKNOWN is a little silly but we need some sort of
|
2005-03-07 18:27:42 +00:00
|
|
|
* error return value */
|
2001-01-19 09:37:32 +00:00
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), GST_PAD_UNKNOWN);
|
2000-01-30 09:03:00 +00:00
|
|
|
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
result = GST_PAD_DIRECTION (pad);
|
2005-03-07 18:27:42 +00:00
|
|
|
|
|
|
|
return result;
|
2000-01-30 09:03:00 +00:00
|
|
|
}
|
|
|
|
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
static gboolean
|
2011-11-18 12:46:46 +00:00
|
|
|
gst_pad_activate_default (GstPad * pad, GstObject * parent)
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
{
|
2016-01-27 10:46:06 +00:00
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
|
|
|
|
|
|
|
|
return activate_mode_internal (pad, parent, GST_PAD_MODE_PUSH, TRUE);
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
}
|
|
|
|
|
2012-09-11 18:49:58 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_mode_get_name:
|
|
|
|
* @mode: the pad mode
|
|
|
|
*
|
|
|
|
* Return the name of a pad mode, for use in debug messages mostly.
|
|
|
|
*
|
|
|
|
* Returns: short mnemonic for pad mode @mode
|
|
|
|
*/
|
|
|
|
const gchar *
|
2012-07-03 21:20:40 +00:00
|
|
|
gst_pad_mode_get_name (GstPadMode mode)
|
|
|
|
{
|
|
|
|
switch (mode) {
|
|
|
|
case GST_PAD_MODE_NONE:
|
|
|
|
return "none";
|
|
|
|
case GST_PAD_MODE_PUSH:
|
|
|
|
return "push";
|
|
|
|
case GST_PAD_MODE_PULL:
|
|
|
|
return "pull";
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return "unknown";
|
|
|
|
}
|
|
|
|
|
2017-11-16 07:26:12 +00:00
|
|
|
/* Returns TRUE if pad wasn't already in the new_mode */
|
|
|
|
static gboolean
|
2011-11-18 11:35:46 +00:00
|
|
|
pre_activate (GstPad * pad, GstPadMode new_mode)
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
{
|
2005-10-11 15:23:10 +00:00
|
|
|
switch (new_mode) {
|
2011-11-18 11:35:46 +00:00
|
|
|
case GST_PAD_MODE_NONE:
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
2017-11-16 09:47:46 +00:00
|
|
|
while (G_UNLIKELY (pad->priv->in_activation))
|
|
|
|
g_cond_wait (&pad->priv->activation_cond, GST_OBJECT_GET_LOCK (pad));
|
2017-11-16 07:26:12 +00:00
|
|
|
if (new_mode == GST_PAD_MODE (pad)) {
|
|
|
|
GST_WARNING_OBJECT (pad,
|
|
|
|
"Pad is already in the process of being deactivated");
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2017-11-16 09:47:46 +00:00
|
|
|
pad->priv->in_activation = TRUE;
|
2011-11-21 12:29:05 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "setting PAD_MODE NONE, set flushing");
|
2005-10-11 15:23:10 +00:00
|
|
|
GST_PAD_SET_FLUSHING (pad);
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = GST_FLOW_FLUSHING;
|
2011-11-18 11:35:46 +00:00
|
|
|
GST_PAD_MODE (pad) = new_mode;
|
2005-10-11 15:23:10 +00:00
|
|
|
/* unlock blocked pads so element can resume and stop */
|
2006-11-03 13:57:28 +00:00
|
|
|
GST_PAD_BLOCK_BROADCAST (pad);
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2005-10-11 15:23:10 +00:00
|
|
|
break;
|
2011-11-21 12:29:05 +00:00
|
|
|
case GST_PAD_MODE_PUSH:
|
|
|
|
case GST_PAD_MODE_PULL:
|
|
|
|
GST_OBJECT_LOCK (pad);
|
2017-11-16 09:47:46 +00:00
|
|
|
while (G_UNLIKELY (pad->priv->in_activation))
|
|
|
|
g_cond_wait (&pad->priv->activation_cond, GST_OBJECT_GET_LOCK (pad));
|
2017-11-16 07:26:12 +00:00
|
|
|
if (new_mode == GST_PAD_MODE (pad)) {
|
|
|
|
GST_WARNING_OBJECT (pad,
|
|
|
|
"Pad is already in the process of being activated");
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2017-11-16 09:47:46 +00:00
|
|
|
pad->priv->in_activation = TRUE;
|
2012-07-03 21:20:40 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "setting pad into %s mode, unset flushing",
|
|
|
|
gst_pad_mode_get_name (new_mode));
|
2011-11-21 12:29:05 +00:00
|
|
|
GST_PAD_UNSET_FLUSHING (pad);
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = GST_FLOW_OK;
|
2011-11-21 12:29:05 +00:00
|
|
|
GST_PAD_MODE (pad) = new_mode;
|
2011-11-22 17:32:51 +00:00
|
|
|
if (GST_PAD_IS_SINK (pad)) {
|
|
|
|
GstPad *peer;
|
|
|
|
/* make sure the peer src pad sends us all events */
|
|
|
|
if ((peer = GST_PAD_PEER (pad))) {
|
|
|
|
gst_object_ref (peer);
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
|
|
|
|
GST_DEBUG_OBJECT (pad, "reschedule events on peer %s:%s",
|
|
|
|
GST_DEBUG_PAD_NAME (peer));
|
|
|
|
|
|
|
|
GST_OBJECT_LOCK (peer);
|
2011-11-23 16:50:17 +00:00
|
|
|
schedule_events (peer, NULL);
|
2011-11-22 17:32:51 +00:00
|
|
|
GST_OBJECT_UNLOCK (peer);
|
|
|
|
|
|
|
|
gst_object_unref (peer);
|
|
|
|
} else {
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
}
|
2011-11-21 12:29:05 +00:00
|
|
|
break;
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
}
|
2017-11-16 07:26:12 +00:00
|
|
|
return TRUE;
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2011-11-18 11:35:46 +00:00
|
|
|
post_activate (GstPad * pad, GstPadMode new_mode)
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
{
|
2005-10-11 15:23:10 +00:00
|
|
|
switch (new_mode) {
|
2011-11-18 11:35:46 +00:00
|
|
|
case GST_PAD_MODE_NONE:
|
2018-01-16 09:17:58 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
pad->priv->in_activation = FALSE;
|
|
|
|
g_cond_broadcast (&pad->priv->activation_cond);
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
|
2005-10-11 15:23:10 +00:00
|
|
|
/* ensures that streaming stops */
|
2005-11-21 17:21:15 +00:00
|
|
|
GST_PAD_STREAM_LOCK (pad);
|
Do not set the internal pad as a parent anymore so we can avoid hierarchy linking errors when the ghostpad has no par...
Original commit message from CVS:
* docs/design/part-gstghostpad.txt:
* gst/gstghostpad.c: (gst_ghost_pad_class_init),
(gst_ghost_pad_internal_do_activate_push),
(gst_ghost_pad_internal_do_activate_pull),
(gst_ghost_pad_do_activate_push), (gst_ghost_pad_do_activate_pull),
(gst_ghost_pad_do_link), (gst_ghost_pad_dispose),
(gst_ghost_pad_new_full), (gst_ghost_pad_set_target):
Do not set the internal pad as a parent anymore so we can avoid
hierarchy linking errors when the ghostpad has no parent yet. This also
fixes failed activation because of unlinked internal pads, which in
turn fixes the impossible case where you have to activate a pad before
you can add it to a running element.
Also fix the docs.
* gst/gstpad.c: (pre_activate), (post_activate),
(gst_pad_set_active), (gst_pad_activate_pull),
(gst_pad_activate_push), (gst_pad_check_pull_range):
Add some more debug info.
Mark activation mode in pre_activate so that we don't try to activate in
endless loops. Fixes #385084.
2007-02-20 10:16:27 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "stopped streaming");
|
2011-05-05 11:10:42 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
2011-11-23 16:50:17 +00:00
|
|
|
remove_events (pad);
|
2011-05-05 11:10:42 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2005-11-21 17:21:15 +00:00
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
2005-10-11 15:23:10 +00:00
|
|
|
break;
|
2011-11-21 12:29:05 +00:00
|
|
|
case GST_PAD_MODE_PUSH:
|
|
|
|
case GST_PAD_MODE_PULL:
|
2017-11-16 09:47:46 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
pad->priv->in_activation = FALSE;
|
|
|
|
g_cond_broadcast (&pad->priv->activation_cond);
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2011-11-21 12:29:05 +00:00
|
|
|
/* NOP */
|
|
|
|
break;
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-07-24 21:04:50 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_set_active:
|
2002-09-01 20:11:14 +00:00
|
|
|
* @pad: the #GstPad to activate or deactivate.
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
* @active: whether or not the pad should be active.
|
2002-07-24 21:04:50 +00:00
|
|
|
*
|
2005-10-05 22:35:14 +00:00
|
|
|
* Activates or deactivates the given pad.
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
* Normally called from within core state change functions.
|
gst/: Simplify pad activation.
Original commit message from CVS:
* gst/base/Makefile.am:
* gst/base/README:
* gst/base/gstbasesink.c: (gst_basesink_get_type),
(gst_basesink_base_init), (gst_basesink_class_init),
(gst_basesink_pad_getcaps), (gst_basesink_init),
(gst_basesink_activate), (gst_basesink_change_state):
* gst/base/gstbasesink.h:
* gst/base/gstbasetransform.c: (gst_base_transform_get_type),
(gst_base_transform_base_init), (gst_base_transform_finalize),
(gst_base_transform_class_init), (gst_base_transform_init),
(gst_base_transform_proxy_getcaps), (gst_base_transform_setcaps),
(gst_base_transform_event), (gst_base_transform_getrange),
(gst_base_transform_chain), (gst_base_transform_handle_buffer),
(gst_base_transform_set_property),
(gst_base_transform_get_property),
(gst_base_transform_sink_activate),
(gst_base_transform_src_activate),
(gst_base_transform_change_state):
* gst/base/gstbasetransform.h:
* gst/elements/gstidentity.c: (gst_identity_finalize),
(gst_identity_class_init), (gst_identity_init),
(gst_identity_event), (gst_identity_check_perfect),
(gst_identity_transform), (gst_identity_set_property),
(gst_identity_get_property), (gst_identity_change_state):
* gst/elements/gstidentity.h:
* gst/gstelement.c: (gst_element_get_state_func),
(gst_element_lost_state), (gst_element_pads_activate):
* gst/gstpad.c: (gst_pad_set_active), (gst_pad_peer_set_active),
(gst_pad_check_pull_range), (gst_pad_pull_range):
* gst/gstpad.h:
Simplify pad activation.
Added function to check if pull_range can be performed.
Error out when pulling inactive or flushing pads.
Removed const from refcounted types as it does not make sense.
Simplify pad templates in basesink
Added base class for simple 1-to-1 transforms.
Make identity subclass the base transform.
2005-03-29 16:18:12 +00:00
|
|
|
*
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
* If @active, makes sure the pad is active. If it is already active, either in
|
|
|
|
* push or pull mode, just return. Otherwise dispatches to the pad's activate
|
|
|
|
* function to perform the actual activation.
|
gst/: Simplify pad activation.
Original commit message from CVS:
* gst/base/Makefile.am:
* gst/base/README:
* gst/base/gstbasesink.c: (gst_basesink_get_type),
(gst_basesink_base_init), (gst_basesink_class_init),
(gst_basesink_pad_getcaps), (gst_basesink_init),
(gst_basesink_activate), (gst_basesink_change_state):
* gst/base/gstbasesink.h:
* gst/base/gstbasetransform.c: (gst_base_transform_get_type),
(gst_base_transform_base_init), (gst_base_transform_finalize),
(gst_base_transform_class_init), (gst_base_transform_init),
(gst_base_transform_proxy_getcaps), (gst_base_transform_setcaps),
(gst_base_transform_event), (gst_base_transform_getrange),
(gst_base_transform_chain), (gst_base_transform_handle_buffer),
(gst_base_transform_set_property),
(gst_base_transform_get_property),
(gst_base_transform_sink_activate),
(gst_base_transform_src_activate),
(gst_base_transform_change_state):
* gst/base/gstbasetransform.h:
* gst/elements/gstidentity.c: (gst_identity_finalize),
(gst_identity_class_init), (gst_identity_init),
(gst_identity_event), (gst_identity_check_perfect),
(gst_identity_transform), (gst_identity_set_property),
(gst_identity_get_property), (gst_identity_change_state):
* gst/elements/gstidentity.h:
* gst/gstelement.c: (gst_element_get_state_func),
(gst_element_lost_state), (gst_element_pads_activate):
* gst/gstpad.c: (gst_pad_set_active), (gst_pad_peer_set_active),
(gst_pad_check_pull_range), (gst_pad_pull_range):
* gst/gstpad.h:
Simplify pad activation.
Added function to check if pull_range can be performed.
Error out when pulling inactive or flushing pads.
Removed const from refcounted types as it does not make sense.
Simplify pad templates in basesink
Added base class for simple 1-to-1 transforms.
Make identity subclass the base transform.
2005-03-29 16:18:12 +00:00
|
|
|
*
|
2012-09-28 08:41:54 +00:00
|
|
|
* If not @active, calls gst_pad_activate_mode() with the pad's current mode
|
2014-05-29 21:54:34 +00:00
|
|
|
* and a %FALSE argument.
|
2005-03-07 18:27:42 +00:00
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Returns: %TRUE if the operation was successful.
|
2005-03-21 17:34:02 +00:00
|
|
|
*
|
2005-11-14 12:43:43 +00:00
|
|
|
* MT safe.
|
2005-03-21 17:34:02 +00:00
|
|
|
*/
|
|
|
|
gboolean
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
gst_pad_set_active (GstPad * pad, gboolean active)
|
2005-03-21 17:34:02 +00:00
|
|
|
{
|
2011-11-18 12:46:46 +00:00
|
|
|
GstObject *parent;
|
2011-11-18 11:35:46 +00:00
|
|
|
GstPadMode old;
|
2005-06-27 18:39:41 +00:00
|
|
|
gboolean ret = FALSE;
|
2005-03-28 14:54:33 +00:00
|
|
|
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
|
|
|
|
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
2011-11-18 11:35:46 +00:00
|
|
|
old = GST_PAD_MODE (pad);
|
2011-11-18 12:46:46 +00:00
|
|
|
ACQUIRE_PARENT (pad, parent, no_parent);
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2005-03-28 14:54:33 +00:00
|
|
|
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
if (active) {
|
2011-11-21 12:29:05 +00:00
|
|
|
if (old == GST_PAD_MODE_NONE) {
|
|
|
|
GST_DEBUG_OBJECT (pad, "activating pad from none");
|
|
|
|
ret = (GST_PAD_ACTIVATEFUNC (pad)) (pad, parent);
|
2014-05-23 16:25:35 +00:00
|
|
|
if (ret)
|
|
|
|
pad->ABI.abi.last_flowret = GST_FLOW_OK;
|
2011-11-21 12:29:05 +00:00
|
|
|
} else {
|
2012-07-03 21:20:40 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "pad was active in %s mode",
|
|
|
|
gst_pad_mode_get_name (old));
|
2011-11-21 12:29:05 +00:00
|
|
|
ret = TRUE;
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
}
|
|
|
|
} else {
|
2011-11-21 12:29:05 +00:00
|
|
|
if (old == GST_PAD_MODE_NONE) {
|
|
|
|
GST_DEBUG_OBJECT (pad, "pad was inactive");
|
|
|
|
ret = TRUE;
|
|
|
|
} else {
|
2012-07-03 21:20:40 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "deactivating pad from %s mode",
|
|
|
|
gst_pad_mode_get_name (old));
|
2016-01-27 10:46:06 +00:00
|
|
|
ret = activate_mode_internal (pad, parent, old, FALSE);
|
2014-05-23 16:25:35 +00:00
|
|
|
if (ret)
|
|
|
|
pad->ABI.abi.last_flowret = GST_FLOW_FLUSHING;
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-11-18 12:46:46 +00:00
|
|
|
RELEASE_PARENT (parent);
|
|
|
|
|
2011-11-21 12:29:05 +00:00
|
|
|
if (G_UNLIKELY (!ret))
|
2011-11-18 12:46:46 +00:00
|
|
|
goto failed;
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
|
|
|
/* ERRORS */
|
|
|
|
no_parent:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (pad, "no parent");
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
failed:
|
|
|
|
{
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
2006-08-20 19:30:09 +00:00
|
|
|
if (!active) {
|
|
|
|
g_critical ("Failed to deactivate pad %s:%s, very bad",
|
|
|
|
GST_DEBUG_PAD_NAME (pad));
|
|
|
|
} else {
|
Do not set the internal pad as a parent anymore so we can avoid hierarchy linking errors when the ghostpad has no par...
Original commit message from CVS:
* docs/design/part-gstghostpad.txt:
* gst/gstghostpad.c: (gst_ghost_pad_class_init),
(gst_ghost_pad_internal_do_activate_push),
(gst_ghost_pad_internal_do_activate_pull),
(gst_ghost_pad_do_activate_push), (gst_ghost_pad_do_activate_pull),
(gst_ghost_pad_do_link), (gst_ghost_pad_dispose),
(gst_ghost_pad_new_full), (gst_ghost_pad_set_target):
Do not set the internal pad as a parent anymore so we can avoid
hierarchy linking errors when the ghostpad has no parent yet. This also
fixes failed activation because of unlinked internal pads, which in
turn fixes the impossible case where you have to activate a pad before
you can add it to a running element.
Also fix the docs.
* gst/gstpad.c: (pre_activate), (post_activate),
(gst_pad_set_active), (gst_pad_activate_pull),
(gst_pad_activate_push), (gst_pad_check_pull_range):
Add some more debug info.
Mark activation mode in pre_activate so that we don't try to activate in
endless loops. Fixes #385084.
2007-02-20 10:16:27 +00:00
|
|
|
GST_WARNING_OBJECT (pad, "Failed to activate pad");
|
2006-08-20 19:30:09 +00:00
|
|
|
}
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2011-11-18 12:46:46 +00:00
|
|
|
return FALSE;
|
2005-10-11 15:23:10 +00:00
|
|
|
}
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
}
|
2005-05-25 13:59:18 +00:00
|
|
|
|
2016-01-27 10:46:06 +00:00
|
|
|
static gboolean
|
|
|
|
activate_mode_internal (GstPad * pad, GstObject * parent, GstPadMode mode,
|
|
|
|
gboolean active)
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
{
|
2011-11-18 12:46:46 +00:00
|
|
|
gboolean res = FALSE;
|
2011-11-18 11:35:46 +00:00
|
|
|
GstPadMode old, new;
|
2011-11-21 12:29:05 +00:00
|
|
|
GstPadDirection dir;
|
2005-10-12 10:05:36 +00:00
|
|
|
GstPad *peer;
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
2011-11-18 11:35:46 +00:00
|
|
|
old = GST_PAD_MODE (pad);
|
2011-11-21 12:29:05 +00:00
|
|
|
dir = GST_PAD_DIRECTION (pad);
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
|
2011-11-21 12:29:05 +00:00
|
|
|
new = active ? mode : GST_PAD_MODE_NONE;
|
|
|
|
|
|
|
|
if (old == new)
|
|
|
|
goto was_ok;
|
|
|
|
|
2012-07-03 21:24:22 +00:00
|
|
|
if (active && old != mode && old != GST_PAD_MODE_NONE) {
|
2011-11-21 12:29:05 +00:00
|
|
|
/* pad was activate in the wrong direction, deactivate it
|
|
|
|
* and reactivate it in the requested mode */
|
2012-07-03 21:20:40 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "deactivating pad from %s mode",
|
|
|
|
gst_pad_mode_get_name (old));
|
|
|
|
|
2016-01-27 10:46:06 +00:00
|
|
|
if (G_UNLIKELY (!activate_mode_internal (pad, parent, old, FALSE)))
|
2011-11-21 12:29:05 +00:00
|
|
|
goto deactivate_failed;
|
2016-05-10 12:01:42 +00:00
|
|
|
old = GST_PAD_MODE_NONE;
|
2005-03-28 14:54:33 +00:00
|
|
|
}
|
|
|
|
|
2011-11-21 12:29:05 +00:00
|
|
|
switch (mode) {
|
|
|
|
case GST_PAD_MODE_PULL:
|
|
|
|
{
|
|
|
|
if (dir == GST_PAD_SINK) {
|
|
|
|
if ((peer = gst_pad_get_peer (pad))) {
|
|
|
|
GST_DEBUG_OBJECT (pad, "calling peer");
|
|
|
|
if (G_UNLIKELY (!gst_pad_activate_mode (peer, mode, active)))
|
|
|
|
goto peer_failed;
|
|
|
|
gst_object_unref (peer);
|
|
|
|
} else {
|
|
|
|
/* there is no peer, this is only fatal when we activate. When we
|
|
|
|
* deactivate, we must assume the application has unlinked the peer and
|
|
|
|
* will deactivate it eventually. */
|
|
|
|
if (active)
|
|
|
|
goto not_linked;
|
|
|
|
else
|
|
|
|
GST_DEBUG_OBJECT (pad, "deactivating unlinked pad");
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (G_UNLIKELY (GST_PAD_GETRANGEFUNC (pad) == NULL))
|
|
|
|
goto failure; /* Can't activate pull on a src without a
|
2005-12-14 10:09:35 +00:00
|
|
|
getrange function */
|
2011-11-21 12:29:05 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
break;
|
2005-03-28 14:54:33 +00:00
|
|
|
}
|
|
|
|
|
2013-07-15 09:36:18 +00:00
|
|
|
/* Mark pad as needing reconfiguration */
|
|
|
|
if (active)
|
|
|
|
GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_NEED_RECONFIGURE);
|
2005-03-28 14:54:33 +00:00
|
|
|
|
2017-11-16 07:26:12 +00:00
|
|
|
/* pre_activate returns TRUE if we weren't already in the process of
|
|
|
|
* switching to the 'new' mode */
|
|
|
|
if (pre_activate (pad, new)) {
|
|
|
|
|
|
|
|
if (GST_PAD_ACTIVATEMODEFUNC (pad)) {
|
|
|
|
if (G_UNLIKELY (!GST_PAD_ACTIVATEMODEFUNC (pad) (pad, parent, mode,
|
|
|
|
active)))
|
|
|
|
goto failure;
|
|
|
|
} else {
|
|
|
|
/* can happen for sinks of passthrough elements */
|
|
|
|
}
|
2005-03-28 14:54:33 +00:00
|
|
|
|
2017-11-16 07:26:12 +00:00
|
|
|
post_activate (pad, new);
|
|
|
|
}
|
2005-10-12 10:05:36 +00:00
|
|
|
|
2012-07-03 21:20:40 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "%s in %s mode",
|
|
|
|
active ? "activated" : "deactivated", gst_pad_mode_get_name (mode));
|
2006-07-09 13:26:06 +00:00
|
|
|
|
2011-11-18 12:46:46 +00:00
|
|
|
exit_success:
|
|
|
|
res = TRUE;
|
2012-07-11 14:34:22 +00:00
|
|
|
|
|
|
|
/* Clear sticky flags on deactivation */
|
|
|
|
if (!active) {
|
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
GST_OBJECT_FLAG_UNSET (pad, GST_PAD_FLAG_NEED_RECONFIGURE);
|
|
|
|
GST_OBJECT_FLAG_UNSET (pad, GST_PAD_FLAG_EOS);
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
}
|
|
|
|
|
2011-11-18 12:46:46 +00:00
|
|
|
exit:
|
|
|
|
return res;
|
|
|
|
|
gst/: Simplify pad activation.
Original commit message from CVS:
* gst/base/Makefile.am:
* gst/base/README:
* gst/base/gstbasesink.c: (gst_basesink_get_type),
(gst_basesink_base_init), (gst_basesink_class_init),
(gst_basesink_pad_getcaps), (gst_basesink_init),
(gst_basesink_activate), (gst_basesink_change_state):
* gst/base/gstbasesink.h:
* gst/base/gstbasetransform.c: (gst_base_transform_get_type),
(gst_base_transform_base_init), (gst_base_transform_finalize),
(gst_base_transform_class_init), (gst_base_transform_init),
(gst_base_transform_proxy_getcaps), (gst_base_transform_setcaps),
(gst_base_transform_event), (gst_base_transform_getrange),
(gst_base_transform_chain), (gst_base_transform_handle_buffer),
(gst_base_transform_set_property),
(gst_base_transform_get_property),
(gst_base_transform_sink_activate),
(gst_base_transform_src_activate),
(gst_base_transform_change_state):
* gst/base/gstbasetransform.h:
* gst/elements/gstidentity.c: (gst_identity_finalize),
(gst_identity_class_init), (gst_identity_init),
(gst_identity_event), (gst_identity_check_perfect),
(gst_identity_transform), (gst_identity_set_property),
(gst_identity_get_property), (gst_identity_change_state):
* gst/elements/gstidentity.h:
* gst/gstelement.c: (gst_element_get_state_func),
(gst_element_lost_state), (gst_element_pads_activate):
* gst/gstpad.c: (gst_pad_set_active), (gst_pad_peer_set_active),
(gst_pad_check_pull_range), (gst_pad_pull_range):
* gst/gstpad.h:
Simplify pad activation.
Added function to check if pull_range can be performed.
Error out when pulling inactive or flushing pads.
Removed const from refcounted types as it does not make sense.
Simplify pad templates in basesink
Added base class for simple 1-to-1 transforms.
Make identity subclass the base transform.
2005-03-29 16:18:12 +00:00
|
|
|
was_ok:
|
|
|
|
{
|
2012-07-03 21:20:40 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "already %s in %s mode",
|
|
|
|
active ? "activated" : "deactivated", gst_pad_mode_get_name (mode));
|
2011-11-18 12:46:46 +00:00
|
|
|
goto exit_success;
|
gst/: Simplify pad activation.
Original commit message from CVS:
* gst/base/Makefile.am:
* gst/base/README:
* gst/base/gstbasesink.c: (gst_basesink_get_type),
(gst_basesink_base_init), (gst_basesink_class_init),
(gst_basesink_pad_getcaps), (gst_basesink_init),
(gst_basesink_activate), (gst_basesink_change_state):
* gst/base/gstbasesink.h:
* gst/base/gstbasetransform.c: (gst_base_transform_get_type),
(gst_base_transform_base_init), (gst_base_transform_finalize),
(gst_base_transform_class_init), (gst_base_transform_init),
(gst_base_transform_proxy_getcaps), (gst_base_transform_setcaps),
(gst_base_transform_event), (gst_base_transform_getrange),
(gst_base_transform_chain), (gst_base_transform_handle_buffer),
(gst_base_transform_set_property),
(gst_base_transform_get_property),
(gst_base_transform_sink_activate),
(gst_base_transform_src_activate),
(gst_base_transform_change_state):
* gst/base/gstbasetransform.h:
* gst/elements/gstidentity.c: (gst_identity_finalize),
(gst_identity_class_init), (gst_identity_init),
(gst_identity_event), (gst_identity_check_perfect),
(gst_identity_transform), (gst_identity_set_property),
(gst_identity_get_property), (gst_identity_change_state):
* gst/elements/gstidentity.h:
* gst/gstelement.c: (gst_element_get_state_func),
(gst_element_lost_state), (gst_element_pads_activate):
* gst/gstpad.c: (gst_pad_set_active), (gst_pad_peer_set_active),
(gst_pad_check_pull_range), (gst_pad_pull_range):
* gst/gstpad.h:
Simplify pad activation.
Added function to check if pull_range can be performed.
Error out when pulling inactive or flushing pads.
Removed const from refcounted types as it does not make sense.
Simplify pad templates in basesink
Added base class for simple 1-to-1 transforms.
Make identity subclass the base transform.
2005-03-29 16:18:12 +00:00
|
|
|
}
|
2006-07-09 13:26:06 +00:00
|
|
|
deactivate_failed:
|
|
|
|
{
|
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad,
|
2012-07-03 21:20:40 +00:00
|
|
|
"failed to %s in switch to %s mode from %s mode",
|
|
|
|
(active ? "activate" : "deactivate"), gst_pad_mode_get_name (mode),
|
|
|
|
gst_pad_mode_get_name (old));
|
2011-11-18 12:46:46 +00:00
|
|
|
goto exit;
|
2006-07-09 13:26:06 +00:00
|
|
|
}
|
2005-10-12 10:05:36 +00:00
|
|
|
peer_failed:
|
2005-03-28 14:54:33 +00:00
|
|
|
{
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_LOCK (peer);
|
2005-10-12 10:05:36 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad,
|
2011-11-21 12:29:05 +00:00
|
|
|
"activate_mode on peer (%s:%s) failed", GST_DEBUG_PAD_NAME (peer));
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (peer);
|
2005-10-12 10:05:36 +00:00
|
|
|
gst_object_unref (peer);
|
2011-11-18 12:46:46 +00:00
|
|
|
goto exit;
|
2005-03-28 14:54:33 +00:00
|
|
|
}
|
2007-01-12 15:48:00 +00:00
|
|
|
not_linked:
|
|
|
|
{
|
|
|
|
GST_CAT_INFO_OBJECT (GST_CAT_PADS, pad, "can't activate unlinked sink "
|
|
|
|
"pad in pull mode");
|
2011-11-18 12:46:46 +00:00
|
|
|
goto exit;
|
2007-01-12 15:48:00 +00:00
|
|
|
}
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
failure:
|
2005-03-28 14:54:33 +00:00
|
|
|
{
|
2006-08-14 07:35:09 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
2012-07-03 21:20:40 +00:00
|
|
|
GST_CAT_INFO_OBJECT (GST_CAT_PADS, pad, "failed to %s in %s mode",
|
|
|
|
active ? "activate" : "deactivate", gst_pad_mode_get_name (mode));
|
2006-08-14 07:35:09 +00:00
|
|
|
GST_PAD_SET_FLUSHING (pad);
|
2011-11-18 11:35:46 +00:00
|
|
|
GST_PAD_MODE (pad) = old;
|
2017-11-16 09:47:46 +00:00
|
|
|
pad->priv->in_activation = FALSE;
|
|
|
|
g_cond_broadcast (&pad->priv->activation_cond);
|
2006-08-14 07:35:09 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2011-11-18 12:46:46 +00:00
|
|
|
goto exit;
|
gst/: Simplify pad activation.
Original commit message from CVS:
* gst/base/Makefile.am:
* gst/base/README:
* gst/base/gstbasesink.c: (gst_basesink_get_type),
(gst_basesink_base_init), (gst_basesink_class_init),
(gst_basesink_pad_getcaps), (gst_basesink_init),
(gst_basesink_activate), (gst_basesink_change_state):
* gst/base/gstbasesink.h:
* gst/base/gstbasetransform.c: (gst_base_transform_get_type),
(gst_base_transform_base_init), (gst_base_transform_finalize),
(gst_base_transform_class_init), (gst_base_transform_init),
(gst_base_transform_proxy_getcaps), (gst_base_transform_setcaps),
(gst_base_transform_event), (gst_base_transform_getrange),
(gst_base_transform_chain), (gst_base_transform_handle_buffer),
(gst_base_transform_set_property),
(gst_base_transform_get_property),
(gst_base_transform_sink_activate),
(gst_base_transform_src_activate),
(gst_base_transform_change_state):
* gst/base/gstbasetransform.h:
* gst/elements/gstidentity.c: (gst_identity_finalize),
(gst_identity_class_init), (gst_identity_init),
(gst_identity_event), (gst_identity_check_perfect),
(gst_identity_transform), (gst_identity_set_property),
(gst_identity_get_property), (gst_identity_change_state):
* gst/elements/gstidentity.h:
* gst/gstelement.c: (gst_element_get_state_func),
(gst_element_lost_state), (gst_element_pads_activate):
* gst/gstpad.c: (gst_pad_set_active), (gst_pad_peer_set_active),
(gst_pad_check_pull_range), (gst_pad_pull_range):
* gst/gstpad.h:
Simplify pad activation.
Added function to check if pull_range can be performed.
Error out when pulling inactive or flushing pads.
Removed const from refcounted types as it does not make sense.
Simplify pad templates in basesink
Added base class for simple 1-to-1 transforms.
Make identity subclass the base transform.
2005-03-29 16:18:12 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-01-27 10:46:06 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_activate_mode:
|
|
|
|
* @pad: the #GstPad to activate or deactivate.
|
|
|
|
* @mode: the requested activation mode
|
|
|
|
* @active: whether or not the pad should be active.
|
|
|
|
*
|
|
|
|
* Activates or deactivates the given pad in @mode via dispatching to the
|
|
|
|
* pad's activatemodefunc. For use from within pad activation functions only.
|
|
|
|
*
|
|
|
|
* If you don't know what this is, you probably don't want to call it.
|
|
|
|
*
|
|
|
|
* Returns: %TRUE if the operation was successful.
|
|
|
|
*
|
|
|
|
* MT safe.
|
|
|
|
*/
|
|
|
|
gboolean
|
|
|
|
gst_pad_activate_mode (GstPad * pad, GstPadMode mode, gboolean active)
|
|
|
|
{
|
|
|
|
GstObject *parent;
|
|
|
|
gboolean res;
|
2017-08-18 12:30:32 +00:00
|
|
|
GstPadMode old, new;
|
2016-01-27 10:46:06 +00:00
|
|
|
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
|
|
|
|
|
|
|
|
GST_OBJECT_LOCK (pad);
|
2017-08-18 12:30:32 +00:00
|
|
|
|
|
|
|
old = GST_PAD_MODE (pad);
|
|
|
|
new = active ? mode : GST_PAD_MODE_NONE;
|
|
|
|
if (old == new)
|
|
|
|
goto was_ok;
|
|
|
|
|
2016-01-27 10:46:06 +00:00
|
|
|
ACQUIRE_PARENT (pad, parent, no_parent);
|
2017-08-18 12:30:32 +00:00
|
|
|
|
2016-01-27 10:46:06 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
|
|
|
|
res = activate_mode_internal (pad, parent, mode, active);
|
|
|
|
|
|
|
|
RELEASE_PARENT (parent);
|
|
|
|
|
|
|
|
return res;
|
|
|
|
|
2017-08-18 12:30:32 +00:00
|
|
|
was_ok:
|
|
|
|
{
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "already %s in %s mode",
|
|
|
|
active ? "activated" : "deactivated", gst_pad_mode_get_name (mode));
|
|
|
|
return TRUE;
|
|
|
|
}
|
2016-01-27 10:46:06 +00:00
|
|
|
no_parent:
|
|
|
|
{
|
|
|
|
GST_WARNING_OBJECT (pad, "no parent");
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-03-21 17:34:02 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_is_active:
|
|
|
|
* @pad: the #GstPad to query
|
|
|
|
*
|
|
|
|
* Query if a pad is active
|
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Returns: %TRUE if the pad is active.
|
2005-03-21 17:34:02 +00:00
|
|
|
*
|
|
|
|
* MT safe.
|
2002-07-24 21:04:50 +00:00
|
|
|
*/
|
2005-03-07 18:27:42 +00:00
|
|
|
gboolean
|
2005-03-21 17:34:02 +00:00
|
|
|
gst_pad_is_active (GstPad * pad)
|
2002-07-24 21:04:50 +00:00
|
|
|
{
|
2005-03-21 17:34:02 +00:00
|
|
|
gboolean result = FALSE;
|
2002-07-24 21:04:50 +00:00
|
|
|
|
2005-03-07 18:27:42 +00:00
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
|
2002-07-24 21:04:50 +00:00
|
|
|
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
2011-08-15 11:24:11 +00:00
|
|
|
result = GST_PAD_IS_ACTIVE (pad);
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2002-07-24 21:04:50 +00:00
|
|
|
|
2005-03-21 17:34:02 +00:00
|
|
|
return result;
|
2002-07-24 21:04:50 +00:00
|
|
|
}
|
|
|
|
|
2013-12-30 09:01:39 +00:00
|
|
|
static void
|
|
|
|
cleanup_hook (GstPad * pad, GHook * hook)
|
|
|
|
{
|
|
|
|
GstPadProbeType type;
|
|
|
|
|
|
|
|
if (!G_HOOK_IS_VALID (hook))
|
|
|
|
return;
|
|
|
|
|
|
|
|
type = (hook->flags) >> G_HOOK_FLAG_USER_SHIFT;
|
|
|
|
|
|
|
|
if (type & GST_PAD_PROBE_TYPE_BLOCKING) {
|
|
|
|
/* unblock when we remove the last blocking probe */
|
|
|
|
pad->num_blocked--;
|
|
|
|
GST_DEBUG_OBJECT (pad, "remove blocking probe, now %d left",
|
|
|
|
pad->num_blocked);
|
2014-01-02 12:33:20 +00:00
|
|
|
|
|
|
|
/* Might have new probes now that want to be called */
|
|
|
|
GST_PAD_BLOCK_BROADCAST (pad);
|
|
|
|
|
2013-12-30 09:01:39 +00:00
|
|
|
if (pad->num_blocked == 0) {
|
|
|
|
GST_DEBUG_OBJECT (pad, "last blocking probe removed, unblocking");
|
|
|
|
GST_OBJECT_FLAG_UNSET (pad, GST_PAD_FLAG_BLOCKED);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
g_hook_destroy_link (&pad->probes, hook);
|
|
|
|
pad->num_probes--;
|
|
|
|
}
|
|
|
|
|
2005-01-11 00:40:13 +00:00
|
|
|
/**
|
2011-05-31 17:16:09 +00:00
|
|
|
* gst_pad_add_probe:
|
|
|
|
* @pad: the #GstPad to add the probe to
|
|
|
|
* @mask: the probe mask
|
|
|
|
* @callback: #GstPadProbeCallback that will be called with notifications of
|
|
|
|
* the pad state
|
2010-12-07 18:35:04 +00:00
|
|
|
* @user_data: (closure): user data passed to the callback
|
2009-02-22 19:01:05 +00:00
|
|
|
* @destroy_data: #GDestroyNotify for user_data
|
2005-03-21 17:34:02 +00:00
|
|
|
*
|
2011-05-31 17:16:09 +00:00
|
|
|
* Be notified of different states of pads. The provided callback is called for
|
|
|
|
* every state that matches @mask.
|
2005-01-11 00:40:13 +00:00
|
|
|
*
|
2015-10-28 11:04:25 +00:00
|
|
|
* Probes are called in groups: First GST_PAD_PROBE_TYPE_BLOCK probes are
|
|
|
|
* called, then others, then finally GST_PAD_PROBE_TYPE_IDLE. The only
|
|
|
|
* exception here are GST_PAD_PROBE_TYPE_IDLE probes that are called
|
|
|
|
* immediately if the pad is already idle while calling gst_pad_add_probe().
|
|
|
|
* In each of the groups, probes are called in the order in which they were
|
|
|
|
* added.
|
|
|
|
*
|
2014-03-06 21:51:57 +00:00
|
|
|
* Returns: an id or 0 if no probe is pending. The id can be used to remove the
|
|
|
|
* probe with gst_pad_remove_probe(). When using GST_PAD_PROBE_TYPE_IDLE it can
|
2015-02-02 06:37:44 +00:00
|
|
|
* happen that the probe can be run immediately and if the probe returns
|
2014-03-06 21:51:57 +00:00
|
|
|
* GST_PAD_PROBE_REMOVE this functions returns 0.
|
2005-03-21 17:34:02 +00:00
|
|
|
*
|
|
|
|
* MT safe.
|
2005-01-11 00:40:13 +00:00
|
|
|
*/
|
2011-05-31 17:16:09 +00:00
|
|
|
gulong
|
2011-11-01 00:13:35 +00:00
|
|
|
gst_pad_add_probe (GstPad * pad, GstPadProbeType mask,
|
2011-05-31 17:16:09 +00:00
|
|
|
GstPadProbeCallback callback, gpointer user_data,
|
2009-02-22 19:01:05 +00:00
|
|
|
GDestroyNotify destroy_data)
|
2005-01-11 00:40:13 +00:00
|
|
|
{
|
2011-05-31 17:16:09 +00:00
|
|
|
GHook *hook;
|
|
|
|
gulong res;
|
|
|
|
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), 0);
|
|
|
|
g_return_val_if_fail (mask != 0, 0);
|
2005-01-11 00:40:13 +00:00
|
|
|
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
2005-01-11 00:40:13 +00:00
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
/* make a new probe */
|
|
|
|
hook = g_hook_alloc (&pad->probes);
|
|
|
|
|
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "adding probe for mask 0x%08x",
|
|
|
|
mask);
|
|
|
|
|
2011-06-01 17:27:55 +00:00
|
|
|
/* when no contraints are given for the types, assume all types are
|
|
|
|
* acceptable */
|
2016-03-24 15:13:39 +00:00
|
|
|
if ((mask & _PAD_PROBE_TYPE_ALL_BOTH_AND_FLUSH) == 0)
|
2011-11-08 16:32:11 +00:00
|
|
|
mask |= GST_PAD_PROBE_TYPE_ALL_BOTH;
|
2011-11-01 00:13:35 +00:00
|
|
|
if ((mask & GST_PAD_PROBE_TYPE_SCHEDULING) == 0)
|
|
|
|
mask |= GST_PAD_PROBE_TYPE_SCHEDULING;
|
2011-06-01 17:27:55 +00:00
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
/* store our flags and other fields */
|
|
|
|
hook->flags |= (mask << G_HOOK_FLAG_USER_SHIFT);
|
|
|
|
hook->func = callback;
|
|
|
|
hook->data = user_data;
|
|
|
|
hook->destroy = destroy_data;
|
2011-11-07 16:04:13 +00:00
|
|
|
PROBE_COOKIE (hook) = (pad->priv->probe_cookie - 1);
|
2005-03-21 17:34:02 +00:00
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
/* add the probe */
|
2015-10-27 16:05:05 +00:00
|
|
|
g_hook_append (&pad->probes, hook);
|
2011-06-01 17:27:55 +00:00
|
|
|
pad->num_probes++;
|
2011-11-07 16:04:13 +00:00
|
|
|
/* incremenent cookie so that the new hook get's called */
|
|
|
|
pad->priv->probe_list_cookie++;
|
2005-03-21 17:34:02 +00:00
|
|
|
|
2011-06-01 17:27:55 +00:00
|
|
|
/* get the id of the hook, we return this and it can be used to remove the
|
|
|
|
* probe later */
|
2011-05-31 17:16:09 +00:00
|
|
|
res = hook->hook_id;
|
2009-02-22 19:01:05 +00:00
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "got probe id %lu", res);
|
2009-02-22 19:01:05 +00:00
|
|
|
|
2011-11-01 00:13:35 +00:00
|
|
|
if (mask & GST_PAD_PROBE_TYPE_BLOCKING) {
|
2011-05-31 17:16:09 +00:00
|
|
|
/* we have a block probe */
|
|
|
|
pad->num_blocked++;
|
2011-11-16 11:36:51 +00:00
|
|
|
GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_BLOCKED);
|
2011-06-01 17:27:55 +00:00
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "added blocking probe, "
|
|
|
|
"now %d blocking probes", pad->num_blocked);
|
2014-01-02 12:33:20 +00:00
|
|
|
|
|
|
|
/* Might have new probes now that want to be called */
|
|
|
|
GST_PAD_BLOCK_BROADCAST (pad);
|
2011-05-31 17:16:09 +00:00
|
|
|
}
|
2011-05-30 16:29:06 +00:00
|
|
|
|
2011-06-01 17:27:55 +00:00
|
|
|
/* call the callback if we need to be called for idle callbacks */
|
2011-11-01 00:13:35 +00:00
|
|
|
if ((mask & GST_PAD_PROBE_TYPE_IDLE) && (callback != NULL)) {
|
2011-06-01 17:27:55 +00:00
|
|
|
if (pad->priv->using > 0) {
|
|
|
|
/* the pad is in use, we can't signal the idle callback yet. Since we set the
|
|
|
|
* flag above, the last thread to leave the push will do the callback. New
|
|
|
|
* threads going into the push will block. */
|
2011-06-02 09:21:09 +00:00
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
|
|
|
"pad is in use, delay idle callback");
|
2011-06-01 17:27:55 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
} else {
|
2012-01-26 10:01:21 +00:00
|
|
|
GstPadProbeInfo info = { GST_PAD_PROBE_TYPE_IDLE, res, };
|
2013-12-30 09:01:39 +00:00
|
|
|
GstPadProbeReturn ret;
|
2011-11-08 10:04:19 +00:00
|
|
|
|
2013-12-30 18:03:22 +00:00
|
|
|
/* Keep another ref, the callback could destroy the pad */
|
|
|
|
gst_object_ref (pad);
|
2015-04-14 20:06:36 +00:00
|
|
|
pad->priv->idle_running++;
|
2013-12-30 18:03:22 +00:00
|
|
|
|
2011-06-01 17:27:55 +00:00
|
|
|
/* the pad is idle now, we can signal the idle callback now */
|
2011-06-02 09:21:09 +00:00
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
|
|
|
"pad is idle, trigger idle callback");
|
2011-06-01 17:27:55 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2005-01-11 00:40:13 +00:00
|
|
|
|
2013-12-30 09:01:39 +00:00
|
|
|
ret = callback (pad, &info, user_data);
|
|
|
|
|
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
switch (ret) {
|
|
|
|
case GST_PAD_PROBE_REMOVE:
|
|
|
|
/* remove the probe */
|
|
|
|
GST_DEBUG_OBJECT (pad, "asked to remove hook");
|
|
|
|
cleanup_hook (pad, hook);
|
|
|
|
res = 0;
|
|
|
|
break;
|
|
|
|
case GST_PAD_PROBE_DROP:
|
|
|
|
GST_DEBUG_OBJECT (pad, "asked to drop item");
|
|
|
|
break;
|
|
|
|
case GST_PAD_PROBE_PASS:
|
|
|
|
GST_DEBUG_OBJECT (pad, "asked to pass item");
|
|
|
|
break;
|
|
|
|
case GST_PAD_PROBE_OK:
|
|
|
|
GST_DEBUG_OBJECT (pad, "probe returned OK");
|
|
|
|
break;
|
2015-04-29 13:49:17 +00:00
|
|
|
case GST_PAD_PROBE_HANDLED:
|
|
|
|
GST_DEBUG_OBJECT (pad, "probe handled the data");
|
|
|
|
break;
|
2013-12-30 09:01:39 +00:00
|
|
|
default:
|
|
|
|
GST_DEBUG_OBJECT (pad, "probe returned %d", ret);
|
|
|
|
break;
|
|
|
|
}
|
2015-04-14 20:06:36 +00:00
|
|
|
pad->priv->idle_running--;
|
|
|
|
if (pad->priv->idle_running == 0) {
|
|
|
|
GST_PAD_BLOCK_BROADCAST (pad);
|
|
|
|
}
|
2013-12-30 09:01:39 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2013-12-30 18:03:22 +00:00
|
|
|
|
|
|
|
gst_object_unref (pad);
|
2011-06-01 17:27:55 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2011-05-30 16:29:06 +00:00
|
|
|
}
|
2011-06-01 17:27:55 +00:00
|
|
|
return res;
|
2011-05-31 17:16:09 +00:00
|
|
|
}
|
2011-05-30 11:40:04 +00:00
|
|
|
|
2011-05-30 16:29:06 +00:00
|
|
|
/**
|
2011-05-31 17:16:09 +00:00
|
|
|
* gst_pad_remove_probe:
|
|
|
|
* @pad: the #GstPad with the probe
|
|
|
|
* @id: the probe id to remove
|
2011-05-30 16:29:06 +00:00
|
|
|
*
|
2011-05-31 17:16:09 +00:00
|
|
|
* Remove the probe with @id from @pad.
|
2011-05-30 16:29:06 +00:00
|
|
|
*
|
|
|
|
* MT safe.
|
|
|
|
*/
|
|
|
|
void
|
2011-05-31 17:16:09 +00:00
|
|
|
gst_pad_remove_probe (GstPad * pad, gulong id)
|
2011-05-30 16:29:06 +00:00
|
|
|
{
|
2011-05-31 17:16:09 +00:00
|
|
|
GHook *hook;
|
|
|
|
|
2011-05-30 16:29:06 +00:00
|
|
|
g_return_if_fail (GST_IS_PAD (pad));
|
|
|
|
|
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
hook = g_hook_get (&pad->probes, id);
|
|
|
|
if (hook == NULL)
|
|
|
|
goto not_found;
|
2011-05-30 16:29:06 +00:00
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "removing hook %ld",
|
|
|
|
hook->hook_id);
|
|
|
|
cleanup_hook (pad, hook);
|
2011-05-30 11:40:04 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2005-03-21 17:34:02 +00:00
|
|
|
|
2011-05-30 16:29:06 +00:00
|
|
|
return;
|
2005-03-21 17:34:02 +00:00
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
not_found:
|
2005-03-21 17:34:02 +00:00
|
|
|
{
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2011-06-01 17:27:55 +00:00
|
|
|
g_warning ("%s: pad `%p' has no probe with id `%lu'", G_STRLOC, pad, id);
|
2011-05-30 16:29:06 +00:00
|
|
|
return;
|
2005-01-11 00:40:13 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-03-21 17:34:02 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_is_blocked:
|
2005-10-15 15:30:24 +00:00
|
|
|
* @pad: the #GstPad to query
|
2005-03-21 17:34:02 +00:00
|
|
|
*
|
|
|
|
* Checks if the pad is blocked or not. This function returns the
|
|
|
|
* last requested state of the pad. It is not certain that the pad
|
2006-10-10 14:47:40 +00:00
|
|
|
* is actually blocking at this point (see gst_pad_is_blocking()).
|
2005-03-21 17:34:02 +00:00
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Returns: %TRUE if the pad is blocked.
|
2005-03-21 17:34:02 +00:00
|
|
|
*
|
|
|
|
* MT safe.
|
|
|
|
*/
|
|
|
|
gboolean
|
|
|
|
gst_pad_is_blocked (GstPad * pad)
|
2002-12-14 13:02:16 +00:00
|
|
|
{
|
2005-03-07 18:27:42 +00:00
|
|
|
gboolean result = FALSE;
|
2002-12-14 13:02:16 +00:00
|
|
|
|
2005-03-21 17:34:02 +00:00
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), result);
|
2000-01-30 09:03:00 +00:00
|
|
|
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
2011-11-16 11:36:51 +00:00
|
|
|
result = GST_OBJECT_FLAG_IS_SET (pad, GST_PAD_FLAG_BLOCKED);
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2000-01-30 09:03:00 +00:00
|
|
|
|
2005-03-07 18:27:42 +00:00
|
|
|
return result;
|
2000-01-30 09:03:00 +00:00
|
|
|
}
|
|
|
|
|
2006-10-02 16:01:54 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_is_blocking:
|
|
|
|
* @pad: the #GstPad to query
|
|
|
|
*
|
|
|
|
* Checks if the pad is blocking or not. This is a guaranteed state
|
|
|
|
* of whether the pad is actually blocking on a #GstBuffer or a #GstEvent.
|
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Returns: %TRUE if the pad is blocking.
|
2006-10-02 16:01:54 +00:00
|
|
|
*
|
|
|
|
* MT safe.
|
|
|
|
*/
|
|
|
|
gboolean
|
|
|
|
gst_pad_is_blocking (GstPad * pad)
|
|
|
|
{
|
|
|
|
gboolean result = FALSE;
|
|
|
|
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), result);
|
|
|
|
|
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
/* the blocking flag is only valid if the pad is not flushing */
|
2011-11-16 11:36:51 +00:00
|
|
|
result = GST_PAD_IS_BLOCKING (pad) && !GST_PAD_IS_FLUSHING (pad);
|
2006-10-02 16:01:54 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2012-08-04 14:42:05 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_needs_reconfigure:
|
|
|
|
* @pad: the #GstPad to check
|
|
|
|
*
|
|
|
|
* Check the #GST_PAD_FLAG_NEED_RECONFIGURE flag on @pad and return %TRUE
|
|
|
|
* if the flag was set.
|
|
|
|
*
|
|
|
|
* Returns: %TRUE is the GST_PAD_FLAG_NEED_RECONFIGURE flag is set on @pad.
|
|
|
|
*/
|
|
|
|
gboolean
|
|
|
|
gst_pad_needs_reconfigure (GstPad * pad)
|
|
|
|
{
|
|
|
|
gboolean reconfigure;
|
|
|
|
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
|
|
|
|
|
|
|
|
GST_OBJECT_LOCK (pad);
|
2013-07-15 09:32:54 +00:00
|
|
|
reconfigure = GST_PAD_NEEDS_RECONFIGURE (pad);
|
|
|
|
GST_DEBUG_OBJECT (pad, "peeking RECONFIGURE flag %d", reconfigure);
|
2012-08-04 14:42:05 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
|
|
|
|
return reconfigure;
|
|
|
|
}
|
|
|
|
|
2011-06-10 15:32:20 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_check_reconfigure:
|
|
|
|
* @pad: the #GstPad to check
|
|
|
|
*
|
2011-11-16 11:36:51 +00:00
|
|
|
* Check and clear the #GST_PAD_FLAG_NEED_RECONFIGURE flag on @pad and return %TRUE
|
2011-06-10 15:32:20 +00:00
|
|
|
* if the flag was set.
|
|
|
|
*
|
2011-11-16 11:36:51 +00:00
|
|
|
* Returns: %TRUE is the GST_PAD_FLAG_NEED_RECONFIGURE flag was set on @pad.
|
2011-06-10 15:32:20 +00:00
|
|
|
*/
|
|
|
|
gboolean
|
|
|
|
gst_pad_check_reconfigure (GstPad * pad)
|
|
|
|
{
|
|
|
|
gboolean reconfigure;
|
|
|
|
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
|
|
|
|
|
|
|
|
GST_OBJECT_LOCK (pad);
|
2013-07-15 09:32:54 +00:00
|
|
|
reconfigure = GST_PAD_NEEDS_RECONFIGURE (pad);
|
|
|
|
if (reconfigure) {
|
|
|
|
GST_DEBUG_OBJECT (pad, "remove RECONFIGURE flag");
|
|
|
|
GST_OBJECT_FLAG_UNSET (pad, GST_PAD_FLAG_NEED_RECONFIGURE);
|
2013-01-18 00:35:48 +00:00
|
|
|
}
|
2011-06-10 15:32:20 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
|
|
|
|
return reconfigure;
|
|
|
|
}
|
|
|
|
|
2011-08-04 15:12:21 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_mark_reconfigure:
|
|
|
|
* @pad: the #GstPad to mark
|
|
|
|
*
|
|
|
|
* Mark a pad for needing reconfiguration. The next call to
|
|
|
|
* gst_pad_check_reconfigure() will return %TRUE after this call.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
gst_pad_mark_reconfigure (GstPad * pad)
|
|
|
|
{
|
|
|
|
g_return_if_fail (GST_IS_PAD (pad));
|
|
|
|
|
|
|
|
GST_OBJECT_LOCK (pad);
|
2011-11-16 11:36:51 +00:00
|
|
|
GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_NEED_RECONFIGURE);
|
2011-08-04 15:12:21 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
}
|
|
|
|
|
2012-06-15 10:55:20 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_set_activate_function:
|
|
|
|
* @p: a #GstPad.
|
|
|
|
* @f: the #GstPadActivateFunction to set.
|
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Calls gst_pad_set_activate_function_full() with %NULL for the user_data and
|
2012-06-15 10:55:20 +00:00
|
|
|
* notify.
|
|
|
|
*/
|
2005-03-21 17:34:02 +00:00
|
|
|
/**
|
2011-11-21 14:47:01 +00:00
|
|
|
* gst_pad_set_activate_function_full:
|
2006-07-06 15:21:46 +00:00
|
|
|
* @pad: a #GstPad.
|
2005-08-25 23:17:18 +00:00
|
|
|
* @activate: the #GstPadActivateFunction to set.
|
2012-01-26 18:28:01 +00:00
|
|
|
* @user_data: user_data passed to @notify
|
2011-11-21 14:47:01 +00:00
|
|
|
* @notify: notify called when @activate will not be used anymore.
|
2005-03-21 17:34:02 +00:00
|
|
|
*
|
2006-07-06 15:21:46 +00:00
|
|
|
* Sets the given activate function for @pad. The activate function will
|
2012-09-28 08:41:54 +00:00
|
|
|
* dispatch to gst_pad_activate_mode() to perform the actual activation.
|
|
|
|
* Only makes sense to set on sink pads.
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
*
|
|
|
|
* Call this function if your sink pad can start a pull-based task.
|
2005-03-21 17:34:02 +00:00
|
|
|
*/
|
|
|
|
void
|
2011-11-21 14:47:01 +00:00
|
|
|
gst_pad_set_activate_function_full (GstPad * pad,
|
2012-01-26 18:28:01 +00:00
|
|
|
GstPadActivateFunction activate, gpointer user_data, GDestroyNotify notify)
|
2005-03-21 17:34:02 +00:00
|
|
|
{
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
g_return_if_fail (GST_IS_PAD (pad));
|
2005-03-21 17:34:02 +00:00
|
|
|
|
2011-11-21 14:47:01 +00:00
|
|
|
if (pad->activatenotify)
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->activatenotify (pad->activatedata);
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
GST_PAD_ACTIVATEFUNC (pad) = activate;
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->activatedata = user_data;
|
2011-11-21 14:47:01 +00:00
|
|
|
pad->activatenotify = notify;
|
|
|
|
|
gst/gstpad.c: Use _DEBUG_OBJECT when it makes sense.
Original commit message from CVS:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_get_property), (gst_pad_activate_pull),
(gst_pad_activate_push), (gst_pad_set_blocked_async),
(gst_pad_set_activate_function),
(gst_pad_set_activatepull_function),
(gst_pad_set_activatepush_function), (gst_pad_set_chain_function),
(gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_set_event_function),
(gst_pad_set_query_function), (gst_pad_set_query_type_function),
(gst_pad_set_internal_link_function), (gst_pad_set_link_function),
(gst_pad_set_unlink_function), (gst_pad_set_getcaps_function),
(gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_set_bufferalloc_function), (gst_pad_link_check_hierarchy),
(gst_pad_get_caps_unlocked), (gst_pad_get_caps),
(gst_pad_peer_get_caps), (gst_pad_accept_caps),
(gst_pad_peer_accept_caps), (gst_pad_set_caps),
(gst_pad_configure_sink), (gst_pad_configure_src),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_buffer_alloc_unchecked), (gst_pad_alloc_buffer_full),
(gst_pad_query), (gst_pad_load_and_link), (handle_pad_block),
(gst_pad_chain_unchecked), (gst_pad_push), (gst_pad_get_range),
(gst_pad_send_event):
Use _DEBUG_OBJECT when it makes sense.
Protect GST_PAD_CAPS with the OBJECT_LOCK.
Small cleanups and code reflows.
Avoid caps refcounting in _accept_caps.
Refactor alloc_buffer so that the code performed on the peer is in a
separate function. Also if the pad does not implement a buffer alloc
function, we should still check if the pad is flushing before falling
back to the default allocator.
2006-07-31 14:21:10 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "activatefunc set to %s",
|
|
|
|
GST_DEBUG_FUNCPTR_NAME (activate));
|
2005-03-21 17:34:02 +00:00
|
|
|
}
|
|
|
|
|
2012-06-15 10:55:20 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_set_activatemode_function:
|
|
|
|
* @p: a #GstPad.
|
|
|
|
* @f: the #GstPadActivateModeFunction to set.
|
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Calls gst_pad_set_activatemode_function_full() with %NULL for the user_data and
|
2012-06-15 10:55:20 +00:00
|
|
|
* notify.
|
|
|
|
*/
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
/**
|
2011-11-21 14:47:01 +00:00
|
|
|
* gst_pad_set_activatemode_function_full:
|
2006-07-06 15:21:46 +00:00
|
|
|
* @pad: a #GstPad.
|
2011-11-21 12:29:05 +00:00
|
|
|
* @activatemode: the #GstPadActivateModeFunction to set.
|
2012-01-26 18:28:01 +00:00
|
|
|
* @user_data: user_data passed to @notify
|
2011-11-21 14:47:01 +00:00
|
|
|
* @notify: notify called when @activatemode will not be used anymore.
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
*
|
2011-11-21 12:29:05 +00:00
|
|
|
* Sets the given activate_mode function for the pad. An activate_mode function
|
|
|
|
* prepares the element for data passing.
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
*/
|
|
|
|
void
|
2011-11-21 14:47:01 +00:00
|
|
|
gst_pad_set_activatemode_function_full (GstPad * pad,
|
2012-01-26 18:28:01 +00:00
|
|
|
GstPadActivateModeFunction activatemode, gpointer user_data,
|
|
|
|
GDestroyNotify notify)
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
{
|
|
|
|
g_return_if_fail (GST_IS_PAD (pad));
|
|
|
|
|
2011-11-21 14:47:01 +00:00
|
|
|
if (pad->activatemodenotify)
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->activatemodenotify (pad->activatemodedata);
|
2011-11-21 12:29:05 +00:00
|
|
|
GST_PAD_ACTIVATEMODEFUNC (pad) = activatemode;
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->activatemodedata = user_data;
|
2011-11-21 14:47:01 +00:00
|
|
|
pad->activatemodenotify = notify;
|
|
|
|
|
2011-11-21 12:29:05 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "activatemodefunc set to %s",
|
|
|
|
GST_DEBUG_FUNCPTR_NAME (activatemode));
|
gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
Original commit message from CVS:
2005-06-27 Andy Wingo <wingo@pobox.com>
* gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
remaining buffer.
* gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
returns a sorted copy of the trace list.
(gst_alloc_trace_print_live): New API, only prints traces with
live objects. Sort the list.
(gst_alloc_trace_print_all): Sort the list.
(gst_alloc_trace_print): Align columns.
* gst/elements/gstttypefindelement.c:
* gst/elements/gsttee.c:
* gst/base/gstbasesrc.c:
* gst/base/gstbasesink.c:
* gst/base/gstbasetransform.c:
* gst/gstqueue.c: Adapt for pad activation changes.
* gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
sched.
(gst_pipeline_dispose): Drop ref on sched.
* gst/gstpad.c (gst_pad_init): Set the default activate func.
(gst_pad_activate_default): Push mode by default.
(pre_activate_switch, post_activate_switch): New stubs, things to
do before and after switching activation modes on pads.
(gst_pad_set_active): Take a boolean and not a mode, dispatch to
the pad's activate function to choose which mode to activate.
Shortcut on deactivation and call the right function directly.
(gst_pad_activate_pull): New API, (de)activates a pad in pull
mode.
(gst_pad_activate_push): New API, same for push mode.
(gst_pad_set_activate_function)
(gst_pad_set_activatepull_function)
(gst_pad_set_activatepush_function): Setters for new API.
* gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
Trace all miniobjects.
(gst_mini_object_make_writable): Unref the arg if we copy, like
gst_caps_make_writable.
* gst/gstmessage.c (_gst_message_initialize): No trace init.
* gst/gstghostpad.c (gst_proxy_pad_do_activate)
(gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
Adapt for new pad API.
* gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
* gst/gstelement.h:
* gst/gstelement.c (gst_element_iterate_src_pads)
(gst_element_iterate_sink_pads): New API functions.
* gst/gstelement.c (iterator_fold_with_resync): New utility,
should fold into gstiterator.c in some form.
(gst_element_pads_activate): Simplified via use of fold and
delegation of decisions to gstpad->activate.
* gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
help in debugging.
* gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
class once in init, like gstmessage. Didn't run into this issue
but it seems correct. Don't initialize a trace, gstminiobject does
that.
* check/pipelines/simple_launch_lines.c (test_stop_from_app): New
test, runs fakesrc ! fakesink, stopping on ::handoff via a message
to the bus.
(assert_live_count): New util function, uses alloc traces to check
cleanup.
* check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
To be modified when unlink drops the internal pad.
2005-06-27 18:35:05 +00:00
|
|
|
}
|
|
|
|
|
2012-06-15 10:55:20 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_set_chain_function:
|
|
|
|
* @p: a sink #GstPad.
|
|
|
|
* @f: the #GstPadChainFunction to set.
|
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Calls gst_pad_set_chain_function_full() with %NULL for the user_data and
|
2012-06-15 10:55:20 +00:00
|
|
|
* notify.
|
|
|
|
*/
|
2000-10-25 19:09:53 +00:00
|
|
|
/**
|
2011-11-21 14:47:01 +00:00
|
|
|
* gst_pad_set_chain_function_full:
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
* @pad: a sink #GstPad.
|
2002-09-01 20:11:14 +00:00
|
|
|
* @chain: the #GstPadChainFunction to set.
|
2012-01-26 18:28:01 +00:00
|
|
|
* @user_data: user_data passed to @notify
|
2011-11-21 14:47:01 +00:00
|
|
|
* @notify: notify called when @chain will not be used anymore.
|
2000-10-25 19:09:53 +00:00
|
|
|
*
|
gst/gstelement.c (gst_element_dispose): Protect against multiple invocations.
Original commit message from CVS:
2004-02-24 Andy Wingo <wingo@pobox.com>
* gst/gstelement.c (gst_element_dispose): Protect against multiple
invocations.
* gst/schedulers/gstoptimalscheduler.c
I added a mess of prototypes at the top of the file by way of
documentation. Some of the operations on chains and groups were
re-organized.
(create_group): Added a type argument so if the group is enabled,
the setup_group_scheduler knows what to do.
(group_elements): Added a type argument here, too, to be passed on
to create_group.
(group_element_set_enabled): If an unlinked PLAYING element is
added to a bin, we have to create a new group to hold the element,
and this function will be called before the group is added to the
chain. Thus we have a valid case for group->chain==NULL. Instead
of calling chain_group_set_enabled, just set the flag on the group
(the chain's status will be set when the group is added to it).
(gst_opt_scheduler_state_transition, chain_group_set_enabled):
Setup the group scheduler when the group is enabled, not
specifically when an element goes PAUSED->PLAYING. This means
PLAYING elements can be added, linked, and scheduled into a
PLAYING pipeline, as was intended.
(add_to_group): Don't ref the group twice. I don't know when this
double-ref got in here. Removing it has the potential to cause
segfaults if other parts of the scheduler are buggy. If you find
that the scheduler is segfaulting for you, put in an extra ref
here and see if that hacks over the underlying issue. Of course,
then find out what code is unreffing a group it doesn't own...
(create_group): Make the extra refcount floating, and remove it
after adding the element. This means that...
(unref_group): Destroy when the refcount reaches 0, not 1, like
every other refcounted object in the known universe.
(remove_from_group): When a group becomes empty, set it to be not
active, and remove it from its chain. Don't unref it again,
there's no floating reference any more.
(destroy_group): We have to remove the group from the chain in
remove_from_group (rather than here) to break refcounting cycles
(the chain always has a ref on the group). So assert that
group->chain==NULL.
(ref_group_by_count): Removed, it was commented out anyway.
(merge_chains): Use the remove_from_chain and add_to_chain
primitives to do the reparenting, instead of rolling our own
implementation.
(add_to_chain): The first non-disabled group in the chain's group
list will be the entry point for the chain. Because buffers can
accumulate in loop elements' peer bufpens, we preferentially
schedule loop groups before get groups to avoid unnecessary
execution of get-based groups when the bufpens are already full.
(gst_opt_scheduler_schedule_run_queue): Debug fixes.
(get_group_schedule_function): Ditto.
(loop_group_schedule_function): Ditto.
(gst_opt_scheduler_loop_wrapper): Ditto.
(gst_opt_scheduler_iterate): Ditto.
I understand the opt scheduler now, yippee!
* gst/gstpad.c: All throughout, added FIXMEs to look at for 0.9.
(gst_pad_get_name, gst_pad_set_chain_function)
(gst_pad_set_get_function, gst_pad_set_event_function)
(gst_pad_set_event_mask_function, gst_pad_get_event_masks)
(gst_pad_get_event_masks_default, gst_pad_set_convert_function)
(gst_pad_set_query_function, gst_pad_get_query_types)
(gst_pad_get_query_types_default)
(gst_pad_set_internal_link_function)
(gst_pad_set_formats_function, gst_pad_set_link_function)
(gst_pad_set_fixate_function, gst_pad_set_getcaps_function)
(gst_pad_set_bufferalloc_function, gst_pad_unlink)
(gst_pad_renegotiate, gst_pad_set_parent, gst_pad_get_parent)
(gst_pad_add_ghost_pad, gst_pad_proxy_getcaps)
(gst_pad_proxy_pad_link, gst_pad_proxy_fixate)
(gst_pad_get_pad_template_caps, gst_pad_check_compatibility)
(gst_pad_get_peer, gst_pad_get_allowed_caps)
(gst_pad_alloc_buffer, gst_pad_push, gst_pad_pull)
(gst_pad_selectv, gst_pad_select, gst_pad_template_get_caps)
(gst_pad_event_default_dispatch, gst_pad_event_default)
(gst_pad_dispatcher, gst_pad_send_event, gst_pad_convert_default)
(gst_pad_convert, gst_pad_query_default, gst_pad_query)
(gst_pad_get_formats_default, gst_pad_get_formats): Better
argument checks, and some doc fixes.
(gst_pad_custom_new_from_template): Um, does anyone
use these functions? Actually make a custom pad instead of a
normal one.
(gst_pad_try_set_caps): Transpose some checks.
(gst_pad_try_set_caps_nonfixed): Same, and use a macro to check if
the pad is in negotiation.
(gst_pad_try_relink_filtered): Use pad_link_prepare.
* gst/gstelement.c: Remove prototypes also defined in gstclock.h.
* gst/gstelement.h:
* gst/gstclock.h: Un-deprecate the old clocking API, as discussed
on the list.
2004-02-25 13:16:12 +00:00
|
|
|
* Sets the given chain function for the pad. The chain function is called to
|
2006-07-06 15:21:46 +00:00
|
|
|
* process a #GstBuffer input buffer. see #GstPadChainFunction for more details.
|
2000-10-25 19:09:53 +00:00
|
|
|
*/
|
2004-03-13 15:27:01 +00:00
|
|
|
void
|
2011-11-21 14:47:01 +00:00
|
|
|
gst_pad_set_chain_function_full (GstPad * pad, GstPadChainFunction chain,
|
2012-01-26 18:28:01 +00:00
|
|
|
gpointer user_data, GDestroyNotify notify)
|
2000-11-01 13:49:41 +00:00
|
|
|
{
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
g_return_if_fail (GST_IS_PAD (pad));
|
gst/gstbin.c: Keep track of pads that are being linked/unlinked and resync the state changes.
Original commit message from CVS:
Base on Patch by: Olivier Crete <tester at tester dot ca>
* gst/gstbin.c: (gst_bin_init), (gst_bin_add_func),
(gst_bin_remove_func), (update_degree),
(gst_bin_sort_iterator_new), (gst_bin_handle_message_func):
Keep track of pads that are being linked/unlinked and resync the state
changes.
* gst/gstpad.c: (gst_pad_get_direction),
(gst_pad_set_chain_function), (gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link),
(gst_pad_event_default_dispatch), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range):
Some code cleanups, use macros to check pad direction.
Don't need to take the lock on the pad direction.
Post structure change when pads are linked/unlinked.
Change some checks into _return_if_fail().
* tests/check/gst/gstbin.c:
(test_link_structure_change_state_changed_sync_cb),
(GST_START_TEST), (gst_bin_suite):
Add testcase for pad link/unlinke resync during a state change.
Fixes #510354.
2008-10-06 16:15:02 +00:00
|
|
|
g_return_if_fail (GST_PAD_IS_SINK (pad));
|
2001-01-19 09:37:32 +00:00
|
|
|
|
2011-11-21 14:47:01 +00:00
|
|
|
if (pad->chainnotify)
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->chainnotify (pad->chaindata);
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
GST_PAD_CHAINFUNC (pad) = chain;
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->chaindata = user_data;
|
2011-11-21 14:47:01 +00:00
|
|
|
pad->chainnotify = notify;
|
|
|
|
|
gst/gstpad.c: Use _DEBUG_OBJECT when it makes sense.
Original commit message from CVS:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_get_property), (gst_pad_activate_pull),
(gst_pad_activate_push), (gst_pad_set_blocked_async),
(gst_pad_set_activate_function),
(gst_pad_set_activatepull_function),
(gst_pad_set_activatepush_function), (gst_pad_set_chain_function),
(gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_set_event_function),
(gst_pad_set_query_function), (gst_pad_set_query_type_function),
(gst_pad_set_internal_link_function), (gst_pad_set_link_function),
(gst_pad_set_unlink_function), (gst_pad_set_getcaps_function),
(gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_set_bufferalloc_function), (gst_pad_link_check_hierarchy),
(gst_pad_get_caps_unlocked), (gst_pad_get_caps),
(gst_pad_peer_get_caps), (gst_pad_accept_caps),
(gst_pad_peer_accept_caps), (gst_pad_set_caps),
(gst_pad_configure_sink), (gst_pad_configure_src),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_buffer_alloc_unchecked), (gst_pad_alloc_buffer_full),
(gst_pad_query), (gst_pad_load_and_link), (handle_pad_block),
(gst_pad_chain_unchecked), (gst_pad_push), (gst_pad_get_range),
(gst_pad_send_event):
Use _DEBUG_OBJECT when it makes sense.
Protect GST_PAD_CAPS with the OBJECT_LOCK.
Small cleanups and code reflows.
Avoid caps refcounting in _accept_caps.
Refactor alloc_buffer so that the code performed on the peer is in a
separate function. Also if the pad does not implement a buffer alloc
function, we should still check if the pad is flushing before falling
back to the default allocator.
2006-07-31 14:21:10 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "chainfunc set to %s",
|
|
|
|
GST_DEBUG_FUNCPTR_NAME (chain));
|
2000-02-26 18:55:14 +00:00
|
|
|
}
|
|
|
|
|
2012-06-15 10:55:20 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_set_chain_list_function:
|
|
|
|
* @p: a sink #GstPad.
|
|
|
|
* @f: the #GstPadChainListFunction to set.
|
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Calls gst_pad_set_chain_list_function_full() with %NULL for the user_data and
|
2012-06-15 10:55:20 +00:00
|
|
|
* notify.
|
|
|
|
*/
|
2009-05-12 11:10:55 +00:00
|
|
|
/**
|
2011-11-21 14:47:01 +00:00
|
|
|
* gst_pad_set_chain_list_function_full:
|
2009-05-12 11:10:55 +00:00
|
|
|
* @pad: a sink #GstPad.
|
|
|
|
* @chainlist: the #GstPadChainListFunction to set.
|
2012-01-26 18:28:01 +00:00
|
|
|
* @user_data: user_data passed to @notify
|
2011-11-21 14:47:01 +00:00
|
|
|
* @notify: notify called when @chainlist will not be used anymore.
|
2009-05-12 11:10:55 +00:00
|
|
|
*
|
|
|
|
* Sets the given chain list function for the pad. The chainlist function is
|
|
|
|
* called to process a #GstBufferList input buffer list. See
|
|
|
|
* #GstPadChainListFunction for more details.
|
|
|
|
*/
|
|
|
|
void
|
2011-11-21 14:47:01 +00:00
|
|
|
gst_pad_set_chain_list_function_full (GstPad * pad,
|
2012-01-26 18:28:01 +00:00
|
|
|
GstPadChainListFunction chainlist, gpointer user_data,
|
|
|
|
GDestroyNotify notify)
|
2009-05-12 11:10:55 +00:00
|
|
|
{
|
|
|
|
g_return_if_fail (GST_IS_PAD (pad));
|
|
|
|
g_return_if_fail (GST_PAD_IS_SINK (pad));
|
|
|
|
|
2011-11-21 14:47:01 +00:00
|
|
|
if (pad->chainlistnotify)
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->chainlistnotify (pad->chainlistdata);
|
2009-05-12 11:10:55 +00:00
|
|
|
GST_PAD_CHAINLISTFUNC (pad) = chainlist;
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->chainlistdata = user_data;
|
2011-11-21 14:47:01 +00:00
|
|
|
pad->chainlistnotify = notify;
|
|
|
|
|
2009-05-12 11:10:55 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "chainlistfunc set to %s",
|
|
|
|
GST_DEBUG_FUNCPTR_NAME (chainlist));
|
|
|
|
}
|
|
|
|
|
2012-06-15 10:55:20 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_set_getrange_function:
|
|
|
|
* @p: a source #GstPad.
|
|
|
|
* @f: the #GstPadGetRangeFunction to set.
|
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Calls gst_pad_set_getrange_function_full() with %NULL for the user_data and
|
2012-06-15 10:55:20 +00:00
|
|
|
* notify.
|
|
|
|
*/
|
2000-12-06 23:04:12 +00:00
|
|
|
/**
|
2011-11-21 14:47:01 +00:00
|
|
|
* gst_pad_set_getrange_function_full:
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
* @pad: a source #GstPad.
|
2005-03-21 17:34:02 +00:00
|
|
|
* @get: the #GstPadGetRangeFunction to set.
|
2012-01-26 18:28:01 +00:00
|
|
|
* @user_data: user_data passed to @notify
|
2011-11-21 14:47:01 +00:00
|
|
|
* @notify: notify called when @get will not be used anymore.
|
2000-12-06 23:04:12 +00:00
|
|
|
*
|
2007-04-09 08:17:13 +00:00
|
|
|
* Sets the given getrange function for the pad. The getrange function is
|
|
|
|
* called to produce a new #GstBuffer to start the processing pipeline. see
|
2006-07-06 15:21:46 +00:00
|
|
|
* #GstPadGetRangeFunction for a description of the getrange function.
|
2000-12-06 23:04:12 +00:00
|
|
|
*/
|
2001-01-21 23:20:46 +00:00
|
|
|
void
|
2011-11-21 14:47:01 +00:00
|
|
|
gst_pad_set_getrange_function_full (GstPad * pad, GstPadGetRangeFunction get,
|
2012-01-26 18:28:01 +00:00
|
|
|
gpointer user_data, GDestroyNotify notify)
|
2000-12-06 23:04:12 +00:00
|
|
|
{
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
g_return_if_fail (GST_IS_PAD (pad));
|
gst/gstbin.c: Keep track of pads that are being linked/unlinked and resync the state changes.
Original commit message from CVS:
Base on Patch by: Olivier Crete <tester at tester dot ca>
* gst/gstbin.c: (gst_bin_init), (gst_bin_add_func),
(gst_bin_remove_func), (update_degree),
(gst_bin_sort_iterator_new), (gst_bin_handle_message_func):
Keep track of pads that are being linked/unlinked and resync the state
changes.
* gst/gstpad.c: (gst_pad_get_direction),
(gst_pad_set_chain_function), (gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link),
(gst_pad_event_default_dispatch), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range):
Some code cleanups, use macros to check pad direction.
Don't need to take the lock on the pad direction.
Post structure change when pads are linked/unlinked.
Change some checks into _return_if_fail().
* tests/check/gst/gstbin.c:
(test_link_structure_change_state_changed_sync_cb),
(GST_START_TEST), (gst_bin_suite):
Add testcase for pad link/unlinke resync during a state change.
Fixes #510354.
2008-10-06 16:15:02 +00:00
|
|
|
g_return_if_fail (GST_PAD_IS_SRC (pad));
|
2000-12-06 23:04:12 +00:00
|
|
|
|
2011-11-21 14:47:01 +00:00
|
|
|
if (pad->getrangenotify)
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->getrangenotify (pad->getrangedata);
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
GST_PAD_GETRANGEFUNC (pad) = get;
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->getrangedata = user_data;
|
2011-11-21 14:47:01 +00:00
|
|
|
pad->getrangenotify = notify;
|
2004-03-13 15:27:01 +00:00
|
|
|
|
gst/gstpad.c: Use _DEBUG_OBJECT when it makes sense.
Original commit message from CVS:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_get_property), (gst_pad_activate_pull),
(gst_pad_activate_push), (gst_pad_set_blocked_async),
(gst_pad_set_activate_function),
(gst_pad_set_activatepull_function),
(gst_pad_set_activatepush_function), (gst_pad_set_chain_function),
(gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_set_event_function),
(gst_pad_set_query_function), (gst_pad_set_query_type_function),
(gst_pad_set_internal_link_function), (gst_pad_set_link_function),
(gst_pad_set_unlink_function), (gst_pad_set_getcaps_function),
(gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_set_bufferalloc_function), (gst_pad_link_check_hierarchy),
(gst_pad_get_caps_unlocked), (gst_pad_get_caps),
(gst_pad_peer_get_caps), (gst_pad_accept_caps),
(gst_pad_peer_accept_caps), (gst_pad_set_caps),
(gst_pad_configure_sink), (gst_pad_configure_src),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_buffer_alloc_unchecked), (gst_pad_alloc_buffer_full),
(gst_pad_query), (gst_pad_load_and_link), (handle_pad_block),
(gst_pad_chain_unchecked), (gst_pad_push), (gst_pad_get_range),
(gst_pad_send_event):
Use _DEBUG_OBJECT when it makes sense.
Protect GST_PAD_CAPS with the OBJECT_LOCK.
Small cleanups and code reflows.
Avoid caps refcounting in _accept_caps.
Refactor alloc_buffer so that the code performed on the peer is in a
separate function. Also if the pad does not implement a buffer alloc
function, we should still check if the pad is flushing before falling
back to the default allocator.
2006-07-31 14:21:10 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "getrangefunc set to %s",
|
|
|
|
GST_DEBUG_FUNCPTR_NAME (get));
|
2000-12-06 23:04:12 +00:00
|
|
|
}
|
|
|
|
|
2012-06-15 10:55:20 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_set_event_function:
|
|
|
|
* @p: a #GstPad of either direction.
|
|
|
|
* @f: the #GstPadEventFunction to set.
|
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Calls gst_pad_set_event_function_full() with %NULL for the user_data and
|
2012-06-15 10:55:20 +00:00
|
|
|
* notify.
|
|
|
|
*/
|
2001-08-06 20:37:21 +00:00
|
|
|
/**
|
2011-11-21 14:47:01 +00:00
|
|
|
* gst_pad_set_event_function_full:
|
2007-05-02 15:14:32 +00:00
|
|
|
* @pad: a #GstPad of either direction.
|
2002-09-01 20:11:14 +00:00
|
|
|
* @event: the #GstPadEventFunction to set.
|
2012-01-26 18:28:01 +00:00
|
|
|
* @user_data: user_data passed to @notify
|
2011-11-21 14:47:01 +00:00
|
|
|
* @notify: notify called when @event will not be used anymore.
|
2001-08-06 20:37:21 +00:00
|
|
|
*
|
2002-09-01 20:11:14 +00:00
|
|
|
* Sets the given event handler for the pad.
|
2001-08-06 20:37:21 +00:00
|
|
|
*/
|
|
|
|
void
|
2011-11-21 14:47:01 +00:00
|
|
|
gst_pad_set_event_function_full (GstPad * pad, GstPadEventFunction event,
|
2012-01-26 18:28:01 +00:00
|
|
|
gpointer user_data, GDestroyNotify notify)
|
2001-08-06 20:37:21 +00:00
|
|
|
{
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
g_return_if_fail (GST_IS_PAD (pad));
|
2001-08-06 20:37:21 +00:00
|
|
|
|
2011-11-21 14:47:01 +00:00
|
|
|
if (pad->eventnotify)
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->eventnotify (pad->eventdata);
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
GST_PAD_EVENTFUNC (pad) = event;
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->eventdata = user_data;
|
2011-11-21 14:47:01 +00:00
|
|
|
pad->eventnotify = notify;
|
2002-07-24 21:04:50 +00:00
|
|
|
|
gst/gstpad.c: Use _DEBUG_OBJECT when it makes sense.
Original commit message from CVS:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_get_property), (gst_pad_activate_pull),
(gst_pad_activate_push), (gst_pad_set_blocked_async),
(gst_pad_set_activate_function),
(gst_pad_set_activatepull_function),
(gst_pad_set_activatepush_function), (gst_pad_set_chain_function),
(gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_set_event_function),
(gst_pad_set_query_function), (gst_pad_set_query_type_function),
(gst_pad_set_internal_link_function), (gst_pad_set_link_function),
(gst_pad_set_unlink_function), (gst_pad_set_getcaps_function),
(gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_set_bufferalloc_function), (gst_pad_link_check_hierarchy),
(gst_pad_get_caps_unlocked), (gst_pad_get_caps),
(gst_pad_peer_get_caps), (gst_pad_accept_caps),
(gst_pad_peer_accept_caps), (gst_pad_set_caps),
(gst_pad_configure_sink), (gst_pad_configure_src),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_buffer_alloc_unchecked), (gst_pad_alloc_buffer_full),
(gst_pad_query), (gst_pad_load_and_link), (handle_pad_block),
(gst_pad_chain_unchecked), (gst_pad_push), (gst_pad_get_range),
(gst_pad_send_event):
Use _DEBUG_OBJECT when it makes sense.
Protect GST_PAD_CAPS with the OBJECT_LOCK.
Small cleanups and code reflows.
Avoid caps refcounting in _accept_caps.
Refactor alloc_buffer so that the code performed on the peer is in a
separate function. Also if the pad does not implement a buffer alloc
function, we should still check if the pad is flushing before falling
back to the default allocator.
2006-07-31 14:21:10 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "eventfunc for set to %s",
|
|
|
|
GST_DEBUG_FUNCPTR_NAME (event));
|
2001-08-06 20:37:21 +00:00
|
|
|
}
|
|
|
|
|
2015-11-12 16:15:37 +00:00
|
|
|
static gboolean
|
|
|
|
event_wrap (GstPad * pad, GstObject * object, GstEvent * event)
|
|
|
|
{
|
|
|
|
GstFlowReturn ret;
|
|
|
|
|
|
|
|
ret = GST_PAD_EVENTFULLFUNC (pad) (pad, object, event);
|
|
|
|
if (ret == GST_FLOW_OK)
|
|
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gst_pad_set_event_full_function:
|
|
|
|
* @p: a #GstPad of either direction.
|
|
|
|
* @f: the #GstPadEventFullFunction to set.
|
|
|
|
*
|
|
|
|
* Calls gst_pad_set_event_full_function_full() with %NULL for the user_data and
|
|
|
|
* notify.
|
|
|
|
*/
|
|
|
|
/**
|
|
|
|
* gst_pad_set_event_full_function_full:
|
|
|
|
* @pad: a #GstPad of either direction.
|
|
|
|
* @event: the #GstPadEventFullFunction to set.
|
|
|
|
* @user_data: user_data passed to @notify
|
|
|
|
* @notify: notify called when @event will not be used anymore.
|
|
|
|
*
|
|
|
|
* Sets the given event handler for the pad.
|
2015-12-31 19:27:12 +00:00
|
|
|
*
|
|
|
|
* Since: 1.8
|
2015-11-12 16:15:37 +00:00
|
|
|
*/
|
|
|
|
void
|
|
|
|
gst_pad_set_event_full_function_full (GstPad * pad,
|
|
|
|
GstPadEventFullFunction event, gpointer user_data, GDestroyNotify notify)
|
|
|
|
{
|
|
|
|
g_return_if_fail (GST_IS_PAD (pad));
|
|
|
|
|
|
|
|
if (pad->eventnotify)
|
|
|
|
pad->eventnotify (pad->eventdata);
|
|
|
|
GST_PAD_EVENTFULLFUNC (pad) = event;
|
|
|
|
GST_PAD_EVENTFUNC (pad) = event_wrap;
|
|
|
|
pad->eventdata = user_data;
|
|
|
|
pad->eventnotify = notify;
|
|
|
|
|
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "eventfullfunc for set to %s",
|
|
|
|
GST_DEBUG_FUNCPTR_NAME (event));
|
|
|
|
}
|
|
|
|
|
2012-06-15 10:55:20 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_set_query_function:
|
|
|
|
* @p: a #GstPad of either direction.
|
|
|
|
* @f: the #GstPadQueryFunction to set.
|
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Calls gst_pad_set_query_function_full() with %NULL for the user_data and
|
2012-06-15 10:55:20 +00:00
|
|
|
* notify.
|
|
|
|
*/
|
2002-05-26 21:54:27 +00:00
|
|
|
/**
|
2011-11-21 14:47:01 +00:00
|
|
|
* gst_pad_set_query_function_full:
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
* @pad: a #GstPad of either direction.
|
2002-09-01 20:11:14 +00:00
|
|
|
* @query: the #GstPadQueryFunction to set.
|
2012-01-26 18:28:01 +00:00
|
|
|
* @user_data: user_data passed to @notify
|
2011-11-21 14:47:01 +00:00
|
|
|
* @notify: notify called when @query will not be used anymore.
|
2000-10-25 19:09:53 +00:00
|
|
|
*
|
2002-05-26 21:54:27 +00:00
|
|
|
* Set the given query function for the pad.
|
2000-10-25 19:09:53 +00:00
|
|
|
*/
|
2001-01-21 23:20:46 +00:00
|
|
|
void
|
2011-11-21 14:47:01 +00:00
|
|
|
gst_pad_set_query_function_full (GstPad * pad, GstPadQueryFunction query,
|
2012-01-26 18:28:01 +00:00
|
|
|
gpointer user_data, GDestroyNotify notify)
|
2000-11-01 13:49:41 +00:00
|
|
|
{
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
g_return_if_fail (GST_IS_PAD (pad));
|
WARNING: Don't grab this updated unless you're really, REALLY sure.
Original commit message from CVS:
WARNING: Don't grab this updated unless you're really, REALLY sure.
WARNING: Wait for the next one.
Whole lotta changes here, including a few random bits:
examples/*/Makefile: updated to use `libtool gcc`, not just `gcc`
gst/
gstbuffer.h: updated to new flag style
gst.c, gstdebug.h: added new debugging for function ptrs
gstpipeline.c: set type of parent_class to the class, not the object
gstthread.c: ditto
plugins/
cdparanoia/cdparanoia.c: added an argument type, updated some defaults
cobin/spindentity.c: updated to new do/while loopfunction style
mp3encode/lame/gstlame.c: argument types, whole lotta lame options
tests/: various changes
Now, for the big changes: Once again, the scheduling system has changed.
And once again, it broke a whole bunch of things. The gist of the change
is that there is now a function pointer for gst_pad_push and gst_pad_pull,
instead of a hard-wired function. Well, currently they are functions, but
that's for debugging purposes only, they just call the function pointer
after spewing lots of DEBUG().
This changed the GstPad structure a bit, and the GstPad API as well.
Where elements used to provide chain() and pull() functions, they provide
chain() and get() functions. gst_pad_set_pull[region]_function has been
changed to get_pad_set_get[region]_function. This means all the elements
out there that used to have pull functions need to be updated. The calls
to that function have been changed in the normal elements, but the names
of the functions passed is still _pull[region](), which is an aesthetic
issue more than anything.
As for what doesn't work yet, just about anything dealing with Connections
is hosed, meaning threaded stuff won't work. This will be fixed about 12
hours from now, after I've slept, etc. The simplefake.c test works in
both cothreaded and chained cases, but not much else will work due to the
Connection problem. Needless to say, don't grab this unless you *need*
these features *now*, else wait to update this stuff until tomorrow.
I'm going to sleep now.
2000-12-16 10:18:09 +00:00
|
|
|
|
2011-11-21 14:47:01 +00:00
|
|
|
if (pad->querynotify)
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->querynotify (pad->querydata);
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
GST_PAD_QUERYFUNC (pad) = query;
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->querydata = user_data;
|
2011-11-21 14:47:01 +00:00
|
|
|
pad->querynotify = notify;
|
2002-07-24 21:04:50 +00:00
|
|
|
|
gst/gstpad.c: Use _DEBUG_OBJECT when it makes sense.
Original commit message from CVS:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_get_property), (gst_pad_activate_pull),
(gst_pad_activate_push), (gst_pad_set_blocked_async),
(gst_pad_set_activate_function),
(gst_pad_set_activatepull_function),
(gst_pad_set_activatepush_function), (gst_pad_set_chain_function),
(gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_set_event_function),
(gst_pad_set_query_function), (gst_pad_set_query_type_function),
(gst_pad_set_internal_link_function), (gst_pad_set_link_function),
(gst_pad_set_unlink_function), (gst_pad_set_getcaps_function),
(gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_set_bufferalloc_function), (gst_pad_link_check_hierarchy),
(gst_pad_get_caps_unlocked), (gst_pad_get_caps),
(gst_pad_peer_get_caps), (gst_pad_accept_caps),
(gst_pad_peer_accept_caps), (gst_pad_set_caps),
(gst_pad_configure_sink), (gst_pad_configure_src),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_buffer_alloc_unchecked), (gst_pad_alloc_buffer_full),
(gst_pad_query), (gst_pad_load_and_link), (handle_pad_block),
(gst_pad_chain_unchecked), (gst_pad_push), (gst_pad_get_range),
(gst_pad_send_event):
Use _DEBUG_OBJECT when it makes sense.
Protect GST_PAD_CAPS with the OBJECT_LOCK.
Small cleanups and code reflows.
Avoid caps refcounting in _accept_caps.
Refactor alloc_buffer so that the code performed on the peer is in a
separate function. Also if the pad does not implement a buffer alloc
function, we should still check if the pad is flushing before falling
back to the default allocator.
2006-07-31 14:21:10 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "queryfunc set to %s",
|
|
|
|
GST_DEBUG_FUNCPTR_NAME (query));
|
2000-01-30 09:03:00 +00:00
|
|
|
}
|
|
|
|
|
2012-06-15 10:55:20 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_set_iterate_internal_links_function:
|
|
|
|
* @p: a #GstPad of either direction.
|
|
|
|
* @f: the #GstPadIterIntLinkFunction to set.
|
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Calls gst_pad_set_iterate_internal_links_function_full() with %NULL
|
2012-06-15 10:55:20 +00:00
|
|
|
* for the user_data and notify.
|
|
|
|
*/
|
2008-09-01 10:42:04 +00:00
|
|
|
/**
|
2011-11-21 14:47:01 +00:00
|
|
|
* gst_pad_set_iterate_internal_links_function_full:
|
2008-09-01 10:42:04 +00:00
|
|
|
* @pad: a #GstPad of either direction.
|
|
|
|
* @iterintlink: the #GstPadIterIntLinkFunction to set.
|
2012-01-26 18:28:01 +00:00
|
|
|
* @user_data: user_data passed to @notify
|
2011-11-21 14:47:01 +00:00
|
|
|
* @notify: notify called when @iterintlink will not be used anymore.
|
2008-09-01 10:42:04 +00:00
|
|
|
*
|
|
|
|
* Sets the given internal link iterator function for the pad.
|
|
|
|
*/
|
|
|
|
void
|
2011-11-21 14:47:01 +00:00
|
|
|
gst_pad_set_iterate_internal_links_function_full (GstPad * pad,
|
2012-01-26 18:28:01 +00:00
|
|
|
GstPadIterIntLinkFunction iterintlink, gpointer user_data,
|
|
|
|
GDestroyNotify notify)
|
2008-09-01 10:42:04 +00:00
|
|
|
{
|
|
|
|
g_return_if_fail (GST_IS_PAD (pad));
|
|
|
|
|
2011-11-21 14:47:01 +00:00
|
|
|
if (pad->iterintlinknotify)
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->iterintlinknotify (pad->iterintlinkdata);
|
2008-09-01 10:42:04 +00:00
|
|
|
GST_PAD_ITERINTLINKFUNC (pad) = iterintlink;
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->iterintlinkdata = user_data;
|
2011-11-21 14:47:01 +00:00
|
|
|
pad->iterintlinknotify = notify;
|
|
|
|
|
2008-09-01 10:42:04 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "internal link iterator set to %s",
|
|
|
|
GST_DEBUG_FUNCPTR_NAME (iterintlink));
|
|
|
|
}
|
|
|
|
|
2012-06-15 10:55:20 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_set_link_function:
|
|
|
|
* @p: a #GstPad.
|
|
|
|
* @f: the #GstPadLinkFunction to set.
|
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Calls gst_pad_set_link_function_full() with %NULL
|
2012-06-15 10:55:20 +00:00
|
|
|
* for the user_data and notify.
|
|
|
|
*/
|
2001-03-12 21:02:12 +00:00
|
|
|
/**
|
2011-11-21 14:47:01 +00:00
|
|
|
* gst_pad_set_link_function_full:
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
* @pad: a #GstPad.
|
2003-01-09 22:59:37 +00:00
|
|
|
* @link: the #GstPadLinkFunction to set.
|
2012-01-26 18:28:01 +00:00
|
|
|
* @user_data: user_data passed to @notify
|
2011-11-21 14:47:01 +00:00
|
|
|
* @notify: notify called when @link will not be used anymore.
|
2005-10-15 15:30:24 +00:00
|
|
|
*
|
gst/base/gstcollectpads.c: Guard public API with assertions.
Original commit message from CVS:
* gst/base/gstcollectpads.c: (gst_collectpads_set_function),
(gst_collectpads_add_pad), (gst_collectpads_remove_pad),
(gst_collectpads_is_active), (gst_collectpads_collect),
(gst_collectpads_collect_range), (gst_collectpads_start),
(gst_collectpads_stop), (gst_collectpads_peek),
(gst_collectpads_pop), (gst_collectpads_available),
(gst_collectpads_read), (gst_collectpads_flush):
Guard public API with assertions.
* gst/gstpad.c:
Fix docs for gst_pad_set_link_function().
2005-11-02 15:08:05 +00:00
|
|
|
* Sets the given link function for the pad. It will be called when
|
|
|
|
* the pad is linked with another pad.
|
2005-10-15 15:30:24 +00:00
|
|
|
*
|
2005-11-10 09:19:12 +00:00
|
|
|
* The return value #GST_PAD_LINK_OK should be used when the connection can be
|
2005-03-21 17:34:02 +00:00
|
|
|
* made.
|
2005-10-15 15:30:24 +00:00
|
|
|
*
|
2005-11-10 09:19:12 +00:00
|
|
|
* The return value #GST_PAD_LINK_REFUSED should be used when the connection
|
2005-03-21 17:34:02 +00:00
|
|
|
* cannot be made for some reason.
|
2005-11-10 09:19:12 +00:00
|
|
|
*
|
|
|
|
* If @link is installed on a source pad, it should call the #GstPadLinkFunction
|
|
|
|
* of the peer sink pad, if present.
|
2001-03-12 21:02:12 +00:00
|
|
|
*/
|
|
|
|
void
|
2011-11-21 14:47:01 +00:00
|
|
|
gst_pad_set_link_function_full (GstPad * pad, GstPadLinkFunction link,
|
2012-01-26 18:28:01 +00:00
|
|
|
gpointer user_data, GDestroyNotify notify)
|
2001-03-12 21:02:12 +00:00
|
|
|
{
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
g_return_if_fail (GST_IS_PAD (pad));
|
2001-03-12 21:02:12 +00:00
|
|
|
|
2011-11-21 14:47:01 +00:00
|
|
|
if (pad->linknotify)
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->linknotify (pad->linkdata);
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
GST_PAD_LINKFUNC (pad) = link;
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->linkdata = user_data;
|
2011-11-21 14:47:01 +00:00
|
|
|
pad->linknotify = notify;
|
|
|
|
|
gst/gstpad.c: Use _DEBUG_OBJECT when it makes sense.
Original commit message from CVS:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_get_property), (gst_pad_activate_pull),
(gst_pad_activate_push), (gst_pad_set_blocked_async),
(gst_pad_set_activate_function),
(gst_pad_set_activatepull_function),
(gst_pad_set_activatepush_function), (gst_pad_set_chain_function),
(gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_set_event_function),
(gst_pad_set_query_function), (gst_pad_set_query_type_function),
(gst_pad_set_internal_link_function), (gst_pad_set_link_function),
(gst_pad_set_unlink_function), (gst_pad_set_getcaps_function),
(gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_set_bufferalloc_function), (gst_pad_link_check_hierarchy),
(gst_pad_get_caps_unlocked), (gst_pad_get_caps),
(gst_pad_peer_get_caps), (gst_pad_accept_caps),
(gst_pad_peer_accept_caps), (gst_pad_set_caps),
(gst_pad_configure_sink), (gst_pad_configure_src),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_buffer_alloc_unchecked), (gst_pad_alloc_buffer_full),
(gst_pad_query), (gst_pad_load_and_link), (handle_pad_block),
(gst_pad_chain_unchecked), (gst_pad_push), (gst_pad_get_range),
(gst_pad_send_event):
Use _DEBUG_OBJECT when it makes sense.
Protect GST_PAD_CAPS with the OBJECT_LOCK.
Small cleanups and code reflows.
Avoid caps refcounting in _accept_caps.
Refactor alloc_buffer so that the code performed on the peer is in a
separate function. Also if the pad does not implement a buffer alloc
function, we should still check if the pad is flushing before falling
back to the default allocator.
2006-07-31 14:21:10 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "linkfunc set to %s",
|
|
|
|
GST_DEBUG_FUNCPTR_NAME (link));
|
2001-03-12 21:02:12 +00:00
|
|
|
}
|
|
|
|
|
2012-06-15 10:55:20 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_set_unlink_function:
|
|
|
|
* @p: a #GstPad.
|
|
|
|
* @f: the #GstPadUnlinkFunction to set.
|
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Calls gst_pad_set_unlink_function_full() with %NULL
|
2012-06-15 10:55:20 +00:00
|
|
|
* for the user_data and notify.
|
|
|
|
*/
|
2003-08-02 01:52:14 +00:00
|
|
|
/**
|
2011-11-21 14:47:01 +00:00
|
|
|
* gst_pad_set_unlink_function_full:
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
* @pad: a #GstPad.
|
2003-08-02 01:52:14 +00:00
|
|
|
* @unlink: the #GstPadUnlinkFunction to set.
|
2012-01-26 18:28:01 +00:00
|
|
|
* @user_data: user_data passed to @notify
|
2011-11-21 14:47:01 +00:00
|
|
|
* @notify: notify called when @unlink will not be used anymore.
|
2003-08-02 01:52:14 +00:00
|
|
|
*
|
|
|
|
* Sets the given unlink function for the pad. It will be called
|
|
|
|
* when the pad is unlinked.
|
|
|
|
*/
|
|
|
|
void
|
2011-11-21 14:47:01 +00:00
|
|
|
gst_pad_set_unlink_function_full (GstPad * pad, GstPadUnlinkFunction unlink,
|
2012-01-26 18:28:01 +00:00
|
|
|
gpointer user_data, GDestroyNotify notify)
|
2003-08-02 01:52:14 +00:00
|
|
|
{
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
g_return_if_fail (GST_IS_PAD (pad));
|
2003-08-02 01:52:14 +00:00
|
|
|
|
2011-11-21 14:47:01 +00:00
|
|
|
if (pad->unlinknotify)
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->unlinknotify (pad->unlinkdata);
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
GST_PAD_UNLINKFUNC (pad) = unlink;
|
2012-01-26 18:28:01 +00:00
|
|
|
pad->unlinkdata = user_data;
|
2011-11-21 14:47:01 +00:00
|
|
|
pad->unlinknotify = notify;
|
|
|
|
|
gst/gstpad.c: Use _DEBUG_OBJECT when it makes sense.
Original commit message from CVS:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_get_property), (gst_pad_activate_pull),
(gst_pad_activate_push), (gst_pad_set_blocked_async),
(gst_pad_set_activate_function),
(gst_pad_set_activatepull_function),
(gst_pad_set_activatepush_function), (gst_pad_set_chain_function),
(gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_set_event_function),
(gst_pad_set_query_function), (gst_pad_set_query_type_function),
(gst_pad_set_internal_link_function), (gst_pad_set_link_function),
(gst_pad_set_unlink_function), (gst_pad_set_getcaps_function),
(gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_set_bufferalloc_function), (gst_pad_link_check_hierarchy),
(gst_pad_get_caps_unlocked), (gst_pad_get_caps),
(gst_pad_peer_get_caps), (gst_pad_accept_caps),
(gst_pad_peer_accept_caps), (gst_pad_set_caps),
(gst_pad_configure_sink), (gst_pad_configure_src),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_buffer_alloc_unchecked), (gst_pad_alloc_buffer_full),
(gst_pad_query), (gst_pad_load_and_link), (handle_pad_block),
(gst_pad_chain_unchecked), (gst_pad_push), (gst_pad_get_range),
(gst_pad_send_event):
Use _DEBUG_OBJECT when it makes sense.
Protect GST_PAD_CAPS with the OBJECT_LOCK.
Small cleanups and code reflows.
Avoid caps refcounting in _accept_caps.
Refactor alloc_buffer so that the code performed on the peer is in a
separate function. Also if the pad does not implement a buffer alloc
function, we should still check if the pad is flushing before falling
back to the default allocator.
2006-07-31 14:21:10 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "unlinkfunc set to %s",
|
|
|
|
GST_DEBUG_FUNCPTR_NAME (unlink));
|
2003-08-02 01:52:14 +00:00
|
|
|
}
|
|
|
|
|
2000-10-25 19:09:53 +00:00
|
|
|
/**
|
2003-01-09 14:15:37 +00:00
|
|
|
* gst_pad_unlink:
|
|
|
|
* @srcpad: the source #GstPad to unlink.
|
|
|
|
* @sinkpad: the sink #GstPad to unlink.
|
2000-10-25 19:09:53 +00:00
|
|
|
*
|
2008-02-06 12:21:05 +00:00
|
|
|
* Unlinks the source pad from the sink pad. Will emit the #GstPad::unlinked
|
|
|
|
* signal on both pads.
|
2005-03-21 17:34:02 +00:00
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Returns: %TRUE if the pads were unlinked. This function returns %FALSE if
|
2005-03-21 17:34:02 +00:00
|
|
|
* the pads were not linked together.
|
|
|
|
*
|
|
|
|
* MT safe.
|
2000-10-25 19:09:53 +00:00
|
|
|
*/
|
2005-03-21 17:34:02 +00:00
|
|
|
gboolean
|
2004-03-13 15:27:01 +00:00
|
|
|
gst_pad_unlink (GstPad * srcpad, GstPad * sinkpad)
|
2000-11-01 13:49:41 +00:00
|
|
|
{
|
gst/gstbin.c: Keep track of pads that are being linked/unlinked and resync the state changes.
Original commit message from CVS:
Base on Patch by: Olivier Crete <tester at tester dot ca>
* gst/gstbin.c: (gst_bin_init), (gst_bin_add_func),
(gst_bin_remove_func), (update_degree),
(gst_bin_sort_iterator_new), (gst_bin_handle_message_func):
Keep track of pads that are being linked/unlinked and resync the state
changes.
* gst/gstpad.c: (gst_pad_get_direction),
(gst_pad_set_chain_function), (gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link),
(gst_pad_event_default_dispatch), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range):
Some code cleanups, use macros to check pad direction.
Don't need to take the lock on the pad direction.
Post structure change when pads are linked/unlinked.
Change some checks into _return_if_fail().
* tests/check/gst/gstbin.c:
(test_link_structure_change_state_changed_sync_cb),
(GST_START_TEST), (gst_bin_suite):
Add testcase for pad link/unlinke resync during a state change.
Fixes #510354.
2008-10-06 16:15:02 +00:00
|
|
|
gboolean result = FALSE;
|
|
|
|
GstElement *parent = NULL;
|
|
|
|
|
2005-03-21 17:34:02 +00:00
|
|
|
g_return_val_if_fail (GST_IS_PAD (srcpad), FALSE);
|
gst/gstbin.c: Keep track of pads that are being linked/unlinked and resync the state changes.
Original commit message from CVS:
Base on Patch by: Olivier Crete <tester at tester dot ca>
* gst/gstbin.c: (gst_bin_init), (gst_bin_add_func),
(gst_bin_remove_func), (update_degree),
(gst_bin_sort_iterator_new), (gst_bin_handle_message_func):
Keep track of pads that are being linked/unlinked and resync the state
changes.
* gst/gstpad.c: (gst_pad_get_direction),
(gst_pad_set_chain_function), (gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link),
(gst_pad_event_default_dispatch), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range):
Some code cleanups, use macros to check pad direction.
Don't need to take the lock on the pad direction.
Post structure change when pads are linked/unlinked.
Change some checks into _return_if_fail().
* tests/check/gst/gstbin.c:
(test_link_structure_change_state_changed_sync_cb),
(GST_START_TEST), (gst_bin_suite):
Add testcase for pad link/unlinke resync during a state change.
Fixes #510354.
2008-10-06 16:15:02 +00:00
|
|
|
g_return_val_if_fail (GST_PAD_IS_SRC (srcpad), FALSE);
|
2005-03-21 17:34:02 +00:00
|
|
|
g_return_val_if_fail (GST_IS_PAD (sinkpad), FALSE);
|
gst/gstbin.c: Keep track of pads that are being linked/unlinked and resync the state changes.
Original commit message from CVS:
Base on Patch by: Olivier Crete <tester at tester dot ca>
* gst/gstbin.c: (gst_bin_init), (gst_bin_add_func),
(gst_bin_remove_func), (update_degree),
(gst_bin_sort_iterator_new), (gst_bin_handle_message_func):
Keep track of pads that are being linked/unlinked and resync the state
changes.
* gst/gstpad.c: (gst_pad_get_direction),
(gst_pad_set_chain_function), (gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link),
(gst_pad_event_default_dispatch), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range):
Some code cleanups, use macros to check pad direction.
Don't need to take the lock on the pad direction.
Post structure change when pads are linked/unlinked.
Change some checks into _return_if_fail().
* tests/check/gst/gstbin.c:
(test_link_structure_change_state_changed_sync_cb),
(GST_START_TEST), (gst_bin_suite):
Add testcase for pad link/unlinke resync during a state change.
Fixes #510354.
2008-10-06 16:15:02 +00:00
|
|
|
g_return_val_if_fail (GST_PAD_IS_SINK (sinkpad), FALSE);
|
2000-06-25 21:38:00 +00:00
|
|
|
|
tracer: add missing hooks
Add following hooks: element-new, element-add-pad, element-remove-pad,
bin-add-pre, bin-add-post, bin-remove-pre, bin-remove-post, pad-link-pre,
pad-link-post, pad-unlink-pre, pad-unlink-post.
https://bugzilla.gnome.org/show_bug.cgi?id=733187
2015-06-03 23:50:34 +00:00
|
|
|
GST_TRACER_PAD_UNLINK_PRE (srcpad, sinkpad);
|
|
|
|
|
2003-06-29 14:05:49 +00:00
|
|
|
GST_CAT_INFO (GST_CAT_ELEMENT_PADS, "unlinking %s:%s(%p) and %s:%s(%p)",
|
2004-03-13 15:27:01 +00:00
|
|
|
GST_DEBUG_PAD_NAME (srcpad), srcpad,
|
|
|
|
GST_DEBUG_PAD_NAME (sinkpad), sinkpad);
|
2001-05-25 21:00:07 +00:00
|
|
|
|
gst/gstbin.c: Keep track of pads that are being linked/unlinked and resync the state changes.
Original commit message from CVS:
Base on Patch by: Olivier Crete <tester at tester dot ca>
* gst/gstbin.c: (gst_bin_init), (gst_bin_add_func),
(gst_bin_remove_func), (update_degree),
(gst_bin_sort_iterator_new), (gst_bin_handle_message_func):
Keep track of pads that are being linked/unlinked and resync the state
changes.
* gst/gstpad.c: (gst_pad_get_direction),
(gst_pad_set_chain_function), (gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link),
(gst_pad_event_default_dispatch), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range):
Some code cleanups, use macros to check pad direction.
Don't need to take the lock on the pad direction.
Post structure change when pads are linked/unlinked.
Change some checks into _return_if_fail().
* tests/check/gst/gstbin.c:
(test_link_structure_change_state_changed_sync_cb),
(GST_START_TEST), (gst_bin_suite):
Add testcase for pad link/unlinke resync during a state change.
Fixes #510354.
2008-10-06 16:15:02 +00:00
|
|
|
/* We need to notify the parent before taking any pad locks as the bin in
|
|
|
|
* question might be waiting for a lock on the pad while holding its lock
|
|
|
|
* that our message will try to take. */
|
|
|
|
if ((parent = GST_ELEMENT_CAST (gst_pad_get_parent (srcpad)))) {
|
|
|
|
if (GST_IS_ELEMENT (parent)) {
|
|
|
|
gst_element_post_message (parent,
|
2009-09-02 16:54:06 +00:00
|
|
|
gst_message_new_structure_change (GST_OBJECT_CAST (sinkpad),
|
gst/gstbin.c: Keep track of pads that are being linked/unlinked and resync the state changes.
Original commit message from CVS:
Base on Patch by: Olivier Crete <tester at tester dot ca>
* gst/gstbin.c: (gst_bin_init), (gst_bin_add_func),
(gst_bin_remove_func), (update_degree),
(gst_bin_sort_iterator_new), (gst_bin_handle_message_func):
Keep track of pads that are being linked/unlinked and resync the state
changes.
* gst/gstpad.c: (gst_pad_get_direction),
(gst_pad_set_chain_function), (gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link),
(gst_pad_event_default_dispatch), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range):
Some code cleanups, use macros to check pad direction.
Don't need to take the lock on the pad direction.
Post structure change when pads are linked/unlinked.
Change some checks into _return_if_fail().
* tests/check/gst/gstbin.c:
(test_link_structure_change_state_changed_sync_cb),
(GST_START_TEST), (gst_bin_suite):
Add testcase for pad link/unlinke resync during a state change.
Fixes #510354.
2008-10-06 16:15:02 +00:00
|
|
|
GST_STRUCTURE_CHANGE_TYPE_PAD_UNLINK, parent, TRUE));
|
|
|
|
} else {
|
|
|
|
gst_object_unref (parent);
|
|
|
|
parent = NULL;
|
|
|
|
}
|
|
|
|
}
|
2001-01-19 02:23:35 +00:00
|
|
|
|
gst/gstbin.c: Keep track of pads that are being linked/unlinked and resync the state changes.
Original commit message from CVS:
Base on Patch by: Olivier Crete <tester at tester dot ca>
* gst/gstbin.c: (gst_bin_init), (gst_bin_add_func),
(gst_bin_remove_func), (update_degree),
(gst_bin_sort_iterator_new), (gst_bin_handle_message_func):
Keep track of pads that are being linked/unlinked and resync the state
changes.
* gst/gstpad.c: (gst_pad_get_direction),
(gst_pad_set_chain_function), (gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link),
(gst_pad_event_default_dispatch), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range):
Some code cleanups, use macros to check pad direction.
Don't need to take the lock on the pad direction.
Post structure change when pads are linked/unlinked.
Change some checks into _return_if_fail().
* tests/check/gst/gstbin.c:
(test_link_structure_change_state_changed_sync_cb),
(GST_START_TEST), (gst_bin_suite):
Add testcase for pad link/unlinke resync during a state change.
Fixes #510354.
2008-10-06 16:15:02 +00:00
|
|
|
GST_OBJECT_LOCK (srcpad);
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_LOCK (sinkpad);
|
2001-05-25 21:00:07 +00:00
|
|
|
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
if (G_UNLIKELY (GST_PAD_PEER (srcpad) != sinkpad))
|
2005-03-21 17:34:02 +00:00
|
|
|
goto not_linked_together;
|
2000-06-25 21:38:00 +00:00
|
|
|
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
if (GST_PAD_UNLINKFUNC (srcpad)) {
|
2012-09-17 11:09:58 +00:00
|
|
|
GstObject *tmpparent;
|
|
|
|
|
|
|
|
ACQUIRE_PARENT (srcpad, tmpparent, no_src_parent);
|
|
|
|
|
|
|
|
GST_PAD_UNLINKFUNC (srcpad) (srcpad, tmpparent);
|
2012-09-18 10:14:34 +00:00
|
|
|
RELEASE_PARENT (tmpparent);
|
2003-08-02 01:52:14 +00:00
|
|
|
}
|
2012-09-17 11:09:58 +00:00
|
|
|
no_src_parent:
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
if (GST_PAD_UNLINKFUNC (sinkpad)) {
|
2012-09-17 11:09:58 +00:00
|
|
|
GstObject *tmpparent;
|
|
|
|
|
|
|
|
ACQUIRE_PARENT (sinkpad, tmpparent, no_sink_parent);
|
|
|
|
|
|
|
|
GST_PAD_UNLINKFUNC (sinkpad) (sinkpad, tmpparent);
|
2012-09-18 10:14:34 +00:00
|
|
|
RELEASE_PARENT (tmpparent);
|
2003-08-02 01:52:14 +00:00
|
|
|
}
|
2012-09-17 11:09:58 +00:00
|
|
|
no_sink_parent:
|
2003-08-02 01:52:14 +00:00
|
|
|
|
2000-06-25 21:38:00 +00:00
|
|
|
/* first clear peers */
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
GST_PAD_PEER (srcpad) = NULL;
|
|
|
|
GST_PAD_PEER (sinkpad) = NULL;
|
2002-01-13 22:22:42 +00:00
|
|
|
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (sinkpad);
|
|
|
|
GST_OBJECT_UNLOCK (srcpad);
|
2002-02-18 00:40:56 +00:00
|
|
|
|
2005-10-15 15:30:24 +00:00
|
|
|
/* fire off a signal to each of the pads telling them
|
2003-01-09 14:15:37 +00:00
|
|
|
* that they've been unlinked */
|
2009-10-03 20:08:54 +00:00
|
|
|
g_signal_emit (srcpad, gst_pad_signals[PAD_UNLINKED], 0, sinkpad);
|
|
|
|
g_signal_emit (sinkpad, gst_pad_signals[PAD_UNLINKED], 0, srcpad);
|
2001-05-25 21:00:07 +00:00
|
|
|
|
2004-02-22 15:09:20 +00:00
|
|
|
GST_CAT_INFO (GST_CAT_ELEMENT_PADS, "unlinked %s:%s and %s:%s",
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
|
2005-03-21 17:34:02 +00:00
|
|
|
|
gst/gstbin.c: Keep track of pads that are being linked/unlinked and resync the state changes.
Original commit message from CVS:
Base on Patch by: Olivier Crete <tester at tester dot ca>
* gst/gstbin.c: (gst_bin_init), (gst_bin_add_func),
(gst_bin_remove_func), (update_degree),
(gst_bin_sort_iterator_new), (gst_bin_handle_message_func):
Keep track of pads that are being linked/unlinked and resync the state
changes.
* gst/gstpad.c: (gst_pad_get_direction),
(gst_pad_set_chain_function), (gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link),
(gst_pad_event_default_dispatch), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range):
Some code cleanups, use macros to check pad direction.
Don't need to take the lock on the pad direction.
Post structure change when pads are linked/unlinked.
Change some checks into _return_if_fail().
* tests/check/gst/gstbin.c:
(test_link_structure_change_state_changed_sync_cb),
(GST_START_TEST), (gst_bin_suite):
Add testcase for pad link/unlinke resync during a state change.
Fixes #510354.
2008-10-06 16:15:02 +00:00
|
|
|
result = TRUE;
|
2002-02-18 00:40:56 +00:00
|
|
|
|
gst/gstbin.c: Keep track of pads that are being linked/unlinked and resync the state changes.
Original commit message from CVS:
Base on Patch by: Olivier Crete <tester at tester dot ca>
* gst/gstbin.c: (gst_bin_init), (gst_bin_add_func),
(gst_bin_remove_func), (update_degree),
(gst_bin_sort_iterator_new), (gst_bin_handle_message_func):
Keep track of pads that are being linked/unlinked and resync the state
changes.
* gst/gstpad.c: (gst_pad_get_direction),
(gst_pad_set_chain_function), (gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link),
(gst_pad_event_default_dispatch), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range):
Some code cleanups, use macros to check pad direction.
Don't need to take the lock on the pad direction.
Post structure change when pads are linked/unlinked.
Change some checks into _return_if_fail().
* tests/check/gst/gstbin.c:
(test_link_structure_change_state_changed_sync_cb),
(GST_START_TEST), (gst_bin_suite):
Add testcase for pad link/unlinke resync during a state change.
Fixes #510354.
2008-10-06 16:15:02 +00:00
|
|
|
done:
|
|
|
|
if (parent != NULL) {
|
|
|
|
gst_element_post_message (parent,
|
2009-09-02 16:54:06 +00:00
|
|
|
gst_message_new_structure_change (GST_OBJECT_CAST (sinkpad),
|
gst/gstbin.c: Keep track of pads that are being linked/unlinked and resync the state changes.
Original commit message from CVS:
Base on Patch by: Olivier Crete <tester at tester dot ca>
* gst/gstbin.c: (gst_bin_init), (gst_bin_add_func),
(gst_bin_remove_func), (update_degree),
(gst_bin_sort_iterator_new), (gst_bin_handle_message_func):
Keep track of pads that are being linked/unlinked and resync the state
changes.
* gst/gstpad.c: (gst_pad_get_direction),
(gst_pad_set_chain_function), (gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link),
(gst_pad_event_default_dispatch), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range):
Some code cleanups, use macros to check pad direction.
Don't need to take the lock on the pad direction.
Post structure change when pads are linked/unlinked.
Change some checks into _return_if_fail().
* tests/check/gst/gstbin.c:
(test_link_structure_change_state_changed_sync_cb),
(GST_START_TEST), (gst_bin_suite):
Add testcase for pad link/unlinke resync during a state change.
Fixes #510354.
2008-10-06 16:15:02 +00:00
|
|
|
GST_STRUCTURE_CHANGE_TYPE_PAD_UNLINK, parent, FALSE));
|
|
|
|
gst_object_unref (parent);
|
2005-03-21 17:34:02 +00:00
|
|
|
}
|
tracer: add missing hooks
Add following hooks: element-new, element-add-pad, element-remove-pad,
bin-add-pre, bin-add-post, bin-remove-pre, bin-remove-post, pad-link-pre,
pad-link-post, pad-unlink-pre, pad-unlink-post.
https://bugzilla.gnome.org/show_bug.cgi?id=733187
2015-06-03 23:50:34 +00:00
|
|
|
GST_TRACER_PAD_UNLINK_POST (srcpad, sinkpad, result);
|
gst/gstbin.c: Keep track of pads that are being linked/unlinked and resync the state changes.
Original commit message from CVS:
Base on Patch by: Olivier Crete <tester at tester dot ca>
* gst/gstbin.c: (gst_bin_init), (gst_bin_add_func),
(gst_bin_remove_func), (update_degree),
(gst_bin_sort_iterator_new), (gst_bin_handle_message_func):
Keep track of pads that are being linked/unlinked and resync the state
changes.
* gst/gstpad.c: (gst_pad_get_direction),
(gst_pad_set_chain_function), (gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link),
(gst_pad_event_default_dispatch), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range):
Some code cleanups, use macros to check pad direction.
Don't need to take the lock on the pad direction.
Post structure change when pads are linked/unlinked.
Change some checks into _return_if_fail().
* tests/check/gst/gstbin.c:
(test_link_structure_change_state_changed_sync_cb),
(GST_START_TEST), (gst_bin_suite):
Add testcase for pad link/unlinke resync during a state change.
Fixes #510354.
2008-10-06 16:15:02 +00:00
|
|
|
return result;
|
|
|
|
|
|
|
|
/* ERRORS */
|
2005-03-21 17:34:02 +00:00
|
|
|
not_linked_together:
|
|
|
|
{
|
|
|
|
/* we do not emit a warning in this case because unlinking cannot
|
|
|
|
* be made MT safe.*/
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (sinkpad);
|
|
|
|
GST_OBJECT_UNLOCK (srcpad);
|
gst/gstbin.c: Keep track of pads that are being linked/unlinked and resync the state changes.
Original commit message from CVS:
Base on Patch by: Olivier Crete <tester at tester dot ca>
* gst/gstbin.c: (gst_bin_init), (gst_bin_add_func),
(gst_bin_remove_func), (update_degree),
(gst_bin_sort_iterator_new), (gst_bin_handle_message_func):
Keep track of pads that are being linked/unlinked and resync the state
changes.
* gst/gstpad.c: (gst_pad_get_direction),
(gst_pad_set_chain_function), (gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link),
(gst_pad_event_default_dispatch), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range):
Some code cleanups, use macros to check pad direction.
Don't need to take the lock on the pad direction.
Post structure change when pads are linked/unlinked.
Change some checks into _return_if_fail().
* tests/check/gst/gstbin.c:
(test_link_structure_change_state_changed_sync_cb),
(GST_START_TEST), (gst_bin_suite):
Add testcase for pad link/unlinke resync during a state change.
Fixes #510354.
2008-10-06 16:15:02 +00:00
|
|
|
goto done;
|
2005-03-21 17:34:02 +00:00
|
|
|
}
|
2001-09-14 19:45:20 +00:00
|
|
|
}
|
|
|
|
|
2004-01-15 03:03:15 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_is_linked:
|
|
|
|
* @pad: pad to check
|
|
|
|
*
|
gst/gstpad.c (gst_pad_custom_new): Add a FIXME, this is a hacky way to do inheritance.
Original commit message from CVS:
2004-02-10 Andy Wingo <wingo@pobox.com>
* gst/gstpad.c (gst_pad_custom_new): Add a FIXME, this is a hacky
way to do inheritance.
(gst_pad_get_event_masks, gst_pad_get_event_masks_default)
(gst_pad_get_query_types, gst_pad_get_query_types_default):
Routine docs.
(gst_pad_set_link_function, gst_pad_set_fixate_function)
(gst_pad_set_getcaps_function): Doc from Dave's negotation random
doc.
(gst_pad_unlink, gst_pad_is_linked): Docs.
(gst_pad_renegotiate): A brief description of capsnego.
(gst_pad_try_set_caps): Document.
(gst_pad_try_set_caps_nonfixed): Document.
(gst_pad_can_link_filtered, gst_pad_link_filtered): Doc fixes.
(gst_pad_set_parent): Deprecated (although not out of the API).
(gst_pad_get_parent): Deprecated, although many plugins use this.
(gst_pad_add_ghost_pad, gst_pad_remove_ghost_pad): Doc that these
are private and will go away in 0.9.
(gst_pad_perform_negotiate): Doc.
(gst_pad_link_unnegotiate): I think this is meant to be static.
(gst_pad_get_negotiated_caps, gst_pad_get_pad_template_caps)
(gst_pad_template_get_caps_by_name, gst_pad_check_compatibility)
(gst_pad_get_peer): Doc updates.
(gst_pad_caps_change_notify): Doc.
(gst_pad_alloc_buffer, gst_pad_push, gst_static_pad_template_get)
(gst_ghost_pad_new): Doc fixes.
* gst/gstobject.c (gst_object_get_parent, gst_object_unparent)
(gst_object_check_uniqueness):
* gst/gstelement.c (gst_element_add_pad)
(gst_element_add_ghost_pad, gst_element_remove_pad)
(gst_element_remove_ghost_pad, gst_element_get_pad)
(gst_element_get_static_pad, gst_element_get_pad_list)
(gst_element_class_get_pad_template_list)
(gst_element_class_get_pad_template): Work on the docs.
(gst_element_get_pad_template_list): Uses the class method.
(gst_element_get_compatible_pad_template): Docs, and consolidate
some test conditions.
(gst_element_get_pad_from_template): New static function.
(gst_element_request_compatible_pad): Docs, and work with
non-request compatible templates.
(gst_element_get_compatible_pad_filtered): Docs and remove
redundant checks.
(gst_element_get_compatible_pad, gst_element_link_pads_filtered)
(gst_element_link_filtered, gst_element_link_many)
(gst_element_link, gst_element_link_pads)
(gst_element_unlink_many): Docs.
2004-02-05 Andy Wingo <wingo@pobox.com>
* gst/gstpad.c (_gst_real_pad_fixate_accumulator):
s/pointer/boxed/.
* gst/gstmarshal.list (VOID:BOXED, BOXED:BOXED): New marshallers.
* gst/gstpad.c (gst_real_pad_class_init): Use a BOXED:BOXED
marshaller for ::fixate, and VOID:BOXED for ::caps-nego-failed,
with the type=GST_TYPE_CAPS. This allows language bindings to know
what kind of data they're dealing with.
* gst/gstcaps.c (_gst_caps_value_init): GBoxed values initialize
to NULL when g_value_init is called. GstCaps, which rolls its own
type implementation, now does the same instead of allocating empty
caps.
(_gst_caps_initialize, _gst_caps_collect_value,
_gst_caps_lcopy_value): Provide collect_value and lcopy_value type
table methods. This allows G_VALUE_COLLECT to work.
2004-02-05 Andy Wingo <wingo@pobox.com>
* configure.ac:
* testsuite/Makefile.am (SUBDIRS):
* testsuite/ghostpads/Makefile.am:
* testsuite/ghostpads/ghostpads.c: A new test for ghost pads.
* gst/gstpad.c (gst_pad_add_ghost_pad, gst_pad_remove_ghost_pad):
These two routines are the only ones that set
GST_GPAD_REALPAD(gpad), the ghost pad list, and the ghost pad's
pad template. They should be made static, depending on ABI needs.
(gst_real_pad_dispose): Handle the case of ghost pads without a
parent. Assert after dealing with ghost pads that the ghost pad
list is empty.
(gst_ghost_pad_class_init): New property added, ::real-pad. Can be
set after creation.
(gst_ghost_pad_dispose): Set ::real-pad to NULL.
(gst_ghost_pad_set_property, gst_ghost_pad_get_property): New
functions. set_property will call add_ghost_pad/remove_ghost_pad
as appropriate.
(gst_ghost_pad_new): All the work is offloaded to g_object_new.
* gst/gstelement.c (gst_element_add_pad): Handle ghost pads as well.
(gst_element_add_ghost_pad): Remove code duplicated from _add_pad.
(gst_element_remove_pad): Handle ghost pads as well.
(gst_element_remove_ghost_pad): Deprecated (could be removed,
depending on API-stability needs).
2004-02-05 Andy Wingo <wingo@pobox.com>
* gst/gstbin.[ch]: (gst_bin_get_by_interface): GTypes are scalars,
of course they're const
2004-02-11 13:26:04 +00:00
|
|
|
* Checks if a @pad is linked to another pad or not.
|
2004-01-15 03:03:15 +00:00
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Returns: %TRUE if the pad is linked, %FALSE otherwise.
|
2005-03-07 18:27:42 +00:00
|
|
|
*
|
|
|
|
* MT safe.
|
2004-01-15 03:03:15 +00:00
|
|
|
*/
|
|
|
|
gboolean
|
2004-03-13 15:27:01 +00:00
|
|
|
gst_pad_is_linked (GstPad * pad)
|
2004-01-15 03:03:15 +00:00
|
|
|
{
|
2005-03-07 18:27:42 +00:00
|
|
|
gboolean result;
|
|
|
|
|
2004-01-15 03:03:15 +00:00
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
|
|
|
|
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
result = (GST_PAD_PEER (pad) != NULL);
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2005-03-07 18:27:42 +00:00
|
|
|
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
return result;
|
2004-01-15 03:03:15 +00:00
|
|
|
}
|
|
|
|
|
check/gst/gstghostpad.c: Added some more tests for wrong hierarchy
Original commit message from CVS:
* check/gst/gstghostpad.c: (GST_START_TEST), (gst_ghost_pad_suite):
Added some more tests for wrong hierarchy
* docs/design/part-overview.txt:
Some updates.
* gst/gstbin.c: (gst_bin_remove_func), (gst_bin_dispose):
Cleanups.
* gst/gstelement.c: (gst_element_remove_pad), (gst_element_seek),
(gst_element_dispose):
Some more cleanups.
* gst/gstpad.c: (gst_pad_link_check_compatible_unlocked),
(gst_pad_link_check_hierarchy), (gst_pad_link_prepare),
(gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
(gst_pad_set_caps), (gst_pad_send_event):
Check for correct hierarchy when linking pads. Moving to
strict requirement for ghostpads when linking elements in
different bins.
* gst/gstpad.h:
Clean ups. Added WRONG_HIERARCHY return value.
2005-07-28 11:24:33 +00:00
|
|
|
/* get the caps from both pads and see if the intersection
|
|
|
|
* is not empty.
|
|
|
|
*
|
|
|
|
* This function should be called with the pad LOCK on both
|
|
|
|
* pads
|
|
|
|
*/
|
2005-04-24 21:16:45 +00:00
|
|
|
static gboolean
|
2010-06-23 14:45:19 +00:00
|
|
|
gst_pad_link_check_compatible_unlocked (GstPad * src, GstPad * sink,
|
|
|
|
GstPadLinkCheck flags)
|
2005-04-24 21:16:45 +00:00
|
|
|
{
|
2010-06-23 14:45:19 +00:00
|
|
|
GstCaps *srccaps = NULL;
|
|
|
|
GstCaps *sinkcaps = NULL;
|
2009-07-22 08:24:08 +00:00
|
|
|
gboolean compatible = FALSE;
|
2005-04-24 21:16:45 +00:00
|
|
|
|
2010-06-23 14:45:19 +00:00
|
|
|
if (!(flags & (GST_PAD_LINK_CHECK_CAPS | GST_PAD_LINK_CHECK_TEMPLATE_CAPS)))
|
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
/* Doing the expensive caps checking takes priority over only checking the template caps */
|
|
|
|
if (flags & GST_PAD_LINK_CHECK_CAPS) {
|
2011-11-21 16:43:51 +00:00
|
|
|
GST_OBJECT_UNLOCK (sink);
|
2011-11-15 10:20:48 +00:00
|
|
|
GST_OBJECT_UNLOCK (src);
|
2011-11-21 16:43:51 +00:00
|
|
|
|
2011-11-15 15:46:37 +00:00
|
|
|
srccaps = gst_pad_query_caps (src, NULL);
|
|
|
|
sinkcaps = gst_pad_query_caps (sink, NULL);
|
2011-11-21 16:43:51 +00:00
|
|
|
|
|
|
|
GST_OBJECT_LOCK (src);
|
2011-11-15 10:20:48 +00:00
|
|
|
GST_OBJECT_LOCK (sink);
|
2010-06-23 14:45:19 +00:00
|
|
|
} else {
|
2010-07-20 18:49:12 +00:00
|
|
|
/* If one of the two pads doesn't have a template, consider the intersection
|
|
|
|
* as valid.*/
|
|
|
|
if (G_UNLIKELY ((GST_PAD_PAD_TEMPLATE (src) == NULL)
|
|
|
|
|| (GST_PAD_PAD_TEMPLATE (sink) == NULL))) {
|
|
|
|
compatible = TRUE;
|
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
srccaps = gst_caps_ref (GST_PAD_TEMPLATE_CAPS (GST_PAD_PAD_TEMPLATE (src)));
|
|
|
|
sinkcaps =
|
|
|
|
gst_caps_ref (GST_PAD_TEMPLATE_CAPS (GST_PAD_PAD_TEMPLATE (sink)));
|
2010-06-23 14:45:19 +00:00
|
|
|
}
|
2006-01-20 09:53:24 +00:00
|
|
|
|
2010-07-06 13:47:22 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, src, "src caps %" GST_PTR_FORMAT,
|
|
|
|
srccaps);
|
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, sink, "sink caps %" GST_PTR_FORMAT,
|
|
|
|
sinkcaps);
|
2005-04-24 21:16:45 +00:00
|
|
|
|
2006-01-20 09:53:24 +00:00
|
|
|
/* if we have caps on both pads we can check the intersection. If one
|
2014-05-29 21:54:34 +00:00
|
|
|
* of the caps is %NULL, we return %TRUE. */
|
2009-06-29 09:23:31 +00:00
|
|
|
if (G_UNLIKELY (srccaps == NULL || sinkcaps == NULL)) {
|
2008-10-06 08:45:42 +00:00
|
|
|
if (srccaps)
|
|
|
|
gst_caps_unref (srccaps);
|
|
|
|
if (sinkcaps)
|
|
|
|
gst_caps_unref (sinkcaps);
|
2006-01-20 09:56:38 +00:00
|
|
|
goto done;
|
2008-10-06 08:45:42 +00:00
|
|
|
}
|
2005-04-24 21:16:45 +00:00
|
|
|
|
2009-07-22 08:24:08 +00:00
|
|
|
compatible = gst_caps_can_intersect (srccaps, sinkcaps);
|
2006-01-20 09:56:38 +00:00
|
|
|
gst_caps_unref (srccaps);
|
|
|
|
gst_caps_unref (sinkcaps);
|
2005-06-19 00:52:31 +00:00
|
|
|
|
2006-01-20 09:56:38 +00:00
|
|
|
done:
|
2009-07-22 08:24:08 +00:00
|
|
|
GST_CAT_DEBUG (GST_CAT_CAPS, "caps are %scompatible",
|
2014-04-15 19:16:06 +00:00
|
|
|
(compatible ? "" : "not "));
|
2006-01-20 09:53:24 +00:00
|
|
|
|
2009-07-22 08:24:08 +00:00
|
|
|
return compatible;
|
2005-04-24 21:16:45 +00:00
|
|
|
}
|
|
|
|
|
check/gst/gstghostpad.c: Added some more tests for wrong hierarchy
Original commit message from CVS:
* check/gst/gstghostpad.c: (GST_START_TEST), (gst_ghost_pad_suite):
Added some more tests for wrong hierarchy
* docs/design/part-overview.txt:
Some updates.
* gst/gstbin.c: (gst_bin_remove_func), (gst_bin_dispose):
Cleanups.
* gst/gstelement.c: (gst_element_remove_pad), (gst_element_seek),
(gst_element_dispose):
Some more cleanups.
* gst/gstpad.c: (gst_pad_link_check_compatible_unlocked),
(gst_pad_link_check_hierarchy), (gst_pad_link_prepare),
(gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
(gst_pad_set_caps), (gst_pad_send_event):
Check for correct hierarchy when linking pads. Moving to
strict requirement for ghostpads when linking elements in
different bins.
* gst/gstpad.h:
Clean ups. Added WRONG_HIERARCHY return value.
2005-07-28 11:24:33 +00:00
|
|
|
/* check if the grandparents of both pads are the same.
|
|
|
|
* This check is required so that we don't try to link
|
|
|
|
* pads from elements in different bins without ghostpads.
|
|
|
|
*
|
2006-07-19 12:40:54 +00:00
|
|
|
* The LOCK should be held on both pads
|
check/gst/gstghostpad.c: Added some more tests for wrong hierarchy
Original commit message from CVS:
* check/gst/gstghostpad.c: (GST_START_TEST), (gst_ghost_pad_suite):
Added some more tests for wrong hierarchy
* docs/design/part-overview.txt:
Some updates.
* gst/gstbin.c: (gst_bin_remove_func), (gst_bin_dispose):
Cleanups.
* gst/gstelement.c: (gst_element_remove_pad), (gst_element_seek),
(gst_element_dispose):
Some more cleanups.
* gst/gstpad.c: (gst_pad_link_check_compatible_unlocked),
(gst_pad_link_check_hierarchy), (gst_pad_link_prepare),
(gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
(gst_pad_set_caps), (gst_pad_send_event):
Check for correct hierarchy when linking pads. Moving to
strict requirement for ghostpads when linking elements in
different bins.
* gst/gstpad.h:
Clean ups. Added WRONG_HIERARCHY return value.
2005-07-28 11:24:33 +00:00
|
|
|
*/
|
|
|
|
static gboolean
|
|
|
|
gst_pad_link_check_hierarchy (GstPad * src, GstPad * sink)
|
|
|
|
{
|
|
|
|
GstObject *psrc, *psink;
|
|
|
|
|
|
|
|
psrc = GST_OBJECT_PARENT (src);
|
|
|
|
psink = GST_OBJECT_PARENT (sink);
|
|
|
|
|
|
|
|
/* if one of the pads has no parent, we allow the link */
|
2006-10-13 13:27:46 +00:00
|
|
|
if (G_UNLIKELY (psrc == NULL || psink == NULL))
|
|
|
|
goto no_parent;
|
|
|
|
|
2007-02-20 18:02:50 +00:00
|
|
|
/* only care about parents that are elements */
|
|
|
|
if (G_UNLIKELY (!GST_IS_ELEMENT (psrc) || !GST_IS_ELEMENT (psink)))
|
|
|
|
goto no_element_parent;
|
|
|
|
|
2006-10-13 13:27:46 +00:00
|
|
|
/* if the parents are the same, we have a loop */
|
|
|
|
if (G_UNLIKELY (psrc == psink))
|
|
|
|
goto same_parents;
|
|
|
|
|
|
|
|
/* if they both have a parent, we check the grandparents. We can not lock
|
|
|
|
* the parent because we hold on the child (pad) and the locking order is
|
|
|
|
* parent >> child. */
|
|
|
|
psrc = GST_OBJECT_PARENT (psrc);
|
|
|
|
psink = GST_OBJECT_PARENT (psink);
|
|
|
|
|
|
|
|
/* if they have grandparents but they are not the same */
|
|
|
|
if (G_UNLIKELY (psrc != psink))
|
|
|
|
goto wrong_grandparents;
|
|
|
|
|
|
|
|
return TRUE;
|
gst/gstpad.c: Use _DEBUG_OBJECT when it makes sense.
Original commit message from CVS:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_get_property), (gst_pad_activate_pull),
(gst_pad_activate_push), (gst_pad_set_blocked_async),
(gst_pad_set_activate_function),
(gst_pad_set_activatepull_function),
(gst_pad_set_activatepush_function), (gst_pad_set_chain_function),
(gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_set_event_function),
(gst_pad_set_query_function), (gst_pad_set_query_type_function),
(gst_pad_set_internal_link_function), (gst_pad_set_link_function),
(gst_pad_set_unlink_function), (gst_pad_set_getcaps_function),
(gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_set_bufferalloc_function), (gst_pad_link_check_hierarchy),
(gst_pad_get_caps_unlocked), (gst_pad_get_caps),
(gst_pad_peer_get_caps), (gst_pad_accept_caps),
(gst_pad_peer_accept_caps), (gst_pad_set_caps),
(gst_pad_configure_sink), (gst_pad_configure_src),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_buffer_alloc_unchecked), (gst_pad_alloc_buffer_full),
(gst_pad_query), (gst_pad_load_and_link), (handle_pad_block),
(gst_pad_chain_unchecked), (gst_pad_push), (gst_pad_get_range),
(gst_pad_send_event):
Use _DEBUG_OBJECT when it makes sense.
Protect GST_PAD_CAPS with the OBJECT_LOCK.
Small cleanups and code reflows.
Avoid caps refcounting in _accept_caps.
Refactor alloc_buffer so that the code performed on the peer is in a
separate function. Also if the pad does not implement a buffer alloc
function, we should still check if the pad is flushing before falling
back to the default allocator.
2006-07-31 14:21:10 +00:00
|
|
|
|
|
|
|
/* ERRORS */
|
2006-10-13 13:27:46 +00:00
|
|
|
no_parent:
|
|
|
|
{
|
|
|
|
GST_CAT_DEBUG (GST_CAT_CAPS,
|
|
|
|
"one of the pads has no parent %" GST_PTR_FORMAT " and %"
|
|
|
|
GST_PTR_FORMAT, psrc, psink);
|
|
|
|
return TRUE;
|
|
|
|
}
|
2007-02-20 18:02:50 +00:00
|
|
|
no_element_parent:
|
|
|
|
{
|
|
|
|
GST_CAT_DEBUG (GST_CAT_CAPS,
|
|
|
|
"one of the pads has no element parent %" GST_PTR_FORMAT " and %"
|
|
|
|
GST_PTR_FORMAT, psrc, psink);
|
|
|
|
return TRUE;
|
|
|
|
}
|
gst/gstpad.c: Use _DEBUG_OBJECT when it makes sense.
Original commit message from CVS:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_get_property), (gst_pad_activate_pull),
(gst_pad_activate_push), (gst_pad_set_blocked_async),
(gst_pad_set_activate_function),
(gst_pad_set_activatepull_function),
(gst_pad_set_activatepush_function), (gst_pad_set_chain_function),
(gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_set_event_function),
(gst_pad_set_query_function), (gst_pad_set_query_type_function),
(gst_pad_set_internal_link_function), (gst_pad_set_link_function),
(gst_pad_set_unlink_function), (gst_pad_set_getcaps_function),
(gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_set_bufferalloc_function), (gst_pad_link_check_hierarchy),
(gst_pad_get_caps_unlocked), (gst_pad_get_caps),
(gst_pad_peer_get_caps), (gst_pad_accept_caps),
(gst_pad_peer_accept_caps), (gst_pad_set_caps),
(gst_pad_configure_sink), (gst_pad_configure_src),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_buffer_alloc_unchecked), (gst_pad_alloc_buffer_full),
(gst_pad_query), (gst_pad_load_and_link), (handle_pad_block),
(gst_pad_chain_unchecked), (gst_pad_push), (gst_pad_get_range),
(gst_pad_send_event):
Use _DEBUG_OBJECT when it makes sense.
Protect GST_PAD_CAPS with the OBJECT_LOCK.
Small cleanups and code reflows.
Avoid caps refcounting in _accept_caps.
Refactor alloc_buffer so that the code performed on the peer is in a
separate function. Also if the pad does not implement a buffer alloc
function, we should still check if the pad is flushing before falling
back to the default allocator.
2006-07-31 14:21:10 +00:00
|
|
|
same_parents:
|
|
|
|
{
|
|
|
|
GST_CAT_DEBUG (GST_CAT_CAPS, "pads have same parent %" GST_PTR_FORMAT,
|
|
|
|
psrc);
|
2006-10-13 13:27:46 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
wrong_grandparents:
|
|
|
|
{
|
|
|
|
GST_CAT_DEBUG (GST_CAT_CAPS,
|
|
|
|
"pads have different grandparents %" GST_PTR_FORMAT " and %"
|
|
|
|
GST_PTR_FORMAT, psrc, psink);
|
|
|
|
return FALSE;
|
gst/gstpad.c: Use _DEBUG_OBJECT when it makes sense.
Original commit message from CVS:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_get_property), (gst_pad_activate_pull),
(gst_pad_activate_push), (gst_pad_set_blocked_async),
(gst_pad_set_activate_function),
(gst_pad_set_activatepull_function),
(gst_pad_set_activatepush_function), (gst_pad_set_chain_function),
(gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_set_event_function),
(gst_pad_set_query_function), (gst_pad_set_query_type_function),
(gst_pad_set_internal_link_function), (gst_pad_set_link_function),
(gst_pad_set_unlink_function), (gst_pad_set_getcaps_function),
(gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_set_bufferalloc_function), (gst_pad_link_check_hierarchy),
(gst_pad_get_caps_unlocked), (gst_pad_get_caps),
(gst_pad_peer_get_caps), (gst_pad_accept_caps),
(gst_pad_peer_accept_caps), (gst_pad_set_caps),
(gst_pad_configure_sink), (gst_pad_configure_src),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_buffer_alloc_unchecked), (gst_pad_alloc_buffer_full),
(gst_pad_query), (gst_pad_load_and_link), (handle_pad_block),
(gst_pad_chain_unchecked), (gst_pad_push), (gst_pad_get_range),
(gst_pad_send_event):
Use _DEBUG_OBJECT when it makes sense.
Protect GST_PAD_CAPS with the OBJECT_LOCK.
Small cleanups and code reflows.
Avoid caps refcounting in _accept_caps.
Refactor alloc_buffer so that the code performed on the peer is in a
separate function. Also if the pad does not implement a buffer alloc
function, we should still check if the pad is flushing before falling
back to the default allocator.
2006-07-31 14:21:10 +00:00
|
|
|
}
|
check/gst/gstghostpad.c: Added some more tests for wrong hierarchy
Original commit message from CVS:
* check/gst/gstghostpad.c: (GST_START_TEST), (gst_ghost_pad_suite):
Added some more tests for wrong hierarchy
* docs/design/part-overview.txt:
Some updates.
* gst/gstbin.c: (gst_bin_remove_func), (gst_bin_dispose):
Cleanups.
* gst/gstelement.c: (gst_element_remove_pad), (gst_element_seek),
(gst_element_dispose):
Some more cleanups.
* gst/gstpad.c: (gst_pad_link_check_compatible_unlocked),
(gst_pad_link_check_hierarchy), (gst_pad_link_prepare),
(gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
(gst_pad_set_caps), (gst_pad_send_event):
Check for correct hierarchy when linking pads. Moving to
strict requirement for ghostpads when linking elements in
different bins.
* gst/gstpad.h:
Clean ups. Added WRONG_HIERARCHY return value.
2005-07-28 11:24:33 +00:00
|
|
|
}
|
2005-04-24 21:16:45 +00:00
|
|
|
|
2005-03-21 17:34:02 +00:00
|
|
|
/* FIXME leftover from an attempt at refactoring... */
|
gst/gstpad.c: Use _DEBUG_OBJECT when it makes sense.
Original commit message from CVS:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_get_property), (gst_pad_activate_pull),
(gst_pad_activate_push), (gst_pad_set_blocked_async),
(gst_pad_set_activate_function),
(gst_pad_set_activatepull_function),
(gst_pad_set_activatepush_function), (gst_pad_set_chain_function),
(gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_set_event_function),
(gst_pad_set_query_function), (gst_pad_set_query_type_function),
(gst_pad_set_internal_link_function), (gst_pad_set_link_function),
(gst_pad_set_unlink_function), (gst_pad_set_getcaps_function),
(gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_set_bufferalloc_function), (gst_pad_link_check_hierarchy),
(gst_pad_get_caps_unlocked), (gst_pad_get_caps),
(gst_pad_peer_get_caps), (gst_pad_accept_caps),
(gst_pad_peer_accept_caps), (gst_pad_set_caps),
(gst_pad_configure_sink), (gst_pad_configure_src),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_buffer_alloc_unchecked), (gst_pad_alloc_buffer_full),
(gst_pad_query), (gst_pad_load_and_link), (handle_pad_block),
(gst_pad_chain_unchecked), (gst_pad_push), (gst_pad_get_range),
(gst_pad_send_event):
Use _DEBUG_OBJECT when it makes sense.
Protect GST_PAD_CAPS with the OBJECT_LOCK.
Small cleanups and code reflows.
Avoid caps refcounting in _accept_caps.
Refactor alloc_buffer so that the code performed on the peer is in a
separate function. Also if the pad does not implement a buffer alloc
function, we should still check if the pad is flushing before falling
back to the default allocator.
2006-07-31 14:21:10 +00:00
|
|
|
/* call with the two pads unlocked, when this function returns GST_PAD_LINK_OK,
|
|
|
|
* the two pads will be locked in the srcpad, sinkpad order. */
|
2005-03-21 17:34:02 +00:00
|
|
|
static GstPadLinkReturn
|
2010-06-23 14:45:19 +00:00
|
|
|
gst_pad_link_prepare (GstPad * srcpad, GstPad * sinkpad, GstPadLinkCheck flags)
|
2002-09-12 20:52:03 +00:00
|
|
|
{
|
2005-03-21 17:34:02 +00:00
|
|
|
GST_CAT_INFO (GST_CAT_PADS, "trying to link %s:%s and %s:%s",
|
|
|
|
GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
|
gst/gstpad.c: implement enforcing discont events before buffers are passed. This allows state changes of only some el...
Original commit message from CVS:
* gst/gstpad.c: (gst_pad_set_active), (gst_pad_link_new),
(gst_pad_link_free), (gst_pad_link_try), (_invent_event),
(gst_pad_pull):
implement enforcing discont events before buffers are passed. This
allows state changes of only some elements and later correctly going
on where they left off (or in short: you can now set audio sinks to
NULL to release the device when the pipeline is paused)
* gst/gstpad.c: (gst_pad_call_chain_function),
(gst_pad_call_get_function):
* gst/gstpad.h:
add gst_pad_call_chain_function and gst_pad_call_get_function for
scheduler interaction. They are required because of the changes
above.
* gst/schedulers/entryscheduler.c: (get_buffer),
(gst_entry_scheduler_chain_wrapper),
(gst_entry_scheduler_get_wrapper),
(gst_entry_scheduler_state_transition),
(gst_entry_scheduler_pad_link):
* gst/schedulers/gstbasicscheduler.c:
(gst_basic_scheduler_chain_wrapper),
(gst_basic_scheduler_src_wrapper),
(gst_basic_scheduler_chainhandler_proxy),
(gst_basic_scheduler_gethandler_proxy),
(gst_basic_scheduler_cothreaded_chain),
(gst_basic_scheduler_chain_elements):
* gst/schedulers/gstoptimalscheduler.c:
(get_group_schedule_function), (pad_clear_queued),
(gst_opt_scheduler_pad_link):
use the new functions instead of calling get/chain-functions
directly.
2004-04-16 01:36:37 +00:00
|
|
|
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_LOCK (srcpad);
|
2003-12-23 21:39:35 +00:00
|
|
|
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
if (G_UNLIKELY (GST_PAD_PEER (srcpad) != NULL))
|
2005-03-21 17:34:02 +00:00
|
|
|
goto src_was_linked;
|
2003-12-23 21:39:35 +00:00
|
|
|
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_LOCK (sinkpad);
|
2003-12-23 21:39:35 +00:00
|
|
|
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
if (G_UNLIKELY (GST_PAD_PEER (sinkpad) != NULL))
|
2005-03-21 17:34:02 +00:00
|
|
|
goto sink_was_linked;
|
2003-12-23 21:39:35 +00:00
|
|
|
|
check/gst/gstghostpad.c: Added some more tests for wrong hierarchy
Original commit message from CVS:
* check/gst/gstghostpad.c: (GST_START_TEST), (gst_ghost_pad_suite):
Added some more tests for wrong hierarchy
* docs/design/part-overview.txt:
Some updates.
* gst/gstbin.c: (gst_bin_remove_func), (gst_bin_dispose):
Cleanups.
* gst/gstelement.c: (gst_element_remove_pad), (gst_element_seek),
(gst_element_dispose):
Some more cleanups.
* gst/gstpad.c: (gst_pad_link_check_compatible_unlocked),
(gst_pad_link_check_hierarchy), (gst_pad_link_prepare),
(gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
(gst_pad_set_caps), (gst_pad_send_event):
Check for correct hierarchy when linking pads. Moving to
strict requirement for ghostpads when linking elements in
different bins.
* gst/gstpad.h:
Clean ups. Added WRONG_HIERARCHY return value.
2005-07-28 11:24:33 +00:00
|
|
|
/* check hierarchy, pads can only be linked if the grandparents
|
|
|
|
* are the same. */
|
2010-06-23 14:45:19 +00:00
|
|
|
if ((flags & GST_PAD_LINK_CHECK_HIERARCHY)
|
|
|
|
&& !gst_pad_link_check_hierarchy (srcpad, sinkpad))
|
check/gst/gstghostpad.c: Added some more tests for wrong hierarchy
Original commit message from CVS:
* check/gst/gstghostpad.c: (GST_START_TEST), (gst_ghost_pad_suite):
Added some more tests for wrong hierarchy
* docs/design/part-overview.txt:
Some updates.
* gst/gstbin.c: (gst_bin_remove_func), (gst_bin_dispose):
Cleanups.
* gst/gstelement.c: (gst_element_remove_pad), (gst_element_seek),
(gst_element_dispose):
Some more cleanups.
* gst/gstpad.c: (gst_pad_link_check_compatible_unlocked),
(gst_pad_link_check_hierarchy), (gst_pad_link_prepare),
(gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
(gst_pad_set_caps), (gst_pad_send_event):
Check for correct hierarchy when linking pads. Moving to
strict requirement for ghostpads when linking elements in
different bins.
* gst/gstpad.h:
Clean ups. Added WRONG_HIERARCHY return value.
2005-07-28 11:24:33 +00:00
|
|
|
goto wrong_hierarchy;
|
|
|
|
|
2005-03-21 17:34:02 +00:00
|
|
|
/* check pad caps for non-empty intersection */
|
2010-06-23 14:45:19 +00:00
|
|
|
if (!gst_pad_link_check_compatible_unlocked (srcpad, sinkpad, flags))
|
2005-04-24 21:16:45 +00:00
|
|
|
goto no_format;
|
2003-12-23 21:39:35 +00:00
|
|
|
|
2005-03-21 17:34:02 +00:00
|
|
|
/* FIXME check pad scheduling for non-empty intersection */
|
2003-12-23 21:39:35 +00:00
|
|
|
|
2005-03-21 17:34:02 +00:00
|
|
|
return GST_PAD_LINK_OK;
|
2003-12-23 21:39:35 +00:00
|
|
|
|
2005-03-21 17:34:02 +00:00
|
|
|
src_was_linked:
|
|
|
|
{
|
gst/gstbin.c: (de)activate src pads before calling state_change on the childs.
Original commit message from CVS:
* gst/gstbin.c: (activate_pads),
(iterator_activate_fold_with_resync), (gst_bin_src_pads_activate),
(gst_bin_change_state_func):
(de)activate src pads before calling state_change on the childs.
This is to avoid the case where a src ghostpad is blocked (holding the
stream lock), which would block the deactivation of the ghostpad's
target pad.
* gst/gstghostpad.c: (gst_proxy_pad_do_query_type),
(gst_proxy_pad_do_event), (gst_proxy_pad_do_query),
(gst_proxy_pad_do_internal_link), (gst_proxy_pad_do_bufferalloc),
(gst_proxy_pad_do_chain), (gst_proxy_pad_do_getrange),
(gst_proxy_pad_do_checkgetrange), (gst_proxy_pad_do_getcaps),
(gst_proxy_pad_do_acceptcaps), (gst_proxy_pad_do_fixatecaps),
(gst_proxy_pad_do_setcaps), (gst_proxy_pad_set_target_unlocked),
(gst_proxy_pad_set_target), (gst_proxy_pad_get_internal),
(gst_proxy_pad_dispose), (gst_proxy_pad_init),
(gst_ghost_pad_parent_set), (gst_ghost_pad_parent_unset),
(gst_ghost_pad_class_init),
(gst_ghost_pad_internal_do_activate_push),
(gst_ghost_pad_internal_do_activate_pull),
(gst_ghost_pad_do_activate_push), (gst_ghost_pad_do_activate_pull),
(gst_ghost_pad_do_link), (gst_ghost_pad_do_unlink),
(gst_ghost_pad_dispose), (gst_ghost_pad_new_no_target),
(gst_ghost_pad_new), (gst_ghost_pad_set_target):
GhostPads now create their internal GstProxyPad at creation (and not
when they're linked, as it was being done previously).
The internal and target pads are linked straight away.
The data will also travel through the other pad in order to make
pad blocking and probes non-hackish (the probe/block now really happens
on the GhostPad and not on the target).
* gst/gstpad.c: (gst_pad_set_blocked_async),
(gst_pad_link_prepare), (gst_pad_push_event):
Remove previous ghostpad cruft.
* gst/gstutils.c: (gst_pad_add_data_probe),
(gst_pad_add_event_probe), (gst_pad_add_buffer_probe),
(gst_pad_remove_data_probe), (gst_pad_remove_event_probe),
(gst_pad_remove_buffer_probe):
Remove previous ghost pad cruft.
Added more detailed debug statements.
* tests/check/gst/gstghostpad.c: (GST_START_TEST):
Fix the testsuite for refcounting changes.
The comments about who has references were correct, but the refcount
being checked wasn't the same (!?!).
2006-07-11 16:20:09 +00:00
|
|
|
GST_CAT_INFO (GST_CAT_PADS, "src %s:%s was already linked to %s:%s",
|
|
|
|
GST_DEBUG_PAD_NAME (srcpad),
|
|
|
|
GST_DEBUG_PAD_NAME (GST_PAD_PEER (srcpad)));
|
2005-03-21 17:34:02 +00:00
|
|
|
/* we do not emit a warning in this case because unlinking cannot
|
|
|
|
* be made MT safe.*/
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (srcpad);
|
2005-03-21 17:34:02 +00:00
|
|
|
return GST_PAD_LINK_WAS_LINKED;
|
2004-07-14 15:28:51 +00:00
|
|
|
}
|
2005-03-21 17:34:02 +00:00
|
|
|
sink_was_linked:
|
|
|
|
{
|
gst/gstbin.c: (de)activate src pads before calling state_change on the childs.
Original commit message from CVS:
* gst/gstbin.c: (activate_pads),
(iterator_activate_fold_with_resync), (gst_bin_src_pads_activate),
(gst_bin_change_state_func):
(de)activate src pads before calling state_change on the childs.
This is to avoid the case where a src ghostpad is blocked (holding the
stream lock), which would block the deactivation of the ghostpad's
target pad.
* gst/gstghostpad.c: (gst_proxy_pad_do_query_type),
(gst_proxy_pad_do_event), (gst_proxy_pad_do_query),
(gst_proxy_pad_do_internal_link), (gst_proxy_pad_do_bufferalloc),
(gst_proxy_pad_do_chain), (gst_proxy_pad_do_getrange),
(gst_proxy_pad_do_checkgetrange), (gst_proxy_pad_do_getcaps),
(gst_proxy_pad_do_acceptcaps), (gst_proxy_pad_do_fixatecaps),
(gst_proxy_pad_do_setcaps), (gst_proxy_pad_set_target_unlocked),
(gst_proxy_pad_set_target), (gst_proxy_pad_get_internal),
(gst_proxy_pad_dispose), (gst_proxy_pad_init),
(gst_ghost_pad_parent_set), (gst_ghost_pad_parent_unset),
(gst_ghost_pad_class_init),
(gst_ghost_pad_internal_do_activate_push),
(gst_ghost_pad_internal_do_activate_pull),
(gst_ghost_pad_do_activate_push), (gst_ghost_pad_do_activate_pull),
(gst_ghost_pad_do_link), (gst_ghost_pad_do_unlink),
(gst_ghost_pad_dispose), (gst_ghost_pad_new_no_target),
(gst_ghost_pad_new), (gst_ghost_pad_set_target):
GhostPads now create their internal GstProxyPad at creation (and not
when they're linked, as it was being done previously).
The internal and target pads are linked straight away.
The data will also travel through the other pad in order to make
pad blocking and probes non-hackish (the probe/block now really happens
on the GhostPad and not on the target).
* gst/gstpad.c: (gst_pad_set_blocked_async),
(gst_pad_link_prepare), (gst_pad_push_event):
Remove previous ghostpad cruft.
* gst/gstutils.c: (gst_pad_add_data_probe),
(gst_pad_add_event_probe), (gst_pad_add_buffer_probe),
(gst_pad_remove_data_probe), (gst_pad_remove_event_probe),
(gst_pad_remove_buffer_probe):
Remove previous ghost pad cruft.
Added more detailed debug statements.
* tests/check/gst/gstghostpad.c: (GST_START_TEST):
Fix the testsuite for refcounting changes.
The comments about who has references were correct, but the refcount
being checked wasn't the same (!?!).
2006-07-11 16:20:09 +00:00
|
|
|
GST_CAT_INFO (GST_CAT_PADS, "sink %s:%s was already linked to %s:%s",
|
|
|
|
GST_DEBUG_PAD_NAME (sinkpad),
|
|
|
|
GST_DEBUG_PAD_NAME (GST_PAD_PEER (sinkpad)));
|
2005-03-21 17:34:02 +00:00
|
|
|
/* we do not emit a warning in this case because unlinking cannot
|
|
|
|
* be made MT safe.*/
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (sinkpad);
|
|
|
|
GST_OBJECT_UNLOCK (srcpad);
|
2005-03-21 17:34:02 +00:00
|
|
|
return GST_PAD_LINK_WAS_LINKED;
|
2004-01-27 02:06:02 +00:00
|
|
|
}
|
check/gst/gstghostpad.c: Added some more tests for wrong hierarchy
Original commit message from CVS:
* check/gst/gstghostpad.c: (GST_START_TEST), (gst_ghost_pad_suite):
Added some more tests for wrong hierarchy
* docs/design/part-overview.txt:
Some updates.
* gst/gstbin.c: (gst_bin_remove_func), (gst_bin_dispose):
Cleanups.
* gst/gstelement.c: (gst_element_remove_pad), (gst_element_seek),
(gst_element_dispose):
Some more cleanups.
* gst/gstpad.c: (gst_pad_link_check_compatible_unlocked),
(gst_pad_link_check_hierarchy), (gst_pad_link_prepare),
(gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
(gst_pad_set_caps), (gst_pad_send_event):
Check for correct hierarchy when linking pads. Moving to
strict requirement for ghostpads when linking elements in
different bins.
* gst/gstpad.h:
Clean ups. Added WRONG_HIERARCHY return value.
2005-07-28 11:24:33 +00:00
|
|
|
wrong_hierarchy:
|
|
|
|
{
|
|
|
|
GST_CAT_INFO (GST_CAT_PADS, "pads have wrong hierarchy");
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (sinkpad);
|
|
|
|
GST_OBJECT_UNLOCK (srcpad);
|
check/gst/gstghostpad.c: Added some more tests for wrong hierarchy
Original commit message from CVS:
* check/gst/gstghostpad.c: (GST_START_TEST), (gst_ghost_pad_suite):
Added some more tests for wrong hierarchy
* docs/design/part-overview.txt:
Some updates.
* gst/gstbin.c: (gst_bin_remove_func), (gst_bin_dispose):
Cleanups.
* gst/gstelement.c: (gst_element_remove_pad), (gst_element_seek),
(gst_element_dispose):
Some more cleanups.
* gst/gstpad.c: (gst_pad_link_check_compatible_unlocked),
(gst_pad_link_check_hierarchy), (gst_pad_link_prepare),
(gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
(gst_pad_set_caps), (gst_pad_send_event):
Check for correct hierarchy when linking pads. Moving to
strict requirement for ghostpads when linking elements in
different bins.
* gst/gstpad.h:
Clean ups. Added WRONG_HIERARCHY return value.
2005-07-28 11:24:33 +00:00
|
|
|
return GST_PAD_LINK_WRONG_HIERARCHY;
|
|
|
|
}
|
2005-03-21 17:34:02 +00:00
|
|
|
no_format:
|
|
|
|
{
|
|
|
|
GST_CAT_INFO (GST_CAT_PADS, "caps are incompatible");
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (sinkpad);
|
|
|
|
GST_OBJECT_UNLOCK (srcpad);
|
2005-03-21 17:34:02 +00:00
|
|
|
return GST_PAD_LINK_NOFORMAT;
|
2004-01-27 02:06:02 +00:00
|
|
|
}
|
|
|
|
}
|
2003-12-23 21:39:35 +00:00
|
|
|
|
2009-03-18 16:01:16 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_can_link:
|
|
|
|
* @srcpad: the source #GstPad.
|
|
|
|
* @sinkpad: the sink #GstPad.
|
|
|
|
*
|
|
|
|
* Checks if the source pad and the sink pad are compatible so they can be
|
2011-05-02 12:36:14 +00:00
|
|
|
* linked.
|
2009-03-18 16:01:16 +00:00
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Returns: %TRUE if the pads can be linked.
|
2009-03-18 16:01:16 +00:00
|
|
|
*/
|
|
|
|
gboolean
|
|
|
|
gst_pad_can_link (GstPad * srcpad, GstPad * sinkpad)
|
|
|
|
{
|
|
|
|
GstPadLinkReturn result;
|
|
|
|
|
|
|
|
/* generic checks */
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (srcpad), FALSE);
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (sinkpad), FALSE);
|
|
|
|
|
|
|
|
GST_CAT_INFO (GST_CAT_PADS, "check if %s:%s can link with %s:%s",
|
|
|
|
GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
|
|
|
|
|
|
|
|
/* gst_pad_link_prepare does everything for us, we only release the locks
|
|
|
|
* on the pads that it gets us. If this function returns !OK the locks are not
|
|
|
|
* taken anymore. */
|
2010-06-23 14:45:19 +00:00
|
|
|
result = gst_pad_link_prepare (srcpad, sinkpad, GST_PAD_LINK_CHECK_DEFAULT);
|
2009-03-18 16:01:16 +00:00
|
|
|
if (result != GST_PAD_LINK_OK)
|
|
|
|
goto done;
|
|
|
|
|
|
|
|
GST_OBJECT_UNLOCK (srcpad);
|
|
|
|
GST_OBJECT_UNLOCK (sinkpad);
|
|
|
|
|
|
|
|
done:
|
|
|
|
return result == GST_PAD_LINK_OK;
|
|
|
|
}
|
|
|
|
|
2001-09-14 19:45:20 +00:00
|
|
|
/**
|
2010-06-23 14:45:19 +00:00
|
|
|
* gst_pad_link_full:
|
2003-01-09 14:15:37 +00:00
|
|
|
* @srcpad: the source #GstPad to link.
|
|
|
|
* @sinkpad: the sink #GstPad to link.
|
2010-06-23 14:45:19 +00:00
|
|
|
* @flags: the checks to validate when linking
|
2001-09-14 19:45:20 +00:00
|
|
|
*
|
2005-04-24 21:16:45 +00:00
|
|
|
* Links the source pad and the sink pad.
|
2005-03-21 17:34:02 +00:00
|
|
|
*
|
2010-06-25 16:52:02 +00:00
|
|
|
* This variant of #gst_pad_link provides a more granular control on the
|
|
|
|
* checks being done when linking. While providing some considerable speedups
|
|
|
|
* the caller of this method must be aware that wrong usage of those flags
|
|
|
|
* can cause severe issues. Refer to the documentation of #GstPadLinkCheck
|
|
|
|
* for more information.
|
|
|
|
*
|
2010-09-13 08:17:34 +00:00
|
|
|
* MT Safe.
|
|
|
|
*
|
2005-03-21 17:34:02 +00:00
|
|
|
* Returns: A result code indicating if the connection worked or
|
|
|
|
* what went wrong.
|
2001-09-14 19:45:20 +00:00
|
|
|
*/
|
2005-03-21 17:34:02 +00:00
|
|
|
GstPadLinkReturn
|
2010-06-23 14:45:19 +00:00
|
|
|
gst_pad_link_full (GstPad * srcpad, GstPad * sinkpad, GstPadLinkCheck flags)
|
2000-11-01 13:49:41 +00:00
|
|
|
{
|
2005-03-21 17:34:02 +00:00
|
|
|
GstPadLinkReturn result;
|
gst/gstbin.c: Keep track of pads that are being linked/unlinked and resync the state changes.
Original commit message from CVS:
Base on Patch by: Olivier Crete <tester at tester dot ca>
* gst/gstbin.c: (gst_bin_init), (gst_bin_add_func),
(gst_bin_remove_func), (update_degree),
(gst_bin_sort_iterator_new), (gst_bin_handle_message_func):
Keep track of pads that are being linked/unlinked and resync the state
changes.
* gst/gstpad.c: (gst_pad_get_direction),
(gst_pad_set_chain_function), (gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link),
(gst_pad_event_default_dispatch), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range):
Some code cleanups, use macros to check pad direction.
Don't need to take the lock on the pad direction.
Post structure change when pads are linked/unlinked.
Change some checks into _return_if_fail().
* tests/check/gst/gstbin.c:
(test_link_structure_change_state_changed_sync_cb),
(GST_START_TEST), (gst_bin_suite):
Add testcase for pad link/unlinke resync during a state change.
Fixes #510354.
2008-10-06 16:15:02 +00:00
|
|
|
GstElement *parent;
|
2011-06-02 10:40:05 +00:00
|
|
|
GstPadLinkFunction srcfunc, sinkfunc;
|
gst/gstbin.c: Keep track of pads that are being linked/unlinked and resync the state changes.
Original commit message from CVS:
Base on Patch by: Olivier Crete <tester at tester dot ca>
* gst/gstbin.c: (gst_bin_init), (gst_bin_add_func),
(gst_bin_remove_func), (update_degree),
(gst_bin_sort_iterator_new), (gst_bin_handle_message_func):
Keep track of pads that are being linked/unlinked and resync the state
changes.
* gst/gstpad.c: (gst_pad_get_direction),
(gst_pad_set_chain_function), (gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link),
(gst_pad_event_default_dispatch), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range):
Some code cleanups, use macros to check pad direction.
Don't need to take the lock on the pad direction.
Post structure change when pads are linked/unlinked.
Change some checks into _return_if_fail().
* tests/check/gst/gstbin.c:
(test_link_structure_change_state_changed_sync_cb),
(GST_START_TEST), (gst_bin_suite):
Add testcase for pad link/unlinke resync during a state change.
Fixes #510354.
2008-10-06 16:15:02 +00:00
|
|
|
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (srcpad), GST_PAD_LINK_REFUSED);
|
|
|
|
g_return_val_if_fail (GST_PAD_IS_SRC (srcpad), GST_PAD_LINK_WRONG_DIRECTION);
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (sinkpad), GST_PAD_LINK_REFUSED);
|
|
|
|
g_return_val_if_fail (GST_PAD_IS_SINK (sinkpad),
|
|
|
|
GST_PAD_LINK_WRONG_DIRECTION);
|
|
|
|
|
2016-12-08 19:20:17 +00:00
|
|
|
GST_TRACER_PAD_LINK_PRE (srcpad, sinkpad);
|
|
|
|
|
gst/gstbin.c: Keep track of pads that are being linked/unlinked and resync the state changes.
Original commit message from CVS:
Base on Patch by: Olivier Crete <tester at tester dot ca>
* gst/gstbin.c: (gst_bin_init), (gst_bin_add_func),
(gst_bin_remove_func), (update_degree),
(gst_bin_sort_iterator_new), (gst_bin_handle_message_func):
Keep track of pads that are being linked/unlinked and resync the state
changes.
* gst/gstpad.c: (gst_pad_get_direction),
(gst_pad_set_chain_function), (gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link),
(gst_pad_event_default_dispatch), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range):
Some code cleanups, use macros to check pad direction.
Don't need to take the lock on the pad direction.
Post structure change when pads are linked/unlinked.
Change some checks into _return_if_fail().
* tests/check/gst/gstbin.c:
(test_link_structure_change_state_changed_sync_cb),
(GST_START_TEST), (gst_bin_suite):
Add testcase for pad link/unlinke resync during a state change.
Fixes #510354.
2008-10-06 16:15:02 +00:00
|
|
|
/* Notify the parent early. See gst_pad_unlink for details. */
|
2011-06-02 10:40:05 +00:00
|
|
|
if (G_LIKELY ((parent = GST_ELEMENT_CAST (gst_pad_get_parent (srcpad))))) {
|
|
|
|
if (G_LIKELY (GST_IS_ELEMENT (parent))) {
|
gst/gstbin.c: Keep track of pads that are being linked/unlinked and resync the state changes.
Original commit message from CVS:
Base on Patch by: Olivier Crete <tester at tester dot ca>
* gst/gstbin.c: (gst_bin_init), (gst_bin_add_func),
(gst_bin_remove_func), (update_degree),
(gst_bin_sort_iterator_new), (gst_bin_handle_message_func):
Keep track of pads that are being linked/unlinked and resync the state
changes.
* gst/gstpad.c: (gst_pad_get_direction),
(gst_pad_set_chain_function), (gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link),
(gst_pad_event_default_dispatch), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range):
Some code cleanups, use macros to check pad direction.
Don't need to take the lock on the pad direction.
Post structure change when pads are linked/unlinked.
Change some checks into _return_if_fail().
* tests/check/gst/gstbin.c:
(test_link_structure_change_state_changed_sync_cb),
(GST_START_TEST), (gst_bin_suite):
Add testcase for pad link/unlinke resync during a state change.
Fixes #510354.
2008-10-06 16:15:02 +00:00
|
|
|
gst_element_post_message (parent,
|
2009-09-02 16:54:06 +00:00
|
|
|
gst_message_new_structure_change (GST_OBJECT_CAST (sinkpad),
|
gst/gstbin.c: Keep track of pads that are being linked/unlinked and resync the state changes.
Original commit message from CVS:
Base on Patch by: Olivier Crete <tester at tester dot ca>
* gst/gstbin.c: (gst_bin_init), (gst_bin_add_func),
(gst_bin_remove_func), (update_degree),
(gst_bin_sort_iterator_new), (gst_bin_handle_message_func):
Keep track of pads that are being linked/unlinked and resync the state
changes.
* gst/gstpad.c: (gst_pad_get_direction),
(gst_pad_set_chain_function), (gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link),
(gst_pad_event_default_dispatch), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range):
Some code cleanups, use macros to check pad direction.
Don't need to take the lock on the pad direction.
Post structure change when pads are linked/unlinked.
Change some checks into _return_if_fail().
* tests/check/gst/gstbin.c:
(test_link_structure_change_state_changed_sync_cb),
(GST_START_TEST), (gst_bin_suite):
Add testcase for pad link/unlinke resync during a state change.
Fixes #510354.
2008-10-06 16:15:02 +00:00
|
|
|
GST_STRUCTURE_CHANGE_TYPE_PAD_LINK, parent, TRUE));
|
|
|
|
} else {
|
|
|
|
gst_object_unref (parent);
|
|
|
|
parent = NULL;
|
|
|
|
}
|
|
|
|
}
|
2005-03-21 17:34:02 +00:00
|
|
|
|
2005-06-19 00:52:31 +00:00
|
|
|
/* prepare will also lock the two pads */
|
2010-06-23 14:45:19 +00:00
|
|
|
result = gst_pad_link_prepare (srcpad, sinkpad, flags);
|
2005-03-21 17:34:02 +00:00
|
|
|
|
2015-04-05 01:33:18 +00:00
|
|
|
if (G_UNLIKELY (result != GST_PAD_LINK_OK)) {
|
|
|
|
GST_CAT_INFO (GST_CAT_PADS, "link between %s:%s and %s:%s failed: %s",
|
|
|
|
GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad),
|
|
|
|
gst_pad_link_get_name (result));
|
gst/gstbin.c: Keep track of pads that are being linked/unlinked and resync the state changes.
Original commit message from CVS:
Base on Patch by: Olivier Crete <tester at tester dot ca>
* gst/gstbin.c: (gst_bin_init), (gst_bin_add_func),
(gst_bin_remove_func), (update_degree),
(gst_bin_sort_iterator_new), (gst_bin_handle_message_func):
Keep track of pads that are being linked/unlinked and resync the state
changes.
* gst/gstpad.c: (gst_pad_get_direction),
(gst_pad_set_chain_function), (gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link),
(gst_pad_event_default_dispatch), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range):
Some code cleanups, use macros to check pad direction.
Don't need to take the lock on the pad direction.
Post structure change when pads are linked/unlinked.
Change some checks into _return_if_fail().
* tests/check/gst/gstbin.c:
(test_link_structure_change_state_changed_sync_cb),
(GST_START_TEST), (gst_bin_suite):
Add testcase for pad link/unlinke resync during a state change.
Fixes #510354.
2008-10-06 16:15:02 +00:00
|
|
|
goto done;
|
2015-04-05 01:33:18 +00:00
|
|
|
}
|
2005-03-21 17:34:02 +00:00
|
|
|
|
2006-04-08 18:11:56 +00:00
|
|
|
/* must set peers before calling the link function */
|
|
|
|
GST_PAD_PEER (srcpad) = sinkpad;
|
|
|
|
GST_PAD_PEER (sinkpad) = srcpad;
|
|
|
|
|
2011-11-22 17:32:51 +00:00
|
|
|
/* check events, when something is different, mark pending */
|
2011-11-23 16:50:17 +00:00
|
|
|
schedule_events (srcpad, sinkpad);
|
2011-05-05 16:56:41 +00:00
|
|
|
|
2011-06-02 10:40:05 +00:00
|
|
|
/* get the link functions */
|
|
|
|
srcfunc = GST_PAD_LINKFUNC (srcpad);
|
|
|
|
sinkfunc = GST_PAD_LINKFUNC (sinkpad);
|
|
|
|
|
|
|
|
if (G_UNLIKELY (srcfunc || sinkfunc)) {
|
|
|
|
/* custom link functions, execute them */
|
|
|
|
GST_OBJECT_UNLOCK (sinkpad);
|
|
|
|
GST_OBJECT_UNLOCK (srcpad);
|
|
|
|
|
|
|
|
if (srcfunc) {
|
2012-09-17 11:09:58 +00:00
|
|
|
GstObject *tmpparent;
|
|
|
|
|
|
|
|
ACQUIRE_PARENT (srcpad, tmpparent, no_parent);
|
2011-06-02 10:40:05 +00:00
|
|
|
/* this one will call the peer link function */
|
2012-09-17 11:09:58 +00:00
|
|
|
result = srcfunc (srcpad, tmpparent, sinkpad);
|
|
|
|
RELEASE_PARENT (tmpparent);
|
2011-06-02 10:40:05 +00:00
|
|
|
} else if (sinkfunc) {
|
2012-09-17 11:09:58 +00:00
|
|
|
GstObject *tmpparent;
|
|
|
|
|
|
|
|
ACQUIRE_PARENT (sinkpad, tmpparent, no_parent);
|
2011-06-02 10:40:05 +00:00
|
|
|
/* if no source link function, we need to call the sink link
|
|
|
|
* function ourselves. */
|
2012-09-17 11:09:58 +00:00
|
|
|
result = sinkfunc (sinkpad, tmpparent, srcpad);
|
|
|
|
RELEASE_PARENT (tmpparent);
|
2011-06-02 10:40:05 +00:00
|
|
|
}
|
2012-09-17 11:09:58 +00:00
|
|
|
no_parent:
|
2011-06-02 10:40:05 +00:00
|
|
|
|
|
|
|
GST_OBJECT_LOCK (srcpad);
|
|
|
|
GST_OBJECT_LOCK (sinkpad);
|
|
|
|
|
|
|
|
/* we released the lock, check if the same pads are linked still */
|
|
|
|
if (GST_PAD_PEER (srcpad) != sinkpad || GST_PAD_PEER (sinkpad) != srcpad)
|
|
|
|
goto concurrent_link;
|
|
|
|
|
|
|
|
if (G_UNLIKELY (result != GST_PAD_LINK_OK))
|
|
|
|
goto link_failed;
|
|
|
|
}
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (sinkpad);
|
|
|
|
GST_OBJECT_UNLOCK (srcpad);
|
2005-03-21 17:34:02 +00:00
|
|
|
|
2011-06-02 10:40:05 +00:00
|
|
|
/* fire off a signal to each of the pads telling them
|
|
|
|
* that they've been linked */
|
|
|
|
g_signal_emit (srcpad, gst_pad_signals[PAD_LINKED], 0, sinkpad);
|
|
|
|
g_signal_emit (sinkpad, gst_pad_signals[PAD_LINKED], 0, srcpad);
|
2002-01-18 22:44:19 +00:00
|
|
|
|
2011-06-02 10:40:05 +00:00
|
|
|
GST_CAT_INFO (GST_CAT_PADS, "linked %s:%s and %s:%s, successful",
|
|
|
|
GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
|
2015-11-05 20:13:25 +00:00
|
|
|
if (!(flags & GST_PAD_LINK_CHECK_NO_RECONFIGURE))
|
|
|
|
gst_pad_send_event (srcpad, gst_event_new_reconfigure ());
|
2004-02-22 15:09:20 +00:00
|
|
|
|
2011-06-02 10:40:05 +00:00
|
|
|
done:
|
|
|
|
if (G_LIKELY (parent)) {
|
|
|
|
gst_element_post_message (parent,
|
|
|
|
gst_message_new_structure_change (GST_OBJECT_CAST (sinkpad),
|
|
|
|
GST_STRUCTURE_CHANGE_TYPE_PAD_LINK, parent, FALSE));
|
|
|
|
gst_object_unref (parent);
|
|
|
|
}
|
2004-02-22 15:09:20 +00:00
|
|
|
|
2016-12-08 19:20:17 +00:00
|
|
|
GST_TRACER_PAD_LINK_POST (srcpad, sinkpad, result);
|
2011-06-02 10:40:05 +00:00
|
|
|
return result;
|
|
|
|
|
|
|
|
/* ERRORS */
|
|
|
|
concurrent_link:
|
|
|
|
{
|
|
|
|
GST_CAT_INFO (GST_CAT_PADS, "concurrent link between %s:%s and %s:%s",
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
|
2011-06-02 10:40:05 +00:00
|
|
|
GST_OBJECT_UNLOCK (sinkpad);
|
|
|
|
GST_OBJECT_UNLOCK (srcpad);
|
2010-03-17 21:24:55 +00:00
|
|
|
|
2011-06-02 10:40:05 +00:00
|
|
|
/* The other link operation succeeded first */
|
|
|
|
result = GST_PAD_LINK_WAS_LINKED;
|
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
link_failed:
|
|
|
|
{
|
2014-03-11 20:46:14 +00:00
|
|
|
GST_CAT_INFO (GST_CAT_PADS, "link between %s:%s and %s:%s failed: %s",
|
|
|
|
GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad),
|
|
|
|
gst_pad_link_get_name (result));
|
2001-03-12 21:02:12 +00:00
|
|
|
|
2006-04-08 18:11:56 +00:00
|
|
|
GST_PAD_PEER (srcpad) = NULL;
|
|
|
|
GST_PAD_PEER (sinkpad) = NULL;
|
|
|
|
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (sinkpad);
|
|
|
|
GST_OBJECT_UNLOCK (srcpad);
|
2001-05-25 21:00:07 +00:00
|
|
|
|
2011-06-02 10:40:05 +00:00
|
|
|
goto done;
|
2005-03-21 17:34:02 +00:00
|
|
|
}
|
2000-01-30 09:03:00 +00:00
|
|
|
}
|
|
|
|
|
2010-06-23 14:45:19 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_link:
|
|
|
|
* @srcpad: the source #GstPad to link.
|
|
|
|
* @sinkpad: the sink #GstPad to link.
|
|
|
|
*
|
|
|
|
* Links the source pad and the sink pad.
|
|
|
|
*
|
|
|
|
* Returns: A result code indicating if the connection worked or
|
|
|
|
* what went wrong.
|
|
|
|
*
|
|
|
|
* MT Safe.
|
|
|
|
*/
|
|
|
|
GstPadLinkReturn
|
|
|
|
gst_pad_link (GstPad * srcpad, GstPad * sinkpad)
|
|
|
|
{
|
2016-12-08 19:20:17 +00:00
|
|
|
return gst_pad_link_full (srcpad, sinkpad, GST_PAD_LINK_CHECK_DEFAULT);
|
2010-06-23 14:45:19 +00:00
|
|
|
}
|
|
|
|
|
2003-05-06 21:58:49 +00:00
|
|
|
static void
|
2004-03-13 15:27:01 +00:00
|
|
|
gst_pad_set_pad_template (GstPad * pad, GstPadTemplate * templ)
|
2003-05-06 21:58:49 +00:00
|
|
|
{
|
2006-03-21 14:14:49 +00:00
|
|
|
GstPadTemplate **template_p;
|
|
|
|
|
2003-05-06 21:58:49 +00:00
|
|
|
/* this function would need checks if it weren't static */
|
|
|
|
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
2006-03-21 14:14:49 +00:00
|
|
|
template_p = &pad->padtemplate;
|
|
|
|
gst_object_replace ((GstObject **) template_p, (GstObject *) templ);
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2004-03-13 15:27:01 +00:00
|
|
|
|
inlined two more docs factored gstpadtemplate out of gstpad
Original commit message from CVS:
* docs/gst/gstreamer-sections.txt:
* docs/gst/tmpl/.cvsignore:
* docs/gst/tmpl/gstpad.sgml:
* docs/gst/tmpl/gstpadtemplate.sgml:
* gst/Makefile.am:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_finalize), (gst_pad_set_pad_template):
* gst/gstpad.h:
* gst/gstpadtemplate.c: (gst_pad_template_get_type),
(gst_pad_template_class_init), (gst_pad_template_init),
(gst_pad_template_dispose), (name_is_valid),
(gst_static_pad_template_get), (gst_pad_template_new),
(gst_static_pad_template_get_caps), (gst_pad_template_get_caps),
(gst_pad_template_pad_created):
* gst/gstpadtemplate.h:
inlined two more docs
factored gstpadtemplate out of gstpad
2005-09-25 11:19:22 +00:00
|
|
|
if (templ)
|
|
|
|
gst_pad_template_pad_created (templ, pad);
|
2004-03-13 15:27:01 +00:00
|
|
|
}
|
gst/gstelement.c (gst_element_dispose): Protect against multiple invocations.
Original commit message from CVS:
2004-02-24 Andy Wingo <wingo@pobox.com>
* gst/gstelement.c (gst_element_dispose): Protect against multiple
invocations.
* gst/schedulers/gstoptimalscheduler.c
I added a mess of prototypes at the top of the file by way of
documentation. Some of the operations on chains and groups were
re-organized.
(create_group): Added a type argument so if the group is enabled,
the setup_group_scheduler knows what to do.
(group_elements): Added a type argument here, too, to be passed on
to create_group.
(group_element_set_enabled): If an unlinked PLAYING element is
added to a bin, we have to create a new group to hold the element,
and this function will be called before the group is added to the
chain. Thus we have a valid case for group->chain==NULL. Instead
of calling chain_group_set_enabled, just set the flag on the group
(the chain's status will be set when the group is added to it).
(gst_opt_scheduler_state_transition, chain_group_set_enabled):
Setup the group scheduler when the group is enabled, not
specifically when an element goes PAUSED->PLAYING. This means
PLAYING elements can be added, linked, and scheduled into a
PLAYING pipeline, as was intended.
(add_to_group): Don't ref the group twice. I don't know when this
double-ref got in here. Removing it has the potential to cause
segfaults if other parts of the scheduler are buggy. If you find
that the scheduler is segfaulting for you, put in an extra ref
here and see if that hacks over the underlying issue. Of course,
then find out what code is unreffing a group it doesn't own...
(create_group): Make the extra refcount floating, and remove it
after adding the element. This means that...
(unref_group): Destroy when the refcount reaches 0, not 1, like
every other refcounted object in the known universe.
(remove_from_group): When a group becomes empty, set it to be not
active, and remove it from its chain. Don't unref it again,
there's no floating reference any more.
(destroy_group): We have to remove the group from the chain in
remove_from_group (rather than here) to break refcounting cycles
(the chain always has a ref on the group). So assert that
group->chain==NULL.
(ref_group_by_count): Removed, it was commented out anyway.
(merge_chains): Use the remove_from_chain and add_to_chain
primitives to do the reparenting, instead of rolling our own
implementation.
(add_to_chain): The first non-disabled group in the chain's group
list will be the entry point for the chain. Because buffers can
accumulate in loop elements' peer bufpens, we preferentially
schedule loop groups before get groups to avoid unnecessary
execution of get-based groups when the bufpens are already full.
(gst_opt_scheduler_schedule_run_queue): Debug fixes.
(get_group_schedule_function): Ditto.
(loop_group_schedule_function): Ditto.
(gst_opt_scheduler_loop_wrapper): Ditto.
(gst_opt_scheduler_iterate): Ditto.
I understand the opt scheduler now, yippee!
* gst/gstpad.c: All throughout, added FIXMEs to look at for 0.9.
(gst_pad_get_name, gst_pad_set_chain_function)
(gst_pad_set_get_function, gst_pad_set_event_function)
(gst_pad_set_event_mask_function, gst_pad_get_event_masks)
(gst_pad_get_event_masks_default, gst_pad_set_convert_function)
(gst_pad_set_query_function, gst_pad_get_query_types)
(gst_pad_get_query_types_default)
(gst_pad_set_internal_link_function)
(gst_pad_set_formats_function, gst_pad_set_link_function)
(gst_pad_set_fixate_function, gst_pad_set_getcaps_function)
(gst_pad_set_bufferalloc_function, gst_pad_unlink)
(gst_pad_renegotiate, gst_pad_set_parent, gst_pad_get_parent)
(gst_pad_add_ghost_pad, gst_pad_proxy_getcaps)
(gst_pad_proxy_pad_link, gst_pad_proxy_fixate)
(gst_pad_get_pad_template_caps, gst_pad_check_compatibility)
(gst_pad_get_peer, gst_pad_get_allowed_caps)
(gst_pad_alloc_buffer, gst_pad_push, gst_pad_pull)
(gst_pad_selectv, gst_pad_select, gst_pad_template_get_caps)
(gst_pad_event_default_dispatch, gst_pad_event_default)
(gst_pad_dispatcher, gst_pad_send_event, gst_pad_convert_default)
(gst_pad_convert, gst_pad_query_default, gst_pad_query)
(gst_pad_get_formats_default, gst_pad_get_formats): Better
argument checks, and some doc fixes.
(gst_pad_custom_new_from_template): Um, does anyone
use these functions? Actually make a custom pad instead of a
normal one.
(gst_pad_try_set_caps): Transpose some checks.
(gst_pad_try_set_caps_nonfixed): Same, and use a macro to check if
the pad is in negotiation.
(gst_pad_try_relink_filtered): Use pad_link_prepare.
* gst/gstelement.c: Remove prototypes also defined in gstclock.h.
* gst/gstelement.h:
* gst/gstclock.h: Un-deprecate the old clocking API, as discussed
on the list.
2004-02-25 13:16:12 +00:00
|
|
|
|
2001-01-29 00:06:02 +00:00
|
|
|
/**
|
2002-04-11 20:35:18 +00:00
|
|
|
* gst_pad_get_pad_template:
|
gst/gstelement.c (gst_element_dispose): Protect against multiple invocations.
Original commit message from CVS:
2004-02-24 Andy Wingo <wingo@pobox.com>
* gst/gstelement.c (gst_element_dispose): Protect against multiple
invocations.
* gst/schedulers/gstoptimalscheduler.c
I added a mess of prototypes at the top of the file by way of
documentation. Some of the operations on chains and groups were
re-organized.
(create_group): Added a type argument so if the group is enabled,
the setup_group_scheduler knows what to do.
(group_elements): Added a type argument here, too, to be passed on
to create_group.
(group_element_set_enabled): If an unlinked PLAYING element is
added to a bin, we have to create a new group to hold the element,
and this function will be called before the group is added to the
chain. Thus we have a valid case for group->chain==NULL. Instead
of calling chain_group_set_enabled, just set the flag on the group
(the chain's status will be set when the group is added to it).
(gst_opt_scheduler_state_transition, chain_group_set_enabled):
Setup the group scheduler when the group is enabled, not
specifically when an element goes PAUSED->PLAYING. This means
PLAYING elements can be added, linked, and scheduled into a
PLAYING pipeline, as was intended.
(add_to_group): Don't ref the group twice. I don't know when this
double-ref got in here. Removing it has the potential to cause
segfaults if other parts of the scheduler are buggy. If you find
that the scheduler is segfaulting for you, put in an extra ref
here and see if that hacks over the underlying issue. Of course,
then find out what code is unreffing a group it doesn't own...
(create_group): Make the extra refcount floating, and remove it
after adding the element. This means that...
(unref_group): Destroy when the refcount reaches 0, not 1, like
every other refcounted object in the known universe.
(remove_from_group): When a group becomes empty, set it to be not
active, and remove it from its chain. Don't unref it again,
there's no floating reference any more.
(destroy_group): We have to remove the group from the chain in
remove_from_group (rather than here) to break refcounting cycles
(the chain always has a ref on the group). So assert that
group->chain==NULL.
(ref_group_by_count): Removed, it was commented out anyway.
(merge_chains): Use the remove_from_chain and add_to_chain
primitives to do the reparenting, instead of rolling our own
implementation.
(add_to_chain): The first non-disabled group in the chain's group
list will be the entry point for the chain. Because buffers can
accumulate in loop elements' peer bufpens, we preferentially
schedule loop groups before get groups to avoid unnecessary
execution of get-based groups when the bufpens are already full.
(gst_opt_scheduler_schedule_run_queue): Debug fixes.
(get_group_schedule_function): Ditto.
(loop_group_schedule_function): Ditto.
(gst_opt_scheduler_loop_wrapper): Ditto.
(gst_opt_scheduler_iterate): Ditto.
I understand the opt scheduler now, yippee!
* gst/gstpad.c: All throughout, added FIXMEs to look at for 0.9.
(gst_pad_get_name, gst_pad_set_chain_function)
(gst_pad_set_get_function, gst_pad_set_event_function)
(gst_pad_set_event_mask_function, gst_pad_get_event_masks)
(gst_pad_get_event_masks_default, gst_pad_set_convert_function)
(gst_pad_set_query_function, gst_pad_get_query_types)
(gst_pad_get_query_types_default)
(gst_pad_set_internal_link_function)
(gst_pad_set_formats_function, gst_pad_set_link_function)
(gst_pad_set_fixate_function, gst_pad_set_getcaps_function)
(gst_pad_set_bufferalloc_function, gst_pad_unlink)
(gst_pad_renegotiate, gst_pad_set_parent, gst_pad_get_parent)
(gst_pad_add_ghost_pad, gst_pad_proxy_getcaps)
(gst_pad_proxy_pad_link, gst_pad_proxy_fixate)
(gst_pad_get_pad_template_caps, gst_pad_check_compatibility)
(gst_pad_get_peer, gst_pad_get_allowed_caps)
(gst_pad_alloc_buffer, gst_pad_push, gst_pad_pull)
(gst_pad_selectv, gst_pad_select, gst_pad_template_get_caps)
(gst_pad_event_default_dispatch, gst_pad_event_default)
(gst_pad_dispatcher, gst_pad_send_event, gst_pad_convert_default)
(gst_pad_convert, gst_pad_query_default, gst_pad_query)
(gst_pad_get_formats_default, gst_pad_get_formats): Better
argument checks, and some doc fixes.
(gst_pad_custom_new_from_template): Um, does anyone
use these functions? Actually make a custom pad instead of a
normal one.
(gst_pad_try_set_caps): Transpose some checks.
(gst_pad_try_set_caps_nonfixed): Same, and use a macro to check if
the pad is in negotiation.
(gst_pad_try_relink_filtered): Use pad_link_prepare.
* gst/gstelement.c: Remove prototypes also defined in gstclock.h.
* gst/gstelement.h:
* gst/gstclock.h: Un-deprecate the old clocking API, as discussed
on the list.
2004-02-25 13:16:12 +00:00
|
|
|
* @pad: a #GstPad.
|
2001-01-29 00:06:02 +00:00
|
|
|
*
|
gst/gstelement.c (gst_element_dispose): Protect against multiple invocations.
Original commit message from CVS:
2004-02-24 Andy Wingo <wingo@pobox.com>
* gst/gstelement.c (gst_element_dispose): Protect against multiple
invocations.
* gst/schedulers/gstoptimalscheduler.c
I added a mess of prototypes at the top of the file by way of
documentation. Some of the operations on chains and groups were
re-organized.
(create_group): Added a type argument so if the group is enabled,
the setup_group_scheduler knows what to do.
(group_elements): Added a type argument here, too, to be passed on
to create_group.
(group_element_set_enabled): If an unlinked PLAYING element is
added to a bin, we have to create a new group to hold the element,
and this function will be called before the group is added to the
chain. Thus we have a valid case for group->chain==NULL. Instead
of calling chain_group_set_enabled, just set the flag on the group
(the chain's status will be set when the group is added to it).
(gst_opt_scheduler_state_transition, chain_group_set_enabled):
Setup the group scheduler when the group is enabled, not
specifically when an element goes PAUSED->PLAYING. This means
PLAYING elements can be added, linked, and scheduled into a
PLAYING pipeline, as was intended.
(add_to_group): Don't ref the group twice. I don't know when this
double-ref got in here. Removing it has the potential to cause
segfaults if other parts of the scheduler are buggy. If you find
that the scheduler is segfaulting for you, put in an extra ref
here and see if that hacks over the underlying issue. Of course,
then find out what code is unreffing a group it doesn't own...
(create_group): Make the extra refcount floating, and remove it
after adding the element. This means that...
(unref_group): Destroy when the refcount reaches 0, not 1, like
every other refcounted object in the known universe.
(remove_from_group): When a group becomes empty, set it to be not
active, and remove it from its chain. Don't unref it again,
there's no floating reference any more.
(destroy_group): We have to remove the group from the chain in
remove_from_group (rather than here) to break refcounting cycles
(the chain always has a ref on the group). So assert that
group->chain==NULL.
(ref_group_by_count): Removed, it was commented out anyway.
(merge_chains): Use the remove_from_chain and add_to_chain
primitives to do the reparenting, instead of rolling our own
implementation.
(add_to_chain): The first non-disabled group in the chain's group
list will be the entry point for the chain. Because buffers can
accumulate in loop elements' peer bufpens, we preferentially
schedule loop groups before get groups to avoid unnecessary
execution of get-based groups when the bufpens are already full.
(gst_opt_scheduler_schedule_run_queue): Debug fixes.
(get_group_schedule_function): Ditto.
(loop_group_schedule_function): Ditto.
(gst_opt_scheduler_loop_wrapper): Ditto.
(gst_opt_scheduler_iterate): Ditto.
I understand the opt scheduler now, yippee!
* gst/gstpad.c: All throughout, added FIXMEs to look at for 0.9.
(gst_pad_get_name, gst_pad_set_chain_function)
(gst_pad_set_get_function, gst_pad_set_event_function)
(gst_pad_set_event_mask_function, gst_pad_get_event_masks)
(gst_pad_get_event_masks_default, gst_pad_set_convert_function)
(gst_pad_set_query_function, gst_pad_get_query_types)
(gst_pad_get_query_types_default)
(gst_pad_set_internal_link_function)
(gst_pad_set_formats_function, gst_pad_set_link_function)
(gst_pad_set_fixate_function, gst_pad_set_getcaps_function)
(gst_pad_set_bufferalloc_function, gst_pad_unlink)
(gst_pad_renegotiate, gst_pad_set_parent, gst_pad_get_parent)
(gst_pad_add_ghost_pad, gst_pad_proxy_getcaps)
(gst_pad_proxy_pad_link, gst_pad_proxy_fixate)
(gst_pad_get_pad_template_caps, gst_pad_check_compatibility)
(gst_pad_get_peer, gst_pad_get_allowed_caps)
(gst_pad_alloc_buffer, gst_pad_push, gst_pad_pull)
(gst_pad_selectv, gst_pad_select, gst_pad_template_get_caps)
(gst_pad_event_default_dispatch, gst_pad_event_default)
(gst_pad_dispatcher, gst_pad_send_event, gst_pad_convert_default)
(gst_pad_convert, gst_pad_query_default, gst_pad_query)
(gst_pad_get_formats_default, gst_pad_get_formats): Better
argument checks, and some doc fixes.
(gst_pad_custom_new_from_template): Um, does anyone
use these functions? Actually make a custom pad instead of a
normal one.
(gst_pad_try_set_caps): Transpose some checks.
(gst_pad_try_set_caps_nonfixed): Same, and use a macro to check if
the pad is in negotiation.
(gst_pad_try_relink_filtered): Use pad_link_prepare.
* gst/gstelement.c: Remove prototypes also defined in gstclock.h.
* gst/gstelement.h:
* gst/gstclock.h: Un-deprecate the old clocking API, as discussed
on the list.
2004-02-25 13:16:12 +00:00
|
|
|
* Gets the template for @pad.
|
2001-01-29 00:06:02 +00:00
|
|
|
*
|
2014-06-11 22:21:34 +00:00
|
|
|
* Returns: (transfer full) (nullable): the #GstPadTemplate from which
|
|
|
|
* this pad was instantiated, or %NULL if this pad has no
|
|
|
|
* template. Unref after usage.
|
2001-01-29 00:06:02 +00:00
|
|
|
*/
|
2004-03-13 15:27:01 +00:00
|
|
|
GstPadTemplate *
|
|
|
|
gst_pad_get_pad_template (GstPad * pad)
|
2001-01-29 00:06:02 +00:00
|
|
|
{
|
2011-05-17 09:59:00 +00:00
|
|
|
GstPadTemplate *templ;
|
|
|
|
|
2001-01-29 00:06:02 +00:00
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), NULL);
|
2000-03-22 21:18:15 +00:00
|
|
|
|
2011-05-17 09:59:00 +00:00
|
|
|
templ = GST_PAD_PAD_TEMPLATE (pad);
|
2001-05-25 21:00:07 +00:00
|
|
|
|
2011-05-17 09:59:00 +00:00
|
|
|
return (templ ? gst_object_ref (templ) : NULL);
|
|
|
|
}
|
2001-12-19 19:22:53 +00:00
|
|
|
|
2011-05-06 17:03:33 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_has_current_caps:
|
|
|
|
* @pad: a #GstPad to check
|
|
|
|
*
|
2011-08-15 12:17:39 +00:00
|
|
|
* Check if @pad has caps set on it with a #GST_EVENT_CAPS event.
|
2011-05-06 17:03:33 +00:00
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Returns: %TRUE when @pad has caps associated with it.
|
2011-05-06 17:03:33 +00:00
|
|
|
*/
|
|
|
|
gboolean
|
|
|
|
gst_pad_has_current_caps (GstPad * pad)
|
|
|
|
{
|
|
|
|
gboolean result;
|
2011-09-28 16:44:12 +00:00
|
|
|
GstCaps *caps;
|
2011-05-06 17:03:33 +00:00
|
|
|
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
|
|
|
|
|
|
|
|
GST_OBJECT_LOCK (pad);
|
2011-09-28 16:44:12 +00:00
|
|
|
caps = get_pad_caps (pad);
|
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
|
|
|
|
"check current pad caps %" GST_PTR_FORMAT, caps);
|
|
|
|
result = (caps != NULL);
|
2011-05-06 17:03:33 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gst_pad_get_current_caps:
|
|
|
|
* @pad: a #GstPad to get the current capabilities of.
|
|
|
|
*
|
2011-08-15 12:17:39 +00:00
|
|
|
* Gets the capabilities currently configured on @pad with the last
|
|
|
|
* #GST_EVENT_CAPS event.
|
2011-05-06 17:03:33 +00:00
|
|
|
*
|
2016-03-19 11:39:18 +00:00
|
|
|
* Returns: (transfer full) (nullable): the current caps of the pad with
|
|
|
|
* incremented ref-count or %NULL when pad has no caps. Unref after usage.
|
2011-05-06 17:03:33 +00:00
|
|
|
*/
|
|
|
|
GstCaps *
|
|
|
|
gst_pad_get_current_caps (GstPad * pad)
|
|
|
|
{
|
|
|
|
GstCaps *result;
|
|
|
|
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), NULL);
|
|
|
|
|
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
if ((result = get_pad_caps (pad)))
|
|
|
|
gst_caps_ref (result);
|
2011-05-17 16:23:06 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
|
|
|
|
"get current pad caps %" GST_PTR_FORMAT, result);
|
2011-05-06 17:03:33 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2001-03-21 21:43:56 +00:00
|
|
|
/**
|
2002-04-11 20:35:18 +00:00
|
|
|
* gst_pad_get_pad_template_caps:
|
2002-09-01 20:11:14 +00:00
|
|
|
* @pad: a #GstPad to get the template capabilities from.
|
2001-03-21 21:43:56 +00:00
|
|
|
*
|
gst/gstpad.c (gst_pad_custom_new): Add a FIXME, this is a hacky way to do inheritance.
Original commit message from CVS:
2004-02-10 Andy Wingo <wingo@pobox.com>
* gst/gstpad.c (gst_pad_custom_new): Add a FIXME, this is a hacky
way to do inheritance.
(gst_pad_get_event_masks, gst_pad_get_event_masks_default)
(gst_pad_get_query_types, gst_pad_get_query_types_default):
Routine docs.
(gst_pad_set_link_function, gst_pad_set_fixate_function)
(gst_pad_set_getcaps_function): Doc from Dave's negotation random
doc.
(gst_pad_unlink, gst_pad_is_linked): Docs.
(gst_pad_renegotiate): A brief description of capsnego.
(gst_pad_try_set_caps): Document.
(gst_pad_try_set_caps_nonfixed): Document.
(gst_pad_can_link_filtered, gst_pad_link_filtered): Doc fixes.
(gst_pad_set_parent): Deprecated (although not out of the API).
(gst_pad_get_parent): Deprecated, although many plugins use this.
(gst_pad_add_ghost_pad, gst_pad_remove_ghost_pad): Doc that these
are private and will go away in 0.9.
(gst_pad_perform_negotiate): Doc.
(gst_pad_link_unnegotiate): I think this is meant to be static.
(gst_pad_get_negotiated_caps, gst_pad_get_pad_template_caps)
(gst_pad_template_get_caps_by_name, gst_pad_check_compatibility)
(gst_pad_get_peer): Doc updates.
(gst_pad_caps_change_notify): Doc.
(gst_pad_alloc_buffer, gst_pad_push, gst_static_pad_template_get)
(gst_ghost_pad_new): Doc fixes.
* gst/gstobject.c (gst_object_get_parent, gst_object_unparent)
(gst_object_check_uniqueness):
* gst/gstelement.c (gst_element_add_pad)
(gst_element_add_ghost_pad, gst_element_remove_pad)
(gst_element_remove_ghost_pad, gst_element_get_pad)
(gst_element_get_static_pad, gst_element_get_pad_list)
(gst_element_class_get_pad_template_list)
(gst_element_class_get_pad_template): Work on the docs.
(gst_element_get_pad_template_list): Uses the class method.
(gst_element_get_compatible_pad_template): Docs, and consolidate
some test conditions.
(gst_element_get_pad_from_template): New static function.
(gst_element_request_compatible_pad): Docs, and work with
non-request compatible templates.
(gst_element_get_compatible_pad_filtered): Docs and remove
redundant checks.
(gst_element_get_compatible_pad, gst_element_link_pads_filtered)
(gst_element_link_filtered, gst_element_link_many)
(gst_element_link, gst_element_link_pads)
(gst_element_unlink_many): Docs.
2004-02-05 Andy Wingo <wingo@pobox.com>
* gst/gstpad.c (_gst_real_pad_fixate_accumulator):
s/pointer/boxed/.
* gst/gstmarshal.list (VOID:BOXED, BOXED:BOXED): New marshallers.
* gst/gstpad.c (gst_real_pad_class_init): Use a BOXED:BOXED
marshaller for ::fixate, and VOID:BOXED for ::caps-nego-failed,
with the type=GST_TYPE_CAPS. This allows language bindings to know
what kind of data they're dealing with.
* gst/gstcaps.c (_gst_caps_value_init): GBoxed values initialize
to NULL when g_value_init is called. GstCaps, which rolls its own
type implementation, now does the same instead of allocating empty
caps.
(_gst_caps_initialize, _gst_caps_collect_value,
_gst_caps_lcopy_value): Provide collect_value and lcopy_value type
table methods. This allows G_VALUE_COLLECT to work.
2004-02-05 Andy Wingo <wingo@pobox.com>
* configure.ac:
* testsuite/Makefile.am (SUBDIRS):
* testsuite/ghostpads/Makefile.am:
* testsuite/ghostpads/ghostpads.c: A new test for ghost pads.
* gst/gstpad.c (gst_pad_add_ghost_pad, gst_pad_remove_ghost_pad):
These two routines are the only ones that set
GST_GPAD_REALPAD(gpad), the ghost pad list, and the ghost pad's
pad template. They should be made static, depending on ABI needs.
(gst_real_pad_dispose): Handle the case of ghost pads without a
parent. Assert after dealing with ghost pads that the ghost pad
list is empty.
(gst_ghost_pad_class_init): New property added, ::real-pad. Can be
set after creation.
(gst_ghost_pad_dispose): Set ::real-pad to NULL.
(gst_ghost_pad_set_property, gst_ghost_pad_get_property): New
functions. set_property will call add_ghost_pad/remove_ghost_pad
as appropriate.
(gst_ghost_pad_new): All the work is offloaded to g_object_new.
* gst/gstelement.c (gst_element_add_pad): Handle ghost pads as well.
(gst_element_add_ghost_pad): Remove code duplicated from _add_pad.
(gst_element_remove_pad): Handle ghost pads as well.
(gst_element_remove_ghost_pad): Deprecated (could be removed,
depending on API-stability needs).
2004-02-05 Andy Wingo <wingo@pobox.com>
* gst/gstbin.[ch]: (gst_bin_get_by_interface): GTypes are scalars,
of course they're const
2004-02-11 13:26:04 +00:00
|
|
|
* Gets the capabilities for @pad's template.
|
2001-03-21 21:43:56 +00:00
|
|
|
*
|
2011-05-17 09:59:00 +00:00
|
|
|
* Returns: (transfer full): the #GstCaps of this pad template.
|
|
|
|
* Unref after usage.
|
2001-03-21 21:43:56 +00:00
|
|
|
*/
|
2011-05-17 09:59:00 +00:00
|
|
|
GstCaps *
|
2004-03-13 15:27:01 +00:00
|
|
|
gst_pad_get_pad_template_caps (GstPad * pad)
|
2001-03-18 02:42:30 +00:00
|
|
|
{
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), NULL);
|
|
|
|
|
2002-04-11 20:35:18 +00:00
|
|
|
if (GST_PAD_PAD_TEMPLATE (pad))
|
2011-05-17 09:59:00 +00:00
|
|
|
return gst_pad_template_get_caps (GST_PAD_PAD_TEMPLATE (pad));
|
2001-03-18 02:42:30 +00:00
|
|
|
|
2012-03-08 08:44:21 +00:00
|
|
|
return gst_caps_ref (GST_CAPS_ANY);
|
2001-03-18 02:42:30 +00:00
|
|
|
}
|
|
|
|
|
2000-12-31 17:02:47 +00:00
|
|
|
/**
|
2005-03-07 18:27:42 +00:00
|
|
|
* gst_pad_get_peer:
|
|
|
|
* @pad: a #GstPad to get the peer of.
|
2000-12-31 17:02:47 +00:00
|
|
|
*
|
2005-03-07 18:27:42 +00:00
|
|
|
* Gets the peer of @pad. This function refs the peer pad so
|
|
|
|
* you need to unref it after use.
|
2000-12-31 17:02:47 +00:00
|
|
|
*
|
2017-10-22 12:35:30 +00:00
|
|
|
* Returns: (transfer full) (nullable): the peer #GstPad. Unref after usage.
|
2005-03-07 18:27:42 +00:00
|
|
|
*
|
|
|
|
* MT safe.
|
2000-12-31 17:02:47 +00:00
|
|
|
*/
|
2005-03-07 18:27:42 +00:00
|
|
|
GstPad *
|
|
|
|
gst_pad_get_peer (GstPad * pad)
|
2000-12-31 17:02:47 +00:00
|
|
|
{
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
GstPad *result;
|
2005-03-07 18:27:42 +00:00
|
|
|
|
2000-11-01 13:49:41 +00:00
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), NULL);
|
2000-01-30 09:03:00 +00:00
|
|
|
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
result = GST_PAD_PEER (pad);
|
|
|
|
if (result)
|
2005-06-28 09:59:01 +00:00
|
|
|
gst_object_ref (result);
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2005-03-07 18:27:42 +00:00
|
|
|
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
return result;
|
2002-01-13 22:22:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gst_pad_get_allowed_caps:
|
2007-01-10 21:15:08 +00:00
|
|
|
* @pad: a #GstPad.
|
2002-01-13 22:22:42 +00:00
|
|
|
*
|
2005-06-19 00:52:31 +00:00
|
|
|
* Gets the capabilities of the allowed media types that can flow through
|
2007-01-10 21:15:08 +00:00
|
|
|
* @pad and its peer.
|
|
|
|
*
|
|
|
|
* The allowed capabilities is calculated as the intersection of the results of
|
2011-11-15 15:46:37 +00:00
|
|
|
* calling gst_pad_query_caps() on @pad and its peer. The caller owns a reference
|
2007-01-10 21:15:08 +00:00
|
|
|
* on the resulting caps.
|
2002-01-13 22:22:42 +00:00
|
|
|
*
|
2014-06-11 22:21:34 +00:00
|
|
|
* Returns: (transfer full) (nullable): the allowed #GstCaps of the
|
|
|
|
* pad link. Unref the caps when you no longer need it. This
|
|
|
|
* function returns %NULL when @pad has no peer.
|
2005-03-07 18:27:42 +00:00
|
|
|
*
|
|
|
|
* MT safe.
|
2002-01-13 22:22:42 +00:00
|
|
|
*/
|
2004-03-13 15:27:01 +00:00
|
|
|
GstCaps *
|
2007-01-10 21:15:08 +00:00
|
|
|
gst_pad_get_allowed_caps (GstPad * pad)
|
2002-01-13 22:22:42 +00:00
|
|
|
{
|
2005-03-07 18:27:42 +00:00
|
|
|
GstCaps *mycaps;
|
2015-08-08 12:42:52 +00:00
|
|
|
GstCaps *caps = NULL;
|
|
|
|
GstQuery *query;
|
2003-01-16 21:22:06 +00:00
|
|
|
|
2007-01-10 21:15:08 +00:00
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), NULL);
|
2005-03-07 18:27:42 +00:00
|
|
|
|
2007-01-10 21:15:08 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
2015-08-08 12:42:52 +00:00
|
|
|
if (G_UNLIKELY (GST_PAD_PEER (pad) == NULL))
|
2005-03-07 18:27:42 +00:00
|
|
|
goto no_peer;
|
2015-08-08 12:42:52 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2003-03-02 13:59:46 +00:00
|
|
|
|
2007-01-10 21:15:08 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_PROPERTIES, pad, "getting allowed caps");
|
2002-01-20 11:55:35 +00:00
|
|
|
|
2011-11-15 15:46:37 +00:00
|
|
|
mycaps = gst_pad_query_caps (pad, NULL);
|
2005-03-07 18:27:42 +00:00
|
|
|
|
2015-08-08 12:42:52 +00:00
|
|
|
/* Query peer caps */
|
|
|
|
query = gst_query_new_caps (mycaps);
|
2016-07-05 14:50:16 +00:00
|
|
|
if (!gst_pad_peer_query (pad, query)) {
|
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "Caps query failed");
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
|
2015-08-08 13:28:19 +00:00
|
|
|
gst_query_parse_caps_result (query, &caps);
|
2016-07-05 14:50:16 +00:00
|
|
|
if (caps == NULL) {
|
|
|
|
g_warn_if_fail (caps != NULL);
|
|
|
|
goto end;
|
|
|
|
}
|
2015-08-08 13:28:19 +00:00
|
|
|
gst_caps_ref (caps);
|
|
|
|
|
2007-01-10 21:15:08 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "allowed caps %" GST_PTR_FORMAT,
|
gst/gstpad.c: Use _DEBUG_OBJECT when it makes sense.
Original commit message from CVS:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_get_property), (gst_pad_activate_pull),
(gst_pad_activate_push), (gst_pad_set_blocked_async),
(gst_pad_set_activate_function),
(gst_pad_set_activatepull_function),
(gst_pad_set_activatepush_function), (gst_pad_set_chain_function),
(gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_set_event_function),
(gst_pad_set_query_function), (gst_pad_set_query_type_function),
(gst_pad_set_internal_link_function), (gst_pad_set_link_function),
(gst_pad_set_unlink_function), (gst_pad_set_getcaps_function),
(gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_set_bufferalloc_function), (gst_pad_link_check_hierarchy),
(gst_pad_get_caps_unlocked), (gst_pad_get_caps),
(gst_pad_peer_get_caps), (gst_pad_accept_caps),
(gst_pad_peer_accept_caps), (gst_pad_set_caps),
(gst_pad_configure_sink), (gst_pad_configure_src),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_buffer_alloc_unchecked), (gst_pad_alloc_buffer_full),
(gst_pad_query), (gst_pad_load_and_link), (handle_pad_block),
(gst_pad_chain_unchecked), (gst_pad_push), (gst_pad_get_range),
(gst_pad_send_event):
Use _DEBUG_OBJECT when it makes sense.
Protect GST_PAD_CAPS with the OBJECT_LOCK.
Small cleanups and code reflows.
Avoid caps refcounting in _accept_caps.
Refactor alloc_buffer so that the code performed on the peer is in a
separate function. Also if the pad does not implement a buffer alloc
function, we should still check if the pad is flushing before falling
back to the default allocator.
2006-07-31 14:21:10 +00:00
|
|
|
caps);
|
2005-03-07 18:27:42 +00:00
|
|
|
|
2016-07-05 14:50:16 +00:00
|
|
|
end:
|
|
|
|
gst_query_unref (query);
|
|
|
|
gst_caps_unref (mycaps);
|
|
|
|
|
2005-03-07 18:27:42 +00:00
|
|
|
return caps;
|
|
|
|
|
|
|
|
no_peer:
|
|
|
|
{
|
2007-01-10 21:15:08 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_PROPERTIES, pad, "no peer");
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2005-03-07 18:27:42 +00:00
|
|
|
|
|
|
|
return NULL;
|
2003-12-22 01:39:35 +00:00
|
|
|
}
|
2002-01-13 22:22:42 +00:00
|
|
|
}
|
|
|
|
|
2008-09-01 10:42:04 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_iterate_internal_links_default:
|
|
|
|
* @pad: the #GstPad to get the internal links of.
|
2014-05-29 21:54:34 +00:00
|
|
|
* @parent: (allow-none): the parent of @pad or %NULL
|
2008-09-01 10:42:04 +00:00
|
|
|
*
|
|
|
|
* Iterate the list of pads to which the given pad is linked to inside of
|
|
|
|
* the parent element.
|
|
|
|
* This is the default handler, and thus returns an iterator of all of the
|
|
|
|
* pads inside the parent element with opposite direction.
|
|
|
|
*
|
|
|
|
* The caller must free this iterator after use with gst_iterator_free().
|
|
|
|
*
|
2014-06-11 22:21:34 +00:00
|
|
|
* Returns: (nullable): a #GstIterator of #GstPad, or %NULL if @pad
|
|
|
|
* has no parent. Unref each returned pad with gst_object_unref().
|
2008-09-01 10:42:04 +00:00
|
|
|
*/
|
|
|
|
GstIterator *
|
2011-11-16 16:49:46 +00:00
|
|
|
gst_pad_iterate_internal_links_default (GstPad * pad, GstObject * parent)
|
2008-09-01 10:42:04 +00:00
|
|
|
{
|
|
|
|
GstIterator *res;
|
|
|
|
GList **padlist;
|
|
|
|
guint32 *cookie;
|
2008-09-01 11:27:45 +00:00
|
|
|
GMutex *lock;
|
2008-09-01 10:42:04 +00:00
|
|
|
gpointer owner;
|
2011-11-16 16:49:46 +00:00
|
|
|
GstElement *eparent;
|
2008-09-01 10:42:04 +00:00
|
|
|
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), NULL);
|
|
|
|
|
2011-11-16 16:49:46 +00:00
|
|
|
if (parent != NULL && GST_IS_ELEMENT (parent)) {
|
|
|
|
eparent = GST_ELEMENT_CAST (gst_object_ref (parent));
|
|
|
|
} else {
|
2008-09-01 10:42:04 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
2011-11-16 16:49:46 +00:00
|
|
|
eparent = GST_PAD_PARENT (pad);
|
|
|
|
if (!eparent || !GST_IS_ELEMENT (eparent))
|
2008-09-01 10:42:04 +00:00
|
|
|
goto no_parent;
|
|
|
|
|
2011-11-16 16:49:46 +00:00
|
|
|
gst_object_ref (eparent);
|
2008-09-01 10:42:04 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2011-11-16 16:49:46 +00:00
|
|
|
}
|
2008-09-01 10:42:04 +00:00
|
|
|
|
2011-11-16 16:49:46 +00:00
|
|
|
if (pad->direction == GST_PAD_SRC)
|
|
|
|
padlist = &eparent->sinkpads;
|
|
|
|
else
|
|
|
|
padlist = &eparent->srcpads;
|
2008-09-01 10:42:04 +00:00
|
|
|
|
2011-11-16 16:49:46 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "Making iterator");
|
2008-09-01 10:42:04 +00:00
|
|
|
|
2011-11-16 16:49:46 +00:00
|
|
|
cookie = &eparent->pads_cookie;
|
|
|
|
owner = eparent;
|
|
|
|
lock = GST_OBJECT_GET_LOCK (eparent);
|
2008-09-01 10:42:04 +00:00
|
|
|
|
|
|
|
res = gst_iterator_new_list (GST_TYPE_PAD,
|
2011-03-17 10:31:59 +00:00
|
|
|
lock, cookie, padlist, (GObject *) owner, NULL);
|
2008-09-01 10:42:04 +00:00
|
|
|
|
2011-05-05 14:59:36 +00:00
|
|
|
gst_object_unref (owner);
|
|
|
|
|
2008-09-01 10:42:04 +00:00
|
|
|
return res;
|
|
|
|
|
|
|
|
/* ERRORS */
|
|
|
|
no_parent:
|
|
|
|
{
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
GST_DEBUG_OBJECT (pad, "no parent element");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gst_pad_iterate_internal_links:
|
|
|
|
* @pad: the GstPad to get the internal links of.
|
|
|
|
*
|
|
|
|
* Gets an iterator for the pads to which the given pad is linked to inside
|
|
|
|
* of the parent element.
|
|
|
|
*
|
|
|
|
* Each #GstPad element yielded by the iterator will have its refcount increased,
|
|
|
|
* so unref after use.
|
|
|
|
*
|
2010-12-07 18:35:04 +00:00
|
|
|
* Free-function: gst_iterator_free
|
|
|
|
*
|
2014-06-11 22:21:34 +00:00
|
|
|
* Returns: (transfer full) (nullable): a new #GstIterator of #GstPad
|
|
|
|
* or %NULL when the pad does not have an iterator function
|
|
|
|
* configured. Use gst_iterator_free() after usage.
|
2008-09-01 10:42:04 +00:00
|
|
|
*/
|
|
|
|
GstIterator *
|
|
|
|
gst_pad_iterate_internal_links (GstPad * pad)
|
|
|
|
{
|
|
|
|
GstIterator *res = NULL;
|
2011-11-16 11:08:22 +00:00
|
|
|
GstObject *parent;
|
2008-09-01 10:42:04 +00:00
|
|
|
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), NULL);
|
|
|
|
|
2011-11-16 11:08:22 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
ACQUIRE_PARENT (pad, parent, no_parent);
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
|
2008-09-01 10:42:04 +00:00
|
|
|
if (GST_PAD_ITERINTLINKFUNC (pad))
|
2011-11-16 16:49:46 +00:00
|
|
|
res = GST_PAD_ITERINTLINKFUNC (pad) (pad, parent);
|
2008-09-01 10:42:04 +00:00
|
|
|
|
2011-11-16 11:08:22 +00:00
|
|
|
RELEASE_PARENT (parent);
|
|
|
|
|
2008-09-01 10:42:04 +00:00
|
|
|
return res;
|
2011-11-16 11:08:22 +00:00
|
|
|
|
|
|
|
/* ERRORS */
|
|
|
|
no_parent:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (pad, "no parent");
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2015-02-12 12:03:03 +00:00
|
|
|
return NULL;
|
2011-11-16 11:08:22 +00:00
|
|
|
}
|
2008-09-01 10:42:04 +00:00
|
|
|
}
|
|
|
|
|
2011-06-07 08:02:06 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_forward:
|
|
|
|
* @pad: a #GstPad
|
2012-06-20 11:27:33 +00:00
|
|
|
* @forward: (scope call): a #GstPadForwardFunction
|
2011-06-07 08:02:06 +00:00
|
|
|
* @user_data: user data passed to @forward
|
|
|
|
*
|
|
|
|
* Calls @forward for all internally linked pads of @pad. This function deals with
|
|
|
|
* dynamically changing internal pads and will make sure that the @forward
|
|
|
|
* function is only called once for each pad.
|
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* When @forward returns %TRUE, no further pads will be processed.
|
2011-06-07 08:02:06 +00:00
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Returns: %TRUE if one of the dispatcher functions returned %TRUE.
|
2011-06-07 08:02:06 +00:00
|
|
|
*/
|
|
|
|
gboolean
|
|
|
|
gst_pad_forward (GstPad * pad, GstPadForwardFunction forward,
|
|
|
|
gpointer user_data)
|
2000-11-01 13:49:41 +00:00
|
|
|
{
|
2008-09-01 11:27:45 +00:00
|
|
|
gboolean result = FALSE;
|
|
|
|
GstIterator *iter;
|
|
|
|
gboolean done = FALSE;
|
2011-03-17 10:31:59 +00:00
|
|
|
GValue item = { 0, };
|
2008-09-01 11:27:45 +00:00
|
|
|
GList *pushed_pads = NULL;
|
2000-12-16 17:12:28 +00:00
|
|
|
|
2008-09-01 11:27:45 +00:00
|
|
|
iter = gst_pad_iterate_internal_links (pad);
|
2004-08-17 09:16:42 +00:00
|
|
|
|
2008-09-01 11:27:45 +00:00
|
|
|
if (!iter)
|
|
|
|
goto no_iter;
|
2008-05-27 10:59:38 +00:00
|
|
|
|
2008-09-01 11:27:45 +00:00
|
|
|
while (!done) {
|
|
|
|
switch (gst_iterator_next (iter, &item)) {
|
|
|
|
case GST_ITERATOR_OK:
|
2011-06-07 08:02:06 +00:00
|
|
|
{
|
|
|
|
GstPad *intpad;
|
|
|
|
|
|
|
|
intpad = g_value_get_object (&item);
|
2000-09-27 19:33:10 +00:00
|
|
|
|
2011-06-07 08:02:06 +00:00
|
|
|
/* if already pushed, skip. FIXME, find something faster to tag pads */
|
2011-12-10 10:07:02 +00:00
|
|
|
if (intpad == NULL || g_list_find (pushed_pads, intpad)) {
|
2011-03-17 10:31:59 +00:00
|
|
|
g_value_reset (&item);
|
2008-09-01 11:27:45 +00:00
|
|
|
break;
|
|
|
|
}
|
2000-09-27 19:33:10 +00:00
|
|
|
|
2011-06-07 08:02:06 +00:00
|
|
|
GST_LOG_OBJECT (pad, "calling forward function on pad %s:%s",
|
|
|
|
GST_DEBUG_PAD_NAME (intpad));
|
|
|
|
done = result = forward (intpad, user_data);
|
2008-09-01 11:27:45 +00:00
|
|
|
|
2011-06-07 08:02:06 +00:00
|
|
|
pushed_pads = g_list_prepend (pushed_pads, intpad);
|
2008-09-01 11:27:45 +00:00
|
|
|
|
2011-03-17 10:31:59 +00:00
|
|
|
g_value_reset (&item);
|
2008-09-01 11:27:45 +00:00
|
|
|
break;
|
2011-06-07 08:02:06 +00:00
|
|
|
}
|
2008-09-01 11:27:45 +00:00
|
|
|
case GST_ITERATOR_RESYNC:
|
2011-04-18 08:04:24 +00:00
|
|
|
/* We don't reset the result here because we don't push the event
|
|
|
|
* again on pads that got the event already and because we need
|
|
|
|
* to consider the result of the previous pushes */
|
2008-09-01 11:27:45 +00:00
|
|
|
gst_iterator_resync (iter);
|
|
|
|
break;
|
|
|
|
case GST_ITERATOR_ERROR:
|
|
|
|
GST_ERROR_OBJECT (pad, "Could not iterate over internally linked pads");
|
|
|
|
done = TRUE;
|
|
|
|
break;
|
|
|
|
case GST_ITERATOR_DONE:
|
|
|
|
done = TRUE;
|
|
|
|
break;
|
2005-05-09 10:53:13 +00:00
|
|
|
}
|
|
|
|
}
|
2011-03-17 10:31:59 +00:00
|
|
|
g_value_unset (&item);
|
2008-09-01 11:27:45 +00:00
|
|
|
gst_iterator_free (iter);
|
2000-09-27 19:33:10 +00:00
|
|
|
|
2011-06-07 08:02:06 +00:00
|
|
|
g_list_free (pushed_pads);
|
|
|
|
|
2008-09-01 11:27:45 +00:00
|
|
|
no_iter:
|
2011-06-07 08:02:06 +00:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
GstEvent *event;
|
2011-06-09 09:39:08 +00:00
|
|
|
gboolean result;
|
2011-06-07 08:49:34 +00:00
|
|
|
gboolean dispatched;
|
2011-06-07 08:02:06 +00:00
|
|
|
} EventData;
|
2008-09-01 11:27:45 +00:00
|
|
|
|
2011-06-07 08:02:06 +00:00
|
|
|
static gboolean
|
|
|
|
event_forward_func (GstPad * pad, EventData * data)
|
|
|
|
{
|
|
|
|
/* for each pad we send to, we should ref the event; it's up
|
|
|
|
* to downstream to unref again when handled. */
|
|
|
|
GST_LOG_OBJECT (pad, "Reffing and pushing event %p (%s) to %s:%s",
|
|
|
|
data->event, GST_EVENT_TYPE_NAME (data->event), GST_DEBUG_PAD_NAME (pad));
|
2008-09-01 11:27:45 +00:00
|
|
|
|
2011-06-09 09:39:08 +00:00
|
|
|
data->result |= gst_pad_push_event (pad, gst_event_ref (data->event));
|
2008-09-01 11:27:45 +00:00
|
|
|
|
2011-06-07 08:49:34 +00:00
|
|
|
data->dispatched = TRUE;
|
|
|
|
|
2011-06-07 08:02:06 +00:00
|
|
|
/* don't stop */
|
|
|
|
return FALSE;
|
|
|
|
}
|
2000-09-27 19:33:10 +00:00
|
|
|
|
2000-10-25 19:09:53 +00:00
|
|
|
/**
|
2005-05-09 10:53:13 +00:00
|
|
|
* gst_pad_event_default:
|
|
|
|
* @pad: a #GstPad to call the default event handler on.
|
2014-05-29 21:54:34 +00:00
|
|
|
* @parent: (allow-none): the parent of @pad or %NULL
|
2010-12-07 18:35:04 +00:00
|
|
|
* @event: (transfer full): the #GstEvent to handle.
|
2000-10-25 19:09:53 +00:00
|
|
|
*
|
2011-06-07 08:02:06 +00:00
|
|
|
* Invokes the default event handler for the given pad.
|
|
|
|
*
|
|
|
|
* The EOS event will pause the task associated with @pad before it is forwarded
|
|
|
|
* to all internally linked pads,
|
|
|
|
*
|
2015-03-31 14:48:22 +00:00
|
|
|
* The event is sent to all pads internally linked to @pad. This function
|
2011-06-07 08:49:34 +00:00
|
|
|
* takes ownership of @event.
|
2000-10-25 19:09:53 +00:00
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Returns: %TRUE if the event was sent successfully.
|
2000-10-25 19:09:53 +00:00
|
|
|
*/
|
2005-05-09 10:53:13 +00:00
|
|
|
gboolean
|
2011-11-17 11:40:45 +00:00
|
|
|
gst_pad_event_default (GstPad * pad, GstObject * parent, GstEvent * event)
|
2000-11-01 13:49:41 +00:00
|
|
|
{
|
2011-11-15 10:20:48 +00:00
|
|
|
gboolean result, forward = TRUE;
|
2011-05-08 10:43:26 +00:00
|
|
|
|
2005-05-09 10:53:13 +00:00
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
|
|
|
|
g_return_val_if_fail (event != NULL, FALSE);
|
2001-01-19 02:23:35 +00:00
|
|
|
|
2012-08-31 13:25:22 +00:00
|
|
|
GST_LOG_OBJECT (pad, "default event handler for event %" GST_PTR_FORMAT,
|
|
|
|
event);
|
2009-06-15 16:42:59 +00:00
|
|
|
|
2005-05-09 10:53:13 +00:00
|
|
|
switch (GST_EVENT_TYPE (event)) {
|
2011-11-15 10:20:48 +00:00
|
|
|
case GST_EVENT_CAPS:
|
|
|
|
forward = GST_PAD_IS_PROXY_CAPS (pad);
|
|
|
|
result = TRUE;
|
|
|
|
break;
|
2005-05-09 10:53:13 +00:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2000-01-30 09:03:00 +00:00
|
|
|
|
2011-11-15 10:20:48 +00:00
|
|
|
if (forward) {
|
|
|
|
EventData data;
|
2011-06-09 09:39:08 +00:00
|
|
|
|
2011-11-15 10:20:48 +00:00
|
|
|
data.event = event;
|
|
|
|
data.dispatched = FALSE;
|
|
|
|
data.result = FALSE;
|
2011-06-09 09:39:08 +00:00
|
|
|
|
2011-11-15 10:20:48 +00:00
|
|
|
gst_pad_forward (pad, (GstPadForwardFunction) event_forward_func, &data);
|
|
|
|
|
|
|
|
/* for sinkpads without a parent element or without internal links, nothing
|
|
|
|
* will be dispatched but we still want to return TRUE. */
|
|
|
|
if (data.dispatched)
|
|
|
|
result = data.result;
|
|
|
|
else
|
|
|
|
result = TRUE;
|
|
|
|
}
|
2011-06-09 09:39:08 +00:00
|
|
|
|
|
|
|
gst_event_unref (event);
|
2011-05-08 10:43:26 +00:00
|
|
|
|
|
|
|
return result;
|
2000-01-30 09:03:00 +00:00
|
|
|
}
|
|
|
|
|
2011-11-09 16:36:00 +00:00
|
|
|
/* Default accept caps implementation just checks against
|
|
|
|
* the allowed caps for the pad */
|
|
|
|
static gboolean
|
2011-11-15 10:20:48 +00:00
|
|
|
gst_pad_query_accept_caps_default (GstPad * pad, GstQuery * query)
|
2011-11-09 16:36:00 +00:00
|
|
|
{
|
|
|
|
/* get the caps and see if it intersects to something not empty */
|
2015-11-05 19:15:22 +00:00
|
|
|
GstCaps *caps, *allowed = NULL;
|
2011-11-09 16:36:00 +00:00
|
|
|
gboolean result;
|
|
|
|
|
2011-11-15 15:13:15 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "query accept-caps %" GST_PTR_FORMAT, query);
|
2011-11-09 16:36:00 +00:00
|
|
|
|
2011-11-15 10:20:48 +00:00
|
|
|
/* first forward the query to internally linked pads when we are dealing with
|
|
|
|
* a PROXY CAPS */
|
|
|
|
if (GST_PAD_IS_PROXY_CAPS (pad)) {
|
2015-08-25 22:37:30 +00:00
|
|
|
result = gst_pad_proxy_query_accept_caps (pad, query);
|
2015-11-05 19:15:22 +00:00
|
|
|
if (result)
|
|
|
|
allowed = gst_pad_get_pad_template_caps (pad);
|
|
|
|
else
|
|
|
|
goto done;
|
2011-11-15 10:20:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
gst_query_parse_accept_caps (query, &caps);
|
2015-11-05 19:15:22 +00:00
|
|
|
if (!allowed) {
|
2016-12-14 07:25:39 +00:00
|
|
|
if (GST_PAD_IS_ACCEPT_TEMPLATE (pad)) {
|
2015-11-05 19:15:22 +00:00
|
|
|
allowed = gst_pad_get_pad_template_caps (pad);
|
2016-12-14 07:25:39 +00:00
|
|
|
} else {
|
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_PERFORMANCE, pad,
|
|
|
|
"fallback ACCEPT_CAPS query, consider implementing a specialized version");
|
2015-11-05 19:15:22 +00:00
|
|
|
allowed = gst_pad_query_caps (pad, caps);
|
2016-12-14 07:25:39 +00:00
|
|
|
}
|
2015-11-05 19:15:22 +00:00
|
|
|
}
|
2011-11-15 10:20:48 +00:00
|
|
|
|
2011-11-09 16:36:00 +00:00
|
|
|
if (allowed) {
|
2013-12-03 20:46:19 +00:00
|
|
|
if (GST_PAD_IS_ACCEPT_INTERSECT (pad)) {
|
|
|
|
GST_DEBUG_OBJECT (pad,
|
|
|
|
"allowed caps intersect %" GST_PTR_FORMAT ", caps %" GST_PTR_FORMAT,
|
|
|
|
allowed, caps);
|
|
|
|
result = gst_caps_can_intersect (caps, allowed);
|
|
|
|
} else {
|
|
|
|
GST_DEBUG_OBJECT (pad, "allowed caps subset %" GST_PTR_FORMAT ", caps %"
|
|
|
|
GST_PTR_FORMAT, allowed, caps);
|
|
|
|
result = gst_caps_is_subset (caps, allowed);
|
|
|
|
}
|
2011-11-09 16:36:00 +00:00
|
|
|
gst_caps_unref (allowed);
|
|
|
|
} else {
|
2013-06-19 10:30:47 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "no compatible caps allowed on the pad");
|
2011-11-09 16:36:00 +00:00
|
|
|
result = FALSE;
|
|
|
|
}
|
|
|
|
gst_query_set_accept_caps_result (query, result);
|
|
|
|
|
2011-11-15 10:20:48 +00:00
|
|
|
done:
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Default caps implementation */
|
|
|
|
static gboolean
|
|
|
|
gst_pad_query_caps_default (GstPad * pad, GstQuery * query)
|
|
|
|
{
|
|
|
|
GstCaps *result = NULL, *filter;
|
|
|
|
GstPadTemplate *templ;
|
|
|
|
gboolean fixed_caps;
|
|
|
|
|
2012-07-18 14:20:41 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "query caps %" GST_PTR_FORMAT,
|
|
|
|
query);
|
2011-11-15 10:20:48 +00:00
|
|
|
|
|
|
|
/* first try to proxy if we must */
|
|
|
|
if (GST_PAD_IS_PROXY_CAPS (pad)) {
|
|
|
|
if ((gst_pad_proxy_query_caps (pad, query))) {
|
2012-07-18 14:20:41 +00:00
|
|
|
goto done;
|
2011-11-15 10:20:48 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-18 14:20:41 +00:00
|
|
|
gst_query_parse_caps (query, &filter);
|
|
|
|
|
2011-11-15 10:20:48 +00:00
|
|
|
/* no proxy or it failed, do default handling */
|
|
|
|
fixed_caps = GST_PAD_IS_FIXED_CAPS (pad);
|
|
|
|
|
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
if (fixed_caps) {
|
|
|
|
/* fixed caps, try the negotiated caps first */
|
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "fixed pad caps: trying pad caps");
|
|
|
|
if ((result = get_pad_caps (pad)))
|
|
|
|
goto filter_done_unlock;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((templ = GST_PAD_PAD_TEMPLATE (pad))) {
|
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "trying pad template caps");
|
|
|
|
if ((result = GST_PAD_TEMPLATE_CAPS (templ)))
|
|
|
|
goto filter_done_unlock;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!fixed_caps) {
|
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
|
|
|
|
"non-fixed pad caps: trying pad caps");
|
|
|
|
/* non fixed caps, try the negotiated caps */
|
|
|
|
if ((result = get_pad_caps (pad)))
|
|
|
|
goto filter_done_unlock;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* this almost never happens */
|
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "pad has no caps");
|
2012-03-08 08:45:06 +00:00
|
|
|
result = GST_CAPS_ANY;
|
2011-11-15 10:20:48 +00:00
|
|
|
|
|
|
|
filter_done_unlock:
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
|
|
|
|
/* run the filter on the result */
|
|
|
|
if (filter) {
|
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
|
|
|
|
"using caps %p %" GST_PTR_FORMAT " with filter %p %"
|
|
|
|
GST_PTR_FORMAT, result, result, filter, filter);
|
|
|
|
result = gst_caps_intersect_full (filter, result, GST_CAPS_INTERSECT_FIRST);
|
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "result %p %" GST_PTR_FORMAT,
|
|
|
|
result, result);
|
|
|
|
} else {
|
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
|
|
|
|
"using caps %p %" GST_PTR_FORMAT, result, result);
|
|
|
|
result = gst_caps_ref (result);
|
|
|
|
}
|
|
|
|
gst_query_set_caps_result (query, result);
|
|
|
|
gst_caps_unref (result);
|
|
|
|
|
2012-07-18 14:20:41 +00:00
|
|
|
done:
|
2011-11-09 16:36:00 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2015-02-12 11:55:36 +00:00
|
|
|
/* Default latency implementation */
|
|
|
|
typedef struct
|
|
|
|
{
|
2016-05-13 07:43:14 +00:00
|
|
|
guint count;
|
2015-02-12 11:55:36 +00:00
|
|
|
gboolean live;
|
|
|
|
GstClockTime min, max;
|
|
|
|
} LatencyFoldData;
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
query_latency_default_fold (const GValue * item, GValue * ret,
|
|
|
|
gpointer user_data)
|
|
|
|
{
|
2015-02-26 07:38:48 +00:00
|
|
|
GstPad *pad = g_value_get_object (item), *peer;
|
2015-02-12 11:55:36 +00:00
|
|
|
LatencyFoldData *fold_data = user_data;
|
|
|
|
GstQuery *query;
|
2015-02-26 07:38:48 +00:00
|
|
|
gboolean res = FALSE;
|
2015-02-12 11:55:36 +00:00
|
|
|
|
|
|
|
query = gst_query_new_latency ();
|
2015-02-26 07:38:48 +00:00
|
|
|
|
|
|
|
peer = gst_pad_get_peer (pad);
|
|
|
|
if (peer) {
|
|
|
|
res = gst_pad_peer_query (pad, query);
|
|
|
|
} else {
|
|
|
|
GST_LOG_OBJECT (pad, "No peer pad found, ignoring this pad");
|
|
|
|
}
|
2015-02-12 11:55:36 +00:00
|
|
|
|
|
|
|
if (res) {
|
|
|
|
gboolean live;
|
|
|
|
GstClockTime min, max;
|
|
|
|
|
|
|
|
gst_query_parse_latency (query, &live, &min, &max);
|
|
|
|
|
|
|
|
GST_LOG_OBJECT (pad, "got latency live:%s min:%" G_GINT64_FORMAT
|
|
|
|
" max:%" G_GINT64_FORMAT, live ? "true" : "false", min, max);
|
|
|
|
|
2016-05-13 07:43:14 +00:00
|
|
|
/* FIXME : Why do we only take values into account if it's live ? */
|
|
|
|
if (live || fold_data->count == 0) {
|
2015-02-12 11:55:36 +00:00
|
|
|
if (min > fold_data->min)
|
|
|
|
fold_data->min = min;
|
|
|
|
|
|
|
|
if (fold_data->max == GST_CLOCK_TIME_NONE)
|
|
|
|
fold_data->max = max;
|
|
|
|
else if (max < fold_data->max)
|
|
|
|
fold_data->max = max;
|
|
|
|
|
2016-05-13 07:43:14 +00:00
|
|
|
fold_data->live = live;
|
2015-02-12 11:55:36 +00:00
|
|
|
}
|
2016-05-13 07:43:14 +00:00
|
|
|
fold_data->count += 1;
|
2015-02-26 07:38:48 +00:00
|
|
|
} else if (peer) {
|
2015-02-18 23:12:49 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "latency query failed");
|
|
|
|
g_value_set_boolean (ret, FALSE);
|
2015-02-12 11:55:36 +00:00
|
|
|
}
|
2015-02-26 07:38:48 +00:00
|
|
|
|
2015-02-12 11:55:36 +00:00
|
|
|
gst_query_unref (query);
|
2015-02-26 07:38:48 +00:00
|
|
|
if (peer)
|
|
|
|
gst_object_unref (peer);
|
2015-02-12 11:55:36 +00:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
gst_pad_query_latency_default (GstPad * pad, GstQuery * query)
|
|
|
|
{
|
|
|
|
GstIterator *it;
|
|
|
|
GstIteratorResult res;
|
|
|
|
GValue ret = G_VALUE_INIT;
|
|
|
|
gboolean query_ret;
|
|
|
|
LatencyFoldData fold_data;
|
|
|
|
|
|
|
|
it = gst_pad_iterate_internal_links (pad);
|
2015-02-12 12:03:15 +00:00
|
|
|
if (!it) {
|
|
|
|
GST_DEBUG_OBJECT (pad, "Can't iterate internal links");
|
|
|
|
return FALSE;
|
|
|
|
}
|
2015-02-12 11:55:36 +00:00
|
|
|
|
2015-02-16 09:35:41 +00:00
|
|
|
g_value_init (&ret, G_TYPE_BOOLEAN);
|
|
|
|
|
2015-02-12 11:55:36 +00:00
|
|
|
retry:
|
2016-05-13 07:43:14 +00:00
|
|
|
fold_data.count = 0;
|
2015-02-12 11:55:36 +00:00
|
|
|
fold_data.live = FALSE;
|
|
|
|
fold_data.min = 0;
|
|
|
|
fold_data.max = GST_CLOCK_TIME_NONE;
|
|
|
|
|
2015-02-18 23:12:49 +00:00
|
|
|
g_value_set_boolean (&ret, TRUE);
|
2015-02-12 11:55:36 +00:00
|
|
|
res = gst_iterator_fold (it, query_latency_default_fold, &ret, &fold_data);
|
|
|
|
switch (res) {
|
|
|
|
case GST_ITERATOR_OK:
|
|
|
|
g_assert_not_reached ();
|
|
|
|
break;
|
|
|
|
case GST_ITERATOR_DONE:
|
|
|
|
break;
|
|
|
|
case GST_ITERATOR_ERROR:
|
|
|
|
g_value_set_boolean (&ret, FALSE);
|
|
|
|
break;
|
|
|
|
case GST_ITERATOR_RESYNC:
|
|
|
|
gst_iterator_resync (it);
|
|
|
|
goto retry;
|
|
|
|
default:
|
|
|
|
g_assert_not_reached ();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
gst_iterator_free (it);
|
|
|
|
|
|
|
|
query_ret = g_value_get_boolean (&ret);
|
|
|
|
if (query_ret) {
|
|
|
|
GST_LOG_OBJECT (pad, "got latency live:%s min:%" G_GINT64_FORMAT
|
|
|
|
" max:%" G_GINT64_FORMAT, fold_data.live ? "true" : "false",
|
|
|
|
fold_data.min, fold_data.max);
|
|
|
|
|
|
|
|
if (fold_data.min > fold_data.max) {
|
|
|
|
GST_ERROR_OBJECT (pad, "minimum latency bigger than maximum latency");
|
|
|
|
}
|
|
|
|
|
|
|
|
gst_query_set_latency (query, fold_data.live, fold_data.min, fold_data.max);
|
|
|
|
} else {
|
|
|
|
GST_LOG_OBJECT (pad, "latency query failed");
|
|
|
|
}
|
|
|
|
|
|
|
|
return query_ret;
|
|
|
|
}
|
|
|
|
|
2012-03-14 15:27:31 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
GstQuery *query;
|
|
|
|
gboolean result;
|
|
|
|
gboolean dispatched;
|
|
|
|
} QueryData;
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
query_forward_func (GstPad * pad, QueryData * data)
|
|
|
|
{
|
|
|
|
GST_LOG_OBJECT (pad, "query peer %p (%s) of %s:%s",
|
2012-07-18 15:44:54 +00:00
|
|
|
data->query, GST_QUERY_TYPE_NAME (data->query), GST_DEBUG_PAD_NAME (pad));
|
2012-03-14 15:27:31 +00:00
|
|
|
|
|
|
|
data->result |= gst_pad_peer_query (pad, data->query);
|
|
|
|
|
|
|
|
data->dispatched = TRUE;
|
|
|
|
|
|
|
|
/* stop on first successful reply */
|
|
|
|
return data->result;
|
|
|
|
}
|
|
|
|
|
2005-10-20 20:46:17 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_query_default:
|
|
|
|
* @pad: a #GstPad to call the default query handler on.
|
2014-05-29 21:54:34 +00:00
|
|
|
* @parent: (allow-none): the parent of @pad or %NULL
|
2010-12-07 18:35:04 +00:00
|
|
|
* @query: (transfer none): the #GstQuery to handle.
|
2005-10-20 20:46:17 +00:00
|
|
|
*
|
gst/gstelement.c (gst_element_requires_clock, gst_element_provides_clock, gst_element_request_pad, gst_element_class_...
Original commit message from CVS:
* gst/gstelement.c (gst_element_requires_clock,
gst_element_provides_clock, gst_element_request_pad,
gst_element_class_set_details, gst_element_class_set_details_simple,
gst_element_default_send_event, gst_element_abort_state,
gst_element_continue_state, gst_element_set_state,
gst_element_set_state_func, iterator_activate_fold_with_resync):
* gst/gstpad.c (gst_pad_activate_pull, gst_pad_set_getcaps_function,
gst_pad_fixate_caps, gst_pad_configure_sink, gst_pad_configure_src,
gst_pad_query, gst_pad_save_thyself, handle_pad_block, gst_pad_push,
gst_pad_get_range, gst_pad_pull_range):
* gst/gstpad.h (GST_PAD_LINK_SUCCESSFUL, GST_FLOW_CUSTOM_SUCCESS,
GST_FLOW_NOT_SUPPORTED, GST_FLOW_IS_FATAL, GstPadActivateFunction,
GstPadActivateModeFunction, GstPadChainFunction,
GstPadGetCapsFunction, GstPadAcceptCapsFunction,
GstPadFixateCapsFunction, GstPadTemplate):
* gst/gstpipeline.c (gst_pipeline_change_state,
gst_pipeline_set_new_stream_time, gst_pipeline_use_clock,
gst_pipeline_set_clock, gst_pipeline_auto_clock,
gst_pipeline_get_delay):
Whitespace and docs fixes.
2007-05-22 06:37:37 +00:00
|
|
|
* Invokes the default query handler for the given pad.
|
|
|
|
* The query is sent to all pads internally linked to @pad. Note that
|
|
|
|
* if there are many possible sink pads that are internally linked to
|
2005-10-20 20:46:17 +00:00
|
|
|
* @pad, only one will be sent the query.
|
|
|
|
* Multi-sinkpad elements should implement custom query handlers.
|
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Returns: %TRUE if the query was performed successfully.
|
2005-10-20 20:46:17 +00:00
|
|
|
*/
|
gst/: Simplify pad activation.
Original commit message from CVS:
* gst/base/Makefile.am:
* gst/base/README:
* gst/base/gstbasesink.c: (gst_basesink_get_type),
(gst_basesink_base_init), (gst_basesink_class_init),
(gst_basesink_pad_getcaps), (gst_basesink_init),
(gst_basesink_activate), (gst_basesink_change_state):
* gst/base/gstbasesink.h:
* gst/base/gstbasetransform.c: (gst_base_transform_get_type),
(gst_base_transform_base_init), (gst_base_transform_finalize),
(gst_base_transform_class_init), (gst_base_transform_init),
(gst_base_transform_proxy_getcaps), (gst_base_transform_setcaps),
(gst_base_transform_event), (gst_base_transform_getrange),
(gst_base_transform_chain), (gst_base_transform_handle_buffer),
(gst_base_transform_set_property),
(gst_base_transform_get_property),
(gst_base_transform_sink_activate),
(gst_base_transform_src_activate),
(gst_base_transform_change_state):
* gst/base/gstbasetransform.h:
* gst/elements/gstidentity.c: (gst_identity_finalize),
(gst_identity_class_init), (gst_identity_init),
(gst_identity_event), (gst_identity_check_perfect),
(gst_identity_transform), (gst_identity_set_property),
(gst_identity_get_property), (gst_identity_change_state):
* gst/elements/gstidentity.h:
* gst/gstelement.c: (gst_element_get_state_func),
(gst_element_lost_state), (gst_element_pads_activate):
* gst/gstpad.c: (gst_pad_set_active), (gst_pad_peer_set_active),
(gst_pad_check_pull_range), (gst_pad_pull_range):
* gst/gstpad.h:
Simplify pad activation.
Added function to check if pull_range can be performed.
Error out when pulling inactive or flushing pads.
Removed const from refcounted types as it does not make sense.
Simplify pad templates in basesink
Added base class for simple 1-to-1 transforms.
Make identity subclass the base transform.
2005-03-29 16:18:12 +00:00
|
|
|
gboolean
|
2011-11-16 16:22:56 +00:00
|
|
|
gst_pad_query_default (GstPad * pad, GstObject * parent, GstQuery * query)
|
gst/: Simplify pad activation.
Original commit message from CVS:
* gst/base/Makefile.am:
* gst/base/README:
* gst/base/gstbasesink.c: (gst_basesink_get_type),
(gst_basesink_base_init), (gst_basesink_class_init),
(gst_basesink_pad_getcaps), (gst_basesink_init),
(gst_basesink_activate), (gst_basesink_change_state):
* gst/base/gstbasesink.h:
* gst/base/gstbasetransform.c: (gst_base_transform_get_type),
(gst_base_transform_base_init), (gst_base_transform_finalize),
(gst_base_transform_class_init), (gst_base_transform_init),
(gst_base_transform_proxy_getcaps), (gst_base_transform_setcaps),
(gst_base_transform_event), (gst_base_transform_getrange),
(gst_base_transform_chain), (gst_base_transform_handle_buffer),
(gst_base_transform_set_property),
(gst_base_transform_get_property),
(gst_base_transform_sink_activate),
(gst_base_transform_src_activate),
(gst_base_transform_change_state):
* gst/base/gstbasetransform.h:
* gst/elements/gstidentity.c: (gst_identity_finalize),
(gst_identity_class_init), (gst_identity_init),
(gst_identity_event), (gst_identity_check_perfect),
(gst_identity_transform), (gst_identity_set_property),
(gst_identity_get_property), (gst_identity_change_state):
* gst/elements/gstidentity.h:
* gst/gstelement.c: (gst_element_get_state_func),
(gst_element_lost_state), (gst_element_pads_activate):
* gst/gstpad.c: (gst_pad_set_active), (gst_pad_peer_set_active),
(gst_pad_check_pull_range), (gst_pad_pull_range):
* gst/gstpad.h:
Simplify pad activation.
Added function to check if pull_range can be performed.
Error out when pulling inactive or flushing pads.
Removed const from refcounted types as it does not make sense.
Simplify pad templates in basesink
Added base class for simple 1-to-1 transforms.
Make identity subclass the base transform.
2005-03-29 16:18:12 +00:00
|
|
|
{
|
2012-02-02 11:05:37 +00:00
|
|
|
gboolean forward, ret = FALSE;
|
2011-06-13 14:30:22 +00:00
|
|
|
|
2005-05-09 10:53:13 +00:00
|
|
|
switch (GST_QUERY_TYPE (query)) {
|
2011-06-13 14:30:22 +00:00
|
|
|
case GST_QUERY_SCHEDULING:
|
2012-07-18 15:30:30 +00:00
|
|
|
forward = GST_PAD_IS_PROXY_SCHEDULING (pad);
|
2011-06-13 14:30:22 +00:00
|
|
|
break;
|
2012-02-02 11:05:37 +00:00
|
|
|
case GST_QUERY_ALLOCATION:
|
|
|
|
forward = GST_PAD_IS_PROXY_ALLOCATION (pad);
|
|
|
|
break;
|
2011-11-09 16:36:00 +00:00
|
|
|
case GST_QUERY_ACCEPT_CAPS:
|
2011-11-15 10:20:48 +00:00
|
|
|
ret = gst_pad_query_accept_caps_default (pad, query);
|
|
|
|
forward = FALSE;
|
|
|
|
break;
|
|
|
|
case GST_QUERY_CAPS:
|
|
|
|
ret = gst_pad_query_caps_default (pad, query);
|
2011-11-09 16:36:00 +00:00
|
|
|
forward = FALSE;
|
|
|
|
break;
|
2015-02-12 11:55:36 +00:00
|
|
|
case GST_QUERY_LATENCY:
|
|
|
|
ret = gst_pad_query_latency_default (pad, query);
|
|
|
|
forward = FALSE;
|
|
|
|
break;
|
2005-05-09 10:53:13 +00:00
|
|
|
case GST_QUERY_POSITION:
|
|
|
|
case GST_QUERY_SEEKING:
|
|
|
|
case GST_QUERY_FORMATS:
|
|
|
|
case GST_QUERY_JITTER:
|
|
|
|
case GST_QUERY_RATE:
|
|
|
|
case GST_QUERY_CONVERT:
|
|
|
|
default:
|
2012-02-02 11:05:37 +00:00
|
|
|
forward = TRUE;
|
2011-06-13 14:30:22 +00:00
|
|
|
break;
|
gst/: Simplify pad activation.
Original commit message from CVS:
* gst/base/Makefile.am:
* gst/base/README:
* gst/base/gstbasesink.c: (gst_basesink_get_type),
(gst_basesink_base_init), (gst_basesink_class_init),
(gst_basesink_pad_getcaps), (gst_basesink_init),
(gst_basesink_activate), (gst_basesink_change_state):
* gst/base/gstbasesink.h:
* gst/base/gstbasetransform.c: (gst_base_transform_get_type),
(gst_base_transform_base_init), (gst_base_transform_finalize),
(gst_base_transform_class_init), (gst_base_transform_init),
(gst_base_transform_proxy_getcaps), (gst_base_transform_setcaps),
(gst_base_transform_event), (gst_base_transform_getrange),
(gst_base_transform_chain), (gst_base_transform_handle_buffer),
(gst_base_transform_set_property),
(gst_base_transform_get_property),
(gst_base_transform_sink_activate),
(gst_base_transform_src_activate),
(gst_base_transform_change_state):
* gst/base/gstbasetransform.h:
* gst/elements/gstidentity.c: (gst_identity_finalize),
(gst_identity_class_init), (gst_identity_init),
(gst_identity_event), (gst_identity_check_perfect),
(gst_identity_transform), (gst_identity_set_property),
(gst_identity_get_property), (gst_identity_change_state):
* gst/elements/gstidentity.h:
* gst/gstelement.c: (gst_element_get_state_func),
(gst_element_lost_state), (gst_element_pads_activate):
* gst/gstpad.c: (gst_pad_set_active), (gst_pad_peer_set_active),
(gst_pad_check_pull_range), (gst_pad_pull_range):
* gst/gstpad.h:
Simplify pad activation.
Added function to check if pull_range can be performed.
Error out when pulling inactive or flushing pads.
Removed const from refcounted types as it does not make sense.
Simplify pad templates in basesink
Added base class for simple 1-to-1 transforms.
Make identity subclass the base transform.
2005-03-29 16:18:12 +00:00
|
|
|
}
|
2011-06-13 14:30:22 +00:00
|
|
|
|
2012-03-15 15:50:31 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "%sforwarding %p (%s) query", (forward ? "" : "not "),
|
|
|
|
query, GST_QUERY_TYPE_NAME (query));
|
|
|
|
|
2011-06-13 14:30:22 +00:00
|
|
|
if (forward) {
|
2012-03-14 15:27:31 +00:00
|
|
|
QueryData data;
|
|
|
|
|
|
|
|
data.query = query;
|
|
|
|
data.dispatched = FALSE;
|
|
|
|
data.result = FALSE;
|
|
|
|
|
|
|
|
gst_pad_forward (pad, (GstPadForwardFunction) query_forward_func, &data);
|
|
|
|
|
|
|
|
if (data.dispatched) {
|
|
|
|
ret = data.result;
|
|
|
|
} else {
|
2012-03-15 15:50:31 +00:00
|
|
|
/* nothing dispatched, assume drained */
|
2012-03-14 15:27:31 +00:00
|
|
|
if (GST_QUERY_TYPE (query) == GST_QUERY_DRAIN)
|
|
|
|
ret = TRUE;
|
|
|
|
else
|
|
|
|
ret = FALSE;
|
|
|
|
}
|
2011-06-13 14:30:22 +00:00
|
|
|
}
|
|
|
|
return ret;
|
gst/: Simplify pad activation.
Original commit message from CVS:
* gst/base/Makefile.am:
* gst/base/README:
* gst/base/gstbasesink.c: (gst_basesink_get_type),
(gst_basesink_base_init), (gst_basesink_class_init),
(gst_basesink_pad_getcaps), (gst_basesink_init),
(gst_basesink_activate), (gst_basesink_change_state):
* gst/base/gstbasesink.h:
* gst/base/gstbasetransform.c: (gst_base_transform_get_type),
(gst_base_transform_base_init), (gst_base_transform_finalize),
(gst_base_transform_class_init), (gst_base_transform_init),
(gst_base_transform_proxy_getcaps), (gst_base_transform_setcaps),
(gst_base_transform_event), (gst_base_transform_getrange),
(gst_base_transform_chain), (gst_base_transform_handle_buffer),
(gst_base_transform_set_property),
(gst_base_transform_get_property),
(gst_base_transform_sink_activate),
(gst_base_transform_src_activate),
(gst_base_transform_change_state):
* gst/base/gstbasetransform.h:
* gst/elements/gstidentity.c: (gst_identity_finalize),
(gst_identity_class_init), (gst_identity_init),
(gst_identity_event), (gst_identity_check_perfect),
(gst_identity_transform), (gst_identity_set_property),
(gst_identity_get_property), (gst_identity_change_state):
* gst/elements/gstidentity.h:
* gst/gstelement.c: (gst_element_get_state_func),
(gst_element_lost_state), (gst_element_pads_activate):
* gst/gstpad.c: (gst_pad_set_active), (gst_pad_peer_set_active),
(gst_pad_check_pull_range), (gst_pad_pull_range):
* gst/gstpad.h:
Simplify pad activation.
Added function to check if pull_range can be performed.
Error out when pulling inactive or flushing pads.
Removed const from refcounted types as it does not make sense.
Simplify pad templates in basesink
Added base class for simple 1-to-1 transforms.
Make identity subclass the base transform.
2005-03-29 16:18:12 +00:00
|
|
|
}
|
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
static void
|
|
|
|
probe_hook_marshal (GHook * hook, ProbeMarshall * data)
|
2011-05-30 11:40:04 +00:00
|
|
|
{
|
2011-05-31 17:16:09 +00:00
|
|
|
GstPad *pad = data->pad;
|
2011-11-08 10:04:19 +00:00
|
|
|
GstPadProbeInfo *info = data->info;
|
|
|
|
GstPadProbeType type, flags;
|
2011-06-01 17:27:55 +00:00
|
|
|
GstPadProbeCallback callback;
|
2011-11-01 00:13:35 +00:00
|
|
|
GstPadProbeReturn ret;
|
2014-08-06 09:32:39 +00:00
|
|
|
gpointer original_data;
|
2011-05-30 11:40:04 +00:00
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
/* if we have called this callback, do nothing */
|
2011-11-07 16:04:13 +00:00
|
|
|
if (PROBE_COOKIE (hook) == data->cookie) {
|
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
|
|
|
"hook %lu, cookie %u already called", hook->hook_id,
|
|
|
|
PROBE_COOKIE (hook));
|
2011-05-31 17:16:09 +00:00
|
|
|
return;
|
2011-11-07 16:04:13 +00:00
|
|
|
}
|
2011-05-30 11:40:04 +00:00
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
PROBE_COOKIE (hook) = data->cookie;
|
2011-05-30 16:29:06 +00:00
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
flags = hook->flags >> G_HOOK_FLAG_USER_SHIFT;
|
2011-11-08 10:04:19 +00:00
|
|
|
type = info->type;
|
2014-08-06 09:32:39 +00:00
|
|
|
original_data = info->data;
|
2011-05-30 11:40:04 +00:00
|
|
|
|
2011-06-03 11:56:04 +00:00
|
|
|
/* one of the scheduling types */
|
2011-11-08 10:04:19 +00:00
|
|
|
if ((flags & GST_PAD_PROBE_TYPE_SCHEDULING & type) == 0)
|
2011-11-07 16:04:13 +00:00
|
|
|
goto no_match;
|
2016-03-24 20:34:20 +00:00
|
|
|
|
2017-09-04 12:33:29 +00:00
|
|
|
if (G_UNLIKELY (data->handled)) {
|
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
|
|
|
"probe previously returned HANDLED, not calling again");
|
|
|
|
goto no_match;
|
|
|
|
} else if (G_UNLIKELY (data->dropped)) {
|
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
|
|
|
"probe previously returned DROPPED, not calling again");
|
|
|
|
goto no_match;
|
|
|
|
}
|
|
|
|
|
2016-03-24 20:34:20 +00:00
|
|
|
if (type & GST_PAD_PROBE_TYPE_PUSH) {
|
|
|
|
/* one of the data types for non-idle probes */
|
|
|
|
if ((type & GST_PAD_PROBE_TYPE_IDLE) == 0
|
|
|
|
&& (flags & _PAD_PROBE_TYPE_ALL_BOTH_AND_FLUSH & type) == 0)
|
|
|
|
goto no_match;
|
|
|
|
} else if (type & GST_PAD_PROBE_TYPE_PULL) {
|
|
|
|
/* one of the data types for non-idle probes */
|
|
|
|
if ((type & GST_PAD_PROBE_TYPE_BLOCKING) == 0
|
|
|
|
&& (flags & _PAD_PROBE_TYPE_ALL_BOTH_AND_FLUSH & type) == 0)
|
|
|
|
goto no_match;
|
|
|
|
} else {
|
|
|
|
/* Type must have PULL or PUSH probe types */
|
|
|
|
g_assert_not_reached ();
|
|
|
|
}
|
|
|
|
|
2011-11-25 06:11:24 +00:00
|
|
|
/* one of the blocking types must match */
|
|
|
|
if ((type & GST_PAD_PROBE_TYPE_BLOCKING) &&
|
|
|
|
(flags & GST_PAD_PROBE_TYPE_BLOCKING & type) == 0)
|
2011-11-07 16:04:13 +00:00
|
|
|
goto no_match;
|
2013-12-30 17:44:24 +00:00
|
|
|
if ((type & GST_PAD_PROBE_TYPE_BLOCKING) == 0 &&
|
|
|
|
(flags & GST_PAD_PROBE_TYPE_BLOCKING))
|
|
|
|
goto no_match;
|
2011-12-06 17:09:13 +00:00
|
|
|
/* only probes that have GST_PAD_PROBE_TYPE_EVENT_FLUSH set */
|
|
|
|
if ((type & GST_PAD_PROBE_TYPE_EVENT_FLUSH) &&
|
|
|
|
(flags & GST_PAD_PROBE_TYPE_EVENT_FLUSH & type) == 0)
|
2011-12-05 20:20:52 +00:00
|
|
|
goto no_match;
|
2011-05-31 17:16:09 +00:00
|
|
|
|
2011-06-01 17:27:55 +00:00
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
2012-02-10 11:05:18 +00:00
|
|
|
"hook %lu, cookie %u with flags 0x%08x matches", hook->hook_id,
|
|
|
|
PROBE_COOKIE (hook), flags);
|
2011-05-31 17:16:09 +00:00
|
|
|
|
2012-02-21 15:37:11 +00:00
|
|
|
data->marshalled = TRUE;
|
|
|
|
|
2011-06-01 17:27:55 +00:00
|
|
|
callback = (GstPadProbeCallback) hook->func;
|
|
|
|
if (callback == NULL)
|
|
|
|
return;
|
2011-05-31 17:16:09 +00:00
|
|
|
|
2012-01-26 10:01:21 +00:00
|
|
|
info->id = hook->hook_id;
|
|
|
|
|
2011-06-01 17:27:55 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2011-05-31 17:16:09 +00:00
|
|
|
|
2011-11-08 10:04:19 +00:00
|
|
|
ret = callback (pad, info, hook->data);
|
2011-06-01 17:27:55 +00:00
|
|
|
|
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
|
2014-08-06 09:32:39 +00:00
|
|
|
if (original_data != NULL && info->data == NULL) {
|
|
|
|
GST_DEBUG_OBJECT (pad, "data item in pad probe info was dropped");
|
|
|
|
info->type = GST_PAD_PROBE_TYPE_INVALID;
|
|
|
|
data->dropped = TRUE;
|
|
|
|
}
|
|
|
|
|
2011-06-01 17:27:55 +00:00
|
|
|
switch (ret) {
|
2011-11-01 00:13:35 +00:00
|
|
|
case GST_PAD_PROBE_REMOVE:
|
2011-06-01 17:27:55 +00:00
|
|
|
/* remove the probe */
|
|
|
|
GST_DEBUG_OBJECT (pad, "asked to remove hook");
|
|
|
|
cleanup_hook (pad, hook);
|
|
|
|
break;
|
2011-11-01 00:13:35 +00:00
|
|
|
case GST_PAD_PROBE_DROP:
|
2011-06-01 17:27:55 +00:00
|
|
|
/* need to drop the data, make sure other probes don't get called
|
|
|
|
* anymore */
|
|
|
|
GST_DEBUG_OBJECT (pad, "asked to drop item");
|
2011-11-08 10:04:19 +00:00
|
|
|
info->type = GST_PAD_PROBE_TYPE_INVALID;
|
2011-11-07 16:04:13 +00:00
|
|
|
data->dropped = TRUE;
|
2011-06-01 17:27:55 +00:00
|
|
|
break;
|
2015-04-29 13:49:17 +00:00
|
|
|
case GST_PAD_PROBE_HANDLED:
|
|
|
|
GST_DEBUG_OBJECT (pad, "probe handled data");
|
|
|
|
data->handled = TRUE;
|
|
|
|
break;
|
2011-11-01 00:13:35 +00:00
|
|
|
case GST_PAD_PROBE_PASS:
|
2011-06-01 17:27:55 +00:00
|
|
|
/* inform the pad block to let things pass */
|
|
|
|
GST_DEBUG_OBJECT (pad, "asked to pass item");
|
|
|
|
data->pass = TRUE;
|
2013-04-04 13:45:15 +00:00
|
|
|
break;
|
|
|
|
case GST_PAD_PROBE_OK:
|
|
|
|
GST_DEBUG_OBJECT (pad, "probe returned OK");
|
2011-06-01 17:27:55 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
GST_DEBUG_OBJECT (pad, "probe returned %d", ret);
|
|
|
|
break;
|
2011-05-30 11:40:04 +00:00
|
|
|
}
|
2011-11-07 16:04:13 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
no_match:
|
|
|
|
{
|
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
2012-02-10 11:05:18 +00:00
|
|
|
"hook %lu, cookie %u with flags 0x%08x does not match %08x",
|
|
|
|
hook->hook_id, PROBE_COOKIE (hook), flags, info->type);
|
2011-11-07 16:04:13 +00:00
|
|
|
return;
|
|
|
|
}
|
2011-05-31 17:16:09 +00:00
|
|
|
}
|
2011-05-30 11:40:04 +00:00
|
|
|
|
2011-11-08 11:47:33 +00:00
|
|
|
/* a probe that does not take or return any data */
|
|
|
|
#define PROBE_NO_DATA(pad,mask,label,defaultval) \
|
|
|
|
G_STMT_START { \
|
|
|
|
if (G_UNLIKELY (pad->num_probes)) { \
|
2015-01-21 10:45:41 +00:00
|
|
|
GstFlowReturn pval = defaultval; \
|
2011-11-08 11:47:33 +00:00
|
|
|
/* pass NULL as the data item */ \
|
2015-04-29 13:49:17 +00:00
|
|
|
GstPadProbeInfo info = { mask, 0, NULL, 0, 0 }; \
|
|
|
|
info.ABI.abi.flow_ret = defaultval; \
|
2011-11-08 10:04:19 +00:00
|
|
|
ret = do_probe_callbacks (pad, &info, defaultval); \
|
2015-01-21 10:45:41 +00:00
|
|
|
if (G_UNLIKELY (ret != pval && ret != GST_FLOW_OK)) \
|
2011-11-08 10:04:19 +00:00
|
|
|
goto label; \
|
|
|
|
} \
|
|
|
|
} G_STMT_END
|
|
|
|
|
2015-04-29 13:49:17 +00:00
|
|
|
#define PROBE_FULL(pad,mask,data,offs,size,label,handleable,handle_label) \
|
|
|
|
G_STMT_START { \
|
|
|
|
if (G_UNLIKELY (pad->num_probes)) { \
|
|
|
|
/* pass the data item */ \
|
|
|
|
GstPadProbeInfo info = { mask, 0, data, offs, size }; \
|
|
|
|
info.ABI.abi.flow_ret = GST_FLOW_OK; \
|
|
|
|
ret = do_probe_callbacks (pad, &info, GST_FLOW_OK); \
|
|
|
|
/* store the possibly updated data item */ \
|
|
|
|
data = GST_PAD_PROBE_INFO_DATA (&info); \
|
|
|
|
/* if something went wrong, exit */ \
|
|
|
|
if (G_UNLIKELY (ret != GST_FLOW_OK)) { \
|
|
|
|
if (handleable && ret == GST_FLOW_CUSTOM_SUCCESS_1) { \
|
|
|
|
ret = info.ABI.abi.flow_ret; \
|
|
|
|
goto handle_label; \
|
|
|
|
} \
|
|
|
|
goto label; \
|
|
|
|
} \
|
|
|
|
} \
|
2011-06-01 17:27:55 +00:00
|
|
|
} G_STMT_END
|
|
|
|
|
2015-04-29 13:49:17 +00:00
|
|
|
#define PROBE_PUSH(pad,mask,data,label) \
|
|
|
|
PROBE_FULL(pad, mask, data, -1, -1, label, FALSE, label);
|
|
|
|
#define PROBE_HANDLE(pad,mask,data,label,handle_label) \
|
|
|
|
PROBE_FULL(pad, mask, data, -1, -1, label, TRUE, handle_label);
|
|
|
|
#define PROBE_PULL(pad,mask,data,offs,size,label) \
|
|
|
|
PROBE_FULL(pad, mask, data, offs, size, label, FALSE, label);
|
2011-10-07 09:49:19 +00:00
|
|
|
|
2015-04-14 20:06:36 +00:00
|
|
|
static GstFlowReturn
|
|
|
|
do_pad_idle_probe_wait (GstPad * pad)
|
|
|
|
{
|
|
|
|
while (GST_PAD_IS_RUNNING_IDLE_PROBE (pad)) {
|
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
|
|
|
"waiting idle probe to be removed");
|
|
|
|
GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_BLOCKING);
|
|
|
|
GST_PAD_BLOCK_WAIT (pad);
|
|
|
|
GST_OBJECT_FLAG_UNSET (pad, GST_PAD_FLAG_BLOCKING);
|
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "We got unblocked");
|
|
|
|
|
|
|
|
if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
|
|
|
|
return GST_FLOW_FLUSHING;
|
|
|
|
}
|
|
|
|
return GST_FLOW_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define PROBE_TYPE_IS_SERIALIZED(i) \
|
|
|
|
( \
|
|
|
|
( \
|
|
|
|
(((i)->type & (GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM | \
|
|
|
|
GST_PAD_PROBE_TYPE_EVENT_FLUSH)) && \
|
|
|
|
GST_EVENT_IS_SERIALIZED ((i)->data)) \
|
|
|
|
) || ( \
|
|
|
|
(((i)->type & GST_PAD_PROBE_TYPE_QUERY_DOWNSTREAM) && \
|
|
|
|
GST_QUERY_IS_SERIALIZED ((i)->data)) \
|
|
|
|
) || ( \
|
|
|
|
((i)->type & (GST_PAD_PROBE_TYPE_BUFFER | \
|
|
|
|
GST_PAD_PROBE_TYPE_BUFFER_LIST)) \
|
|
|
|
) \
|
|
|
|
)
|
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
static GstFlowReturn
|
2011-11-08 10:04:19 +00:00
|
|
|
do_probe_callbacks (GstPad * pad, GstPadProbeInfo * info,
|
2011-10-07 09:49:19 +00:00
|
|
|
GstFlowReturn defaultval)
|
2011-05-31 17:16:09 +00:00
|
|
|
{
|
|
|
|
ProbeMarshall data;
|
|
|
|
guint cookie;
|
2011-11-07 16:04:13 +00:00
|
|
|
gboolean is_block;
|
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
data.pad = pad;
|
2011-11-08 10:04:19 +00:00
|
|
|
data.info = info;
|
2011-05-31 17:16:09 +00:00
|
|
|
data.pass = FALSE;
|
2015-04-29 13:49:17 +00:00
|
|
|
data.handled = FALSE;
|
2011-11-07 16:04:13 +00:00
|
|
|
data.marshalled = FALSE;
|
|
|
|
data.dropped = FALSE;
|
|
|
|
data.cookie = ++pad->priv->probe_cookie;
|
2011-05-30 11:40:04 +00:00
|
|
|
|
2011-11-08 10:04:19 +00:00
|
|
|
is_block =
|
|
|
|
(info->type & GST_PAD_PROBE_TYPE_BLOCK) == GST_PAD_PROBE_TYPE_BLOCK;
|
|
|
|
|
2015-04-14 20:06:36 +00:00
|
|
|
if (is_block && PROBE_TYPE_IS_SERIALIZED (info)) {
|
|
|
|
if (do_pad_idle_probe_wait (pad) == GST_FLOW_FLUSHING)
|
|
|
|
goto flushing;
|
|
|
|
}
|
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
again:
|
2011-11-07 16:04:13 +00:00
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
|
|
|
"do probes cookie %u", data.cookie);
|
|
|
|
cookie = pad->priv->probe_list_cookie;
|
2011-05-31 17:16:09 +00:00
|
|
|
|
2011-11-07 16:04:13 +00:00
|
|
|
g_hook_list_marshal (&pad->probes, TRUE,
|
2011-05-31 17:16:09 +00:00
|
|
|
(GHookMarshaller) probe_hook_marshal, &data);
|
|
|
|
|
|
|
|
/* if the list changed, call the new callbacks (they will not have their
|
|
|
|
* cookie set to data.cookie */
|
2011-11-07 16:04:13 +00:00
|
|
|
if (cookie != pad->priv->probe_list_cookie) {
|
2011-06-01 17:27:55 +00:00
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
|
|
|
"probe list changed, restarting");
|
2011-05-31 17:16:09 +00:00
|
|
|
goto again;
|
2011-06-01 17:27:55 +00:00
|
|
|
}
|
2011-05-31 17:16:09 +00:00
|
|
|
|
2011-11-07 16:04:13 +00:00
|
|
|
/* the first item that dropped will stop the hooks and then we drop here */
|
|
|
|
if (data.dropped)
|
2011-05-31 17:16:09 +00:00
|
|
|
goto dropped;
|
|
|
|
|
2015-04-29 13:49:17 +00:00
|
|
|
/* If one handler took care of it, let the the item pass */
|
|
|
|
if (data.handled) {
|
|
|
|
goto handled;
|
|
|
|
}
|
|
|
|
|
2011-11-07 16:04:13 +00:00
|
|
|
/* if no handler matched and we are blocking, let the item pass */
|
|
|
|
if (!data.marshalled && is_block)
|
|
|
|
goto passed;
|
|
|
|
|
|
|
|
/* At this point, all handlers returned either OK or PASS. If one handler
|
|
|
|
* returned PASS, let the item pass */
|
2011-05-31 17:16:09 +00:00
|
|
|
if (data.pass)
|
|
|
|
goto passed;
|
|
|
|
|
2011-11-07 16:04:13 +00:00
|
|
|
if (is_block) {
|
2011-06-01 17:27:55 +00:00
|
|
|
while (GST_PAD_IS_BLOCKED (pad)) {
|
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
|
|
|
"we are blocked %d times", pad->num_blocked);
|
|
|
|
|
|
|
|
/* we might have released the lock */
|
|
|
|
if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
|
|
|
|
goto flushing;
|
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
/* now we block the streaming thread. It can be unlocked when we
|
|
|
|
* deactivate the pad (which will also set the FLUSHING flag) or
|
|
|
|
* when the pad is unblocked. A flushing event will also unblock
|
|
|
|
* the pad after setting the FLUSHING flag. */
|
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
|
|
|
"Waiting to be unblocked or set flushing");
|
2011-11-16 11:36:51 +00:00
|
|
|
GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_BLOCKING);
|
2011-05-31 17:16:09 +00:00
|
|
|
GST_PAD_BLOCK_WAIT (pad);
|
2011-11-16 11:36:51 +00:00
|
|
|
GST_OBJECT_FLAG_UNSET (pad, GST_PAD_FLAG_BLOCKING);
|
2011-06-01 17:27:55 +00:00
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "We got unblocked");
|
2011-05-31 17:16:09 +00:00
|
|
|
|
2014-01-02 12:33:20 +00:00
|
|
|
/* if the list changed, call the new callbacks (they will not have their
|
|
|
|
* cookie set to data.cookie */
|
|
|
|
if (cookie != pad->priv->probe_list_cookie) {
|
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
|
|
|
"probe list changed, restarting");
|
|
|
|
goto again;
|
|
|
|
}
|
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
|
|
|
|
goto flushing;
|
|
|
|
}
|
2011-05-30 11:40:04 +00:00
|
|
|
}
|
2011-05-31 17:16:09 +00:00
|
|
|
|
2011-10-07 09:49:19 +00:00
|
|
|
return defaultval;
|
2011-05-31 17:16:09 +00:00
|
|
|
|
|
|
|
/* ERRORS */
|
2011-05-30 11:40:04 +00:00
|
|
|
flushing:
|
|
|
|
{
|
2011-05-31 17:16:09 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "pad is flushing");
|
2012-02-08 14:16:46 +00:00
|
|
|
return GST_FLOW_FLUSHING;
|
2011-05-30 11:40:04 +00:00
|
|
|
}
|
2011-05-31 17:16:09 +00:00
|
|
|
dropped:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (pad, "data is dropped");
|
|
|
|
return GST_FLOW_CUSTOM_SUCCESS;
|
|
|
|
}
|
|
|
|
passed:
|
|
|
|
{
|
2011-10-07 09:49:19 +00:00
|
|
|
/* FIXME : Should we return FLOW_OK or the defaultval ?? */
|
2011-05-31 17:16:09 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "data is passed");
|
|
|
|
return GST_FLOW_OK;
|
|
|
|
}
|
2015-04-29 13:49:17 +00:00
|
|
|
handled:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (pad, "data was handled");
|
|
|
|
return GST_FLOW_CUSTOM_SUCCESS_1;
|
|
|
|
}
|
2011-05-30 11:40:04 +00:00
|
|
|
}
|
|
|
|
|
2011-05-19 14:26:06 +00:00
|
|
|
/* pad offsets */
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gst_pad_get_offset:
|
|
|
|
* @pad: a #GstPad
|
|
|
|
*
|
2011-05-19 16:27:55 +00:00
|
|
|
* Get the offset applied to the running time of @pad. @pad has to be a source
|
|
|
|
* pad.
|
2011-05-19 14:26:06 +00:00
|
|
|
*
|
|
|
|
* Returns: the offset.
|
|
|
|
*/
|
|
|
|
gint64
|
|
|
|
gst_pad_get_offset (GstPad * pad)
|
|
|
|
{
|
|
|
|
gint64 result;
|
|
|
|
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), 0);
|
|
|
|
|
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
result = pad->offset;
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2014-04-04 15:15:25 +00:00
|
|
|
static gboolean
|
|
|
|
mark_event_not_received (GstPad * pad, PadEvent * ev, gpointer user_data)
|
|
|
|
{
|
|
|
|
ev->received = FALSE;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2011-05-19 14:26:06 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_set_offset:
|
|
|
|
* @pad: a #GstPad
|
|
|
|
* @offset: the offset
|
|
|
|
*
|
|
|
|
* Set the offset that will be applied to the running time of @pad.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
gst_pad_set_offset (GstPad * pad, gint64 offset)
|
|
|
|
{
|
|
|
|
g_return_if_fail (GST_IS_PAD (pad));
|
|
|
|
|
|
|
|
GST_OBJECT_LOCK (pad);
|
2011-05-19 16:27:55 +00:00
|
|
|
/* if nothing changed, do nothing */
|
|
|
|
if (pad->offset == offset)
|
|
|
|
goto done;
|
|
|
|
|
2011-05-19 14:26:06 +00:00
|
|
|
pad->offset = offset;
|
2016-06-11 19:18:06 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "changed offset to %" GST_STIME_FORMAT,
|
|
|
|
GST_STIME_ARGS (offset));
|
2011-05-19 16:27:55 +00:00
|
|
|
|
2014-04-04 15:15:25 +00:00
|
|
|
/* resend all sticky events with updated offset on next buffer push */
|
|
|
|
events_foreach (pad, mark_event_not_received, NULL);
|
|
|
|
GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_PENDING_EVENTS);
|
2011-05-19 16:27:55 +00:00
|
|
|
|
|
|
|
done:
|
2011-05-19 14:26:06 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
}
|
|
|
|
|
2012-06-02 14:55:07 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
GstFlowReturn ret;
|
|
|
|
|
|
|
|
/* If TRUE and ret is not OK this means
|
|
|
|
* that pushing the EOS event failed
|
|
|
|
*/
|
|
|
|
gboolean was_eos;
|
2013-05-09 08:29:11 +00:00
|
|
|
|
|
|
|
/* If called for an event this is
|
|
|
|
* the event that would be pushed
|
|
|
|
* next. Don't forward sticky events
|
|
|
|
* that would come after that */
|
|
|
|
GstEvent *event;
|
2012-06-02 14:55:07 +00:00
|
|
|
} PushStickyData;
|
|
|
|
|
2012-03-14 15:01:15 +00:00
|
|
|
/* should be called with pad LOCK */
|
|
|
|
static gboolean
|
|
|
|
push_sticky (GstPad * pad, PadEvent * ev, gpointer user_data)
|
|
|
|
{
|
2012-06-02 14:55:07 +00:00
|
|
|
PushStickyData *data = user_data;
|
2012-03-14 15:01:15 +00:00
|
|
|
GstEvent *event = ev->event;
|
|
|
|
|
|
|
|
if (ev->received) {
|
|
|
|
GST_DEBUG_OBJECT (pad, "event %s was already received",
|
|
|
|
GST_EVENT_TYPE_NAME (event));
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2013-05-09 08:29:11 +00:00
|
|
|
/* If we're called because of an sticky event, only forward
|
|
|
|
* events that would come before this new event and the
|
|
|
|
* event itself */
|
|
|
|
if (data->event && GST_EVENT_IS_STICKY (data->event) &&
|
|
|
|
GST_EVENT_TYPE (data->event) <= GST_EVENT_SEGMENT &&
|
|
|
|
GST_EVENT_TYPE (data->event) < GST_EVENT_TYPE (event)) {
|
|
|
|
data->ret = GST_FLOW_CUSTOM_SUCCESS_1;
|
|
|
|
} else {
|
|
|
|
data->ret = gst_pad_push_event_unchecked (pad, gst_event_ref (event),
|
|
|
|
GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM);
|
2017-12-06 16:07:29 +00:00
|
|
|
if (data->ret == GST_FLOW_CUSTOM_SUCCESS_1)
|
|
|
|
data->ret = GST_FLOW_OK;
|
2013-05-09 08:29:11 +00:00
|
|
|
}
|
2012-03-14 15:01:15 +00:00
|
|
|
|
2012-06-02 14:55:07 +00:00
|
|
|
switch (data->ret) {
|
2012-03-14 15:01:15 +00:00
|
|
|
case GST_FLOW_OK:
|
|
|
|
ev->received = TRUE;
|
|
|
|
GST_DEBUG_OBJECT (pad, "event %s marked received",
|
|
|
|
GST_EVENT_TYPE_NAME (event));
|
|
|
|
break;
|
2012-10-05 07:42:59 +00:00
|
|
|
case GST_FLOW_CUSTOM_SUCCESS:
|
|
|
|
/* we can't assume the event is received when it was dropped */
|
|
|
|
GST_DEBUG_OBJECT (pad, "event %s was dropped, mark pending",
|
|
|
|
GST_EVENT_TYPE_NAME (event));
|
|
|
|
GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_PENDING_EVENTS);
|
|
|
|
data->ret = GST_FLOW_OK;
|
|
|
|
break;
|
2013-05-09 08:29:11 +00:00
|
|
|
case GST_FLOW_CUSTOM_SUCCESS_1:
|
|
|
|
/* event was ignored and should be sent later */
|
|
|
|
GST_DEBUG_OBJECT (pad, "event %s was ignored, mark pending",
|
|
|
|
GST_EVENT_TYPE_NAME (event));
|
|
|
|
GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_PENDING_EVENTS);
|
|
|
|
data->ret = GST_FLOW_OK;
|
|
|
|
break;
|
2012-03-14 15:01:15 +00:00
|
|
|
case GST_FLOW_NOT_LINKED:
|
|
|
|
/* not linked is not a problem, we are sticky so the event will be
|
2015-10-31 13:04:27 +00:00
|
|
|
* rescheduled to be sent later on re-link, but only for non-EOS events */
|
2012-10-05 07:42:59 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "pad was not linked, mark pending");
|
2015-10-31 13:04:27 +00:00
|
|
|
if (GST_EVENT_TYPE (event) != GST_EVENT_EOS) {
|
2012-06-04 09:25:47 +00:00
|
|
|
data->ret = GST_FLOW_OK;
|
2015-10-31 13:04:27 +00:00
|
|
|
ev->received = TRUE;
|
|
|
|
}
|
2012-10-05 07:42:59 +00:00
|
|
|
break;
|
2012-03-14 15:01:15 +00:00
|
|
|
default:
|
2012-10-05 07:42:59 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "result %s, mark pending events",
|
|
|
|
gst_flow_get_name (data->ret));
|
2012-03-14 15:01:15 +00:00
|
|
|
GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_PENDING_EVENTS);
|
|
|
|
break;
|
|
|
|
}
|
2012-06-02 14:55:07 +00:00
|
|
|
|
|
|
|
if (data->ret != GST_FLOW_OK && GST_EVENT_TYPE (event) == GST_EVENT_EOS)
|
|
|
|
data->was_eos = TRUE;
|
|
|
|
|
|
|
|
return data->ret == GST_FLOW_OK;
|
2012-03-14 15:01:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* check sticky events and push them when needed. should be called
|
|
|
|
* with pad LOCK */
|
|
|
|
static inline GstFlowReturn
|
2013-05-09 08:29:11 +00:00
|
|
|
check_sticky (GstPad * pad, GstEvent * event)
|
2012-03-14 15:01:15 +00:00
|
|
|
{
|
2013-05-09 08:29:11 +00:00
|
|
|
PushStickyData data = { GST_FLOW_OK, FALSE, event };
|
2012-03-14 15:01:15 +00:00
|
|
|
|
|
|
|
if (G_UNLIKELY (GST_PAD_HAS_PENDING_EVENTS (pad))) {
|
|
|
|
GST_OBJECT_FLAG_UNSET (pad, GST_PAD_FLAG_PENDING_EVENTS);
|
|
|
|
|
|
|
|
GST_DEBUG_OBJECT (pad, "pushing all sticky events");
|
2012-06-02 14:55:07 +00:00
|
|
|
events_foreach (pad, push_sticky, &data);
|
|
|
|
|
|
|
|
/* If there's an EOS event we must push it downstream
|
|
|
|
* even if sending a previous sticky event failed.
|
|
|
|
* Otherwise the pipeline might wait forever for EOS.
|
|
|
|
*
|
|
|
|
* Only do this if pushing another event than the EOS
|
|
|
|
* event failed.
|
|
|
|
*/
|
|
|
|
if (data.ret != GST_FLOW_OK && !data.was_eos) {
|
2012-06-04 09:25:47 +00:00
|
|
|
PadEvent *ev = find_event_by_type (pad, GST_EVENT_EOS, 0);
|
2012-06-02 14:55:07 +00:00
|
|
|
|
2012-06-04 09:25:47 +00:00
|
|
|
if (ev && !ev->received) {
|
|
|
|
data.ret = gst_pad_push_event_unchecked (pad, gst_event_ref (ev->event),
|
|
|
|
GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM);
|
2012-10-05 07:42:59 +00:00
|
|
|
/* the event could have been dropped. Because this can only
|
|
|
|
* happen if the user asked for it, it's not an error */
|
|
|
|
if (data.ret == GST_FLOW_CUSTOM_SUCCESS)
|
|
|
|
data.ret = GST_FLOW_OK;
|
2012-06-02 14:55:07 +00:00
|
|
|
}
|
|
|
|
}
|
2012-03-14 15:01:15 +00:00
|
|
|
}
|
2012-06-02 14:55:07 +00:00
|
|
|
return data.ret;
|
2012-03-14 15:01:15 +00:00
|
|
|
}
|
|
|
|
|
2011-05-19 14:26:06 +00:00
|
|
|
|
2011-11-08 16:32:11 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_query:
|
|
|
|
* @pad: a #GstPad to invoke the default query on.
|
|
|
|
* @query: (transfer none): the #GstQuery to perform.
|
|
|
|
*
|
|
|
|
* Dispatches a query to a pad. The query should have been allocated by the
|
|
|
|
* caller via one of the type-specific allocation functions. The element that
|
|
|
|
* the pad belongs to is responsible for filling the query with an appropriate
|
|
|
|
* response, which should then be parsed with a type-specific query parsing
|
|
|
|
* function.
|
|
|
|
*
|
|
|
|
* Again, the caller is responsible for both the allocation and deallocation of
|
|
|
|
* the query structure.
|
|
|
|
*
|
|
|
|
* Please also note that some queries might need a running pipeline to work.
|
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Returns: %TRUE if the query could be performed.
|
2011-11-08 16:32:11 +00:00
|
|
|
*/
|
|
|
|
gboolean
|
|
|
|
gst_pad_query (GstPad * pad, GstQuery * query)
|
|
|
|
{
|
2011-11-16 11:08:22 +00:00
|
|
|
GstObject *parent;
|
2012-03-14 14:29:12 +00:00
|
|
|
gboolean res, serialized;
|
2011-11-08 16:32:11 +00:00
|
|
|
GstPadQueryFunction func;
|
|
|
|
GstPadProbeType type;
|
|
|
|
GstFlowReturn ret;
|
|
|
|
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
|
|
|
|
g_return_val_if_fail (GST_IS_QUERY (query), FALSE);
|
|
|
|
|
2012-03-14 14:16:56 +00:00
|
|
|
if (GST_PAD_IS_SRC (pad)) {
|
|
|
|
if (G_UNLIKELY (!GST_QUERY_IS_UPSTREAM (query)))
|
|
|
|
goto wrong_direction;
|
2011-11-08 16:32:11 +00:00
|
|
|
type = GST_PAD_PROBE_TYPE_QUERY_UPSTREAM;
|
2012-03-14 14:16:56 +00:00
|
|
|
} else if (GST_PAD_IS_SINK (pad)) {
|
|
|
|
if (G_UNLIKELY (!GST_QUERY_IS_DOWNSTREAM (query)))
|
|
|
|
goto wrong_direction;
|
2011-11-08 16:32:11 +00:00
|
|
|
type = GST_PAD_PROBE_TYPE_QUERY_DOWNSTREAM;
|
2012-03-14 14:16:56 +00:00
|
|
|
} else
|
|
|
|
goto unknown_direction;
|
|
|
|
|
|
|
|
GST_DEBUG_OBJECT (pad, "doing query %p (%s)", query,
|
|
|
|
GST_QUERY_TYPE_NAME (query));
|
2015-03-13 13:10:42 +00:00
|
|
|
GST_TRACER_PAD_QUERY_PRE (pad, query);
|
2011-11-08 16:32:11 +00:00
|
|
|
|
2012-03-14 14:29:12 +00:00
|
|
|
serialized = GST_QUERY_IS_SERIALIZED (query);
|
|
|
|
if (G_UNLIKELY (serialized))
|
|
|
|
GST_PAD_STREAM_LOCK (pad);
|
|
|
|
|
2011-11-08 16:32:11 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
PROBE_PUSH (pad, type | GST_PAD_PROBE_TYPE_PUSH |
|
|
|
|
GST_PAD_PROBE_TYPE_BLOCK, query, probe_stopped);
|
|
|
|
PROBE_PUSH (pad, type | GST_PAD_PROBE_TYPE_PUSH, query, probe_stopped);
|
2011-11-16 11:08:22 +00:00
|
|
|
|
|
|
|
ACQUIRE_PARENT (pad, parent, no_parent);
|
2011-11-08 16:32:11 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
|
|
|
|
if ((func = GST_PAD_QUERYFUNC (pad)) == NULL)
|
|
|
|
goto no_func;
|
|
|
|
|
2011-11-16 16:22:56 +00:00
|
|
|
res = func (pad, parent, query);
|
2011-11-08 16:32:11 +00:00
|
|
|
|
2011-11-16 11:08:22 +00:00
|
|
|
RELEASE_PARENT (parent);
|
|
|
|
|
2011-11-08 16:32:11 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "sent query %p (%s), result %d", query,
|
|
|
|
GST_QUERY_TYPE_NAME (query), res);
|
2016-01-07 22:03:48 +00:00
|
|
|
GST_TRACER_PAD_QUERY_POST (pad, query, res);
|
2011-11-08 16:32:11 +00:00
|
|
|
|
|
|
|
if (res != TRUE)
|
|
|
|
goto query_failed;
|
|
|
|
|
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
PROBE_PUSH (pad, type | GST_PAD_PROBE_TYPE_PULL, query, probe_stopped);
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
|
2012-03-14 14:29:12 +00:00
|
|
|
if (G_UNLIKELY (serialized))
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
|
|
|
|
2011-11-08 16:32:11 +00:00
|
|
|
return res;
|
|
|
|
|
2011-11-16 11:08:22 +00:00
|
|
|
/* ERRORS */
|
2012-03-14 14:16:56 +00:00
|
|
|
wrong_direction:
|
|
|
|
{
|
|
|
|
g_warning ("pad %s:%s query %s in wrong direction",
|
|
|
|
GST_DEBUG_PAD_NAME (pad), GST_QUERY_TYPE_NAME (query));
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
unknown_direction:
|
|
|
|
{
|
|
|
|
g_warning ("pad %s:%s has invalid direction", GST_DEBUG_PAD_NAME (pad));
|
|
|
|
return FALSE;
|
|
|
|
}
|
2011-11-16 11:08:22 +00:00
|
|
|
no_parent:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (pad, "had no parent");
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2012-03-14 14:29:12 +00:00
|
|
|
if (G_UNLIKELY (serialized))
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
2011-11-16 11:08:22 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2011-11-08 16:32:11 +00:00
|
|
|
no_func:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (pad, "had no query function");
|
2011-11-17 11:40:45 +00:00
|
|
|
RELEASE_PARENT (parent);
|
2012-03-14 14:29:12 +00:00
|
|
|
if (G_UNLIKELY (serialized))
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
2011-11-08 16:32:11 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
query_failed:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (pad, "query failed");
|
2012-03-14 14:29:12 +00:00
|
|
|
if (G_UNLIKELY (serialized))
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
2011-11-08 16:32:11 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
probe_stopped:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (pad, "probe stopped: %s", gst_flow_get_name (ret));
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2012-03-14 14:29:12 +00:00
|
|
|
if (G_UNLIKELY (serialized))
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
2012-03-16 20:37:10 +00:00
|
|
|
|
2015-04-29 13:49:17 +00:00
|
|
|
/* if a probe dropped without handling, we don't sent it further but assume
|
|
|
|
* that the probe did not answer the query and return FALSE */
|
|
|
|
if (ret != GST_FLOW_CUSTOM_SUCCESS_1)
|
|
|
|
res = FALSE;
|
|
|
|
else
|
|
|
|
res = TRUE;
|
2012-03-16 20:37:10 +00:00
|
|
|
|
|
|
|
return res;
|
2011-11-08 16:32:11 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gst_pad_peer_query:
|
|
|
|
* @pad: a #GstPad to invoke the peer query on.
|
|
|
|
* @query: (transfer none): the #GstQuery to perform.
|
|
|
|
*
|
|
|
|
* Performs gst_pad_query() on the peer of @pad.
|
|
|
|
*
|
|
|
|
* The caller is responsible for both the allocation and deallocation of
|
|
|
|
* the query structure.
|
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Returns: %TRUE if the query could be performed. This function returns %FALSE
|
2011-11-08 16:32:11 +00:00
|
|
|
* if @pad has no peer.
|
|
|
|
*/
|
|
|
|
gboolean
|
|
|
|
gst_pad_peer_query (GstPad * pad, GstQuery * query)
|
|
|
|
{
|
|
|
|
GstPad *peerpad;
|
|
|
|
GstPadProbeType type;
|
2012-03-14 15:01:15 +00:00
|
|
|
gboolean res, serialized;
|
2011-11-08 16:32:11 +00:00
|
|
|
GstFlowReturn ret;
|
|
|
|
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
|
|
|
|
g_return_val_if_fail (GST_IS_QUERY (query), FALSE);
|
|
|
|
|
2012-03-14 14:16:56 +00:00
|
|
|
if (GST_PAD_IS_SRC (pad)) {
|
|
|
|
if (G_UNLIKELY (!GST_QUERY_IS_DOWNSTREAM (query)))
|
|
|
|
goto wrong_direction;
|
2011-11-08 16:32:11 +00:00
|
|
|
type = GST_PAD_PROBE_TYPE_QUERY_DOWNSTREAM;
|
2012-03-14 14:16:56 +00:00
|
|
|
} else if (GST_PAD_IS_SINK (pad)) {
|
|
|
|
if (G_UNLIKELY (!GST_QUERY_IS_UPSTREAM (query)))
|
|
|
|
goto wrong_direction;
|
2011-11-08 16:32:11 +00:00
|
|
|
type = GST_PAD_PROBE_TYPE_QUERY_UPSTREAM;
|
2012-03-14 14:16:56 +00:00
|
|
|
} else
|
|
|
|
goto unknown_direction;
|
2011-11-08 16:32:11 +00:00
|
|
|
|
|
|
|
GST_DEBUG_OBJECT (pad, "peer query %p (%s)", query,
|
|
|
|
GST_QUERY_TYPE_NAME (query));
|
|
|
|
|
2012-03-14 15:01:15 +00:00
|
|
|
serialized = GST_QUERY_IS_SERIALIZED (query);
|
|
|
|
|
2011-11-08 16:32:11 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
2012-03-14 15:01:15 +00:00
|
|
|
if (GST_PAD_IS_SRC (pad) && serialized) {
|
|
|
|
/* all serialized queries on the srcpad trigger push of
|
|
|
|
* sticky events */
|
2014-01-22 10:10:01 +00:00
|
|
|
if (check_sticky (pad, NULL) != GST_FLOW_OK)
|
2012-03-14 15:01:15 +00:00
|
|
|
goto sticky_failed;
|
|
|
|
}
|
|
|
|
|
2011-11-08 16:32:11 +00:00
|
|
|
PROBE_PUSH (pad, type | GST_PAD_PROBE_TYPE_PUSH |
|
|
|
|
GST_PAD_PROBE_TYPE_BLOCK, query, probe_stopped);
|
|
|
|
PROBE_PUSH (pad, type | GST_PAD_PROBE_TYPE_PUSH, query, probe_stopped);
|
|
|
|
|
|
|
|
peerpad = GST_PAD_PEER (pad);
|
|
|
|
if (G_UNLIKELY (peerpad == NULL))
|
|
|
|
goto no_peer;
|
|
|
|
|
|
|
|
gst_object_ref (peerpad);
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
|
|
|
|
res = gst_pad_query (peerpad, query);
|
|
|
|
|
|
|
|
gst_object_unref (peerpad);
|
|
|
|
|
|
|
|
if (res != TRUE)
|
|
|
|
goto query_failed;
|
|
|
|
|
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
PROBE_PUSH (pad, type | GST_PAD_PROBE_TYPE_PULL, query, probe_stopped);
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
|
|
|
|
return res;
|
|
|
|
|
|
|
|
/* ERRORS */
|
2012-03-14 14:16:56 +00:00
|
|
|
wrong_direction:
|
|
|
|
{
|
|
|
|
g_warning ("pad %s:%s query %s in wrong direction",
|
|
|
|
GST_DEBUG_PAD_NAME (pad), GST_QUERY_TYPE_NAME (query));
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
unknown_direction:
|
|
|
|
{
|
|
|
|
g_warning ("pad %s:%s has invalid direction", GST_DEBUG_PAD_NAME (pad));
|
|
|
|
return FALSE;
|
|
|
|
}
|
2012-03-14 15:01:15 +00:00
|
|
|
sticky_failed:
|
|
|
|
{
|
|
|
|
GST_WARNING_OBJECT (pad, "could not send sticky events");
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2011-11-08 16:32:11 +00:00
|
|
|
no_peer:
|
|
|
|
{
|
2012-10-10 09:34:27 +00:00
|
|
|
GST_INFO_OBJECT (pad, "pad has no peer");
|
2011-11-08 16:32:11 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
query_failed:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (pad, "query failed");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
probe_stopped:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (pad, "probe stopped: %s", gst_flow_get_name (ret));
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2012-03-16 20:37:10 +00:00
|
|
|
|
2015-04-29 13:49:17 +00:00
|
|
|
/* if a probe dropped without handling, we don't sent it further but
|
|
|
|
* assume that the probe did not answer the query and return FALSE */
|
|
|
|
if (ret != GST_FLOW_CUSTOM_SUCCESS_1)
|
|
|
|
res = FALSE;
|
|
|
|
else
|
|
|
|
res = TRUE;
|
2012-03-16 20:37:10 +00:00
|
|
|
|
|
|
|
return res;
|
2011-11-08 16:32:11 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-05-09 10:53:13 +00:00
|
|
|
/**********************************************************************
|
|
|
|
* Data passing functions
|
|
|
|
*/
|
gst/gstpad.c (_gst_real_pad_fixate_accumulator): s/pointer/boxed/.
Original commit message from CVS:
2004-02-05 Andy Wingo <wingo@pobox.com>
* gst/gstpad.c (_gst_real_pad_fixate_accumulator):
s/pointer/boxed/.
* gst/gstmarshal.list (VOID:BOXED, BOXED:BOXED): New marshallers.
* gst/gstpad.c (gst_real_pad_class_init): Use a BOXED:BOXED
marshaller for ::fixate, and VOID:BOXED for ::caps-nego-failed,
with the type=GST_TYPE_CAPS. This allows language bindings to know
what kind of data they're dealing with.
* gst/gstcaps.c (_gst_caps_value_init): GBoxed values initialize
to NULL when g_value_init is called. GstCaps, which rolls its own
type implementation, now does the same instead of allocating empty
caps.
(_gst_caps_initialize, _gst_caps_collect_value,
_gst_caps_lcopy_value): Provide collect_value and lcopy_value type
table methods. This allows G_VALUE_COLLECT to work.
2004-02-05 Andy Wingo <wingo@pobox.com>
* configure.ac:
* testsuite/Makefile.am (SUBDIRS):
* testsuite/ghostpads/Makefile.am:
* testsuite/ghostpads/ghostpads.c: A new test for ghost pads.
* gst/gstpad.c (gst_pad_add_ghost_pad, gst_pad_remove_ghost_pad):
These two routines are the only ones that set
GST_GPAD_REALPAD(gpad), the ghost pad list, and the ghost pad's
pad template. They should be made static, depending on ABI needs.
(gst_real_pad_dispose): Handle the case of ghost pads without a
parent. Assert after dealing with ghost pads that the ghost pad
list is empty.
(gst_ghost_pad_class_init): New property added, ::real-pad. Can be
set after creation.
(gst_ghost_pad_dispose): Set ::real-pad to NULL.
(gst_ghost_pad_set_property, gst_ghost_pad_get_property): New
functions. set_property will call add_ghost_pad/remove_ghost_pad
as appropriate.
(gst_ghost_pad_new): All the work is offloaded to g_object_new.
* gst/gstelement.c (gst_element_add_pad): Handle ghost pads as well.
(gst_element_add_ghost_pad): Remove code duplicated from _add_pad.
(gst_element_remove_pad): Handle ghost pads as well.
(gst_element_remove_ghost_pad): Deprecated (could be removed,
depending on API-stability needs).
2004-02-05 Andy Wingo <wingo@pobox.com>
* gst/gstbin.[ch]: (gst_bin_get_by_interface): GTypes are scalars,
of course they're const
2004-02-05 13:51:26 +00:00
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
/* this is the chain function that does not perform the additional argument
|
|
|
|
* checking for that little extra speed.
|
|
|
|
*/
|
|
|
|
static inline GstFlowReturn
|
2011-11-01 00:13:35 +00:00
|
|
|
gst_pad_chain_data_unchecked (GstPad * pad, GstPadProbeType type, void *data)
|
2001-01-20 02:57:46 +00:00
|
|
|
{
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
GstFlowReturn ret;
|
2011-11-17 11:40:45 +00:00
|
|
|
GstObject *parent;
|
2015-04-29 13:49:17 +00:00
|
|
|
gboolean handled = FALSE;
|
2001-01-20 02:57:46 +00:00
|
|
|
|
2010-09-23 12:34:54 +00:00
|
|
|
GST_PAD_STREAM_LOCK (pad);
|
|
|
|
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
|
2005-05-09 10:53:13 +00:00
|
|
|
goto flushing;
|
2001-01-20 02:57:46 +00:00
|
|
|
|
2012-06-04 09:46:42 +00:00
|
|
|
if (G_UNLIKELY (GST_PAD_IS_EOS (pad)))
|
|
|
|
goto eos;
|
|
|
|
|
2012-02-08 11:57:11 +00:00
|
|
|
if (G_UNLIKELY (GST_PAD_MODE (pad) != GST_PAD_MODE_PUSH))
|
|
|
|
goto wrong_mode;
|
|
|
|
|
2015-10-20 14:29:42 +00:00
|
|
|
#ifdef GST_ENABLE_EXTRA_CHECKS
|
2013-09-26 09:32:50 +00:00
|
|
|
if (G_UNLIKELY (pad->priv->last_cookie != pad->priv->events_cookie)) {
|
|
|
|
if (!find_event_by_type (pad, GST_EVENT_STREAM_START, 0)) {
|
|
|
|
g_warning (G_STRLOC
|
|
|
|
":%s:<%s:%s> Got data flow before stream-start event",
|
|
|
|
G_STRFUNC, GST_DEBUG_PAD_NAME (pad));
|
|
|
|
}
|
|
|
|
if (!find_event_by_type (pad, GST_EVENT_SEGMENT, 0)) {
|
|
|
|
g_warning (G_STRLOC
|
|
|
|
":%s:<%s:%s> Got data flow before segment event",
|
|
|
|
G_STRFUNC, GST_DEBUG_PAD_NAME (pad));
|
|
|
|
}
|
|
|
|
pad->priv->last_cookie = pad->priv->events_cookie;
|
2013-05-09 09:05:50 +00:00
|
|
|
}
|
2013-05-10 14:03:34 +00:00
|
|
|
#endif
|
2013-05-09 09:05:50 +00:00
|
|
|
|
2015-04-29 13:49:17 +00:00
|
|
|
PROBE_HANDLE (pad, type | GST_PAD_PROBE_TYPE_BLOCK, data, probe_stopped,
|
|
|
|
probe_handled);
|
2011-11-04 17:19:14 +00:00
|
|
|
|
2015-04-29 13:49:17 +00:00
|
|
|
PROBE_HANDLE (pad, type, data, probe_stopped, probe_handled);
|
2011-05-26 16:21:09 +00:00
|
|
|
|
2015-06-19 04:05:44 +00:00
|
|
|
ACQUIRE_PARENT (pad, parent, no_parent);
|
2011-05-31 17:16:09 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
gst/: Removed atomic operations, use existing LOCK.
Original commit message from CVS:
* gst/gstpad.c: (_gst_do_pass_data_accumulator),
(default_have_data), (gst_pad_class_init), (gst_pad_init),
(gst_pad_emit_have_data_signal), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range), (gst_pad_push_event), (gst_pad_send_event):
* gst/gstpad.h:
* gst/gstutils.c: (gst_atomic_int_set), (gst_pad_add_data_probe),
(gst_pad_add_event_probe), (gst_pad_add_buffer_probe),
(gst_pad_remove_data_probe), (gst_pad_remove_event_probe),
(gst_pad_remove_buffer_probe):
Removed atomic operations, use existing LOCK.
Move exception handling out of main code path.
2005-06-30 09:23:54 +00:00
|
|
|
|
2005-08-21 15:01:18 +00:00
|
|
|
/* NOTE: we read the chainfunc unlocked.
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
* we cannot hold the lock for the pad so we might send
|
2005-05-09 10:53:13 +00:00
|
|
|
* the data to the wrong function. This is not really a
|
|
|
|
* problem since functions are assigned at creation time
|
|
|
|
* and don't change that often... */
|
2011-11-01 00:13:35 +00:00
|
|
|
if (G_LIKELY (type & GST_PAD_PROBE_TYPE_BUFFER)) {
|
2009-05-12 11:10:55 +00:00
|
|
|
GstPadChainFunction chainfunc;
|
2002-05-26 21:54:27 +00:00
|
|
|
|
2009-05-12 11:10:55 +00:00
|
|
|
if (G_UNLIKELY ((chainfunc = GST_PAD_CHAINFUNC (pad)) == NULL))
|
|
|
|
goto no_function;
|
Remove old probes, add new g-signal-based probes and some utility functions.
Original commit message from CVS:
* docs/gst/gstreamer-sections.txt:
* docs/gst/tmpl/gstpad.sgml:
* docs/gst/tmpl/gstprobe.sgml:
* gst/Makefile.am:
* gst/gstpad.c: (_gst_do_pass_data_accumulator),
(gst_pad_class_init), (gst_pad_init), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_push_event), (gst_pad_send_event):
* gst/gstpad.h:
* gst/gstutils.c: (gst_pad_add_data_probe),
(gst_pad_add_event_probe), (gst_pad_add_buffer_probe),
(gst_pad_remove_data_probe), (gst_pad_remove_event_probe),
(gst_pad_remove_buffer_probe):
* gst/gstutils.h:
Remove old probes, add new g-signal-based probes and some utility
functions.
2005-06-29 15:51:25 +00:00
|
|
|
|
2015-05-15 13:57:14 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_SCHEDULING, pad,
|
2011-10-07 14:36:10 +00:00
|
|
|
"calling chainfunction &%s with buffer %" GST_PTR_FORMAT,
|
|
|
|
GST_DEBUG_FUNCPTR_NAME (chainfunc), GST_BUFFER (data));
|
2002-05-26 21:54:27 +00:00
|
|
|
|
2011-11-17 11:40:45 +00:00
|
|
|
ret = chainfunc (pad, parent, GST_BUFFER_CAST (data));
|
2009-05-12 11:10:55 +00:00
|
|
|
|
2015-05-15 13:57:14 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_SCHEDULING, pad,
|
2011-04-11 09:05:24 +00:00
|
|
|
"called chainfunction &%s with buffer %p, returned %s",
|
|
|
|
GST_DEBUG_FUNCPTR_NAME (chainfunc), data, gst_flow_get_name (ret));
|
2009-05-12 11:10:55 +00:00
|
|
|
} else {
|
|
|
|
GstPadChainListFunction chainlistfunc;
|
|
|
|
|
|
|
|
if (G_UNLIKELY ((chainlistfunc = GST_PAD_CHAINLISTFUNC (pad)) == NULL))
|
2011-05-26 14:48:14 +00:00
|
|
|
goto no_function;
|
2009-05-12 11:10:55 +00:00
|
|
|
|
2015-05-15 13:57:14 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_SCHEDULING, pad,
|
2009-05-12 11:10:55 +00:00
|
|
|
"calling chainlistfunction &%s",
|
|
|
|
GST_DEBUG_FUNCPTR_NAME (chainlistfunc));
|
|
|
|
|
2011-11-17 11:40:45 +00:00
|
|
|
ret = chainlistfunc (pad, parent, GST_BUFFER_LIST_CAST (data));
|
2009-05-12 11:10:55 +00:00
|
|
|
|
2015-05-15 13:57:14 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_SCHEDULING, pad,
|
2009-05-12 11:10:55 +00:00
|
|
|
"called chainlistfunction &%s, returned %s",
|
|
|
|
GST_DEBUG_FUNCPTR_NAME (chainlistfunc), gst_flow_get_name (ret));
|
|
|
|
}
|
2005-08-21 15:01:18 +00:00
|
|
|
|
2015-06-19 04:05:44 +00:00
|
|
|
RELEASE_PARENT (parent);
|
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
2010-09-23 12:34:54 +00:00
|
|
|
|
2005-05-09 10:53:13 +00:00
|
|
|
return ret;
|
2004-03-13 15:27:01 +00:00
|
|
|
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
/* ERRORS */
|
2011-05-31 17:16:09 +00:00
|
|
|
flushing:
|
2005-05-09 10:53:13 +00:00
|
|
|
{
|
2011-05-31 17:16:09 +00:00
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
|
|
|
"chaining, but pad was flushing");
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
2011-10-17 19:37:17 +00:00
|
|
|
gst_mini_object_unref (GST_MINI_OBJECT_CAST (data));
|
2012-02-08 14:16:46 +00:00
|
|
|
return GST_FLOW_FLUSHING;
|
2011-05-31 17:16:09 +00:00
|
|
|
}
|
2012-06-04 09:46:42 +00:00
|
|
|
eos:
|
|
|
|
{
|
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "chaining, but pad was EOS");
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
|
|
|
gst_mini_object_unref (GST_MINI_OBJECT_CAST (data));
|
|
|
|
return GST_FLOW_EOS;
|
|
|
|
}
|
2012-02-08 11:57:11 +00:00
|
|
|
wrong_mode:
|
|
|
|
{
|
2012-02-17 23:03:41 +00:00
|
|
|
g_critical ("chain on pad %s:%s but it was not in push mode",
|
|
|
|
GST_DEBUG_PAD_NAME (pad));
|
2012-02-08 11:57:11 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
|
|
|
gst_mini_object_unref (GST_MINI_OBJECT_CAST (data));
|
|
|
|
return GST_FLOW_ERROR;
|
|
|
|
}
|
2015-04-29 13:49:17 +00:00
|
|
|
probe_handled:
|
|
|
|
handled = TRUE;
|
|
|
|
/* PASSTHROUGH */
|
2011-05-31 17:16:09 +00:00
|
|
|
probe_stopped:
|
|
|
|
{
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
2015-04-29 13:49:17 +00:00
|
|
|
/* We unref the buffer, except if the probe handled it (CUSTOM_SUCCESS_1) */
|
|
|
|
if (!handled)
|
|
|
|
gst_mini_object_unref (GST_MINI_OBJECT_CAST (data));
|
2011-05-26 16:21:09 +00:00
|
|
|
|
|
|
|
switch (ret) {
|
|
|
|
case GST_FLOW_CUSTOM_SUCCESS:
|
2015-04-29 13:49:17 +00:00
|
|
|
case GST_FLOW_CUSTOM_SUCCESS_1:
|
|
|
|
GST_DEBUG_OBJECT (pad, "dropped or handled buffer");
|
2011-05-26 16:21:09 +00:00
|
|
|
ret = GST_FLOW_OK;
|
|
|
|
break;
|
|
|
|
default:
|
2013-12-07 14:40:32 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "an error occurred %s", gst_flow_get_name (ret));
|
2011-05-26 16:21:09 +00:00
|
|
|
break;
|
|
|
|
}
|
2011-05-05 11:10:42 +00:00
|
|
|
return ret;
|
|
|
|
}
|
2015-06-19 04:05:44 +00:00
|
|
|
no_parent:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (pad, "No parent when chaining %" GST_PTR_FORMAT, data);
|
|
|
|
gst_mini_object_unref (GST_MINI_OBJECT_CAST (data));
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
|
|
|
return GST_FLOW_FLUSHING;
|
|
|
|
}
|
2005-05-09 10:53:13 +00:00
|
|
|
no_function:
|
|
|
|
{
|
2015-06-19 04:05:44 +00:00
|
|
|
RELEASE_PARENT (parent);
|
2011-06-02 09:01:31 +00:00
|
|
|
gst_mini_object_unref (GST_MINI_OBJECT_CAST (data));
|
2012-02-17 23:03:41 +00:00
|
|
|
g_critical ("chain on pad %s:%s but it has no chainfunction",
|
|
|
|
GST_DEBUG_PAD_NAME (pad));
|
2011-05-31 17:16:09 +00:00
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
2006-07-06 15:21:46 +00:00
|
|
|
return GST_FLOW_NOT_SUPPORTED;
|
2002-05-26 21:54:27 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-06-12 09:28:35 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_chain:
|
2006-07-06 15:21:46 +00:00
|
|
|
* @pad: a sink #GstPad, returns GST_FLOW_ERROR if not.
|
2010-12-07 18:35:04 +00:00
|
|
|
* @buffer: (transfer full): the #GstBuffer to send, return GST_FLOW_ERROR
|
|
|
|
* if not.
|
2006-06-12 09:28:35 +00:00
|
|
|
*
|
|
|
|
* Chain a buffer to @pad.
|
|
|
|
*
|
2012-02-08 14:16:46 +00:00
|
|
|
* The function returns #GST_FLOW_FLUSHING if the pad was flushing.
|
2006-07-06 15:21:46 +00:00
|
|
|
*
|
2011-06-08 10:58:29 +00:00
|
|
|
* If the buffer type is not acceptable for @pad (as negotiated with a
|
2013-12-07 14:38:19 +00:00
|
|
|
* preceding GST_EVENT_CAPS event), this function returns
|
2011-06-08 10:58:29 +00:00
|
|
|
* #GST_FLOW_NOT_NEGOTIATED.
|
2006-07-06 15:21:46 +00:00
|
|
|
*
|
|
|
|
* The function proceeds calling the chain function installed on @pad (see
|
|
|
|
* gst_pad_set_chain_function()) and the return value of that function is
|
|
|
|
* returned to the caller. #GST_FLOW_NOT_SUPPORTED is returned if @pad has no
|
|
|
|
* chain function.
|
|
|
|
*
|
|
|
|
* In all cases, success or failure, the caller loses its reference to @buffer
|
|
|
|
* after calling this function.
|
|
|
|
*
|
2006-06-12 09:28:35 +00:00
|
|
|
* Returns: a #GstFlowReturn from the pad.
|
|
|
|
*
|
|
|
|
* MT safe.
|
|
|
|
*/
|
|
|
|
GstFlowReturn
|
|
|
|
gst_pad_chain (GstPad * pad, GstBuffer * buffer)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
|
gst/gstbin.c: Keep track of pads that are being linked/unlinked and resync the state changes.
Original commit message from CVS:
Base on Patch by: Olivier Crete <tester at tester dot ca>
* gst/gstbin.c: (gst_bin_init), (gst_bin_add_func),
(gst_bin_remove_func), (update_degree),
(gst_bin_sort_iterator_new), (gst_bin_handle_message_func):
Keep track of pads that are being linked/unlinked and resync the state
changes.
* gst/gstpad.c: (gst_pad_get_direction),
(gst_pad_set_chain_function), (gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link),
(gst_pad_event_default_dispatch), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range):
Some code cleanups, use macros to check pad direction.
Don't need to take the lock on the pad direction.
Post structure change when pads are linked/unlinked.
Change some checks into _return_if_fail().
* tests/check/gst/gstbin.c:
(test_link_structure_change_state_changed_sync_cb),
(GST_START_TEST), (gst_bin_suite):
Add testcase for pad link/unlinke resync during a state change.
Fixes #510354.
2008-10-06 16:15:02 +00:00
|
|
|
g_return_val_if_fail (GST_PAD_IS_SINK (pad), GST_FLOW_ERROR);
|
2006-06-12 09:28:35 +00:00
|
|
|
g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR);
|
|
|
|
|
2011-11-04 17:19:14 +00:00
|
|
|
return gst_pad_chain_data_unchecked (pad,
|
|
|
|
GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_PUSH, buffer);
|
2006-06-12 09:28:35 +00:00
|
|
|
}
|
|
|
|
|
2011-05-26 14:48:14 +00:00
|
|
|
static GstFlowReturn
|
2011-11-17 11:40:45 +00:00
|
|
|
gst_pad_chain_list_default (GstPad * pad, GstObject * parent,
|
|
|
|
GstBufferList * list)
|
2011-05-26 14:48:14 +00:00
|
|
|
{
|
|
|
|
guint i, len;
|
|
|
|
GstBuffer *buffer;
|
|
|
|
GstFlowReturn ret;
|
|
|
|
|
2015-03-28 14:45:35 +00:00
|
|
|
GST_INFO_OBJECT (pad, "chaining each buffer in list individually");
|
2011-05-26 14:48:14 +00:00
|
|
|
|
2011-10-29 06:24:12 +00:00
|
|
|
len = gst_buffer_list_length (list);
|
2011-05-26 14:48:14 +00:00
|
|
|
|
|
|
|
ret = GST_FLOW_OK;
|
|
|
|
for (i = 0; i < len; i++) {
|
|
|
|
buffer = gst_buffer_list_get (list, i);
|
2011-06-02 09:01:31 +00:00
|
|
|
ret =
|
2011-11-04 17:19:14 +00:00
|
|
|
gst_pad_chain_data_unchecked (pad,
|
|
|
|
GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_PUSH,
|
2011-06-02 09:01:31 +00:00
|
|
|
gst_buffer_ref (buffer));
|
2011-05-26 14:48:14 +00:00
|
|
|
if (ret != GST_FLOW_OK)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
gst_buffer_list_unref (list);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
/**
|
2009-05-12 11:10:55 +00:00
|
|
|
* gst_pad_chain_list:
|
|
|
|
* @pad: a sink #GstPad, returns GST_FLOW_ERROR if not.
|
2010-12-07 18:35:04 +00:00
|
|
|
* @list: (transfer full): the #GstBufferList to send, return GST_FLOW_ERROR
|
|
|
|
* if not.
|
2006-07-06 15:21:46 +00:00
|
|
|
*
|
2009-05-12 11:10:55 +00:00
|
|
|
* Chain a bufferlist to @pad.
|
2006-07-06 15:21:46 +00:00
|
|
|
*
|
2012-02-08 14:16:46 +00:00
|
|
|
* The function returns #GST_FLOW_FLUSHING if the pad was flushing.
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
*
|
2011-06-08 10:58:29 +00:00
|
|
|
* If @pad was not negotiated properly with a CAPS event, this function
|
|
|
|
* returns #GST_FLOW_NOT_NEGOTIATED.
|
2006-07-06 15:21:46 +00:00
|
|
|
*
|
2009-05-12 11:10:55 +00:00
|
|
|
* The function proceeds calling the chainlist function installed on @pad (see
|
|
|
|
* gst_pad_set_chain_list_function()) and the return value of that function is
|
|
|
|
* returned to the caller. #GST_FLOW_NOT_SUPPORTED is returned if @pad has no
|
|
|
|
* chainlist function.
|
2006-07-06 15:21:46 +00:00
|
|
|
*
|
2009-05-12 11:10:55 +00:00
|
|
|
* In all cases, success or failure, the caller loses its reference to @list
|
2006-07-06 15:21:46 +00:00
|
|
|
* after calling this function.
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
*
|
|
|
|
* MT safe.
|
2009-05-22 08:33:02 +00:00
|
|
|
*
|
2009-05-22 09:24:22 +00:00
|
|
|
* Returns: a #GstFlowReturn from the pad.
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
*/
|
|
|
|
GstFlowReturn
|
2009-05-12 11:10:55 +00:00
|
|
|
gst_pad_chain_list (GstPad * pad, GstBufferList * list)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
|
|
|
|
g_return_val_if_fail (GST_PAD_IS_SINK (pad), GST_FLOW_ERROR);
|
|
|
|
g_return_val_if_fail (GST_IS_BUFFER_LIST (list), GST_FLOW_ERROR);
|
|
|
|
|
2011-11-04 17:19:14 +00:00
|
|
|
return gst_pad_chain_data_unchecked (pad,
|
|
|
|
GST_PAD_PROBE_TYPE_BUFFER_LIST | GST_PAD_PROBE_TYPE_PUSH, list);
|
2009-05-12 11:10:55 +00:00
|
|
|
}
|
|
|
|
|
2011-05-26 15:39:17 +00:00
|
|
|
static GstFlowReturn
|
2011-11-01 00:13:35 +00:00
|
|
|
gst_pad_push_data (GstPad * pad, GstPadProbeType type, void *data)
|
2011-05-26 15:39:17 +00:00
|
|
|
{
|
|
|
|
GstPad *peer;
|
|
|
|
GstFlowReturn ret;
|
2015-04-29 13:49:17 +00:00
|
|
|
gboolean handled = FALSE;
|
2011-05-26 15:39:17 +00:00
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
|
|
|
|
goto flushing;
|
|
|
|
|
2012-06-04 09:46:42 +00:00
|
|
|
if (G_UNLIKELY (GST_PAD_IS_EOS (pad)))
|
|
|
|
goto eos;
|
|
|
|
|
2012-02-08 11:57:11 +00:00
|
|
|
if (G_UNLIKELY (GST_PAD_MODE (pad) != GST_PAD_MODE_PUSH))
|
|
|
|
goto wrong_mode;
|
|
|
|
|
2015-10-20 14:29:42 +00:00
|
|
|
#ifdef GST_ENABLE_EXTRA_CHECKS
|
2013-09-26 09:32:50 +00:00
|
|
|
if (G_UNLIKELY (pad->priv->last_cookie != pad->priv->events_cookie)) {
|
|
|
|
if (!find_event_by_type (pad, GST_EVENT_STREAM_START, 0)) {
|
|
|
|
g_warning (G_STRLOC
|
|
|
|
":%s:<%s:%s> Got data flow before stream-start event",
|
|
|
|
G_STRFUNC, GST_DEBUG_PAD_NAME (pad));
|
|
|
|
}
|
|
|
|
if (!find_event_by_type (pad, GST_EVENT_SEGMENT, 0)) {
|
|
|
|
g_warning (G_STRLOC
|
|
|
|
":%s:<%s:%s> Got data flow before segment event",
|
|
|
|
G_STRFUNC, GST_DEBUG_PAD_NAME (pad));
|
|
|
|
}
|
|
|
|
pad->priv->last_cookie = pad->priv->events_cookie;
|
2013-05-09 09:05:50 +00:00
|
|
|
}
|
2013-05-10 14:03:34 +00:00
|
|
|
#endif
|
2013-05-09 09:05:50 +00:00
|
|
|
|
2013-05-09 08:29:11 +00:00
|
|
|
if (G_UNLIKELY ((ret = check_sticky (pad, NULL))) != GST_FLOW_OK)
|
2012-03-09 10:53:54 +00:00
|
|
|
goto events_error;
|
2011-11-22 17:32:51 +00:00
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
/* do block probes */
|
2015-04-29 13:49:17 +00:00
|
|
|
PROBE_HANDLE (pad, type | GST_PAD_PROBE_TYPE_BLOCK, data, probe_stopped,
|
|
|
|
probe_handled);
|
2011-05-31 17:16:09 +00:00
|
|
|
|
2012-08-30 17:15:42 +00:00
|
|
|
/* recheck sticky events because the probe might have cause a relink */
|
2013-05-09 08:29:11 +00:00
|
|
|
if (G_UNLIKELY ((ret = check_sticky (pad, NULL))) != GST_FLOW_OK)
|
2012-08-30 17:15:42 +00:00
|
|
|
goto events_error;
|
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
/* do post-blocking probes */
|
2015-04-29 13:49:17 +00:00
|
|
|
PROBE_HANDLE (pad, type, data, probe_stopped, probe_handled);
|
2011-05-31 17:16:09 +00:00
|
|
|
|
2017-08-02 18:02:32 +00:00
|
|
|
/* recheck sticky events because the probe might have cause a relink */
|
|
|
|
if (G_UNLIKELY ((ret = check_sticky (pad, NULL))) != GST_FLOW_OK)
|
|
|
|
goto events_error;
|
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
if (G_UNLIKELY ((peer = GST_PAD_PEER (pad)) == NULL))
|
|
|
|
goto not_linked;
|
|
|
|
|
|
|
|
/* take ref to peer pad before releasing the lock */
|
|
|
|
gst_object_ref (peer);
|
|
|
|
pad->priv->using++;
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2011-05-26 15:39:17 +00:00
|
|
|
|
2011-06-02 09:01:31 +00:00
|
|
|
ret = gst_pad_chain_data_unchecked (peer, type, data);
|
2015-08-02 15:38:14 +00:00
|
|
|
data = NULL;
|
2011-05-26 15:39:17 +00:00
|
|
|
|
|
|
|
gst_object_unref (peer);
|
|
|
|
|
2011-06-01 17:27:55 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = ret;
|
2011-06-01 17:27:55 +00:00
|
|
|
pad->priv->using--;
|
|
|
|
if (pad->priv->using == 0) {
|
|
|
|
/* pad is not active anymore, trigger idle callbacks */
|
2011-11-08 11:47:33 +00:00
|
|
|
PROBE_NO_DATA (pad, GST_PAD_PROBE_TYPE_PUSH | GST_PAD_PROBE_TYPE_IDLE,
|
2011-10-07 09:49:19 +00:00
|
|
|
probe_stopped, ret);
|
2011-06-01 17:27:55 +00:00
|
|
|
}
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2011-05-26 15:50:15 +00:00
|
|
|
|
2011-05-26 15:39:17 +00:00
|
|
|
return ret;
|
|
|
|
|
|
|
|
/* ERROR recovery here */
|
2011-05-31 17:16:09 +00:00
|
|
|
/* ERRORS */
|
|
|
|
flushing:
|
|
|
|
{
|
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
|
|
|
"pushing, but pad was flushing");
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = GST_FLOW_FLUSHING;
|
2011-05-31 17:16:09 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2011-06-02 09:01:31 +00:00
|
|
|
gst_mini_object_unref (GST_MINI_OBJECT_CAST (data));
|
2012-02-08 14:16:46 +00:00
|
|
|
return GST_FLOW_FLUSHING;
|
2011-05-31 17:16:09 +00:00
|
|
|
}
|
2012-06-04 09:46:42 +00:00
|
|
|
eos:
|
|
|
|
{
|
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "pushing, but pad was EOS");
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = GST_FLOW_EOS;
|
2012-06-04 09:46:42 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
gst_mini_object_unref (GST_MINI_OBJECT_CAST (data));
|
|
|
|
return GST_FLOW_EOS;
|
|
|
|
}
|
2012-02-08 11:57:11 +00:00
|
|
|
wrong_mode:
|
|
|
|
{
|
2012-02-17 23:03:41 +00:00
|
|
|
g_critical ("pushing on pad %s:%s but it was not activated in push mode",
|
|
|
|
GST_DEBUG_PAD_NAME (pad));
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = GST_FLOW_ERROR;
|
2012-02-08 11:57:11 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
gst_mini_object_unref (GST_MINI_OBJECT_CAST (data));
|
|
|
|
return GST_FLOW_ERROR;
|
|
|
|
}
|
2011-11-22 17:32:51 +00:00
|
|
|
events_error:
|
|
|
|
{
|
2011-11-28 12:54:43 +00:00
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
|
|
|
"error pushing events, return %s", gst_flow_get_name (ret));
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = ret;
|
2011-11-22 17:32:51 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
gst_mini_object_unref (GST_MINI_OBJECT_CAST (data));
|
|
|
|
return ret;
|
|
|
|
}
|
2015-04-29 13:49:17 +00:00
|
|
|
probe_handled:
|
|
|
|
handled = TRUE;
|
|
|
|
/* PASSTHROUGH */
|
2011-05-31 17:16:09 +00:00
|
|
|
probe_stopped:
|
2011-05-26 15:39:17 +00:00
|
|
|
{
|
2011-05-31 17:16:09 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2015-04-29 13:49:17 +00:00
|
|
|
if (data != NULL && !handled)
|
2014-08-06 09:32:39 +00:00
|
|
|
gst_mini_object_unref (GST_MINI_OBJECT_CAST (data));
|
2011-05-26 15:39:17 +00:00
|
|
|
|
|
|
|
switch (ret) {
|
|
|
|
case GST_FLOW_CUSTOM_SUCCESS:
|
2015-04-29 13:49:17 +00:00
|
|
|
case GST_FLOW_CUSTOM_SUCCESS_1:
|
|
|
|
GST_DEBUG_OBJECT (pad, "dropped or handled buffer");
|
2011-05-26 15:39:17 +00:00
|
|
|
ret = GST_FLOW_OK;
|
|
|
|
break;
|
|
|
|
default:
|
2013-12-07 14:40:32 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "an error occurred %s", gst_flow_get_name (ret));
|
2011-05-26 15:39:17 +00:00
|
|
|
break;
|
|
|
|
}
|
2015-04-29 13:49:17 +00:00
|
|
|
pad->ABI.abi.last_flowret = ret;
|
2011-05-26 15:39:17 +00:00
|
|
|
return ret;
|
|
|
|
}
|
2011-05-31 17:16:09 +00:00
|
|
|
not_linked:
|
|
|
|
{
|
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
|
|
|
"pushing, but it was not linked");
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = GST_FLOW_NOT_LINKED;
|
2011-05-31 17:16:09 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2011-06-02 09:01:31 +00:00
|
|
|
gst_mini_object_unref (GST_MINI_OBJECT_CAST (data));
|
2011-05-31 17:16:09 +00:00
|
|
|
return GST_FLOW_NOT_LINKED;
|
|
|
|
}
|
2011-05-26 15:39:17 +00:00
|
|
|
}
|
|
|
|
|
2009-05-12 11:10:55 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_push:
|
|
|
|
* @pad: a source #GstPad, returns #GST_FLOW_ERROR if not.
|
2010-12-07 18:35:04 +00:00
|
|
|
* @buffer: (transfer full): the #GstBuffer to push returns GST_FLOW_ERROR
|
|
|
|
* if not.
|
2009-05-12 11:10:55 +00:00
|
|
|
*
|
|
|
|
* Pushes a buffer to the peer of @pad.
|
|
|
|
*
|
2011-06-08 10:58:29 +00:00
|
|
|
* This function will call installed block probes before triggering any
|
|
|
|
* installed data probes.
|
2009-05-12 11:10:55 +00:00
|
|
|
*
|
|
|
|
* The function proceeds calling gst_pad_chain() on the peer pad and returns
|
|
|
|
* the value from that function. If @pad has no peer, #GST_FLOW_NOT_LINKED will
|
|
|
|
* be returned.
|
|
|
|
*
|
|
|
|
* In all cases, success or failure, the caller loses its reference to @buffer
|
|
|
|
* after calling this function.
|
|
|
|
*
|
|
|
|
* Returns: a #GstFlowReturn from the peer pad.
|
|
|
|
*
|
|
|
|
* MT safe.
|
|
|
|
*/
|
|
|
|
GstFlowReturn
|
|
|
|
gst_pad_push (GstPad * pad, GstBuffer * buffer)
|
2013-10-24 12:47:48 +00:00
|
|
|
{
|
|
|
|
GstFlowReturn res;
|
|
|
|
|
2009-05-12 11:10:55 +00:00
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
|
|
|
|
g_return_val_if_fail (GST_PAD_IS_SRC (pad), GST_FLOW_ERROR);
|
|
|
|
g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR);
|
|
|
|
|
2013-10-28 20:39:52 +00:00
|
|
|
GST_TRACER_PAD_PUSH_PRE (pad, buffer);
|
|
|
|
res = gst_pad_push_data (pad,
|
2011-11-04 17:19:14 +00:00
|
|
|
GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_PUSH, buffer);
|
2013-10-28 20:39:52 +00:00
|
|
|
GST_TRACER_PAD_PUSH_POST (pad, res);
|
|
|
|
return res;
|
2009-05-12 11:10:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gst_pad_push_list:
|
|
|
|
* @pad: a source #GstPad, returns #GST_FLOW_ERROR if not.
|
2010-12-07 18:35:04 +00:00
|
|
|
* @list: (transfer full): the #GstBufferList to push returns GST_FLOW_ERROR
|
|
|
|
* if not.
|
2009-05-12 11:10:55 +00:00
|
|
|
*
|
|
|
|
* Pushes a buffer list to the peer of @pad.
|
|
|
|
*
|
2011-06-08 10:58:29 +00:00
|
|
|
* This function will call installed block probes before triggering any
|
|
|
|
* installed data probes.
|
2009-05-12 11:10:55 +00:00
|
|
|
*
|
|
|
|
* The function proceeds calling the chain function on the peer pad and returns
|
|
|
|
* the value from that function. If @pad has no peer, #GST_FLOW_NOT_LINKED will
|
|
|
|
* be returned. If the peer pad does not have any installed chainlist function
|
|
|
|
* every group buffer of the list will be merged into a normal #GstBuffer and
|
|
|
|
* chained via gst_pad_chain().
|
|
|
|
*
|
|
|
|
* In all cases, success or failure, the caller loses its reference to @list
|
|
|
|
* after calling this function.
|
|
|
|
*
|
|
|
|
* Returns: a #GstFlowReturn from the peer pad.
|
|
|
|
*
|
|
|
|
* MT safe.
|
|
|
|
*/
|
|
|
|
GstFlowReturn
|
|
|
|
gst_pad_push_list (GstPad * pad, GstBufferList * list)
|
2013-10-27 16:04:32 +00:00
|
|
|
{
|
|
|
|
GstFlowReturn res;
|
|
|
|
|
2009-05-12 11:10:55 +00:00
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
|
|
|
|
g_return_val_if_fail (GST_PAD_IS_SRC (pad), GST_FLOW_ERROR);
|
|
|
|
g_return_val_if_fail (GST_IS_BUFFER_LIST (list), GST_FLOW_ERROR);
|
|
|
|
|
2013-10-28 20:39:52 +00:00
|
|
|
GST_TRACER_PAD_PUSH_LIST_PRE (pad, list);
|
|
|
|
res = gst_pad_push_data (pad,
|
2011-11-04 17:19:14 +00:00
|
|
|
GST_PAD_PROBE_TYPE_BUFFER_LIST | GST_PAD_PROBE_TYPE_PUSH, list);
|
2013-10-28 20:39:52 +00:00
|
|
|
GST_TRACER_PAD_PUSH_LIST_POST (pad, res);
|
|
|
|
return res;
|
2009-05-12 11:10:55 +00:00
|
|
|
}
|
|
|
|
|
2010-09-08 06:37:42 +00:00
|
|
|
static GstFlowReturn
|
|
|
|
gst_pad_get_range_unchecked (GstPad * pad, guint64 offset, guint size,
|
2011-05-06 09:14:02 +00:00
|
|
|
GstBuffer ** buffer)
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
{
|
|
|
|
GstFlowReturn ret;
|
|
|
|
GstPadGetRangeFunction getrangefunc;
|
2011-11-17 11:40:45 +00:00
|
|
|
GstObject *parent;
|
2012-03-20 12:14:55 +00:00
|
|
|
GstBuffer *res_buf;
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
|
2005-11-21 17:21:15 +00:00
|
|
|
GST_PAD_STREAM_LOCK (pad);
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
goto flushing;
|
2011-11-04 17:19:14 +00:00
|
|
|
|
2012-02-08 11:57:11 +00:00
|
|
|
if (G_UNLIKELY (GST_PAD_MODE (pad) != GST_PAD_MODE_PULL))
|
|
|
|
goto wrong_mode;
|
|
|
|
|
2013-05-09 08:29:11 +00:00
|
|
|
if (G_UNLIKELY ((ret = check_sticky (pad, NULL))) != GST_FLOW_OK)
|
2012-03-09 10:53:54 +00:00
|
|
|
goto events_error;
|
2011-11-22 17:32:51 +00:00
|
|
|
|
2012-03-20 12:14:55 +00:00
|
|
|
res_buf = *buffer;
|
|
|
|
|
2012-03-16 20:37:10 +00:00
|
|
|
/* when one of the probes returns DROPPED, probe_stopped will be called
|
2012-03-20 12:14:55 +00:00
|
|
|
* and we skip calling the getrange function, res_buf should then contain a
|
2012-03-16 20:37:10 +00:00
|
|
|
* valid result buffer */
|
|
|
|
PROBE_PULL (pad, GST_PAD_PROBE_TYPE_PULL | GST_PAD_PROBE_TYPE_BLOCK,
|
2012-03-20 12:14:55 +00:00
|
|
|
res_buf, offset, size, probe_stopped);
|
2011-11-17 11:40:45 +00:00
|
|
|
|
2012-08-30 17:15:42 +00:00
|
|
|
/* recheck sticky events because the probe might have cause a relink */
|
2013-05-09 08:29:11 +00:00
|
|
|
if (G_UNLIKELY ((ret = check_sticky (pad, NULL))) != GST_FLOW_OK)
|
2012-08-30 17:15:42 +00:00
|
|
|
goto events_error;
|
|
|
|
|
2011-11-17 11:40:45 +00:00
|
|
|
ACQUIRE_PARENT (pad, parent, no_parent);
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
if (G_UNLIKELY ((getrangefunc = GST_PAD_GETRANGEFUNC (pad)) == NULL))
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
goto no_function;
|
|
|
|
|
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
gst/gstpad.c: Use _DEBUG_OBJECT when it makes sense.
Original commit message from CVS:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_get_property), (gst_pad_activate_pull),
(gst_pad_activate_push), (gst_pad_set_blocked_async),
(gst_pad_set_activate_function),
(gst_pad_set_activatepull_function),
(gst_pad_set_activatepush_function), (gst_pad_set_chain_function),
(gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_set_event_function),
(gst_pad_set_query_function), (gst_pad_set_query_type_function),
(gst_pad_set_internal_link_function), (gst_pad_set_link_function),
(gst_pad_set_unlink_function), (gst_pad_set_getcaps_function),
(gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_set_bufferalloc_function), (gst_pad_link_check_hierarchy),
(gst_pad_get_caps_unlocked), (gst_pad_get_caps),
(gst_pad_peer_get_caps), (gst_pad_accept_caps),
(gst_pad_peer_accept_caps), (gst_pad_set_caps),
(gst_pad_configure_sink), (gst_pad_configure_src),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_buffer_alloc_unchecked), (gst_pad_alloc_buffer_full),
(gst_pad_query), (gst_pad_load_and_link), (handle_pad_block),
(gst_pad_chain_unchecked), (gst_pad_push), (gst_pad_get_range),
(gst_pad_send_event):
Use _DEBUG_OBJECT when it makes sense.
Protect GST_PAD_CAPS with the OBJECT_LOCK.
Small cleanups and code reflows.
Avoid caps refcounting in _accept_caps.
Refactor alloc_buffer so that the code performed on the peer is in a
separate function. Also if the pad does not implement a buffer alloc
function, we should still check if the pad is flushing before falling
back to the default allocator.
2006-07-31 14:21:10 +00:00
|
|
|
"calling getrangefunc %s, offset %"
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
G_GUINT64_FORMAT ", size %u",
|
gst/gstpad.c: Use _DEBUG_OBJECT when it makes sense.
Original commit message from CVS:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_get_property), (gst_pad_activate_pull),
(gst_pad_activate_push), (gst_pad_set_blocked_async),
(gst_pad_set_activate_function),
(gst_pad_set_activatepull_function),
(gst_pad_set_activatepush_function), (gst_pad_set_chain_function),
(gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_set_event_function),
(gst_pad_set_query_function), (gst_pad_set_query_type_function),
(gst_pad_set_internal_link_function), (gst_pad_set_link_function),
(gst_pad_set_unlink_function), (gst_pad_set_getcaps_function),
(gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_set_bufferalloc_function), (gst_pad_link_check_hierarchy),
(gst_pad_get_caps_unlocked), (gst_pad_get_caps),
(gst_pad_peer_get_caps), (gst_pad_accept_caps),
(gst_pad_peer_accept_caps), (gst_pad_set_caps),
(gst_pad_configure_sink), (gst_pad_configure_src),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_buffer_alloc_unchecked), (gst_pad_alloc_buffer_full),
(gst_pad_query), (gst_pad_load_and_link), (handle_pad_block),
(gst_pad_chain_unchecked), (gst_pad_push), (gst_pad_get_range),
(gst_pad_send_event):
Use _DEBUG_OBJECT when it makes sense.
Protect GST_PAD_CAPS with the OBJECT_LOCK.
Small cleanups and code reflows.
Avoid caps refcounting in _accept_caps.
Refactor alloc_buffer so that the code performed on the peer is in a
separate function. Also if the pad does not implement a buffer alloc
function, we should still check if the pad is flushing before falling
back to the default allocator.
2006-07-31 14:21:10 +00:00
|
|
|
GST_DEBUG_FUNCPTR_NAME (getrangefunc), offset, size);
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
|
2012-03-20 12:14:55 +00:00
|
|
|
ret = getrangefunc (pad, parent, offset, size, &res_buf);
|
2011-11-17 11:40:45 +00:00
|
|
|
|
|
|
|
RELEASE_PARENT (parent);
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
|
2014-05-23 16:25:35 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
2008-10-10 15:27:37 +00:00
|
|
|
if (G_UNLIKELY (ret != GST_FLOW_OK))
|
|
|
|
goto get_range_failed;
|
2007-01-06 17:09:10 +00:00
|
|
|
|
2011-05-31 17:16:09 +00:00
|
|
|
/* can only fire the signal if we have a valid buffer */
|
2011-11-08 11:47:33 +00:00
|
|
|
probed_data:
|
|
|
|
PROBE_PULL (pad, GST_PAD_PROBE_TYPE_PULL | GST_PAD_PROBE_TYPE_BUFFER,
|
2012-03-20 12:14:55 +00:00
|
|
|
res_buf, offset, size, probe_stopped_unref);
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = ret;
|
2011-06-01 17:27:55 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2011-05-31 17:16:09 +00:00
|
|
|
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
|
|
|
|
2012-03-20 12:14:55 +00:00
|
|
|
*buffer = res_buf;
|
|
|
|
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
return ret;
|
|
|
|
|
|
|
|
/* ERRORS */
|
|
|
|
flushing:
|
|
|
|
{
|
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
2011-06-03 14:46:26 +00:00
|
|
|
"getrange, but pad was flushing");
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = GST_FLOW_FLUSHING;
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2005-11-21 17:21:15 +00:00
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
2012-02-08 14:16:46 +00:00
|
|
|
return GST_FLOW_FLUSHING;
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
}
|
2012-02-08 11:57:11 +00:00
|
|
|
wrong_mode:
|
|
|
|
{
|
2012-02-17 23:03:41 +00:00
|
|
|
g_critical ("getrange on pad %s:%s but it was not activated in pull mode",
|
|
|
|
GST_DEBUG_PAD_NAME (pad));
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = GST_FLOW_ERROR;
|
2012-02-08 11:57:11 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
|
|
|
return GST_FLOW_ERROR;
|
|
|
|
}
|
2011-11-22 17:32:51 +00:00
|
|
|
events_error:
|
|
|
|
{
|
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "error pushing events");
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = ret;
|
2011-11-22 17:32:51 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
|
|
|
return ret;
|
|
|
|
}
|
2011-11-17 11:40:45 +00:00
|
|
|
no_parent:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (pad, "no parent");
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = GST_FLOW_FLUSHING;
|
2011-11-17 11:40:45 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
2012-02-08 14:16:46 +00:00
|
|
|
return GST_FLOW_FLUSHING;
|
2011-11-17 11:40:45 +00:00
|
|
|
}
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
no_function:
|
|
|
|
{
|
2012-02-17 23:03:41 +00:00
|
|
|
g_critical ("getrange on pad %s:%s but it has no getrangefunction",
|
|
|
|
GST_DEBUG_PAD_NAME (pad));
|
2011-11-17 11:40:45 +00:00
|
|
|
RELEASE_PARENT (parent);
|
2005-11-21 17:21:15 +00:00
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
2006-07-06 15:21:46 +00:00
|
|
|
return GST_FLOW_NOT_SUPPORTED;
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
}
|
2011-05-31 17:16:09 +00:00
|
|
|
probe_stopped:
|
2011-11-04 17:19:14 +00:00
|
|
|
{
|
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
|
|
|
"probe returned %s", gst_flow_get_name (ret));
|
2012-03-16 20:37:10 +00:00
|
|
|
if (ret == GST_FLOW_CUSTOM_SUCCESS) {
|
2012-03-20 12:14:55 +00:00
|
|
|
if (res_buf) {
|
2012-03-16 20:37:10 +00:00
|
|
|
/* the probe filled the buffer and asks us to not call the getrange
|
|
|
|
* anymore, we continue with the post probes then. */
|
|
|
|
GST_DEBUG_OBJECT (pad, "handled buffer");
|
|
|
|
ret = GST_FLOW_OK;
|
|
|
|
goto probed_data;
|
|
|
|
} else {
|
|
|
|
/* no buffer, we are EOS */
|
|
|
|
GST_DEBUG_OBJECT (pad, "no buffer, return EOS");
|
|
|
|
ret = GST_FLOW_EOS;
|
|
|
|
}
|
|
|
|
}
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = ret;
|
2011-11-04 17:19:14 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
2012-03-16 20:37:10 +00:00
|
|
|
|
2011-11-04 17:19:14 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
probe_stopped_unref:
|
gst/: Removed atomic operations, use existing LOCK.
Original commit message from CVS:
* gst/gstpad.c: (_gst_do_pass_data_accumulator),
(default_have_data), (gst_pad_class_init), (gst_pad_init),
(gst_pad_emit_have_data_signal), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range), (gst_pad_push_event), (gst_pad_send_event):
* gst/gstpad.h:
* gst/gstutils.c: (gst_atomic_int_set), (gst_pad_add_data_probe),
(gst_pad_add_event_probe), (gst_pad_add_buffer_probe),
(gst_pad_remove_data_probe), (gst_pad_remove_event_probe),
(gst_pad_remove_buffer_probe):
Removed atomic operations, use existing LOCK.
Move exception handling out of main code path.
2005-06-30 09:23:54 +00:00
|
|
|
{
|
2006-07-06 15:21:46 +00:00
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
2011-05-31 17:16:09 +00:00
|
|
|
"probe returned %s", gst_flow_get_name (ret));
|
2012-03-16 20:37:10 +00:00
|
|
|
/* if we drop here, it signals EOS */
|
|
|
|
if (ret == GST_FLOW_CUSTOM_SUCCESS)
|
|
|
|
ret = GST_FLOW_EOS;
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = ret;
|
2011-05-31 17:16:09 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2005-11-21 17:21:15 +00:00
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
2012-03-20 12:14:55 +00:00
|
|
|
if (*buffer == NULL)
|
|
|
|
gst_buffer_unref (res_buf);
|
2011-05-31 17:16:09 +00:00
|
|
|
return ret;
|
gst/: Removed atomic operations, use existing LOCK.
Original commit message from CVS:
* gst/gstpad.c: (_gst_do_pass_data_accumulator),
(default_have_data), (gst_pad_class_init), (gst_pad_init),
(gst_pad_emit_have_data_signal), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range), (gst_pad_push_event), (gst_pad_send_event):
* gst/gstpad.h:
* gst/gstutils.c: (gst_atomic_int_set), (gst_pad_add_data_probe),
(gst_pad_add_event_probe), (gst_pad_add_buffer_probe),
(gst_pad_remove_data_probe), (gst_pad_remove_event_probe),
(gst_pad_remove_buffer_probe):
Removed atomic operations, use existing LOCK.
Move exception handling out of main code path.
2005-06-30 09:23:54 +00:00
|
|
|
}
|
2008-10-10 15:27:37 +00:00
|
|
|
get_range_failed:
|
|
|
|
{
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = ret;
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2011-05-31 17:16:09 +00:00
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
2010-05-17 12:09:15 +00:00
|
|
|
GST_CAT_LEVEL_LOG (GST_CAT_SCHEDULING,
|
2011-10-10 09:33:51 +00:00
|
|
|
(ret >= GST_FLOW_EOS) ? GST_LEVEL_INFO : GST_LEVEL_WARNING,
|
2010-05-17 12:09:15 +00:00
|
|
|
pad, "getrange failed, flow: %s", gst_flow_get_name (ret));
|
2008-10-10 15:27:37 +00:00
|
|
|
return ret;
|
|
|
|
}
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
}
|
|
|
|
|
2010-09-08 06:37:42 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_get_range:
|
|
|
|
* @pad: a src #GstPad, returns #GST_FLOW_ERROR if not.
|
|
|
|
* @offset: The start offset of the buffer
|
|
|
|
* @size: The length of the buffer
|
2010-12-07 18:35:04 +00:00
|
|
|
* @buffer: (out callee-allocates): a pointer to hold the #GstBuffer,
|
|
|
|
* returns #GST_FLOW_ERROR if %NULL.
|
2010-09-08 06:37:42 +00:00
|
|
|
*
|
2012-02-08 14:16:46 +00:00
|
|
|
* When @pad is flushing this function returns #GST_FLOW_FLUSHING
|
2011-09-07 11:14:38 +00:00
|
|
|
* immediately and @buffer is %NULL.
|
2010-09-08 06:37:42 +00:00
|
|
|
*
|
|
|
|
* Calls the getrange function of @pad, see #GstPadGetRangeFunction for a
|
|
|
|
* description of a getrange function. If @pad has no getrange function
|
|
|
|
* installed (see gst_pad_set_getrange_function()) this function returns
|
|
|
|
* #GST_FLOW_NOT_SUPPORTED.
|
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* If @buffer points to a variable holding %NULL, a valid new #GstBuffer will be
|
2012-03-20 12:14:55 +00:00
|
|
|
* placed in @buffer when this function returns #GST_FLOW_OK. The new buffer
|
|
|
|
* must be freed with gst_buffer_unref() after usage.
|
|
|
|
*
|
|
|
|
* When @buffer points to a variable that points to a valid #GstBuffer, the
|
|
|
|
* buffer will be filled with the result data when this function returns
|
|
|
|
* #GST_FLOW_OK. If the provided buffer is larger than @size, only
|
|
|
|
* @size bytes will be filled in the result buffer and its size will be updated
|
|
|
|
* accordingly.
|
|
|
|
*
|
|
|
|
* Note that less than @size bytes can be returned in @buffer when, for example,
|
|
|
|
* an EOS condition is near or when @buffer is not large enough to hold @size
|
|
|
|
* bytes. The caller should check the result buffer size to get the result size.
|
|
|
|
*
|
|
|
|
* When this function returns any other result value than #GST_FLOW_OK, @buffer
|
|
|
|
* will be unchanged.
|
2012-03-16 20:37:10 +00:00
|
|
|
*
|
2013-12-07 14:38:19 +00:00
|
|
|
* This is a lowlevel function. Usually gst_pad_pull_range() is used.
|
2010-09-08 06:37:42 +00:00
|
|
|
*
|
|
|
|
* Returns: a #GstFlowReturn from the pad.
|
|
|
|
*
|
|
|
|
* MT safe.
|
|
|
|
*/
|
|
|
|
GstFlowReturn
|
|
|
|
gst_pad_get_range (GstPad * pad, guint64 offset, guint size,
|
|
|
|
GstBuffer ** buffer)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
|
|
|
|
g_return_val_if_fail (GST_PAD_IS_SRC (pad), GST_FLOW_ERROR);
|
|
|
|
g_return_val_if_fail (buffer != NULL, GST_FLOW_ERROR);
|
2014-09-12 12:22:19 +00:00
|
|
|
g_return_val_if_fail (*buffer == NULL || (GST_IS_BUFFER (*buffer)
|
|
|
|
&& gst_buffer_get_size (*buffer) >= size), GST_FLOW_ERROR);
|
2010-09-08 06:37:42 +00:00
|
|
|
|
2011-05-06 09:14:02 +00:00
|
|
|
return gst_pad_get_range_unchecked (pad, offset, size, buffer);
|
2010-09-08 06:37:42 +00:00
|
|
|
}
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
|
2001-12-09 13:17:54 +00:00
|
|
|
/**
|
2005-05-09 10:53:13 +00:00
|
|
|
* gst_pad_pull_range:
|
2006-07-06 15:21:46 +00:00
|
|
|
* @pad: a sink #GstPad, returns GST_FLOW_ERROR if not.
|
2005-05-09 10:53:13 +00:00
|
|
|
* @offset: The start offset of the buffer
|
2005-08-25 23:17:18 +00:00
|
|
|
* @size: The length of the buffer
|
2010-12-07 18:35:04 +00:00
|
|
|
* @buffer: (out callee-allocates): a pointer to hold the #GstBuffer, returns
|
|
|
|
* GST_FLOW_ERROR if %NULL.
|
2001-12-09 13:17:54 +00:00
|
|
|
*
|
2012-03-20 12:14:55 +00:00
|
|
|
* Pulls a @buffer from the peer pad or fills up a provided buffer.
|
2006-07-06 15:21:46 +00:00
|
|
|
*
|
2007-03-13 14:53:21 +00:00
|
|
|
* This function will first trigger the pad block signal if it was
|
2006-07-06 15:21:46 +00:00
|
|
|
* installed.
|
|
|
|
*
|
|
|
|
* When @pad is not linked #GST_FLOW_NOT_LINKED is returned else this
|
|
|
|
* function returns the result of gst_pad_get_range() on the peer pad.
|
|
|
|
* See gst_pad_get_range() for a list of return values and for the
|
|
|
|
* semantics of the arguments of this function.
|
2002-05-26 21:54:27 +00:00
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* If @buffer points to a variable holding %NULL, a valid new #GstBuffer will be
|
2012-03-20 12:14:55 +00:00
|
|
|
* placed in @buffer when this function returns #GST_FLOW_OK. The new buffer
|
|
|
|
* must be freed with gst_buffer_unref() after usage. When this function
|
2014-05-29 21:54:34 +00:00
|
|
|
* returns any other result value, @buffer will still point to %NULL.
|
2012-03-20 12:14:55 +00:00
|
|
|
*
|
|
|
|
* When @buffer points to a variable that points to a valid #GstBuffer, the
|
|
|
|
* buffer will be filled with the result data when this function returns
|
|
|
|
* #GST_FLOW_OK. When this function returns any other result value,
|
|
|
|
* @buffer will be unchanged. If the provided buffer is larger than @size, only
|
|
|
|
* @size bytes will be filled in the result buffer and its size will be updated
|
|
|
|
* accordingly.
|
|
|
|
*
|
|
|
|
* Note that less than @size bytes can be returned in @buffer when, for example,
|
|
|
|
* an EOS condition is near or when @buffer is not large enough to hold @size
|
|
|
|
* bytes. The caller should check the result buffer size to get the result size.
|
2012-03-16 20:37:10 +00:00
|
|
|
*
|
2005-05-09 10:53:13 +00:00
|
|
|
* Returns: a #GstFlowReturn from the peer pad.
|
|
|
|
*
|
|
|
|
* MT safe.
|
2001-12-09 13:17:54 +00:00
|
|
|
*/
|
2005-05-09 10:53:13 +00:00
|
|
|
GstFlowReturn
|
|
|
|
gst_pad_pull_range (GstPad * pad, guint64 offset, guint size,
|
|
|
|
GstBuffer ** buffer)
|
2001-08-22 21:45:25 +00:00
|
|
|
{
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
GstPad *peer;
|
2005-05-09 10:53:13 +00:00
|
|
|
GstFlowReturn ret;
|
2012-03-20 12:14:55 +00:00
|
|
|
GstBuffer *res_buf;
|
2004-03-13 15:27:01 +00:00
|
|
|
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
|
gst/gstbin.c: Keep track of pads that are being linked/unlinked and resync the state changes.
Original commit message from CVS:
Base on Patch by: Olivier Crete <tester at tester dot ca>
* gst/gstbin.c: (gst_bin_init), (gst_bin_add_func),
(gst_bin_remove_func), (update_degree),
(gst_bin_sort_iterator_new), (gst_bin_handle_message_func):
Keep track of pads that are being linked/unlinked and resync the state
changes.
* gst/gstpad.c: (gst_pad_get_direction),
(gst_pad_set_chain_function), (gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link),
(gst_pad_event_default_dispatch), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range):
Some code cleanups, use macros to check pad direction.
Don't need to take the lock on the pad direction.
Post structure change when pads are linked/unlinked.
Change some checks into _return_if_fail().
* tests/check/gst/gstbin.c:
(test_link_structure_change_state_changed_sync_cb),
(GST_START_TEST), (gst_bin_suite):
Add testcase for pad link/unlinke resync during a state change.
Fixes #510354.
2008-10-06 16:15:02 +00:00
|
|
|
g_return_val_if_fail (GST_PAD_IS_SINK (pad), GST_FLOW_ERROR);
|
2005-05-09 10:53:13 +00:00
|
|
|
g_return_val_if_fail (buffer != NULL, GST_FLOW_ERROR);
|
2014-09-12 12:22:19 +00:00
|
|
|
g_return_val_if_fail (*buffer == NULL || (GST_IS_BUFFER (*buffer)
|
|
|
|
&& gst_buffer_get_size (*buffer) >= size), GST_FLOW_ERROR);
|
2005-03-21 17:34:02 +00:00
|
|
|
|
2014-07-16 07:22:14 +00:00
|
|
|
GST_TRACER_PAD_PULL_RANGE_PRE (pad, offset, size);
|
|
|
|
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
2011-06-03 14:46:26 +00:00
|
|
|
if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
|
|
|
|
goto flushing;
|
2005-05-09 10:53:13 +00:00
|
|
|
|
2012-02-08 11:57:11 +00:00
|
|
|
if (G_UNLIKELY (GST_PAD_MODE (pad) != GST_PAD_MODE_PULL))
|
|
|
|
goto wrong_mode;
|
|
|
|
|
2012-03-20 12:14:55 +00:00
|
|
|
res_buf = *buffer;
|
|
|
|
|
2012-03-16 20:37:10 +00:00
|
|
|
/* when one of the probes returns DROPPED, probe_stopped will be
|
|
|
|
* called and we skip calling the peer getrange function. *buffer should then
|
|
|
|
* contain a valid buffer */
|
|
|
|
PROBE_PULL (pad, GST_PAD_PROBE_TYPE_PULL | GST_PAD_PROBE_TYPE_BLOCK,
|
2012-03-20 12:14:55 +00:00
|
|
|
res_buf, offset, size, probe_stopped);
|
gst/gstbin.c: Add default event/set_manager handlers. The set_manager handler takes care that the manager is distribu...
Original commit message from CVS:
* gst/gstbin.c: (gst_bin_class_init), (gst_bin_set_manager),
(gst_bin_send_event):
Add default event/set_manager handlers. The set_manager handler
takes care that the manager is distributed over kids that were
already in the bin before the manager was set. The event handler
is a utility virtual function that sends the event over all sinks,
so that gst_element_send_event (bin, event); has the expected
behaviour.
* gst/gstpad.c: (gst_pad_event_default):
Re-install default event handling for discontinuities, so that
seeking works without requiring hacks in applications or extra
code in sinks.
* gst/gstpipeline.c: (gst_pipeline_class_init),
(gst_pipeline_send_event):
Half hack, half utility: set a pipeline to PAUSED for seek events,
since that is the only way we can guarantee a/v sync. Means that
you can do gst_element_seek (pipeline, method, pos); on a pipeline
and it "just works".
2005-03-25 09:57:42 +00:00
|
|
|
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
if (G_UNLIKELY ((peer = GST_PAD_PEER (pad)) == NULL))
|
2011-05-31 17:16:09 +00:00
|
|
|
goto not_linked;
|
gst/: Removed atomic operations, use existing LOCK.
Original commit message from CVS:
* gst/gstpad.c: (_gst_do_pass_data_accumulator),
(default_have_data), (gst_pad_class_init), (gst_pad_init),
(gst_pad_emit_have_data_signal), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range), (gst_pad_push_event), (gst_pad_send_event):
* gst/gstpad.h:
* gst/gstutils.c: (gst_atomic_int_set), (gst_pad_add_data_probe),
(gst_pad_add_event_probe), (gst_pad_add_buffer_probe),
(gst_pad_remove_data_probe), (gst_pad_remove_event_probe),
(gst_pad_remove_buffer_probe):
Removed atomic operations, use existing LOCK.
Move exception handling out of main code path.
2005-06-30 09:23:54 +00:00
|
|
|
|
2005-06-28 09:59:01 +00:00
|
|
|
gst_object_ref (peer);
|
2011-06-02 09:21:09 +00:00
|
|
|
pad->priv->using++;
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2002-05-26 21:54:27 +00:00
|
|
|
|
2012-03-20 12:14:55 +00:00
|
|
|
ret = gst_pad_get_range_unchecked (peer, offset, size, &res_buf);
|
2004-03-13 15:27:01 +00:00
|
|
|
|
2005-06-28 09:59:01 +00:00
|
|
|
gst_object_unref (peer);
|
2005-05-09 10:53:13 +00:00
|
|
|
|
2011-06-02 09:21:09 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
pad->priv->using--;
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = ret;
|
2011-06-02 09:21:09 +00:00
|
|
|
if (pad->priv->using == 0) {
|
|
|
|
/* pad is not active anymore, trigger idle callbacks */
|
2011-11-08 11:47:33 +00:00
|
|
|
PROBE_NO_DATA (pad, GST_PAD_PROBE_TYPE_PULL | GST_PAD_PROBE_TYPE_IDLE,
|
2012-03-16 20:37:10 +00:00
|
|
|
probe_stopped_unref, ret);
|
2011-06-02 09:21:09 +00:00
|
|
|
}
|
|
|
|
|
2008-10-10 15:27:37 +00:00
|
|
|
if (G_UNLIKELY (ret != GST_FLOW_OK))
|
|
|
|
goto pull_range_failed;
|
|
|
|
|
2011-11-08 11:47:33 +00:00
|
|
|
probed_data:
|
|
|
|
PROBE_PULL (pad, GST_PAD_PROBE_TYPE_PULL | GST_PAD_PROBE_TYPE_BUFFER,
|
2012-03-20 12:14:55 +00:00
|
|
|
res_buf, offset, size, probe_stopped_unref);
|
2011-05-05 11:10:42 +00:00
|
|
|
|
2011-05-18 09:08:52 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2011-05-05 11:10:42 +00:00
|
|
|
|
2012-03-20 12:14:55 +00:00
|
|
|
*buffer = res_buf;
|
|
|
|
|
2014-07-16 07:22:14 +00:00
|
|
|
GST_TRACER_PAD_PULL_RANGE_POST (pad, *buffer, ret);
|
2005-05-09 10:53:13 +00:00
|
|
|
return ret;
|
|
|
|
|
|
|
|
/* ERROR recovery here */
|
2011-06-03 14:46:26 +00:00
|
|
|
flushing:
|
|
|
|
{
|
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
|
|
|
"pullrange, but pad was flushing");
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = GST_FLOW_FLUSHING;
|
2011-06-03 14:46:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2014-07-16 07:22:14 +00:00
|
|
|
ret = GST_FLOW_FLUSHING;
|
|
|
|
goto done;
|
2011-06-03 14:46:26 +00:00
|
|
|
}
|
2012-02-08 11:57:11 +00:00
|
|
|
wrong_mode:
|
|
|
|
{
|
2012-02-17 23:03:41 +00:00
|
|
|
g_critical ("pullrange on pad %s:%s but it was not activated in pull mode",
|
|
|
|
GST_DEBUG_PAD_NAME (pad));
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = GST_FLOW_ERROR;
|
2012-02-08 11:57:11 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2014-07-16 07:22:14 +00:00
|
|
|
ret = GST_FLOW_ERROR;
|
|
|
|
goto done;
|
2012-02-08 11:57:11 +00:00
|
|
|
}
|
2012-03-16 20:37:10 +00:00
|
|
|
probe_stopped:
|
2011-05-30 16:29:06 +00:00
|
|
|
{
|
2011-05-31 17:16:09 +00:00
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "pre probe returned %s",
|
|
|
|
gst_flow_get_name (ret));
|
2012-03-16 20:37:10 +00:00
|
|
|
if (ret == GST_FLOW_CUSTOM_SUCCESS) {
|
2012-03-20 12:14:55 +00:00
|
|
|
if (res_buf) {
|
2012-03-16 20:37:10 +00:00
|
|
|
/* the probe filled the buffer and asks us to not forward to the peer
|
|
|
|
* anymore, we continue with the post probes then */
|
|
|
|
GST_DEBUG_OBJECT (pad, "handled buffer");
|
|
|
|
ret = GST_FLOW_OK;
|
|
|
|
goto probed_data;
|
|
|
|
} else {
|
|
|
|
/* no buffer, we are EOS then */
|
|
|
|
GST_DEBUG_OBJECT (pad, "no buffer, return EOS");
|
|
|
|
ret = GST_FLOW_EOS;
|
|
|
|
}
|
|
|
|
}
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = ret;
|
2011-05-30 16:29:06 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2014-07-16 07:22:14 +00:00
|
|
|
goto done;
|
2011-05-30 16:29:06 +00:00
|
|
|
}
|
2011-05-31 17:16:09 +00:00
|
|
|
not_linked:
|
2005-05-09 10:53:13 +00:00
|
|
|
{
|
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
|
|
|
"pulling range, but it was not linked");
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = GST_FLOW_NOT_LINKED;
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2014-07-16 07:22:14 +00:00
|
|
|
ret = GST_FLOW_NOT_LINKED;
|
|
|
|
goto done;
|
2005-05-09 10:53:13 +00:00
|
|
|
}
|
2008-10-10 15:27:37 +00:00
|
|
|
pull_range_failed:
|
|
|
|
{
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = ret;
|
2011-06-02 09:21:09 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2010-02-04 17:43:32 +00:00
|
|
|
GST_CAT_LEVEL_LOG (GST_CAT_SCHEDULING,
|
2011-10-10 09:33:51 +00:00
|
|
|
(ret >= GST_FLOW_EOS) ? GST_LEVEL_INFO : GST_LEVEL_WARNING,
|
2010-02-04 17:43:32 +00:00
|
|
|
pad, "pullrange failed, flow: %s", gst_flow_get_name (ret));
|
2014-07-16 07:22:14 +00:00
|
|
|
goto done;
|
2008-10-10 15:27:37 +00:00
|
|
|
}
|
2012-03-16 20:37:10 +00:00
|
|
|
probe_stopped_unref:
|
gst/: Removed atomic operations, use existing LOCK.
Original commit message from CVS:
* gst/gstpad.c: (_gst_do_pass_data_accumulator),
(default_have_data), (gst_pad_class_init), (gst_pad_init),
(gst_pad_emit_have_data_signal), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range), (gst_pad_push_event), (gst_pad_send_event):
* gst/gstpad.h:
* gst/gstutils.c: (gst_atomic_int_set), (gst_pad_add_data_probe),
(gst_pad_add_event_probe), (gst_pad_add_buffer_probe),
(gst_pad_remove_data_probe), (gst_pad_remove_event_probe),
(gst_pad_remove_buffer_probe):
Removed atomic operations, use existing LOCK.
Move exception handling out of main code path.
2005-06-30 09:23:54 +00:00
|
|
|
{
|
2006-07-06 15:21:46 +00:00
|
|
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
2011-05-31 17:16:09 +00:00
|
|
|
"post probe returned %s", gst_flow_get_name (ret));
|
2014-05-23 16:25:35 +00:00
|
|
|
|
2012-03-16 20:37:10 +00:00
|
|
|
/* if we drop here, it signals EOS */
|
2012-03-20 12:14:55 +00:00
|
|
|
if (ret == GST_FLOW_CUSTOM_SUCCESS)
|
2012-03-16 20:37:10 +00:00
|
|
|
ret = GST_FLOW_EOS;
|
2014-05-23 16:25:35 +00:00
|
|
|
|
|
|
|
pad->ABI.abi.last_flowret = ret;
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
|
2012-03-20 12:14:55 +00:00
|
|
|
if (*buffer == NULL)
|
|
|
|
gst_buffer_unref (res_buf);
|
2014-07-16 07:22:14 +00:00
|
|
|
goto done;
|
gst/: Removed atomic operations, use existing LOCK.
Original commit message from CVS:
* gst/gstpad.c: (_gst_do_pass_data_accumulator),
(default_have_data), (gst_pad_class_init), (gst_pad_init),
(gst_pad_emit_have_data_signal), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range), (gst_pad_push_event), (gst_pad_send_event):
* gst/gstpad.h:
* gst/gstutils.c: (gst_atomic_int_set), (gst_pad_add_data_probe),
(gst_pad_add_event_probe), (gst_pad_add_buffer_probe),
(gst_pad_remove_data_probe), (gst_pad_remove_event_probe),
(gst_pad_remove_buffer_probe):
Removed atomic operations, use existing LOCK.
Move exception handling out of main code path.
2005-06-30 09:23:54 +00:00
|
|
|
}
|
2014-07-16 07:22:14 +00:00
|
|
|
done:
|
|
|
|
GST_TRACER_PAD_PULL_RANGE_POST (pad, NULL, ret);
|
|
|
|
return ret;
|
2011-11-22 17:32:51 +00:00
|
|
|
}
|
|
|
|
|
2012-10-05 05:14:17 +00:00
|
|
|
/* must be called with pad object lock */
|
2013-04-04 14:20:24 +00:00
|
|
|
static GstFlowReturn
|
|
|
|
store_sticky_event (GstPad * pad, GstEvent * event)
|
2011-11-22 17:32:51 +00:00
|
|
|
{
|
2011-11-23 16:50:17 +00:00
|
|
|
guint i, len;
|
|
|
|
GstEventType type;
|
|
|
|
GArray *events;
|
|
|
|
gboolean res = FALSE;
|
|
|
|
const gchar *name = NULL;
|
2013-05-08 01:53:37 +00:00
|
|
|
gboolean insert = TRUE;
|
2011-11-23 16:50:17 +00:00
|
|
|
|
2013-05-27 10:40:50 +00:00
|
|
|
type = GST_EVENT_TYPE (event);
|
|
|
|
|
2014-03-06 21:51:57 +00:00
|
|
|
/* Store all sticky events except SEGMENT/EOS when we're flushing,
|
2013-05-27 10:40:50 +00:00
|
|
|
* otherwise they can be dropped and nothing would ever resend them.
|
|
|
|
* Only do that for activated pads though, everything else is a bug!
|
|
|
|
*/
|
|
|
|
if (G_UNLIKELY (GST_PAD_MODE (pad) == GST_PAD_MODE_NONE
|
|
|
|
|| (GST_PAD_IS_FLUSHING (pad) && (type == GST_EVENT_SEGMENT
|
|
|
|
|| type == GST_EVENT_EOS))))
|
2013-04-04 14:20:24 +00:00
|
|
|
goto flushed;
|
|
|
|
|
2015-06-12 08:52:46 +00:00
|
|
|
/* Unset the EOS flag when received STREAM_START event, so pad can
|
|
|
|
* store sticky event and then push it later */
|
|
|
|
if (type == GST_EVENT_STREAM_START) {
|
2016-03-14 03:20:42 +00:00
|
|
|
GST_LOG_OBJECT (pad, "Removing pending EOS and StreamGroupDone events");
|
2015-06-12 08:52:46 +00:00
|
|
|
remove_event_by_type (pad, GST_EVENT_EOS);
|
2016-03-14 03:20:42 +00:00
|
|
|
remove_event_by_type (pad, GST_EVENT_STREAM_GROUP_DONE);
|
2015-06-12 08:52:46 +00:00
|
|
|
GST_OBJECT_FLAG_UNSET (pad, GST_PAD_FLAG_EOS);
|
|
|
|
}
|
|
|
|
|
2013-04-04 14:20:24 +00:00
|
|
|
if (G_UNLIKELY (GST_PAD_IS_EOS (pad)))
|
|
|
|
goto eos;
|
|
|
|
|
2011-11-23 16:50:17 +00:00
|
|
|
if (type & GST_EVENT_TYPE_STICKY_MULTI)
|
|
|
|
name = gst_structure_get_name (gst_event_get_structure (event));
|
2011-11-22 17:32:51 +00:00
|
|
|
|
2011-11-23 16:50:17 +00:00
|
|
|
events = pad->priv->events;
|
|
|
|
len = events->len;
|
2011-11-22 17:32:51 +00:00
|
|
|
|
2011-11-23 16:50:17 +00:00
|
|
|
for (i = 0; i < len; i++) {
|
|
|
|
PadEvent *ev = &g_array_index (events, PadEvent, i);
|
|
|
|
|
|
|
|
if (ev->event == NULL)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (type == GST_EVENT_TYPE (ev->event)) {
|
|
|
|
/* matching types, check matching name if needed */
|
|
|
|
if (name && !gst_event_has_name (ev->event, name))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
/* overwrite */
|
|
|
|
if ((res = gst_event_replace (&ev->event, event)))
|
|
|
|
ev->received = FALSE;
|
2013-05-08 01:53:37 +00:00
|
|
|
|
|
|
|
insert = FALSE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2013-05-09 07:42:33 +00:00
|
|
|
if (type < GST_EVENT_TYPE (ev->event) || (type != GST_EVENT_TYPE (ev->event)
|
|
|
|
&& GST_EVENT_TYPE (ev->event) == GST_EVENT_EOS)) {
|
2013-05-08 22:19:48 +00:00
|
|
|
/* STREAM_START, CAPS and SEGMENT must be delivered in this order. By
|
|
|
|
* storing the sticky ordered we can check that this is respected. */
|
2013-05-09 07:42:33 +00:00
|
|
|
if (G_UNLIKELY (GST_EVENT_TYPE (ev->event) <= GST_EVENT_SEGMENT
|
|
|
|
|| GST_EVENT_TYPE (ev->event) == GST_EVENT_EOS))
|
2013-05-08 23:44:09 +00:00
|
|
|
g_warning (G_STRLOC
|
|
|
|
":%s:<%s:%s> Sticky event misordering, got '%s' before '%s'",
|
|
|
|
G_STRFUNC, GST_DEBUG_PAD_NAME (pad),
|
|
|
|
gst_event_type_get_name (GST_EVENT_TYPE (ev->event)),
|
|
|
|
gst_event_type_get_name (type));
|
2011-11-23 16:50:17 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2013-05-08 01:53:37 +00:00
|
|
|
if (insert) {
|
2011-11-23 16:50:17 +00:00
|
|
|
PadEvent ev;
|
|
|
|
ev.event = gst_event_ref (event);
|
|
|
|
ev.received = FALSE;
|
2013-05-08 01:53:37 +00:00
|
|
|
g_array_insert_val (events, i, ev);
|
2011-11-23 16:50:17 +00:00
|
|
|
res = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (res) {
|
|
|
|
pad->priv->events_cookie++;
|
|
|
|
GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_PENDING_EVENTS);
|
|
|
|
|
|
|
|
GST_LOG_OBJECT (pad, "stored sticky event %s", GST_EVENT_TYPE_NAME (event));
|
2011-11-22 17:32:51 +00:00
|
|
|
|
|
|
|
switch (GST_EVENT_TYPE (event)) {
|
|
|
|
case GST_EVENT_CAPS:
|
2012-10-05 05:14:17 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2011-11-22 17:32:51 +00:00
|
|
|
|
|
|
|
GST_DEBUG_OBJECT (pad, "notify caps");
|
|
|
|
g_object_notify_by_pspec ((GObject *) pad, pspec_caps);
|
|
|
|
|
2012-10-05 05:14:17 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
2011-11-22 17:32:51 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2011-05-05 11:10:42 +00:00
|
|
|
}
|
2014-05-23 16:25:35 +00:00
|
|
|
if (type == GST_EVENT_EOS) {
|
2013-04-04 14:20:24 +00:00
|
|
|
GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_EOS);
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = GST_FLOW_EOS;
|
|
|
|
}
|
2013-04-04 14:20:24 +00:00
|
|
|
|
2013-05-27 10:40:50 +00:00
|
|
|
return GST_PAD_IS_FLUSHING (pad) ? GST_FLOW_FLUSHING : GST_FLOW_OK;
|
2013-04-04 14:20:24 +00:00
|
|
|
|
|
|
|
/* ERRORS */
|
|
|
|
flushed:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (pad, "pad is flushing");
|
|
|
|
return GST_FLOW_FLUSHING;
|
|
|
|
}
|
|
|
|
eos:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (pad, "pad is EOS");
|
|
|
|
return GST_FLOW_EOS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gst_pad_store_sticky_event:
|
|
|
|
* @pad: a #GstPad
|
2016-07-14 14:40:22 +00:00
|
|
|
* @event: (transfer none): a #GstEvent
|
2013-04-04 14:20:24 +00:00
|
|
|
*
|
|
|
|
* Store the sticky @event on @pad
|
|
|
|
*
|
|
|
|
* Returns: #GST_FLOW_OK on success, #GST_FLOW_FLUSHING when the pad
|
|
|
|
* was flushing or #GST_FLOW_EOS when the pad was EOS.
|
|
|
|
*
|
|
|
|
* Since: 1.2
|
|
|
|
*/
|
|
|
|
GstFlowReturn
|
|
|
|
gst_pad_store_sticky_event (GstPad * pad, GstEvent * event)
|
|
|
|
{
|
|
|
|
GstFlowReturn ret;
|
|
|
|
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
|
|
|
|
g_return_val_if_fail (GST_IS_EVENT (event), FALSE);
|
|
|
|
|
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
ret = store_sticky_event (pad, event);
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
|
|
|
|
return ret;
|
2001-08-22 21:45:25 +00:00
|
|
|
}
|
|
|
|
|
2013-05-09 15:21:13 +00:00
|
|
|
static gboolean
|
|
|
|
sticky_changed (GstPad * pad, PadEvent * ev, gpointer user_data)
|
|
|
|
{
|
|
|
|
PushStickyData *data = user_data;
|
|
|
|
|
|
|
|
/* Forward all sticky events before our current one that are pending */
|
|
|
|
if (ev->event != data->event
|
|
|
|
&& GST_EVENT_TYPE (ev->event) < GST_EVENT_TYPE (data->event))
|
|
|
|
return push_sticky (pad, ev, data);
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2012-03-09 10:53:54 +00:00
|
|
|
/* should be called with pad LOCK */
|
2011-11-28 12:54:43 +00:00
|
|
|
static GstFlowReturn
|
|
|
|
gst_pad_push_event_unchecked (GstPad * pad, GstEvent * event,
|
2012-03-09 10:53:54 +00:00
|
|
|
GstPadProbeType type)
|
2005-03-21 17:34:02 +00:00
|
|
|
{
|
2011-05-31 17:16:09 +00:00
|
|
|
GstFlowReturn ret;
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
GstPad *peerpad;
|
2011-11-28 12:54:43 +00:00
|
|
|
GstEventType event_type;
|
2011-05-30 16:29:06 +00:00
|
|
|
|
2014-04-04 15:15:25 +00:00
|
|
|
/* pass the adjusted event on. We need to do this even if
|
|
|
|
* there is no peer pad because of the probes. */
|
|
|
|
event = apply_pad_offset (pad, event, GST_PAD_IS_SINK (pad));
|
|
|
|
|
2006-07-03 10:30:49 +00:00
|
|
|
/* Two checks to be made:
|
|
|
|
* . (un)set the FLUSHING flag for flushing events,
|
|
|
|
* . handle pad blocking */
|
2011-11-28 12:54:43 +00:00
|
|
|
event_type = GST_EVENT_TYPE (event);
|
|
|
|
switch (event_type) {
|
2005-11-02 18:33:00 +00:00
|
|
|
case GST_EVENT_FLUSH_START:
|
|
|
|
GST_PAD_SET_FLUSHING (pad);
|
2006-07-03 10:30:49 +00:00
|
|
|
|
2011-12-05 20:20:52 +00:00
|
|
|
GST_PAD_BLOCK_BROADCAST (pad);
|
2011-12-06 17:09:13 +00:00
|
|
|
type |= GST_PAD_PROBE_TYPE_EVENT_FLUSH;
|
2005-11-02 18:33:00 +00:00
|
|
|
break;
|
|
|
|
case GST_EVENT_FLUSH_STOP:
|
2014-08-21 13:49:17 +00:00
|
|
|
if (G_UNLIKELY (!GST_PAD_IS_ACTIVE (pad)))
|
|
|
|
goto inactive;
|
|
|
|
|
2005-11-02 18:33:00 +00:00
|
|
|
GST_PAD_UNSET_FLUSHING (pad);
|
2011-10-10 08:38:12 +00:00
|
|
|
|
|
|
|
/* Remove sticky EOS events */
|
|
|
|
GST_LOG_OBJECT (pad, "Removing pending EOS events");
|
2011-11-23 16:50:17 +00:00
|
|
|
remove_event_by_type (pad, GST_EVENT_EOS);
|
2016-03-14 03:20:42 +00:00
|
|
|
remove_event_by_type (pad, GST_EVENT_STREAM_GROUP_DONE);
|
2012-11-11 12:52:25 +00:00
|
|
|
remove_event_by_type (pad, GST_EVENT_SEGMENT);
|
2012-06-04 09:46:42 +00:00
|
|
|
GST_OBJECT_FLAG_UNSET (pad, GST_PAD_FLAG_EOS);
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = GST_FLOW_OK;
|
2011-10-10 08:38:12 +00:00
|
|
|
|
2011-12-06 17:09:13 +00:00
|
|
|
type |= GST_PAD_PROBE_TYPE_EVENT_FLUSH;
|
2005-11-02 18:33:00 +00:00
|
|
|
break;
|
|
|
|
default:
|
2011-05-30 16:29:06 +00:00
|
|
|
{
|
2011-11-09 16:25:30 +00:00
|
|
|
if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
|
|
|
|
goto flushed;
|
|
|
|
|
2012-06-04 09:46:42 +00:00
|
|
|
/* No need to check for EOS here as either the caller (gst_pad_push_event())
|
|
|
|
* checked already or this is called as part of pushing sticky events,
|
|
|
|
* in which case we still want to forward the EOS event downstream.
|
|
|
|
*/
|
|
|
|
|
2011-06-18 15:35:41 +00:00
|
|
|
switch (GST_EVENT_TYPE (event)) {
|
|
|
|
case GST_EVENT_RECONFIGURE:
|
|
|
|
if (GST_PAD_IS_SINK (pad))
|
2011-11-16 11:36:51 +00:00
|
|
|
GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_NEED_RECONFIGURE);
|
2011-06-18 15:35:41 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
2011-05-30 11:40:04 +00:00
|
|
|
}
|
2011-11-08 11:47:33 +00:00
|
|
|
PROBE_PUSH (pad, type | GST_PAD_PROBE_TYPE_PUSH |
|
2011-11-07 16:04:13 +00:00
|
|
|
GST_PAD_PROBE_TYPE_BLOCK, event, probe_stopped);
|
2017-08-02 18:02:32 +00:00
|
|
|
/* recheck sticky events because the probe might have cause a relink */
|
|
|
|
if (GST_PAD_HAS_PENDING_EVENTS (pad) && GST_PAD_IS_SRC (pad)
|
|
|
|
&& (GST_EVENT_IS_SERIALIZED (event)
|
|
|
|
|| GST_EVENT_IS_STICKY (event))) {
|
|
|
|
PushStickyData data = { GST_FLOW_OK, FALSE, event };
|
|
|
|
GST_OBJECT_FLAG_UNSET (pad, GST_PAD_FLAG_PENDING_EVENTS);
|
|
|
|
|
|
|
|
/* Push all sticky events before our current one
|
|
|
|
* that have changed */
|
|
|
|
events_foreach (pad, sticky_changed, &data);
|
|
|
|
}
|
2011-05-30 16:29:06 +00:00
|
|
|
break;
|
2011-05-30 11:40:04 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* send probes after modifying the events above */
|
2011-11-08 11:47:33 +00:00
|
|
|
PROBE_PUSH (pad, type | GST_PAD_PROBE_TYPE_PUSH, event, probe_stopped);
|
2011-05-06 15:30:24 +00:00
|
|
|
|
2013-05-09 15:21:13 +00:00
|
|
|
/* recheck sticky events because the probe might have cause a relink */
|
|
|
|
if (GST_PAD_HAS_PENDING_EVENTS (pad) && GST_PAD_IS_SRC (pad)
|
|
|
|
&& (GST_EVENT_IS_SERIALIZED (event)
|
|
|
|
|| GST_EVENT_IS_STICKY (event))) {
|
|
|
|
PushStickyData data = { GST_FLOW_OK, FALSE, event };
|
|
|
|
GST_OBJECT_FLAG_UNSET (pad, GST_PAD_FLAG_PENDING_EVENTS);
|
|
|
|
|
|
|
|
/* Push all sticky events before our current one
|
|
|
|
* that have changed */
|
|
|
|
events_foreach (pad, sticky_changed, &data);
|
|
|
|
}
|
|
|
|
|
2011-05-06 15:30:24 +00:00
|
|
|
/* now check the peer pad */
|
2011-11-23 07:17:36 +00:00
|
|
|
peerpad = GST_PAD_PEER (pad);
|
2005-03-21 17:34:02 +00:00
|
|
|
if (peerpad == NULL)
|
|
|
|
goto not_linked;
|
|
|
|
|
2011-05-26 17:45:14 +00:00
|
|
|
gst_object_ref (peerpad);
|
|
|
|
pad->priv->using++;
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
|
2011-06-13 14:30:22 +00:00
|
|
|
GST_LOG_OBJECT (pad, "sending event %p (%s) to peerpad %" GST_PTR_FORMAT,
|
2014-04-01 13:38:54 +00:00
|
|
|
event, gst_event_type_get_name (event_type), peerpad);
|
2005-03-21 17:34:02 +00:00
|
|
|
|
2011-11-28 12:54:43 +00:00
|
|
|
ret = gst_pad_send_event_unchecked (peerpad, event, type);
|
2011-05-05 16:56:41 +00:00
|
|
|
|
2011-06-13 14:30:22 +00:00
|
|
|
/* Note: we gave away ownership of the event at this point but we can still
|
|
|
|
* print the old pointer */
|
2014-03-06 21:51:57 +00:00
|
|
|
GST_LOG_OBJECT (pad,
|
2015-01-21 13:10:06 +00:00
|
|
|
"sent event %p (%s) to peerpad %" GST_PTR_FORMAT ", ret %s", event,
|
2014-04-01 13:38:54 +00:00
|
|
|
gst_event_type_get_name (event_type), peerpad, gst_flow_get_name (ret));
|
2011-05-05 16:56:41 +00:00
|
|
|
|
2005-06-28 09:59:01 +00:00
|
|
|
gst_object_unref (peerpad);
|
2005-03-21 17:34:02 +00:00
|
|
|
|
2011-06-01 17:27:55 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
pad->priv->using--;
|
|
|
|
if (pad->priv->using == 0) {
|
|
|
|
/* pad is not active anymore, trigger idle callbacks */
|
2011-11-08 11:47:33 +00:00
|
|
|
PROBE_NO_DATA (pad, GST_PAD_PROBE_TYPE_PUSH | GST_PAD_PROBE_TYPE_IDLE,
|
2011-11-28 12:54:43 +00:00
|
|
|
idle_probe_stopped, ret);
|
2011-06-01 17:27:55 +00:00
|
|
|
}
|
2011-11-28 12:54:43 +00:00
|
|
|
return ret;
|
2005-03-21 17:34:02 +00:00
|
|
|
|
|
|
|
/* ERROR handling */
|
2011-05-26 17:45:14 +00:00
|
|
|
flushed:
|
|
|
|
{
|
2011-05-30 10:27:31 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "We're flushing");
|
2011-05-27 15:20:56 +00:00
|
|
|
gst_event_unref (event);
|
2012-02-08 14:16:46 +00:00
|
|
|
return GST_FLOW_FLUSHING;
|
2011-05-26 17:45:14 +00:00
|
|
|
}
|
2014-08-21 13:49:17 +00:00
|
|
|
inactive:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (pad, "flush-stop on inactive pad");
|
|
|
|
gst_event_unref (event);
|
|
|
|
return GST_FLOW_FLUSHING;
|
|
|
|
}
|
2011-05-31 17:16:09 +00:00
|
|
|
probe_stopped:
|
docs/design/part-states.txt: Some more docs.
Original commit message from CVS:
* docs/design/part-states.txt:
Some more docs.
* gst/gstbin.c: (gst_bin_set_clock_func), (gst_bin_recalc_state),
(gst_bin_change_state_func), (bin_bus_handler):
Doc updates. Don't distribute the same clock over and over again.
* gst/gstclock.c:
* gst/gstclock.h:
Doc updates.
* gst/gstpad.c: (gst_flow_get_name), (gst_flow_to_quark),
(gst_pad_get_type), (gst_pad_push), (gst_pad_push_event),
(gst_pad_send_event):
* gst/gstpad.h:
Make probe emission threadsafe again.
Register quarks and move _get_name() from utils.
Doc updates.
* gst/gstpipeline.c: (gst_pipeline_class_init),
(gst_pipeline_change_state), (gst_pipeline_provide_clock_func):
Only redistribute the clock of it changed.
* gst/gstsystemclock.h:
Doc updates.
* gst/gstutils.c:
* gst/gstutils.h:
Moved the _flow_get_name() to GstPad.
2005-10-11 11:08:52 +00:00
|
|
|
{
|
2011-11-22 17:32:51 +00:00
|
|
|
GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_PENDING_EVENTS);
|
2015-04-29 13:49:17 +00:00
|
|
|
if (ret != GST_FLOW_CUSTOM_SUCCESS_1)
|
|
|
|
gst_event_unref (event);
|
2011-11-28 12:54:43 +00:00
|
|
|
|
|
|
|
switch (ret) {
|
2015-04-29 13:49:17 +00:00
|
|
|
case GST_FLOW_CUSTOM_SUCCESS_1:
|
|
|
|
GST_DEBUG_OBJECT (pad, "handled event");
|
|
|
|
break;
|
2011-11-28 12:54:43 +00:00
|
|
|
case GST_FLOW_CUSTOM_SUCCESS:
|
|
|
|
GST_DEBUG_OBJECT (pad, "dropped event");
|
|
|
|
break;
|
|
|
|
default:
|
2013-12-07 14:40:32 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "an error occurred %s", gst_flow_get_name (ret));
|
2011-11-28 12:54:43 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
not_linked:
|
|
|
|
{
|
2014-03-29 09:18:34 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "Dropping event %s because pad is not linked",
|
|
|
|
gst_event_type_get_name (GST_EVENT_TYPE (event)));
|
2011-11-28 12:54:43 +00:00
|
|
|
GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_PENDING_EVENTS);
|
|
|
|
gst_event_unref (event);
|
2009-10-13 15:24:34 +00:00
|
|
|
|
|
|
|
/* unlinked pads should not influence latency configuration */
|
|
|
|
if (event_type == GST_EVENT_LATENCY)
|
|
|
|
return GST_FLOW_OK;
|
|
|
|
|
2012-03-09 10:53:54 +00:00
|
|
|
return GST_FLOW_NOT_LINKED;
|
2011-11-22 17:32:51 +00:00
|
|
|
}
|
|
|
|
idle_probe_stopped:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (pad, "Idle probe returned %s", gst_flow_get_name (ret));
|
2011-11-28 12:54:43 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gst_pad_push_event:
|
|
|
|
* @pad: a #GstPad to push the event to.
|
|
|
|
* @event: (transfer full): the #GstEvent to send to the pad.
|
|
|
|
*
|
|
|
|
* Sends the event to the peer of the given pad. This function is
|
|
|
|
* mainly used by elements to send events to their peer
|
|
|
|
* elements.
|
|
|
|
*
|
2013-12-07 14:38:19 +00:00
|
|
|
* This function takes ownership of the provided event so you should
|
2011-11-28 12:54:43 +00:00
|
|
|
* gst_event_ref() it if you want to reuse the event after this call.
|
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Returns: %TRUE if the event was handled.
|
2011-11-28 12:54:43 +00:00
|
|
|
*
|
|
|
|
* MT safe.
|
|
|
|
*/
|
|
|
|
gboolean
|
|
|
|
gst_pad_push_event (GstPad * pad, GstEvent * event)
|
|
|
|
{
|
2012-06-04 14:19:26 +00:00
|
|
|
gboolean res = FALSE;
|
2011-11-28 12:54:43 +00:00
|
|
|
GstPadProbeType type;
|
2012-03-09 10:53:54 +00:00
|
|
|
gboolean sticky, serialized;
|
2011-11-28 12:54:43 +00:00
|
|
|
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
|
|
|
|
g_return_val_if_fail (GST_IS_EVENT (event), FALSE);
|
|
|
|
|
2014-07-16 07:22:14 +00:00
|
|
|
GST_TRACER_PAD_PUSH_EVENT_PRE (pad, event);
|
|
|
|
|
2011-11-28 12:54:43 +00:00
|
|
|
if (GST_PAD_IS_SRC (pad)) {
|
|
|
|
if (G_UNLIKELY (!GST_EVENT_IS_DOWNSTREAM (event)))
|
|
|
|
goto wrong_direction;
|
|
|
|
type = GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM;
|
|
|
|
} else if (GST_PAD_IS_SINK (pad)) {
|
|
|
|
if (G_UNLIKELY (!GST_EVENT_IS_UPSTREAM (event)))
|
|
|
|
goto wrong_direction;
|
|
|
|
/* events pushed on sinkpad never are sticky */
|
|
|
|
type = GST_PAD_PROBE_TYPE_EVENT_UPSTREAM;
|
|
|
|
} else
|
|
|
|
goto unknown_direction;
|
|
|
|
|
2012-03-09 10:53:54 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
sticky = GST_EVENT_IS_STICKY (event);
|
|
|
|
serialized = GST_EVENT_IS_SERIALIZED (event);
|
|
|
|
|
|
|
|
if (sticky) {
|
2012-10-05 05:14:17 +00:00
|
|
|
/* srcpad sticky events are stored immediately, the received flag is set
|
2012-03-09 10:53:54 +00:00
|
|
|
* to FALSE and will be set to TRUE when we can successfully push the
|
|
|
|
* event to the peer pad */
|
2013-04-04 14:20:24 +00:00
|
|
|
switch (store_sticky_event (pad, event)) {
|
|
|
|
case GST_FLOW_FLUSHING:
|
|
|
|
goto flushed;
|
|
|
|
case GST_FLOW_EOS:
|
|
|
|
goto eos;
|
|
|
|
default:
|
|
|
|
break;
|
2012-03-09 10:53:54 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if (GST_PAD_IS_SRC (pad) && (serialized || sticky)) {
|
|
|
|
/* all serialized or sticky events on the srcpad trigger push of
|
|
|
|
* sticky events */
|
2013-05-09 08:29:11 +00:00
|
|
|
res = (check_sticky (pad, event) == GST_FLOW_OK);
|
2012-03-09 10:53:54 +00:00
|
|
|
}
|
2012-06-02 18:01:01 +00:00
|
|
|
if (!sticky) {
|
2012-10-05 07:42:59 +00:00
|
|
|
GstFlowReturn ret;
|
|
|
|
|
2012-06-02 18:01:01 +00:00
|
|
|
/* other events are pushed right away */
|
2012-10-05 07:42:59 +00:00
|
|
|
ret = gst_pad_push_event_unchecked (pad, event, type);
|
|
|
|
/* dropped events by a probe are not an error */
|
2015-04-29 13:49:17 +00:00
|
|
|
res = (ret == GST_FLOW_OK || ret == GST_FLOW_CUSTOM_SUCCESS
|
|
|
|
|| ret == GST_FLOW_CUSTOM_SUCCESS_1);
|
2012-03-09 10:53:54 +00:00
|
|
|
} else {
|
2012-06-04 09:25:47 +00:00
|
|
|
/* Errors in sticky event pushing are no problem and ignored here
|
|
|
|
* as they will cause more meaningful errors during data flow.
|
|
|
|
* For EOS events, that are not followed by data flow, we still
|
|
|
|
* return FALSE here though.
|
|
|
|
*/
|
|
|
|
if (GST_EVENT_TYPE (event) != GST_EVENT_EOS)
|
|
|
|
res = TRUE;
|
2012-03-09 10:53:54 +00:00
|
|
|
gst_event_unref (event);
|
|
|
|
}
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2011-11-28 12:54:43 +00:00
|
|
|
|
2014-07-16 07:22:14 +00:00
|
|
|
GST_TRACER_PAD_PUSH_EVENT_POST (pad, res);
|
2011-11-28 12:54:43 +00:00
|
|
|
return res;
|
|
|
|
|
|
|
|
/* ERROR handling */
|
|
|
|
wrong_direction:
|
|
|
|
{
|
|
|
|
g_warning ("pad %s:%s pushing %s event in wrong direction",
|
|
|
|
GST_DEBUG_PAD_NAME (pad), GST_EVENT_TYPE_NAME (event));
|
docs/design/part-states.txt: Some more docs.
Original commit message from CVS:
* docs/design/part-states.txt:
Some more docs.
* gst/gstbin.c: (gst_bin_set_clock_func), (gst_bin_recalc_state),
(gst_bin_change_state_func), (bin_bus_handler):
Doc updates. Don't distribute the same clock over and over again.
* gst/gstclock.c:
* gst/gstclock.h:
Doc updates.
* gst/gstpad.c: (gst_flow_get_name), (gst_flow_to_quark),
(gst_pad_get_type), (gst_pad_push), (gst_pad_push_event),
(gst_pad_send_event):
* gst/gstpad.h:
Make probe emission threadsafe again.
Register quarks and move _get_name() from utils.
Doc updates.
* gst/gstpipeline.c: (gst_pipeline_class_init),
(gst_pipeline_change_state), (gst_pipeline_provide_clock_func):
Only redistribute the clock of it changed.
* gst/gstsystemclock.h:
Doc updates.
* gst/gstutils.c:
* gst/gstutils.h:
Moved the _flow_get_name() to GstPad.
2005-10-11 11:08:52 +00:00
|
|
|
gst_event_unref (event);
|
2014-07-16 07:22:14 +00:00
|
|
|
goto done;
|
docs/design/part-states.txt: Some more docs.
Original commit message from CVS:
* docs/design/part-states.txt:
Some more docs.
* gst/gstbin.c: (gst_bin_set_clock_func), (gst_bin_recalc_state),
(gst_bin_change_state_func), (bin_bus_handler):
Doc updates. Don't distribute the same clock over and over again.
* gst/gstclock.c:
* gst/gstclock.h:
Doc updates.
* gst/gstpad.c: (gst_flow_get_name), (gst_flow_to_quark),
(gst_pad_get_type), (gst_pad_push), (gst_pad_push_event),
(gst_pad_send_event):
* gst/gstpad.h:
Make probe emission threadsafe again.
Register quarks and move _get_name() from utils.
Doc updates.
* gst/gstpipeline.c: (gst_pipeline_class_init),
(gst_pipeline_change_state), (gst_pipeline_provide_clock_func):
Only redistribute the clock of it changed.
* gst/gstsystemclock.h:
Doc updates.
* gst/gstutils.c:
* gst/gstutils.h:
Moved the _flow_get_name() to GstPad.
2005-10-11 11:08:52 +00:00
|
|
|
}
|
2011-11-28 12:54:43 +00:00
|
|
|
unknown_direction:
|
2005-03-21 17:34:02 +00:00
|
|
|
{
|
2011-11-28 12:54:43 +00:00
|
|
|
g_warning ("pad %s:%s has invalid direction", GST_DEBUG_PAD_NAME (pad));
|
2005-05-17 17:37:43 +00:00
|
|
|
gst_event_unref (event);
|
2014-07-16 07:22:14 +00:00
|
|
|
goto done;
|
2011-05-27 09:45:16 +00:00
|
|
|
}
|
2012-03-09 10:53:54 +00:00
|
|
|
flushed:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (pad, "We're flushing");
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
gst_event_unref (event);
|
2014-07-16 07:22:14 +00:00
|
|
|
goto done;
|
2012-03-09 10:53:54 +00:00
|
|
|
}
|
2012-06-04 09:46:42 +00:00
|
|
|
eos:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (pad, "We're EOS");
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2015-10-07 21:55:44 +00:00
|
|
|
gst_event_unref (event);
|
2014-07-16 07:22:14 +00:00
|
|
|
goto done;
|
2012-06-04 09:46:42 +00:00
|
|
|
}
|
2014-07-16 07:22:14 +00:00
|
|
|
done:
|
|
|
|
GST_TRACER_PAD_PUSH_EVENT_POST (pad, FALSE);
|
|
|
|
return FALSE;
|
2005-03-21 17:34:02 +00:00
|
|
|
}
|
|
|
|
|
2011-11-22 17:32:51 +00:00
|
|
|
/* Check if we can call the event function with the given event */
|
|
|
|
static GstFlowReturn
|
|
|
|
pre_eventfunc_check (GstPad * pad, GstEvent * event)
|
|
|
|
{
|
2012-06-04 07:27:35 +00:00
|
|
|
GstCaps *caps;
|
2011-11-22 17:32:51 +00:00
|
|
|
|
|
|
|
switch (GST_EVENT_TYPE (event)) {
|
|
|
|
case GST_EVENT_CAPS:
|
|
|
|
{
|
|
|
|
/* backwards compatibility mode for caps */
|
|
|
|
gst_event_parse_caps (event, &caps);
|
|
|
|
|
2012-06-04 07:27:35 +00:00
|
|
|
if (!gst_pad_query_accept_caps (pad, caps))
|
2011-11-22 17:32:51 +00:00
|
|
|
goto not_accepted;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return GST_FLOW_OK;
|
|
|
|
|
|
|
|
/* ERRORS */
|
|
|
|
not_accepted:
|
|
|
|
{
|
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
|
|
|
|
"caps %" GST_PTR_FORMAT " not accepted", caps);
|
|
|
|
return GST_FLOW_NOT_NEGOTIATED;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-11-28 12:54:43 +00:00
|
|
|
static GstFlowReturn
|
|
|
|
gst_pad_send_event_unchecked (GstPad * pad, GstEvent * event,
|
|
|
|
GstPadProbeType type)
|
2001-10-17 10:21:27 +00:00
|
|
|
{
|
2011-05-31 17:16:09 +00:00
|
|
|
GstFlowReturn ret;
|
2011-11-28 12:54:43 +00:00
|
|
|
GstEventType event_type;
|
2011-11-22 17:32:51 +00:00
|
|
|
gboolean serialized, need_unlock = FALSE, sticky;
|
|
|
|
GstPadEventFunction eventfunc;
|
2015-11-12 16:15:37 +00:00
|
|
|
GstPadEventFullFunction eventfullfunc = NULL;
|
2011-11-22 17:32:51 +00:00
|
|
|
GstObject *parent;
|
Some docs updates
Original commit message from CVS:
* CHANGES-0.9:
* docs/design/part-TODO.txt:
* docs/design/part-events.txt:
Some docs updates
* gst/base/gstbasesink.c: (gst_base_sink_handle_object),
(gst_base_sink_event), (gst_base_sink_do_sync),
(gst_base_sink_activate_push), (gst_base_sink_activate_pull):
* gst/base/gstbasesrc.c: (gst_base_src_send_discont),
(gst_base_src_do_seek), (gst_base_src_event_handler),
(gst_base_src_loop):
* gst/base/gstbasetransform.c: (gst_base_transform_transform_caps),
(gst_base_transform_configure_caps), (gst_base_transform_setcaps),
(gst_base_transform_get_size), (gst_base_transform_buffer_alloc),
(gst_base_transform_event), (gst_base_transform_handle_buffer),
(gst_base_transform_set_passthrough),
(gst_base_transform_is_passthrough):
* gst/elements/gstfakesink.c: (gst_fake_sink_event):
* gst/elements/gstfilesink.c: (gst_file_sink_event):
Event updates.
* gst/gstbuffer.h:
Use faster casts.
* gst/gstelement.c: (gst_element_seek):
* gst/gstelement.h:
Update gst_element_seek.
* gst/gstevent.c: (gst_event_finalize), (_gst_event_copy),
(gst_event_new), (gst_event_new_custom), (gst_event_get_structure),
(gst_event_new_flush_start), (gst_event_new_flush_stop),
(gst_event_new_eos), (gst_event_new_newsegment),
(gst_event_parse_newsegment), (gst_event_new_tag),
(gst_event_parse_tag), (gst_event_new_filler), (gst_event_new_qos),
(gst_event_parse_qos), (gst_event_new_seek),
(gst_event_parse_seek), (gst_event_new_navigation):
* gst/gstevent.h:
Make GstEvent use GstStructure. Add parsing code, make sure the
API is sufficiently generic.
Mark possible directions of events and serialization.
* gst/gstmessage.c: (gst_message_init), (gst_message_finalize),
(_gst_message_copy), (gst_message_new_segment_start),
(gst_message_new_segment_done), (gst_message_new_custom),
(gst_message_parse_segment_start),
(gst_message_parse_segment_done):
Small cleanups.
* gst/gstpad.c: (gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
(gst_pad_set_caps), (gst_pad_send_event):
Update for new events.
Catch events sent in wrong directions.
* gst/gstqueue.c: (gst_queue_link_src),
(gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
(gst_queue_handle_src_query):
Event updates.
* gst/gsttag.c:
* gst/gsttag.h:
Remove event code from this file.
* libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packet_from_event),
(gst_dp_event_from_packet):
Event updates.
2005-07-27 18:33:03 +00:00
|
|
|
|
2011-11-22 17:32:51 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
2014-04-04 15:15:25 +00:00
|
|
|
|
|
|
|
event = apply_pad_offset (pad, event, GST_PAD_IS_SRC (pad));
|
|
|
|
|
2011-11-28 12:54:43 +00:00
|
|
|
if (GST_PAD_IS_SINK (pad))
|
|
|
|
serialized = GST_EVENT_IS_SERIALIZED (event);
|
|
|
|
else
|
|
|
|
serialized = FALSE;
|
|
|
|
sticky = GST_EVENT_IS_STICKY (event);
|
|
|
|
event_type = GST_EVENT_TYPE (event);
|
|
|
|
switch (event_type) {
|
Some docs updates
Original commit message from CVS:
* CHANGES-0.9:
* docs/design/part-TODO.txt:
* docs/design/part-events.txt:
Some docs updates
* gst/base/gstbasesink.c: (gst_base_sink_handle_object),
(gst_base_sink_event), (gst_base_sink_do_sync),
(gst_base_sink_activate_push), (gst_base_sink_activate_pull):
* gst/base/gstbasesrc.c: (gst_base_src_send_discont),
(gst_base_src_do_seek), (gst_base_src_event_handler),
(gst_base_src_loop):
* gst/base/gstbasetransform.c: (gst_base_transform_transform_caps),
(gst_base_transform_configure_caps), (gst_base_transform_setcaps),
(gst_base_transform_get_size), (gst_base_transform_buffer_alloc),
(gst_base_transform_event), (gst_base_transform_handle_buffer),
(gst_base_transform_set_passthrough),
(gst_base_transform_is_passthrough):
* gst/elements/gstfakesink.c: (gst_fake_sink_event):
* gst/elements/gstfilesink.c: (gst_file_sink_event):
Event updates.
* gst/gstbuffer.h:
Use faster casts.
* gst/gstelement.c: (gst_element_seek):
* gst/gstelement.h:
Update gst_element_seek.
* gst/gstevent.c: (gst_event_finalize), (_gst_event_copy),
(gst_event_new), (gst_event_new_custom), (gst_event_get_structure),
(gst_event_new_flush_start), (gst_event_new_flush_stop),
(gst_event_new_eos), (gst_event_new_newsegment),
(gst_event_parse_newsegment), (gst_event_new_tag),
(gst_event_parse_tag), (gst_event_new_filler), (gst_event_new_qos),
(gst_event_parse_qos), (gst_event_new_seek),
(gst_event_parse_seek), (gst_event_new_navigation):
* gst/gstevent.h:
Make GstEvent use GstStructure. Add parsing code, make sure the
API is sufficiently generic.
Mark possible directions of events and serialization.
* gst/gstmessage.c: (gst_message_init), (gst_message_finalize),
(_gst_message_copy), (gst_message_new_segment_start),
(gst_message_new_segment_done), (gst_message_new_custom),
(gst_message_parse_segment_start),
(gst_message_parse_segment_done):
Small cleanups.
* gst/gstpad.c: (gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
(gst_pad_set_caps), (gst_pad_send_event):
Update for new events.
Catch events sent in wrong directions.
* gst/gstqueue.c: (gst_queue_link_src),
(gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
(gst_queue_handle_src_query):
Event updates.
* gst/gsttag.c:
* gst/gsttag.h:
Remove event code from this file.
* libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packet_from_event),
(gst_dp_event_from_packet):
Event updates.
2005-07-27 18:33:03 +00:00
|
|
|
case GST_EVENT_FLUSH_START:
|
gst/gstpad.c: Use _DEBUG_OBJECT when it makes sense.
Original commit message from CVS:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_get_property), (gst_pad_activate_pull),
(gst_pad_activate_push), (gst_pad_set_blocked_async),
(gst_pad_set_activate_function),
(gst_pad_set_activatepull_function),
(gst_pad_set_activatepush_function), (gst_pad_set_chain_function),
(gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_set_event_function),
(gst_pad_set_query_function), (gst_pad_set_query_type_function),
(gst_pad_set_internal_link_function), (gst_pad_set_link_function),
(gst_pad_set_unlink_function), (gst_pad_set_getcaps_function),
(gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_set_bufferalloc_function), (gst_pad_link_check_hierarchy),
(gst_pad_get_caps_unlocked), (gst_pad_get_caps),
(gst_pad_peer_get_caps), (gst_pad_accept_caps),
(gst_pad_peer_accept_caps), (gst_pad_set_caps),
(gst_pad_configure_sink), (gst_pad_configure_src),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_buffer_alloc_unchecked), (gst_pad_alloc_buffer_full),
(gst_pad_query), (gst_pad_load_and_link), (handle_pad_block),
(gst_pad_chain_unchecked), (gst_pad_push), (gst_pad_get_range),
(gst_pad_send_event):
Use _DEBUG_OBJECT when it makes sense.
Protect GST_PAD_CAPS with the OBJECT_LOCK.
Small cleanups and code reflows.
Avoid caps refcounting in _accept_caps.
Refactor alloc_buffer so that the code performed on the peer is in a
separate function. Also if the pad does not implement a buffer alloc
function, we should still check if the pad is flushing before falling
back to the default allocator.
2006-07-31 14:21:10 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_EVENT, pad,
|
|
|
|
"have event type %d (FLUSH_START)", GST_EVENT_TYPE (event));
|
2005-06-23 11:43:39 +00:00
|
|
|
|
Some docs updates
Original commit message from CVS:
* CHANGES-0.9:
* docs/design/part-TODO.txt:
* docs/design/part-events.txt:
Some docs updates
* gst/base/gstbasesink.c: (gst_base_sink_handle_object),
(gst_base_sink_event), (gst_base_sink_do_sync),
(gst_base_sink_activate_push), (gst_base_sink_activate_pull):
* gst/base/gstbasesrc.c: (gst_base_src_send_discont),
(gst_base_src_do_seek), (gst_base_src_event_handler),
(gst_base_src_loop):
* gst/base/gstbasetransform.c: (gst_base_transform_transform_caps),
(gst_base_transform_configure_caps), (gst_base_transform_setcaps),
(gst_base_transform_get_size), (gst_base_transform_buffer_alloc),
(gst_base_transform_event), (gst_base_transform_handle_buffer),
(gst_base_transform_set_passthrough),
(gst_base_transform_is_passthrough):
* gst/elements/gstfakesink.c: (gst_fake_sink_event):
* gst/elements/gstfilesink.c: (gst_file_sink_event):
Event updates.
* gst/gstbuffer.h:
Use faster casts.
* gst/gstelement.c: (gst_element_seek):
* gst/gstelement.h:
Update gst_element_seek.
* gst/gstevent.c: (gst_event_finalize), (_gst_event_copy),
(gst_event_new), (gst_event_new_custom), (gst_event_get_structure),
(gst_event_new_flush_start), (gst_event_new_flush_stop),
(gst_event_new_eos), (gst_event_new_newsegment),
(gst_event_parse_newsegment), (gst_event_new_tag),
(gst_event_parse_tag), (gst_event_new_filler), (gst_event_new_qos),
(gst_event_parse_qos), (gst_event_new_seek),
(gst_event_parse_seek), (gst_event_new_navigation):
* gst/gstevent.h:
Make GstEvent use GstStructure. Add parsing code, make sure the
API is sufficiently generic.
Mark possible directions of events and serialization.
* gst/gstmessage.c: (gst_message_init), (gst_message_finalize),
(_gst_message_copy), (gst_message_new_segment_start),
(gst_message_new_segment_done), (gst_message_new_custom),
(gst_message_parse_segment_start),
(gst_message_parse_segment_done):
Small cleanups.
* gst/gstpad.c: (gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
(gst_pad_set_caps), (gst_pad_send_event):
Update for new events.
Catch events sent in wrong directions.
* gst/gstqueue.c: (gst_queue_link_src),
(gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
(gst_queue_handle_src_query):
Event updates.
* gst/gsttag.c:
* gst/gsttag.h:
Remove event code from this file.
* libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packet_from_event),
(gst_dp_event_from_packet):
Event updates.
2005-07-27 18:33:03 +00:00
|
|
|
/* can't even accept a flush begin event when flushing */
|
2014-08-21 13:49:17 +00:00
|
|
|
if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
|
Some docs updates
Original commit message from CVS:
* CHANGES-0.9:
* docs/design/part-TODO.txt:
* docs/design/part-events.txt:
Some docs updates
* gst/base/gstbasesink.c: (gst_base_sink_handle_object),
(gst_base_sink_event), (gst_base_sink_do_sync),
(gst_base_sink_activate_push), (gst_base_sink_activate_pull):
* gst/base/gstbasesrc.c: (gst_base_src_send_discont),
(gst_base_src_do_seek), (gst_base_src_event_handler),
(gst_base_src_loop):
* gst/base/gstbasetransform.c: (gst_base_transform_transform_caps),
(gst_base_transform_configure_caps), (gst_base_transform_setcaps),
(gst_base_transform_get_size), (gst_base_transform_buffer_alloc),
(gst_base_transform_event), (gst_base_transform_handle_buffer),
(gst_base_transform_set_passthrough),
(gst_base_transform_is_passthrough):
* gst/elements/gstfakesink.c: (gst_fake_sink_event):
* gst/elements/gstfilesink.c: (gst_file_sink_event):
Event updates.
* gst/gstbuffer.h:
Use faster casts.
* gst/gstelement.c: (gst_element_seek):
* gst/gstelement.h:
Update gst_element_seek.
* gst/gstevent.c: (gst_event_finalize), (_gst_event_copy),
(gst_event_new), (gst_event_new_custom), (gst_event_get_structure),
(gst_event_new_flush_start), (gst_event_new_flush_stop),
(gst_event_new_eos), (gst_event_new_newsegment),
(gst_event_parse_newsegment), (gst_event_new_tag),
(gst_event_parse_tag), (gst_event_new_filler), (gst_event_new_qos),
(gst_event_parse_qos), (gst_event_new_seek),
(gst_event_parse_seek), (gst_event_new_navigation):
* gst/gstevent.h:
Make GstEvent use GstStructure. Add parsing code, make sure the
API is sufficiently generic.
Mark possible directions of events and serialization.
* gst/gstmessage.c: (gst_message_init), (gst_message_finalize),
(_gst_message_copy), (gst_message_new_segment_start),
(gst_message_new_segment_done), (gst_message_new_custom),
(gst_message_parse_segment_start),
(gst_message_parse_segment_done):
Small cleanups.
* gst/gstpad.c: (gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
(gst_pad_set_caps), (gst_pad_send_event):
Update for new events.
Catch events sent in wrong directions.
* gst/gstqueue.c: (gst_queue_link_src),
(gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
(gst_queue_handle_src_query):
Event updates.
* gst/gsttag.c:
* gst/gsttag.h:
Remove event code from this file.
* libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packet_from_event),
(gst_dp_event_from_packet):
Event updates.
2005-07-27 18:33:03 +00:00
|
|
|
goto flushing;
|
2010-10-13 00:42:23 +00:00
|
|
|
|
Some docs updates
Original commit message from CVS:
* CHANGES-0.9:
* docs/design/part-TODO.txt:
* docs/design/part-events.txt:
Some docs updates
* gst/base/gstbasesink.c: (gst_base_sink_handle_object),
(gst_base_sink_event), (gst_base_sink_do_sync),
(gst_base_sink_activate_push), (gst_base_sink_activate_pull):
* gst/base/gstbasesrc.c: (gst_base_src_send_discont),
(gst_base_src_do_seek), (gst_base_src_event_handler),
(gst_base_src_loop):
* gst/base/gstbasetransform.c: (gst_base_transform_transform_caps),
(gst_base_transform_configure_caps), (gst_base_transform_setcaps),
(gst_base_transform_get_size), (gst_base_transform_buffer_alloc),
(gst_base_transform_event), (gst_base_transform_handle_buffer),
(gst_base_transform_set_passthrough),
(gst_base_transform_is_passthrough):
* gst/elements/gstfakesink.c: (gst_fake_sink_event):
* gst/elements/gstfilesink.c: (gst_file_sink_event):
Event updates.
* gst/gstbuffer.h:
Use faster casts.
* gst/gstelement.c: (gst_element_seek):
* gst/gstelement.h:
Update gst_element_seek.
* gst/gstevent.c: (gst_event_finalize), (_gst_event_copy),
(gst_event_new), (gst_event_new_custom), (gst_event_get_structure),
(gst_event_new_flush_start), (gst_event_new_flush_stop),
(gst_event_new_eos), (gst_event_new_newsegment),
(gst_event_parse_newsegment), (gst_event_new_tag),
(gst_event_parse_tag), (gst_event_new_filler), (gst_event_new_qos),
(gst_event_parse_qos), (gst_event_new_seek),
(gst_event_parse_seek), (gst_event_new_navigation):
* gst/gstevent.h:
Make GstEvent use GstStructure. Add parsing code, make sure the
API is sufficiently generic.
Mark possible directions of events and serialization.
* gst/gstmessage.c: (gst_message_init), (gst_message_finalize),
(_gst_message_copy), (gst_message_new_segment_start),
(gst_message_new_segment_done), (gst_message_new_custom),
(gst_message_parse_segment_start),
(gst_message_parse_segment_done):
Small cleanups.
* gst/gstpad.c: (gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
(gst_pad_set_caps), (gst_pad_send_event):
Update for new events.
Catch events sent in wrong directions.
* gst/gstqueue.c: (gst_queue_link_src),
(gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
(gst_queue_handle_src_query):
Event updates.
* gst/gsttag.c:
* gst/gsttag.h:
Remove event code from this file.
* libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packet_from_event),
(gst_dp_event_from_packet):
Event updates.
2005-07-27 18:33:03 +00:00
|
|
|
GST_PAD_SET_FLUSHING (pad);
|
gst/gstpad.c: Use _DEBUG_OBJECT when it makes sense.
Original commit message from CVS:
* gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
(gst_pad_get_property), (gst_pad_activate_pull),
(gst_pad_activate_push), (gst_pad_set_blocked_async),
(gst_pad_set_activate_function),
(gst_pad_set_activatepull_function),
(gst_pad_set_activatepush_function), (gst_pad_set_chain_function),
(gst_pad_set_getrange_function),
(gst_pad_set_checkgetrange_function), (gst_pad_set_event_function),
(gst_pad_set_query_function), (gst_pad_set_query_type_function),
(gst_pad_set_internal_link_function), (gst_pad_set_link_function),
(gst_pad_set_unlink_function), (gst_pad_set_getcaps_function),
(gst_pad_set_acceptcaps_function),
(gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
(gst_pad_set_bufferalloc_function), (gst_pad_link_check_hierarchy),
(gst_pad_get_caps_unlocked), (gst_pad_get_caps),
(gst_pad_peer_get_caps), (gst_pad_accept_caps),
(gst_pad_peer_accept_caps), (gst_pad_set_caps),
(gst_pad_configure_sink), (gst_pad_configure_src),
(gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
(gst_pad_buffer_alloc_unchecked), (gst_pad_alloc_buffer_full),
(gst_pad_query), (gst_pad_load_and_link), (handle_pad_block),
(gst_pad_chain_unchecked), (gst_pad_push), (gst_pad_get_range),
(gst_pad_send_event):
Use _DEBUG_OBJECT when it makes sense.
Protect GST_PAD_CAPS with the OBJECT_LOCK.
Small cleanups and code reflows.
Avoid caps refcounting in _accept_caps.
Refactor alloc_buffer so that the code performed on the peer is in a
separate function. Also if the pad does not implement a buffer alloc
function, we should still check if the pad is flushing before falling
back to the default allocator.
2006-07-31 14:21:10 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_EVENT, pad, "set flush flag");
|
2015-10-28 16:04:46 +00:00
|
|
|
GST_PAD_BLOCK_BROADCAST (pad);
|
|
|
|
type |= GST_PAD_PROBE_TYPE_EVENT_FLUSH;
|
Some docs updates
Original commit message from CVS:
* CHANGES-0.9:
* docs/design/part-TODO.txt:
* docs/design/part-events.txt:
Some docs updates
* gst/base/gstbasesink.c: (gst_base_sink_handle_object),
(gst_base_sink_event), (gst_base_sink_do_sync),
(gst_base_sink_activate_push), (gst_base_sink_activate_pull):
* gst/base/gstbasesrc.c: (gst_base_src_send_discont),
(gst_base_src_do_seek), (gst_base_src_event_handler),
(gst_base_src_loop):
* gst/base/gstbasetransform.c: (gst_base_transform_transform_caps),
(gst_base_transform_configure_caps), (gst_base_transform_setcaps),
(gst_base_transform_get_size), (gst_base_transform_buffer_alloc),
(gst_base_transform_event), (gst_base_transform_handle_buffer),
(gst_base_transform_set_passthrough),
(gst_base_transform_is_passthrough):
* gst/elements/gstfakesink.c: (gst_fake_sink_event):
* gst/elements/gstfilesink.c: (gst_file_sink_event):
Event updates.
* gst/gstbuffer.h:
Use faster casts.
* gst/gstelement.c: (gst_element_seek):
* gst/gstelement.h:
Update gst_element_seek.
* gst/gstevent.c: (gst_event_finalize), (_gst_event_copy),
(gst_event_new), (gst_event_new_custom), (gst_event_get_structure),
(gst_event_new_flush_start), (gst_event_new_flush_stop),
(gst_event_new_eos), (gst_event_new_newsegment),
(gst_event_parse_newsegment), (gst_event_new_tag),
(gst_event_parse_tag), (gst_event_new_filler), (gst_event_new_qos),
(gst_event_parse_qos), (gst_event_new_seek),
(gst_event_parse_seek), (gst_event_new_navigation):
* gst/gstevent.h:
Make GstEvent use GstStructure. Add parsing code, make sure the
API is sufficiently generic.
Mark possible directions of events and serialization.
* gst/gstmessage.c: (gst_message_init), (gst_message_finalize),
(_gst_message_copy), (gst_message_new_segment_start),
(gst_message_new_segment_done), (gst_message_new_custom),
(gst_message_parse_segment_start),
(gst_message_parse_segment_done):
Small cleanups.
* gst/gstpad.c: (gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
(gst_pad_set_caps), (gst_pad_send_event):
Update for new events.
Catch events sent in wrong directions.
* gst/gstqueue.c: (gst_queue_link_src),
(gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
(gst_queue_handle_src_query):
Event updates.
* gst/gsttag.c:
* gst/gsttag.h:
Remove event code from this file.
* libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packet_from_event),
(gst_dp_event_from_packet):
Event updates.
2005-07-27 18:33:03 +00:00
|
|
|
break;
|
|
|
|
case GST_EVENT_FLUSH_STOP:
|
2014-08-21 13:49:17 +00:00
|
|
|
/* we can't accept flush-stop on inactive pads else the flushing flag
|
|
|
|
* would be cleared and it would look like the pad can accept data.
|
|
|
|
* Also, some elements restart a streaming thread in flush-stop which we
|
|
|
|
* can't allow on inactive pads */
|
|
|
|
if (G_UNLIKELY (!GST_PAD_IS_ACTIVE (pad)))
|
|
|
|
goto inactive;
|
|
|
|
|
|
|
|
GST_PAD_UNSET_FLUSHING (pad);
|
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_EVENT, pad, "cleared flush flag");
|
2011-10-10 08:38:12 +00:00
|
|
|
/* Remove pending EOS events */
|
2012-11-11 12:52:25 +00:00
|
|
|
GST_LOG_OBJECT (pad, "Removing pending EOS and SEGMENT events");
|
2011-11-23 16:50:17 +00:00
|
|
|
remove_event_by_type (pad, GST_EVENT_EOS);
|
2016-03-14 03:20:42 +00:00
|
|
|
remove_event_by_type (pad, GST_EVENT_STREAM_GROUP_DONE);
|
2012-11-11 12:52:25 +00:00
|
|
|
remove_event_by_type (pad, GST_EVENT_SEGMENT);
|
2012-06-04 09:46:42 +00:00
|
|
|
GST_OBJECT_FLAG_UNSET (pad, GST_PAD_FLAG_EOS);
|
2014-05-23 16:25:35 +00:00
|
|
|
pad->ABI.abi.last_flowret = GST_FLOW_OK;
|
2011-10-10 08:38:12 +00:00
|
|
|
|
2006-02-13 09:59:03 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
/* grab stream lock */
|
|
|
|
GST_PAD_STREAM_LOCK (pad);
|
|
|
|
need_unlock = TRUE;
|
|
|
|
GST_OBJECT_LOCK (pad);
|
2011-11-22 17:32:51 +00:00
|
|
|
if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
|
|
|
|
goto flushing;
|
gst/gstpad.c: Propagate errors from _set_caps() in configure_src/sink functions instead of returning TRUE.
Original commit message from CVS:
* gst/gstpad.c: (gst_real_pad_init), (gst_pad_set_active),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_accept_caps),
(gst_pad_configure_sink), (gst_pad_configure_src),
(gst_pad_alloc_buffer), (gst_pad_query), (gst_pad_send_event),
(gst_pad_start_task):
Propagate errors from _set_caps() in configure_src/sink
functions instead of returning TRUE.
FLUSH events can travel up and downstream
2005-05-30 15:41:54 +00:00
|
|
|
break;
|
2011-05-03 11:42:44 +00:00
|
|
|
case GST_EVENT_RECONFIGURE:
|
|
|
|
if (GST_PAD_IS_SRC (pad))
|
2011-11-16 11:36:51 +00:00
|
|
|
GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_NEED_RECONFIGURE);
|
gst/gstpad.c: Propagate errors from _set_caps() in configure_src/sink functions instead of returning TRUE.
Original commit message from CVS:
* gst/gstpad.c: (gst_real_pad_init), (gst_pad_set_active),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_accept_caps),
(gst_pad_configure_sink), (gst_pad_configure_src),
(gst_pad_alloc_buffer), (gst_pad_query), (gst_pad_send_event),
(gst_pad_start_task):
Propagate errors from _set_caps() in configure_src/sink
functions instead of returning TRUE.
FLUSH events can travel up and downstream
2005-05-30 15:41:54 +00:00
|
|
|
default:
|
2012-02-08 11:57:11 +00:00
|
|
|
GST_CAT_DEBUG_OBJECT (GST_CAT_EVENT, pad,
|
|
|
|
"have event type %" GST_PTR_FORMAT, event);
|
2005-06-23 11:43:39 +00:00
|
|
|
|
2011-11-09 16:43:49 +00:00
|
|
|
if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
|
|
|
|
goto flushing;
|
|
|
|
|
2015-06-12 08:52:46 +00:00
|
|
|
switch (event_type) {
|
|
|
|
case GST_EVENT_STREAM_START:
|
|
|
|
/* Remove sticky EOS events */
|
|
|
|
GST_LOG_OBJECT (pad, "Removing pending EOS events");
|
|
|
|
remove_event_by_type (pad, GST_EVENT_EOS);
|
2016-03-14 03:20:42 +00:00
|
|
|
remove_event_by_type (pad, GST_EVENT_STREAM_GROUP_DONE);
|
2015-06-12 08:52:46 +00:00
|
|
|
GST_OBJECT_FLAG_UNSET (pad, GST_PAD_FLAG_EOS);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2006-02-13 09:59:03 +00:00
|
|
|
if (serialized) {
|
2012-06-06 07:13:11 +00:00
|
|
|
if (G_UNLIKELY (GST_PAD_IS_EOS (pad)))
|
|
|
|
goto eos;
|
|
|
|
|
2006-10-13 13:27:46 +00:00
|
|
|
/* lock order: STREAM_LOCK, LOCK, recheck flushing. */
|
2006-02-13 09:59:03 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
GST_PAD_STREAM_LOCK (pad);
|
|
|
|
need_unlock = TRUE;
|
|
|
|
GST_OBJECT_LOCK (pad);
|
2011-11-22 17:32:51 +00:00
|
|
|
if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
|
|
|
|
goto flushing;
|
2012-06-04 09:46:42 +00:00
|
|
|
|
|
|
|
if (G_UNLIKELY (GST_PAD_IS_EOS (pad)))
|
|
|
|
goto eos;
|
2006-02-13 09:59:03 +00:00
|
|
|
}
|
2011-05-18 17:43:44 +00:00
|
|
|
break;
|
2011-05-06 09:14:02 +00:00
|
|
|
}
|
|
|
|
|
2013-04-24 06:40:32 +00:00
|
|
|
/* now do the probe */
|
|
|
|
PROBE_PUSH (pad,
|
|
|
|
type | GST_PAD_PROBE_TYPE_PUSH |
|
|
|
|
GST_PAD_PROBE_TYPE_BLOCK, event, probe_stopped);
|
|
|
|
|
|
|
|
PROBE_PUSH (pad, type | GST_PAD_PROBE_TYPE_PUSH, event, probe_stopped);
|
|
|
|
|
2015-11-12 16:15:37 +00:00
|
|
|
eventfullfunc = GST_PAD_EVENTFULLFUNC (pad);
|
|
|
|
eventfunc = GST_PAD_EVENTFUNC (pad);
|
|
|
|
if (G_UNLIKELY (eventfunc == NULL && eventfullfunc == NULL))
|
2011-11-22 17:32:51 +00:00
|
|
|
goto no_function;
|
2011-05-08 10:43:26 +00:00
|
|
|
|
2011-11-22 17:32:51 +00:00
|
|
|
ACQUIRE_PARENT (pad, parent, no_parent);
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2011-05-18 16:53:35 +00:00
|
|
|
|
2011-11-28 12:54:43 +00:00
|
|
|
ret = pre_eventfunc_check (pad, event);
|
|
|
|
if (G_UNLIKELY (ret != GST_FLOW_OK))
|
2011-11-22 17:32:51 +00:00
|
|
|
goto precheck_failed;
|
2011-07-11 09:37:28 +00:00
|
|
|
|
2011-11-22 17:32:51 +00:00
|
|
|
if (sticky)
|
|
|
|
gst_event_ref (event);
|
2011-05-18 16:53:35 +00:00
|
|
|
|
2015-11-12 16:15:37 +00:00
|
|
|
if (eventfullfunc) {
|
|
|
|
ret = eventfullfunc (pad, parent, event);
|
|
|
|
} else if (eventfunc (pad, parent, event)) {
|
2011-11-28 12:54:43 +00:00
|
|
|
ret = GST_FLOW_OK;
|
|
|
|
} else {
|
|
|
|
/* something went wrong */
|
|
|
|
switch (event_type) {
|
|
|
|
case GST_EVENT_CAPS:
|
|
|
|
ret = GST_FLOW_NOT_NEGOTIATED;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
ret = GST_FLOW_ERROR;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2011-11-22 17:32:51 +00:00
|
|
|
RELEASE_PARENT (parent);
|
2011-05-18 09:08:52 +00:00
|
|
|
|
2011-11-28 12:54:43 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "sent event, ret %s", gst_flow_get_name (ret));
|
|
|
|
|
2011-11-22 17:32:51 +00:00
|
|
|
if (sticky) {
|
2011-11-28 12:54:43 +00:00
|
|
|
if (ret == GST_FLOW_OK) {
|
2012-10-05 05:14:17 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
2011-11-22 17:32:51 +00:00
|
|
|
/* after the event function accepted the event, we can store the sticky
|
|
|
|
* event on the pad */
|
2013-04-04 14:20:24 +00:00
|
|
|
switch (store_sticky_event (pad, event)) {
|
|
|
|
case GST_FLOW_FLUSHING:
|
|
|
|
goto flushing;
|
|
|
|
case GST_FLOW_EOS:
|
|
|
|
goto eos;
|
|
|
|
default:
|
|
|
|
break;
|
2012-10-05 05:14:17 +00:00
|
|
|
}
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2011-11-28 12:54:43 +00:00
|
|
|
}
|
2011-11-22 17:32:51 +00:00
|
|
|
gst_event_unref (event);
|
2011-05-06 09:14:02 +00:00
|
|
|
}
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
|
2006-02-13 09:59:03 +00:00
|
|
|
if (need_unlock)
|
2005-11-21 17:21:15 +00:00
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
2005-11-21 14:34:07 +00:00
|
|
|
|
2011-11-28 12:54:43 +00:00
|
|
|
return ret;
|
2005-03-21 17:34:02 +00:00
|
|
|
|
|
|
|
/* ERROR handling */
|
2011-11-28 12:54:43 +00:00
|
|
|
flushing:
|
Some docs updates
Original commit message from CVS:
* CHANGES-0.9:
* docs/design/part-TODO.txt:
* docs/design/part-events.txt:
Some docs updates
* gst/base/gstbasesink.c: (gst_base_sink_handle_object),
(gst_base_sink_event), (gst_base_sink_do_sync),
(gst_base_sink_activate_push), (gst_base_sink_activate_pull):
* gst/base/gstbasesrc.c: (gst_base_src_send_discont),
(gst_base_src_do_seek), (gst_base_src_event_handler),
(gst_base_src_loop):
* gst/base/gstbasetransform.c: (gst_base_transform_transform_caps),
(gst_base_transform_configure_caps), (gst_base_transform_setcaps),
(gst_base_transform_get_size), (gst_base_transform_buffer_alloc),
(gst_base_transform_event), (gst_base_transform_handle_buffer),
(gst_base_transform_set_passthrough),
(gst_base_transform_is_passthrough):
* gst/elements/gstfakesink.c: (gst_fake_sink_event):
* gst/elements/gstfilesink.c: (gst_file_sink_event):
Event updates.
* gst/gstbuffer.h:
Use faster casts.
* gst/gstelement.c: (gst_element_seek):
* gst/gstelement.h:
Update gst_element_seek.
* gst/gstevent.c: (gst_event_finalize), (_gst_event_copy),
(gst_event_new), (gst_event_new_custom), (gst_event_get_structure),
(gst_event_new_flush_start), (gst_event_new_flush_stop),
(gst_event_new_eos), (gst_event_new_newsegment),
(gst_event_parse_newsegment), (gst_event_new_tag),
(gst_event_parse_tag), (gst_event_new_filler), (gst_event_new_qos),
(gst_event_parse_qos), (gst_event_new_seek),
(gst_event_parse_seek), (gst_event_new_navigation):
* gst/gstevent.h:
Make GstEvent use GstStructure. Add parsing code, make sure the
API is sufficiently generic.
Mark possible directions of events and serialization.
* gst/gstmessage.c: (gst_message_init), (gst_message_finalize),
(_gst_message_copy), (gst_message_new_segment_start),
(gst_message_new_segment_done), (gst_message_new_custom),
(gst_message_parse_segment_start),
(gst_message_parse_segment_done):
Small cleanups.
* gst/gstpad.c: (gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
(gst_pad_set_caps), (gst_pad_send_event):
Update for new events.
Catch events sent in wrong directions.
* gst/gstqueue.c: (gst_queue_link_src),
(gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
(gst_queue_handle_src_query):
Event updates.
* gst/gsttag.c:
* gst/gsttag.h:
Remove event code from this file.
* libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packet_from_event),
(gst_dp_event_from_packet):
Event updates.
2005-07-27 18:33:03 +00:00
|
|
|
{
|
2011-11-28 12:54:43 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
if (need_unlock)
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
|
|
|
GST_CAT_INFO_OBJECT (GST_CAT_EVENT, pad,
|
|
|
|
"Received event on flushing pad. Discarding");
|
Some docs updates
Original commit message from CVS:
* CHANGES-0.9:
* docs/design/part-TODO.txt:
* docs/design/part-events.txt:
Some docs updates
* gst/base/gstbasesink.c: (gst_base_sink_handle_object),
(gst_base_sink_event), (gst_base_sink_do_sync),
(gst_base_sink_activate_push), (gst_base_sink_activate_pull):
* gst/base/gstbasesrc.c: (gst_base_src_send_discont),
(gst_base_src_do_seek), (gst_base_src_event_handler),
(gst_base_src_loop):
* gst/base/gstbasetransform.c: (gst_base_transform_transform_caps),
(gst_base_transform_configure_caps), (gst_base_transform_setcaps),
(gst_base_transform_get_size), (gst_base_transform_buffer_alloc),
(gst_base_transform_event), (gst_base_transform_handle_buffer),
(gst_base_transform_set_passthrough),
(gst_base_transform_is_passthrough):
* gst/elements/gstfakesink.c: (gst_fake_sink_event):
* gst/elements/gstfilesink.c: (gst_file_sink_event):
Event updates.
* gst/gstbuffer.h:
Use faster casts.
* gst/gstelement.c: (gst_element_seek):
* gst/gstelement.h:
Update gst_element_seek.
* gst/gstevent.c: (gst_event_finalize), (_gst_event_copy),
(gst_event_new), (gst_event_new_custom), (gst_event_get_structure),
(gst_event_new_flush_start), (gst_event_new_flush_stop),
(gst_event_new_eos), (gst_event_new_newsegment),
(gst_event_parse_newsegment), (gst_event_new_tag),
(gst_event_parse_tag), (gst_event_new_filler), (gst_event_new_qos),
(gst_event_parse_qos), (gst_event_new_seek),
(gst_event_parse_seek), (gst_event_new_navigation):
* gst/gstevent.h:
Make GstEvent use GstStructure. Add parsing code, make sure the
API is sufficiently generic.
Mark possible directions of events and serialization.
* gst/gstmessage.c: (gst_message_init), (gst_message_finalize),
(_gst_message_copy), (gst_message_new_segment_start),
(gst_message_new_segment_done), (gst_message_new_custom),
(gst_message_parse_segment_start),
(gst_message_parse_segment_done):
Small cleanups.
* gst/gstpad.c: (gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
(gst_pad_set_caps), (gst_pad_send_event):
Update for new events.
Catch events sent in wrong directions.
* gst/gstqueue.c: (gst_queue_link_src),
(gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
(gst_queue_handle_src_query):
Event updates.
* gst/gsttag.c:
* gst/gsttag.h:
Remove event code from this file.
* libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packet_from_event),
(gst_dp_event_from_packet):
Event updates.
2005-07-27 18:33:03 +00:00
|
|
|
gst_event_unref (event);
|
2012-02-08 14:16:46 +00:00
|
|
|
return GST_FLOW_FLUSHING;
|
Some docs updates
Original commit message from CVS:
* CHANGES-0.9:
* docs/design/part-TODO.txt:
* docs/design/part-events.txt:
Some docs updates
* gst/base/gstbasesink.c: (gst_base_sink_handle_object),
(gst_base_sink_event), (gst_base_sink_do_sync),
(gst_base_sink_activate_push), (gst_base_sink_activate_pull):
* gst/base/gstbasesrc.c: (gst_base_src_send_discont),
(gst_base_src_do_seek), (gst_base_src_event_handler),
(gst_base_src_loop):
* gst/base/gstbasetransform.c: (gst_base_transform_transform_caps),
(gst_base_transform_configure_caps), (gst_base_transform_setcaps),
(gst_base_transform_get_size), (gst_base_transform_buffer_alloc),
(gst_base_transform_event), (gst_base_transform_handle_buffer),
(gst_base_transform_set_passthrough),
(gst_base_transform_is_passthrough):
* gst/elements/gstfakesink.c: (gst_fake_sink_event):
* gst/elements/gstfilesink.c: (gst_file_sink_event):
Event updates.
* gst/gstbuffer.h:
Use faster casts.
* gst/gstelement.c: (gst_element_seek):
* gst/gstelement.h:
Update gst_element_seek.
* gst/gstevent.c: (gst_event_finalize), (_gst_event_copy),
(gst_event_new), (gst_event_new_custom), (gst_event_get_structure),
(gst_event_new_flush_start), (gst_event_new_flush_stop),
(gst_event_new_eos), (gst_event_new_newsegment),
(gst_event_parse_newsegment), (gst_event_new_tag),
(gst_event_parse_tag), (gst_event_new_filler), (gst_event_new_qos),
(gst_event_parse_qos), (gst_event_new_seek),
(gst_event_parse_seek), (gst_event_new_navigation):
* gst/gstevent.h:
Make GstEvent use GstStructure. Add parsing code, make sure the
API is sufficiently generic.
Mark possible directions of events and serialization.
* gst/gstmessage.c: (gst_message_init), (gst_message_finalize),
(_gst_message_copy), (gst_message_new_segment_start),
(gst_message_new_segment_done), (gst_message_new_custom),
(gst_message_parse_segment_start),
(gst_message_parse_segment_done):
Small cleanups.
* gst/gstpad.c: (gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
(gst_pad_set_caps), (gst_pad_send_event):
Update for new events.
Catch events sent in wrong directions.
* gst/gstqueue.c: (gst_queue_link_src),
(gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
(gst_queue_handle_src_query):
Event updates.
* gst/gsttag.c:
* gst/gsttag.h:
Remove event code from this file.
* libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packet_from_event),
(gst_dp_event_from_packet):
Event updates.
2005-07-27 18:33:03 +00:00
|
|
|
}
|
2014-08-21 13:49:17 +00:00
|
|
|
inactive:
|
|
|
|
{
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
if (need_unlock)
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
|
|
|
GST_CAT_INFO_OBJECT (GST_CAT_EVENT, pad,
|
|
|
|
"Received flush-stop on inactive pad. Discarding");
|
|
|
|
gst_event_unref (event);
|
|
|
|
return GST_FLOW_FLUSHING;
|
|
|
|
}
|
2012-06-04 09:46:42 +00:00
|
|
|
eos:
|
|
|
|
{
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
if (need_unlock)
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
|
|
|
GST_CAT_INFO_OBJECT (GST_CAT_EVENT, pad,
|
|
|
|
"Received event on EOS pad. Discarding");
|
|
|
|
gst_event_unref (event);
|
|
|
|
return GST_FLOW_EOS;
|
|
|
|
}
|
2011-11-28 12:54:43 +00:00
|
|
|
probe_stopped:
|
2006-02-13 09:59:03 +00:00
|
|
|
{
|
2011-11-28 12:54:43 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
if (need_unlock)
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
2015-04-29 13:49:17 +00:00
|
|
|
/* Only unref if unhandled */
|
|
|
|
if (ret != GST_FLOW_CUSTOM_SUCCESS_1)
|
|
|
|
gst_event_unref (event);
|
2011-11-28 12:54:43 +00:00
|
|
|
|
|
|
|
switch (ret) {
|
2015-04-29 13:49:17 +00:00
|
|
|
case GST_FLOW_CUSTOM_SUCCESS_1:
|
2011-11-28 12:54:43 +00:00
|
|
|
case GST_FLOW_CUSTOM_SUCCESS:
|
2015-04-29 13:49:17 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "dropped or handled event");
|
2011-11-28 12:54:43 +00:00
|
|
|
ret = GST_FLOW_OK;
|
|
|
|
break;
|
|
|
|
default:
|
2013-12-07 14:40:32 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "an error occurred %s", gst_flow_get_name (ret));
|
2011-11-28 12:54:43 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
return ret;
|
2006-02-13 09:59:03 +00:00
|
|
|
}
|
2005-03-21 17:34:02 +00:00
|
|
|
no_function:
|
|
|
|
{
|
|
|
|
g_warning ("pad %s:%s has no event handler, file a bug.",
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
GST_DEBUG_PAD_NAME (pad));
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2007-03-22 08:23:41 +00:00
|
|
|
if (need_unlock)
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
gst_event_unref (event);
|
2011-11-28 12:54:43 +00:00
|
|
|
return GST_FLOW_NOT_SUPPORTED;
|
2011-11-22 17:32:51 +00:00
|
|
|
}
|
2011-11-16 11:08:22 +00:00
|
|
|
no_parent:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (pad, "no parent");
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
if (need_unlock)
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
|
|
|
gst_event_unref (event);
|
2012-02-08 14:16:46 +00:00
|
|
|
return GST_FLOW_FLUSHING;
|
2011-11-16 11:08:22 +00:00
|
|
|
}
|
2011-11-28 12:54:43 +00:00
|
|
|
precheck_failed:
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
{
|
2011-11-28 12:54:43 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "pre event check failed");
|
|
|
|
RELEASE_PARENT (parent);
|
2006-02-13 09:59:03 +00:00
|
|
|
if (need_unlock)
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
2011-11-28 12:54:43 +00:00
|
|
|
gst_event_unref (event);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gst_pad_send_event:
|
|
|
|
* @pad: a #GstPad to send the event to.
|
|
|
|
* @event: (transfer full): the #GstEvent to send to the pad.
|
|
|
|
*
|
|
|
|
* Sends the event to the pad. This function can be used
|
|
|
|
* by applications to send events in the pipeline.
|
|
|
|
*
|
|
|
|
* If @pad is a source pad, @event should be an upstream event. If @pad is a
|
|
|
|
* sink pad, @event should be a downstream event. For example, you would not
|
|
|
|
* send a #GST_EVENT_EOS on a src pad; EOS events only propagate downstream.
|
|
|
|
* Furthermore, some downstream events have to be serialized with data flow,
|
|
|
|
* like EOS, while some can travel out-of-band, like #GST_EVENT_FLUSH_START. If
|
|
|
|
* the event needs to be serialized with data flow, this function will take the
|
|
|
|
* pad's stream lock while calling its event function.
|
|
|
|
*
|
|
|
|
* To find out whether an event type is upstream, downstream, or downstream and
|
|
|
|
* serialized, see #GstEventTypeFlags, gst_event_type_get_flags(),
|
|
|
|
* #GST_EVENT_IS_UPSTREAM, #GST_EVENT_IS_DOWNSTREAM, and
|
|
|
|
* #GST_EVENT_IS_SERIALIZED. Note that in practice that an application or
|
|
|
|
* plugin doesn't need to bother itself with this information; the core handles
|
|
|
|
* all necessary locks and checks.
|
|
|
|
*
|
2013-12-07 14:38:19 +00:00
|
|
|
* This function takes ownership of the provided event so you should
|
2011-11-28 12:54:43 +00:00
|
|
|
* gst_event_ref() it if you want to reuse the event after this call.
|
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Returns: %TRUE if the event was handled.
|
2011-11-28 12:54:43 +00:00
|
|
|
*/
|
|
|
|
gboolean
|
|
|
|
gst_pad_send_event (GstPad * pad, GstEvent * event)
|
|
|
|
{
|
|
|
|
gboolean result;
|
|
|
|
GstPadProbeType type;
|
|
|
|
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
|
|
|
|
g_return_val_if_fail (event != NULL, FALSE);
|
|
|
|
|
|
|
|
if (GST_PAD_IS_SINK (pad)) {
|
|
|
|
if (G_UNLIKELY (!GST_EVENT_IS_DOWNSTREAM (event)))
|
|
|
|
goto wrong_direction;
|
|
|
|
type = GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM;
|
|
|
|
} else if (GST_PAD_IS_SRC (pad)) {
|
|
|
|
if (G_UNLIKELY (!GST_EVENT_IS_UPSTREAM (event)))
|
|
|
|
goto wrong_direction;
|
|
|
|
type = GST_PAD_PROBE_TYPE_EVENT_UPSTREAM;
|
|
|
|
} else
|
|
|
|
goto unknown_direction;
|
|
|
|
|
|
|
|
if (gst_pad_send_event_unchecked (pad, event, type) != GST_FLOW_OK)
|
|
|
|
result = FALSE;
|
|
|
|
else
|
|
|
|
result = TRUE;
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
|
|
|
/* ERROR handling */
|
|
|
|
wrong_direction:
|
|
|
|
{
|
|
|
|
g_warning ("pad %s:%s sending %s event in wrong direction",
|
|
|
|
GST_DEBUG_PAD_NAME (pad), GST_EVENT_TYPE_NAME (event));
|
2005-03-21 17:34:02 +00:00
|
|
|
gst_event_unref (event);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2011-11-28 12:54:43 +00:00
|
|
|
unknown_direction:
|
gst/: Removed atomic operations, use existing LOCK.
Original commit message from CVS:
* gst/gstpad.c: (_gst_do_pass_data_accumulator),
(default_have_data), (gst_pad_class_init), (gst_pad_init),
(gst_pad_emit_have_data_signal), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range), (gst_pad_push_event), (gst_pad_send_event):
* gst/gstpad.h:
* gst/gstutils.c: (gst_atomic_int_set), (gst_pad_add_data_probe),
(gst_pad_add_event_probe), (gst_pad_add_buffer_probe),
(gst_pad_remove_data_probe), (gst_pad_remove_event_probe),
(gst_pad_remove_buffer_probe):
Removed atomic operations, use existing LOCK.
Move exception handling out of main code path.
2005-06-30 09:23:54 +00:00
|
|
|
{
|
2011-11-28 12:54:43 +00:00
|
|
|
g_warning ("pad %s:%s has invalid direction", GST_DEBUG_PAD_NAME (pad));
|
gst/: Removed atomic operations, use existing LOCK.
Original commit message from CVS:
* gst/gstpad.c: (_gst_do_pass_data_accumulator),
(default_have_data), (gst_pad_class_init), (gst_pad_init),
(gst_pad_emit_have_data_signal), (gst_pad_chain), (gst_pad_push),
(gst_pad_check_pull_range), (gst_pad_get_range),
(gst_pad_pull_range), (gst_pad_push_event), (gst_pad_send_event):
* gst/gstpad.h:
* gst/gstutils.c: (gst_atomic_int_set), (gst_pad_add_data_probe),
(gst_pad_add_event_probe), (gst_pad_add_buffer_probe),
(gst_pad_remove_data_probe), (gst_pad_remove_event_probe),
(gst_pad_remove_buffer_probe):
Removed atomic operations, use existing LOCK.
Move exception handling out of main code path.
2005-06-30 09:23:54 +00:00
|
|
|
gst_event_unref (event);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2002-05-26 21:54:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2005-05-09 10:53:13 +00:00
|
|
|
* gst_pad_set_element_private:
|
|
|
|
* @pad: the #GstPad to set the private data of.
|
|
|
|
* @priv: The private data to attach to the pad.
|
2002-05-26 21:54:27 +00:00
|
|
|
*
|
2005-10-15 15:30:24 +00:00
|
|
|
* Set the given private data gpointer on the pad.
|
2005-05-09 10:53:13 +00:00
|
|
|
* This function can only be used by the element that owns the pad.
|
2005-11-24 09:44:07 +00:00
|
|
|
* No locking is performed in this function.
|
2002-05-26 21:54:27 +00:00
|
|
|
*/
|
2005-05-09 10:53:13 +00:00
|
|
|
void
|
|
|
|
gst_pad_set_element_private (GstPad * pad, gpointer priv)
|
2002-05-26 21:54:27 +00:00
|
|
|
{
|
2005-05-09 10:53:13 +00:00
|
|
|
pad->element_private = priv;
|
2002-05-26 21:54:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2005-05-09 10:53:13 +00:00
|
|
|
* gst_pad_get_element_private:
|
|
|
|
* @pad: the #GstPad to get the private data of.
|
2002-05-26 21:54:27 +00:00
|
|
|
*
|
2005-05-09 10:53:13 +00:00
|
|
|
* Gets the private data of a pad.
|
2005-11-24 09:44:07 +00:00
|
|
|
* No locking is performed in this function.
|
2002-05-26 21:54:27 +00:00
|
|
|
*
|
2017-10-22 12:35:30 +00:00
|
|
|
* Returns: (transfer none) (nullable): a #gpointer to the private data.
|
2002-05-26 21:54:27 +00:00
|
|
|
*/
|
2005-05-09 10:53:13 +00:00
|
|
|
gpointer
|
|
|
|
gst_pad_get_element_private (GstPad * pad)
|
2002-05-26 21:54:27 +00:00
|
|
|
{
|
2005-05-09 10:53:13 +00:00
|
|
|
return pad->element_private;
|
|
|
|
}
|
2002-05-26 21:54:27 +00:00
|
|
|
|
2011-05-18 14:26:31 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_get_sticky_event:
|
|
|
|
* @pad: the #GstPad to get the event from.
|
|
|
|
* @event_type: the #GstEventType that should be retrieved.
|
2011-11-23 16:50:17 +00:00
|
|
|
* @idx: the index of the event
|
2011-05-18 14:26:31 +00:00
|
|
|
*
|
|
|
|
* Returns a new reference of the sticky event of type @event_type
|
2011-05-20 09:36:25 +00:00
|
|
|
* from the event.
|
2011-05-18 14:26:31 +00:00
|
|
|
*
|
2014-06-11 22:21:34 +00:00
|
|
|
* Returns: (transfer full) (nullable): a #GstEvent of type
|
|
|
|
* @event_type or %NULL when no event of @event_type was on
|
|
|
|
* @pad. Unref after usage.
|
2011-05-18 14:26:31 +00:00
|
|
|
*/
|
|
|
|
GstEvent *
|
2011-11-23 16:50:17 +00:00
|
|
|
gst_pad_get_sticky_event (GstPad * pad, GstEventType event_type, guint idx)
|
2011-05-18 14:26:31 +00:00
|
|
|
{
|
|
|
|
GstEvent *event = NULL;
|
2011-11-23 16:50:17 +00:00
|
|
|
PadEvent *ev;
|
2011-05-18 14:26:31 +00:00
|
|
|
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), NULL);
|
|
|
|
g_return_val_if_fail ((event_type & GST_EVENT_TYPE_STICKY) != 0, NULL);
|
|
|
|
|
2011-05-18 14:29:10 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
2011-11-23 16:50:17 +00:00
|
|
|
ev = find_event_by_type (pad, event_type, idx);
|
|
|
|
if (ev && (event = ev->event))
|
2011-05-20 09:36:25 +00:00
|
|
|
gst_event_ref (event);
|
2011-05-18 14:29:10 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2011-05-18 14:26:31 +00:00
|
|
|
|
|
|
|
return event;
|
|
|
|
}
|
|
|
|
|
2011-11-23 16:50:17 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
GstPadStickyEventsForeachFunction func;
|
|
|
|
gpointer user_data;
|
|
|
|
} ForeachDispatch;
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
foreach_dispatch_function (GstPad * pad, PadEvent * ev, gpointer user_data)
|
|
|
|
{
|
|
|
|
ForeachDispatch *data = user_data;
|
2013-05-09 15:22:16 +00:00
|
|
|
gboolean ret = TRUE;
|
2011-11-23 16:50:17 +00:00
|
|
|
|
2013-05-09 08:59:41 +00:00
|
|
|
if (ev->event) {
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2011-11-23 16:50:17 +00:00
|
|
|
|
2013-05-09 08:59:41 +00:00
|
|
|
ret = data->func (pad, &ev->event, data->user_data);
|
2011-11-23 16:50:17 +00:00
|
|
|
|
2013-05-09 08:59:41 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
}
|
2011-11-23 16:50:17 +00:00
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2011-05-24 14:08:41 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_sticky_events_foreach:
|
|
|
|
* @pad: the #GstPad that should be used for iteration.
|
2011-11-23 16:50:17 +00:00
|
|
|
* @foreach_func: (scope call): the #GstPadStickyEventsForeachFunction that
|
|
|
|
* should be called for every event.
|
2011-05-24 14:08:41 +00:00
|
|
|
* @user_data: (closure): the optional user data.
|
|
|
|
*
|
2011-11-23 16:50:17 +00:00
|
|
|
* Iterates all sticky events on @pad and calls @foreach_func for every
|
|
|
|
* event. If @foreach_func returns %FALSE the iteration is immediately stopped.
|
2011-05-24 14:08:41 +00:00
|
|
|
*/
|
2011-11-23 16:50:17 +00:00
|
|
|
void
|
2011-05-24 14:08:41 +00:00
|
|
|
gst_pad_sticky_events_foreach (GstPad * pad,
|
|
|
|
GstPadStickyEventsForeachFunction foreach_func, gpointer user_data)
|
|
|
|
{
|
2011-11-23 16:50:17 +00:00
|
|
|
ForeachDispatch data;
|
2011-05-24 14:08:41 +00:00
|
|
|
|
2011-11-23 16:50:17 +00:00
|
|
|
g_return_if_fail (GST_IS_PAD (pad));
|
|
|
|
g_return_if_fail (foreach_func != NULL);
|
2011-05-24 14:08:41 +00:00
|
|
|
|
2011-11-23 16:50:17 +00:00
|
|
|
data.func = foreach_func;
|
|
|
|
data.user_data = user_data;
|
2011-05-24 14:08:41 +00:00
|
|
|
|
2011-11-23 16:50:17 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
events_foreach (pad, foreach_dispatch_function, &data);
|
2011-05-24 14:08:41 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
}
|
|
|
|
|
2009-04-21 12:46:29 +00:00
|
|
|
static void
|
|
|
|
do_stream_status (GstPad * pad, GstStreamStatusType type,
|
|
|
|
GThread * thread, GstTask * task)
|
|
|
|
{
|
|
|
|
GstElement *parent;
|
|
|
|
|
|
|
|
GST_DEBUG_OBJECT (pad, "doing stream-status %d", type);
|
|
|
|
|
|
|
|
if ((parent = GST_ELEMENT_CAST (gst_pad_get_parent (pad)))) {
|
|
|
|
if (GST_IS_ELEMENT (parent)) {
|
|
|
|
GstMessage *message;
|
|
|
|
GValue value = { 0 };
|
|
|
|
|
2010-03-15 12:48:30 +00:00
|
|
|
if (type == GST_STREAM_STATUS_TYPE_ENTER) {
|
|
|
|
gchar *tname, *ename, *pname;
|
|
|
|
|
|
|
|
/* create a good task name */
|
|
|
|
ename = gst_element_get_name (parent);
|
|
|
|
pname = gst_pad_get_name (pad);
|
|
|
|
tname = g_strdup_printf ("%s:%s", ename, pname);
|
|
|
|
g_free (ename);
|
|
|
|
g_free (pname);
|
|
|
|
|
|
|
|
gst_object_set_name (GST_OBJECT_CAST (task), tname);
|
|
|
|
g_free (tname);
|
|
|
|
}
|
|
|
|
|
2009-04-21 12:46:29 +00:00
|
|
|
message = gst_message_new_stream_status (GST_OBJECT_CAST (pad),
|
|
|
|
type, parent);
|
|
|
|
|
|
|
|
g_value_init (&value, GST_TYPE_TASK);
|
|
|
|
g_value_set_object (&value, task);
|
|
|
|
gst_message_set_stream_status_object (message, &value);
|
|
|
|
g_value_unset (&value);
|
|
|
|
|
|
|
|
GST_DEBUG_OBJECT (pad, "posting stream-status %d", type);
|
|
|
|
gst_element_post_message (parent, message);
|
|
|
|
}
|
|
|
|
gst_object_unref (parent);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
pad_enter_thread (GstTask * task, GThread * thread, gpointer user_data)
|
|
|
|
{
|
|
|
|
do_stream_status (GST_PAD_CAST (user_data), GST_STREAM_STATUS_TYPE_ENTER,
|
|
|
|
thread, task);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
pad_leave_thread (GstTask * task, GThread * thread, gpointer user_data)
|
|
|
|
{
|
|
|
|
do_stream_status (GST_PAD_CAST (user_data), GST_STREAM_STATUS_TYPE_LEAVE,
|
|
|
|
thread, task);
|
|
|
|
}
|
|
|
|
|
2005-06-20 15:18:17 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_start_task:
|
|
|
|
* @pad: the #GstPad to start the task of
|
|
|
|
* @func: the task function to call
|
2012-06-20 08:31:49 +00:00
|
|
|
* @user_data: user data passed to the task function
|
|
|
|
* @notify: called when @user_data is no longer referenced
|
2005-06-20 15:18:17 +00:00
|
|
|
*
|
2012-06-20 08:31:49 +00:00
|
|
|
* Starts a task that repeatedly calls @func with @user_data. This function
|
2007-01-21 20:24:11 +00:00
|
|
|
* is mostly used in pad activation functions to start the dataflow.
|
|
|
|
* The #GST_PAD_STREAM_LOCK of @pad will automatically be acquired
|
|
|
|
* before @func is called.
|
2005-06-20 15:18:17 +00:00
|
|
|
*
|
2006-11-06 15:18:57 +00:00
|
|
|
* Returns: a %TRUE if the task could be started.
|
2005-06-20 15:18:17 +00:00
|
|
|
*/
|
2005-05-09 10:53:13 +00:00
|
|
|
gboolean
|
2012-06-20 08:31:49 +00:00
|
|
|
gst_pad_start_task (GstPad * pad, GstTaskFunction func, gpointer user_data,
|
|
|
|
GDestroyNotify notify)
|
2005-05-09 10:53:13 +00:00
|
|
|
{
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
GstTask *task;
|
2009-04-21 15:14:34 +00:00
|
|
|
gboolean res;
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
|
|
|
|
g_return_val_if_fail (func != NULL, FALSE);
|
|
|
|
|
2006-08-23 16:51:19 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "start task");
|
|
|
|
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
task = GST_PAD_TASK (pad);
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
if (task == NULL) {
|
2012-06-20 08:31:49 +00:00
|
|
|
task = gst_task_new (func, user_data, notify);
|
2005-11-21 17:21:15 +00:00
|
|
|
gst_task_set_lock (task, GST_PAD_GET_STREAM_LOCK (pad));
|
2012-06-20 09:59:09 +00:00
|
|
|
gst_task_set_enter_callback (task, pad_enter_thread, pad, NULL);
|
|
|
|
gst_task_set_leave_callback (task, pad_leave_thread, pad, NULL);
|
2012-03-08 16:30:49 +00:00
|
|
|
GST_INFO_OBJECT (pad, "created task %p", task);
|
2009-05-25 11:03:42 +00:00
|
|
|
GST_PAD_TASK (pad) = task;
|
|
|
|
gst_object_ref (task);
|
2009-04-23 15:48:08 +00:00
|
|
|
/* release lock to post the message */
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
|
|
|
|
do_stream_status (pad, GST_STREAM_STATUS_TYPE_CREATE, NULL, task);
|
|
|
|
|
2009-05-25 11:03:42 +00:00
|
|
|
gst_object_unref (task);
|
|
|
|
|
2009-04-23 15:48:08 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
/* nobody else is supposed to have changed the pad now */
|
2009-05-25 11:03:42 +00:00
|
|
|
if (GST_PAD_TASK (pad) != task)
|
|
|
|
goto concurrent_stop;
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
}
|
2009-04-21 15:14:34 +00:00
|
|
|
res = gst_task_set_state (task, GST_TASK_STARTED);
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
|
2009-04-21 15:14:34 +00:00
|
|
|
return res;
|
2009-04-23 15:48:08 +00:00
|
|
|
|
|
|
|
/* ERRORS */
|
2009-05-25 11:03:42 +00:00
|
|
|
concurrent_stop:
|
2009-04-23 15:48:08 +00:00
|
|
|
{
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2009-05-25 11:03:42 +00:00
|
|
|
return TRUE;
|
2009-04-23 15:48:08 +00:00
|
|
|
}
|
2005-05-09 10:53:13 +00:00
|
|
|
}
|
2002-05-26 21:54:27 +00:00
|
|
|
|
2005-06-20 15:18:17 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_pause_task:
|
|
|
|
* @pad: the #GstPad to pause the task of
|
|
|
|
*
|
2007-08-07 09:56:08 +00:00
|
|
|
* Pause the task of @pad. This function will also wait until the
|
|
|
|
* function executed by the task is finished if this function is not
|
|
|
|
* called from the task function.
|
2005-06-20 15:18:17 +00:00
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Returns: a %TRUE if the task could be paused or %FALSE when the pad
|
2005-06-20 15:18:17 +00:00
|
|
|
* has no task.
|
|
|
|
*/
|
2005-05-09 10:53:13 +00:00
|
|
|
gboolean
|
|
|
|
gst_pad_pause_task (GstPad * pad)
|
|
|
|
{
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
GstTask *task;
|
2009-04-21 15:14:34 +00:00
|
|
|
gboolean res;
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
|
|
|
|
|
2006-08-23 16:51:19 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "pause task");
|
|
|
|
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
task = GST_PAD_TASK (pad);
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
if (task == NULL)
|
|
|
|
goto no_task;
|
2009-04-21 15:14:34 +00:00
|
|
|
res = gst_task_set_state (task, GST_TASK_PAUSED);
|
2018-01-15 17:13:45 +00:00
|
|
|
/* unblock activation waits if any */
|
|
|
|
pad->priv->in_activation = FALSE;
|
|
|
|
g_cond_broadcast (&pad->priv->activation_cond);
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
|
2007-10-05 14:44:18 +00:00
|
|
|
/* wait for task function to finish, this lock is recursive so it does nothing
|
|
|
|
* when the pause is called from the task itself */
|
2005-11-21 17:21:15 +00:00
|
|
|
GST_PAD_STREAM_LOCK (pad);
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
|
2009-04-21 15:14:34 +00:00
|
|
|
return res;
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
|
|
|
|
no_task:
|
|
|
|
{
|
2005-11-16 16:06:06 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "pad has no task");
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2005-10-12 11:49:35 +00:00
|
|
|
return FALSE;
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
}
|
2002-05-26 21:54:27 +00:00
|
|
|
}
|
2002-07-24 21:04:50 +00:00
|
|
|
|
2017-02-17 18:48:17 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_get_task_state:
|
|
|
|
* @pad: the #GstPad to get task state from
|
|
|
|
*
|
|
|
|
* Get @pad task state. If no task is currently
|
2017-02-24 21:35:27 +00:00
|
|
|
* set, #GST_TASK_STOPPED is returned.
|
2017-02-17 18:48:17 +00:00
|
|
|
*
|
|
|
|
* Returns: The current state of @pad's task.
|
2017-02-24 21:35:27 +00:00
|
|
|
*
|
|
|
|
* Since: 1.12
|
2017-02-17 18:48:17 +00:00
|
|
|
*/
|
|
|
|
GstTaskState
|
|
|
|
gst_pad_get_task_state (GstPad * pad)
|
|
|
|
{
|
|
|
|
GstTask *task;
|
|
|
|
GstTaskState res;
|
|
|
|
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), GST_TASK_STOPPED);
|
|
|
|
|
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
task = GST_PAD_TASK (pad);
|
|
|
|
if (task == NULL)
|
|
|
|
goto no_task;
|
|
|
|
res = gst_task_get_state (task);
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
|
|
|
|
return res;
|
|
|
|
|
|
|
|
no_task:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (pad, "pad has no task");
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
return GST_TASK_STOPPED;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-06-20 15:18:17 +00:00
|
|
|
/**
|
|
|
|
* gst_pad_stop_task:
|
|
|
|
* @pad: the #GstPad to stop the task of
|
|
|
|
*
|
2005-10-15 15:30:24 +00:00
|
|
|
* Stop the task of @pad. This function will also make sure that the
|
check/generic/states.c: Make sure all tasks are stopped.
Original commit message from CVS:
* check/generic/states.c: (GST_START_TEST):
Make sure all tasks are stopped.
* check/gst/gstbin.c: (GST_START_TEST):
Unref after usage for proper valgrinding.
* gst/gstpad.c: (gst_pad_finalize), (gst_pad_stop_task):
Really wait for the task to stop before destroying the
mutex.
* gst/gstqueue.c: (gst_queue_sink_activate_push),
(gst_queue_src_activate_push):
Small cleanups. Don't stop the task when we did not start
it.
* gst/gsttask.c: (gst_task_get_type), (gst_task_init),
(gst_task_func), (gst_task_cleanup_all), (gst_task_set_lock),
(gst_task_get_state), (gst_task_start), (gst_task_pause),
(gst_task_join):
* gst/gsttask.h:
Protect the stream lock with the object lock.
Disallow setting the stream lock when running.
Add cleanup_all to wait for the threadpool to finish.
Remove code to autoallocate a mutex if none was provided.
Add _join() to wait for a task to stop.
Protect the thread pool with a global lock.
2005-08-24 20:49:53 +00:00
|
|
|
* function executed by the task will effectively stop if not called
|
|
|
|
* from the GstTaskFunction.
|
|
|
|
*
|
|
|
|
* This function will deadlock if called from the GstTaskFunction of
|
2006-01-27 22:34:51 +00:00
|
|
|
* the task. Use gst_task_pause() instead.
|
2005-06-20 15:18:17 +00:00
|
|
|
*
|
2005-10-12 11:49:35 +00:00
|
|
|
* Regardless of whether the pad has a task, the stream lock is acquired and
|
|
|
|
* released so as to ensure that streaming through this pad has finished.
|
|
|
|
*
|
2014-05-29 21:54:34 +00:00
|
|
|
* Returns: a %TRUE if the task could be stopped or %FALSE on error.
|
2005-06-20 15:18:17 +00:00
|
|
|
*/
|
gst/gstquery.h
Original commit message from CVS:
2005-05-06 Andy Wingo <wingo@pobox.com>
* gst/gstquery.h
* gst/gstquery.c (_gst_query_initialize): Extend GstQuery from
GstData, init a memchunk.
(standard_definitions): Add a few query types, deprecate a few.
(gst_query_get_type): New proc.
(_gst_query_copy, _gst_query_free, gst_query_new): GstData
implementation.
(gst_query_new_application, gst_query_get_structure): New public
procs.
* docs/design/draft-query.txt: Removed LINKS from the query types,
because all the rest can be dispatched to other pads -- seemed
ugly to have a query that couldn't be dispatched. internal_links
is fine as a pad method.
* gst/gstpad.h: Add query2 as a pad method, add the new functions
in gstpad.c, but maintain binary compatibility for the moment.
Will fix before 0.9 is out.
* gst/gstqueryutils.c:
* gst/gstqueryutils.h: New files, implement 3 methods for each
query type: parse_query, parse_response, and set. Probably need an
allocator as well.
* gst/gst.h: Add gstquery.h and gstqueryutils.h to the list.
* gst/elements/gstfilesink.c (gst_filesink_query2):
* gst/base/gstbasesrc.c (gst_basesrc_query2): Replace old query,
query_types, and formats methods.
* gst/gstpad.c (gst_pad_query2, gst_pad_query2_default)
(gst_pad_set_query2_function): New functions.
(gst_real_pad_init): Set query2_default as the default query2
function. Basically just dispatches to internally linked pads.
Needs review!
* gst/gstdata_private.h (_GST_DATA_INIT): Set data->refcount to 1
without using the atomic operations. Only one thread can possibly
be accessing the data at this point. Changed so as to avoid
gst_atomic operations.
2005-05-06 21:41:22 +00:00
|
|
|
gboolean
|
2005-05-09 10:53:13 +00:00
|
|
|
gst_pad_stop_task (GstPad * pad)
|
gst/gstquery.h
Original commit message from CVS:
2005-05-06 Andy Wingo <wingo@pobox.com>
* gst/gstquery.h
* gst/gstquery.c (_gst_query_initialize): Extend GstQuery from
GstData, init a memchunk.
(standard_definitions): Add a few query types, deprecate a few.
(gst_query_get_type): New proc.
(_gst_query_copy, _gst_query_free, gst_query_new): GstData
implementation.
(gst_query_new_application, gst_query_get_structure): New public
procs.
* docs/design/draft-query.txt: Removed LINKS from the query types,
because all the rest can be dispatched to other pads -- seemed
ugly to have a query that couldn't be dispatched. internal_links
is fine as a pad method.
* gst/gstpad.h: Add query2 as a pad method, add the new functions
in gstpad.c, but maintain binary compatibility for the moment.
Will fix before 0.9 is out.
* gst/gstqueryutils.c:
* gst/gstqueryutils.h: New files, implement 3 methods for each
query type: parse_query, parse_response, and set. Probably need an
allocator as well.
* gst/gst.h: Add gstquery.h and gstqueryutils.h to the list.
* gst/elements/gstfilesink.c (gst_filesink_query2):
* gst/base/gstbasesrc.c (gst_basesrc_query2): Replace old query,
query_types, and formats methods.
* gst/gstpad.c (gst_pad_query2, gst_pad_query2_default)
(gst_pad_set_query2_function): New functions.
(gst_real_pad_init): Set query2_default as the default query2
function. Basically just dispatches to internally linked pads.
Needs review!
* gst/gstdata_private.h (_GST_DATA_INIT): Set data->refcount to 1
without using the atomic operations. Only one thread can possibly
be accessing the data at this point. Changed so as to avoid
gst_atomic operations.
2005-05-06 21:41:22 +00:00
|
|
|
{
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
GstTask *task;
|
2009-04-21 15:14:34 +00:00
|
|
|
gboolean res;
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
|
|
|
|
g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
|
|
|
|
|
2006-08-23 16:51:19 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "stop task");
|
|
|
|
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_LOCK (pad);
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
task = GST_PAD_TASK (pad);
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
if (task == NULL)
|
|
|
|
goto no_task;
|
gst/gstutils.c: RPAD fixes all around.
Original commit message from CVS:
2005-06-08 Andy Wingo <wingo@pobox.com>
* gst/gstutils.c: RPAD fixes all around.
(gst_element_link_pads): Refcounting fixes.
* tools/gst-inspect.c:
* tools/gst-xmlinspect.c:
* parse/grammar.y:
* gst/base/gsttypefindhelper.c:
* gst/base/gstbasesink.c:
* gst/gstqueue.c: RPAD fixes.
* gst/gstghostpad.h:
* gst/gstghostpad.c: New ghost pad implementation as full proxy
pads. The tricky thing is they provide both source and sink
interfaces, since they proxy the internal pad for the external
pad, and vice versa. Implement with lower-level ProxyPad objects,
with the interior proxy pad as a child of the exterior ghost pad.
Should write a doc on this.
* gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
(gst_pad_set_name, gst_pad_set_parent): Macros removed, use
gst_object API.
* gst/gstpad.c: Big changes. No more stub base GstPad, now all
pads are real pads. No ghost pads in this file. Not documenting
the myriad s/RPAD/PAD/ and REALIZE fixes.
(gst_pad_class_init): Add properties for "direction" and
"template". Both are construct-only, so they can't change during
the life of the pad. Fixes properly deriving from GstPad.
(gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
derived objects, just set properties when creating the objects via
g_object_new.
(gst_pad_get_parent): Implement as a function, return NULL if the
parent is not an element.
(gst_pad_get_real_parent, gst_pad_add_ghost_pad)
(gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
* gst/gstobject.c (gst_object_class_init): Make name a construct
property. Don't set it in the object init.
* gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
with UNKNOWN direction.
(gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
(gst_element_remove_pad): Remove ghost-pad special cases.
(gst_element_pads_activate): Remove rpad cruft.
* gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
catch the pad's-parent-not-an-element case.
* gst/gst.h: Include gstghostpad.h.
* gst/gst.c (init_post): No more real, ghost pads.
* gst/Makefile.am: Add gstghostpad.[ch].
* check/Makefile.am:
* check/gst/gstbin.c:
* check/gst/gstghostpad.c (test_ghost_pads): Check that linking
into a bin creates ghost pads, and that the refcounts are right.
Partly moved from gstbin.c.
2005-06-08 22:16:27 +00:00
|
|
|
GST_PAD_TASK (pad) = NULL;
|
2009-04-21 15:14:34 +00:00
|
|
|
res = gst_task_set_state (task, GST_TASK_STOPPED);
|
2018-01-15 17:13:45 +00:00
|
|
|
/* unblock activation waits if any */
|
|
|
|
pad->priv->in_activation = FALSE;
|
|
|
|
g_cond_broadcast (&pad->priv->activation_cond);
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
|
2005-11-21 17:21:15 +00:00
|
|
|
GST_PAD_STREAM_LOCK (pad);
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
|
2006-08-14 07:35:09 +00:00
|
|
|
if (!gst_task_join (task))
|
|
|
|
goto join_failed;
|
check/generic/states.c: Make sure all tasks are stopped.
Original commit message from CVS:
* check/generic/states.c: (GST_START_TEST):
Make sure all tasks are stopped.
* check/gst/gstbin.c: (GST_START_TEST):
Unref after usage for proper valgrinding.
* gst/gstpad.c: (gst_pad_finalize), (gst_pad_stop_task):
Really wait for the task to stop before destroying the
mutex.
* gst/gstqueue.c: (gst_queue_sink_activate_push),
(gst_queue_src_activate_push):
Small cleanups. Don't stop the task when we did not start
it.
* gst/gsttask.c: (gst_task_get_type), (gst_task_init),
(gst_task_func), (gst_task_cleanup_all), (gst_task_set_lock),
(gst_task_get_state), (gst_task_start), (gst_task_pause),
(gst_task_join):
* gst/gsttask.h:
Protect the stream lock with the object lock.
Disallow setting the stream lock when running.
Add cleanup_all to wait for the threadpool to finish.
Remove code to autoallocate a mutex if none was provided.
Add _join() to wait for a task to stop.
Protect the thread pool with a global lock.
2005-08-24 20:49:53 +00:00
|
|
|
|
2005-06-28 09:59:01 +00:00
|
|
|
gst_object_unref (task);
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
|
2009-04-21 15:14:34 +00:00
|
|
|
return res;
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
|
|
|
|
no_task:
|
|
|
|
{
|
2006-08-23 16:51:19 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "no task");
|
2005-11-21 16:34:26 +00:00
|
|
|
GST_OBJECT_UNLOCK (pad);
|
2005-10-12 11:49:35 +00:00
|
|
|
|
2005-11-21 17:21:15 +00:00
|
|
|
GST_PAD_STREAM_LOCK (pad);
|
|
|
|
GST_PAD_STREAM_UNLOCK (pad);
|
2005-10-12 11:49:35 +00:00
|
|
|
|
2006-08-14 07:35:09 +00:00
|
|
|
/* this is not an error */
|
gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
Original commit message from CVS:
* gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
* gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
(gst_basesink_finish_preroll), (gst_basesink_chain),
(gst_basesink_loop), (gst_basesink_activate),
(gst_basesink_change_state):
* gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
(gst_basesrc_get_range), (gst_basesrc_loop),
(gst_basesrc_activate):
* gst/elements/gsttee.c: (gst_tee_sink_activate):
* gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
(gst_real_pad_init), (gst_real_pad_set_property),
(gst_real_pad_get_property), (gst_pad_set_active),
(gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
(gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
(gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
(gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
(gst_pad_event_default_dispatch), (gst_pad_event_default),
(gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
(gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
(gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
(gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
(gst_pad_stop_task):
* gst/gstpad.h:
* gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
(gst_queue_loop), (gst_queue_src_activate):
* gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
(gst_task_get_state):
* gst/gsttask.h:
* gst/schedulers/threadscheduler.c:
(gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
Implement gst_pad_pause/start/stop_task(), take STREAM lock
in task function.
Remove ACTIVE pad flag, use FLUSHING everywhere
Added _pad_chain(), _pad_get_range() to call chain/getrange
functions.
Add locks around IS_FLUSHING when reading.
Take STREAM lock in chain(), get_range() functions so plugins
don't need to take it anymore.
2005-05-25 11:50:11 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
2006-08-14 07:35:09 +00:00
|
|
|
join_failed:
|
|
|
|
{
|
|
|
|
/* this is bad, possibly the application tried to join the task from
|
|
|
|
* the task's thread. We install the task again so that it will be stopped
|
|
|
|
* again from the right thread next time hopefully. */
|
|
|
|
GST_OBJECT_LOCK (pad);
|
2006-08-23 16:51:19 +00:00
|
|
|
GST_DEBUG_OBJECT (pad, "join failed");
|
2006-08-14 07:35:09 +00:00
|
|
|
/* we can only install this task if there was no other task */
|
|
|
|
if (GST_PAD_TASK (pad) == NULL)
|
|
|
|
GST_PAD_TASK (pad) = task;
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
2005-05-09 10:53:13 +00:00
|
|
|
}
|
2012-09-19 19:01:46 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* gst_pad_probe_info_get_event:
|
|
|
|
* @info: a #GstPadProbeInfo
|
|
|
|
*
|
2017-10-22 12:35:30 +00:00
|
|
|
* Returns: (transfer none) (nullable): The #GstEvent from the probe
|
2012-09-19 19:01:46 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
GstEvent *
|
|
|
|
gst_pad_probe_info_get_event (GstPadProbeInfo * info)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (info->type & (GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM |
|
|
|
|
GST_PAD_PROBE_TYPE_EVENT_UPSTREAM), NULL);
|
|
|
|
|
|
|
|
return GST_PAD_PROBE_INFO_EVENT (info);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gst_pad_probe_info_get_query:
|
|
|
|
* @info: a #GstPadProbeInfo
|
|
|
|
*
|
2017-10-22 12:35:30 +00:00
|
|
|
* Returns: (transfer none) (nullable): The #GstQuery from the probe
|
2012-09-19 19:01:46 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
GstQuery *
|
|
|
|
gst_pad_probe_info_get_query (GstPadProbeInfo * info)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (info->type & (GST_PAD_PROBE_TYPE_QUERY_DOWNSTREAM |
|
|
|
|
GST_PAD_PROBE_TYPE_QUERY_UPSTREAM), NULL);
|
|
|
|
|
|
|
|
return GST_PAD_PROBE_INFO_QUERY (info);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gst_pad_probe_info_get_buffer:
|
|
|
|
* @info: a #GstPadProbeInfo
|
|
|
|
*
|
2017-10-22 12:35:30 +00:00
|
|
|
* Returns: (transfer none) (nullable): The #GstBuffer from the probe
|
2012-09-19 19:01:46 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
GstBuffer *
|
|
|
|
gst_pad_probe_info_get_buffer (GstPadProbeInfo * info)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (info->type & GST_PAD_PROBE_TYPE_BUFFER, NULL);
|
|
|
|
|
|
|
|
return GST_PAD_PROBE_INFO_BUFFER (info);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2015-10-21 11:49:49 +00:00
|
|
|
* gst_pad_probe_info_get_buffer_list:
|
2012-09-19 19:01:46 +00:00
|
|
|
* @info: a #GstPadProbeInfo
|
|
|
|
*
|
2017-10-22 12:35:30 +00:00
|
|
|
* Returns: (transfer none) (nullable): The #GstBufferList from the probe
|
2012-09-19 19:01:46 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
GstBufferList *
|
|
|
|
gst_pad_probe_info_get_buffer_list (GstPadProbeInfo * info)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (info->type & GST_PAD_PROBE_TYPE_BUFFER_LIST, NULL);
|
|
|
|
|
|
|
|
return GST_PAD_PROBE_INFO_BUFFER_LIST (info);
|
|
|
|
}
|
2014-05-23 16:25:35 +00:00
|
|
|
|
|
|
|
/**
|
2014-05-27 12:36:29 +00:00
|
|
|
* gst_pad_get_last_flow_return:
|
2014-05-23 16:25:35 +00:00
|
|
|
* @pad: the #GstPad
|
|
|
|
*
|
|
|
|
* Gets the #GstFlowReturn return from the last data passed by this pad.
|
|
|
|
*
|
|
|
|
* Since: 1.4
|
|
|
|
*/
|
|
|
|
GstFlowReturn
|
|
|
|
gst_pad_get_last_flow_return (GstPad * pad)
|
|
|
|
{
|
|
|
|
GstFlowReturn ret;
|
|
|
|
|
|
|
|
GST_OBJECT_LOCK (pad);
|
|
|
|
ret = GST_PAD_LAST_FLOW_RETURN (pad);
|
|
|
|
GST_OBJECT_UNLOCK (pad);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|