2003-12-08 20:01:01 +00:00
|
|
|
/* GStreamer
|
|
|
|
* Copyright (C) 2003 Julien Moutte <julien@moutte.net>
|
2007-12-17 14:43:04 +00:00
|
|
|
* Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
|
|
|
|
* Copyright (C) 2005 Jan Schmidt <thaytan@mad.scientist.com>
|
|
|
|
* Copyright (C) 2007 Wim Taymans <wim.taymans@gmail.com>
|
2003-12-08 20:01:01 +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
|
|
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
|
|
* Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2003-12-08 20:01:01 +00:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
|
|
|
#endif
|
|
|
|
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
#include <string.h>
|
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
#include "gstswitch.h"
|
|
|
|
|
|
|
|
GST_DEBUG_CATEGORY_STATIC (stream_selector_debug);
|
|
|
|
#define GST_CAT_DEFAULT stream_selector_debug
|
2003-12-08 20:01:01 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
static const GstElementDetails gst_stream_selector_details =
|
|
|
|
GST_ELEMENT_DETAILS ("StreamSelector",
|
2004-03-14 22:34:33 +00:00
|
|
|
"Generic",
|
2007-12-17 14:43:04 +00:00
|
|
|
"N-to-1 input stream_selectoring",
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
"Julien Moutte <julien@moutte.net>\n"
|
2007-12-17 14:43:04 +00:00
|
|
|
"Ronald S. Bultje <rbultje@ronald.bitfreak.net>\n"
|
|
|
|
"Jan Schmidt <thaytan@mad.scientist.com>\n"
|
|
|
|
"Wim Taymans <wim.taymans@gmail.com>");
|
2003-12-08 20:01:01 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
static GstStaticPadTemplate gst_stream_selector_sink_factory =
|
2004-03-14 22:34:33 +00:00
|
|
|
GST_STATIC_PAD_TEMPLATE ("sink%d",
|
|
|
|
GST_PAD_SINK,
|
|
|
|
GST_PAD_REQUEST,
|
|
|
|
GST_STATIC_CAPS_ANY);
|
2003-12-08 20:01:01 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
static GstStaticPadTemplate gst_stream_selector_src_factory =
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
GST_STATIC_PAD_TEMPLATE ("src",
|
|
|
|
GST_PAD_SRC,
|
|
|
|
GST_PAD_ALWAYS,
|
|
|
|
GST_STATIC_CAPS_ANY);
|
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
PROP_ACTIVE_PAD = 1
|
|
|
|
};
|
2003-12-08 20:01:01 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
static gboolean gst_stream_selector_is_active_sinkpad (GstStreamSelector * sel,
|
|
|
|
GstPad * pad);
|
|
|
|
static GstPad *gst_stream_selector_activate_sinkpad (GstStreamSelector * sel,
|
|
|
|
GstPad * pad);
|
|
|
|
static GstPad *gst_stream_selector_get_linked_pad (GstPad * pad,
|
|
|
|
gboolean strict);
|
|
|
|
|
|
|
|
#define GST_TYPE_SELECTOR_PAD \
|
|
|
|
(gst_selector_pad_get_type())
|
|
|
|
#define GST_SELECTOR_PAD(obj) \
|
|
|
|
(G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SELECTOR_PAD, GstSelectorPad))
|
|
|
|
#define GST_SELECTOR_PAD_CLASS(klass) \
|
|
|
|
(G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_SELECTOR_PAD, GstSelectorPadClass))
|
|
|
|
#define GST_IS_SELECTOR_PAD(obj) \
|
|
|
|
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SELECTOR_PAD))
|
|
|
|
#define GST_IS_SELECTOR_PAD_CLASS(klass) \
|
|
|
|
(G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_SELECTOR_PAD))
|
|
|
|
#define GST_SELECTOR_PAD_CAST(obj) \
|
|
|
|
((GstSelectorPad *)(obj))
|
|
|
|
|
|
|
|
typedef struct _GstSelectorPad GstSelectorPad;
|
|
|
|
typedef struct _GstSelectorPadClass GstSelectorPadClass;
|
|
|
|
|
|
|
|
struct _GstSelectorPad
|
|
|
|
{
|
|
|
|
GstPad parent;
|
2003-12-08 20:01:01 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
gboolean active;
|
|
|
|
gboolean eos;
|
|
|
|
gboolean segment_pending;
|
|
|
|
GstSegment segment;
|
|
|
|
};
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
struct _GstSelectorPadClass
|
2004-01-25 12:28:05 +00:00
|
|
|
{
|
2007-12-17 14:43:04 +00:00
|
|
|
GstPadClass parent;
|
|
|
|
};
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
static void gst_selector_pad_class_init (GstSelectorPadClass * klass);
|
|
|
|
static void gst_selector_pad_init (GstSelectorPad * pad);
|
|
|
|
static void gst_selector_pad_finalize (GObject * object);
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
static GstPadClass *selector_pad_parent_class = NULL;
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
static void gst_selector_pad_reset (GstSelectorPad * pad);
|
|
|
|
static gboolean gst_selector_pad_event (GstPad * pad, GstEvent * event);
|
|
|
|
static GstCaps *gst_selector_pad_getcaps (GstPad * pad);
|
|
|
|
static GList *gst_selector_pad_get_linked_pads (GstPad * pad);
|
|
|
|
static GstFlowReturn gst_selector_pad_chain (GstPad * pad, GstBuffer * buf);
|
|
|
|
static GstFlowReturn gst_selector_pad_bufferalloc (GstPad * pad,
|
|
|
|
guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf);
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
static GType
|
|
|
|
gst_selector_pad_get_type (void)
|
|
|
|
{
|
|
|
|
static GType selector_pad_type = 0;
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
if (!selector_pad_type) {
|
|
|
|
static const GTypeInfo selector_pad_info = {
|
|
|
|
sizeof (GstSelectorPadClass),
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
(GClassInitFunc) gst_selector_pad_class_init,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
sizeof (GstSelectorPad),
|
|
|
|
0,
|
|
|
|
(GInstanceInitFunc) gst_selector_pad_init,
|
|
|
|
};
|
|
|
|
|
|
|
|
selector_pad_type =
|
|
|
|
g_type_register_static (GST_TYPE_PAD, "GstSwitchPad",
|
|
|
|
&selector_pad_info, 0);
|
2004-01-25 12:28:05 +00:00
|
|
|
}
|
2007-12-17 14:43:04 +00:00
|
|
|
return selector_pad_type;
|
2004-01-25 12:28:05 +00:00
|
|
|
}
|
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
static void
|
|
|
|
gst_selector_pad_class_init (GstSelectorPadClass * klass)
|
2003-12-08 20:01:01 +00:00
|
|
|
{
|
2007-12-17 14:43:04 +00:00
|
|
|
GObjectClass *gobject_class;
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
gobject_class = (GObjectClass *) klass;
|
|
|
|
|
|
|
|
selector_pad_parent_class = g_type_class_peek_parent (klass);
|
|
|
|
|
|
|
|
gobject_class->finalize = gst_selector_pad_finalize;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gst_selector_pad_init (GstSelectorPad * pad)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gst_selector_pad_finalize (GObject * object)
|
|
|
|
{
|
|
|
|
GstSelectorPad *pad;
|
|
|
|
|
|
|
|
pad = GST_SELECTOR_PAD_CAST (object);
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
G_OBJECT_CLASS (selector_pad_parent_class)->finalize (object);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gst_selector_pad_reset (GstSelectorPad * pad)
|
|
|
|
{
|
|
|
|
pad->active = FALSE;
|
|
|
|
pad->eos = FALSE;
|
|
|
|
gst_segment_init (&pad->segment, GST_FORMAT_UNDEFINED);
|
|
|
|
}
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
/* strictly get the linked pad from the sinkpad. If the pad is active we return
|
|
|
|
* the srcpad else we return NULL */
|
|
|
|
static GList *
|
|
|
|
gst_selector_pad_get_linked_pads (GstPad * pad)
|
|
|
|
{
|
|
|
|
GstPad *otherpad;
|
|
|
|
|
|
|
|
otherpad = gst_stream_selector_get_linked_pad (pad, TRUE);
|
|
|
|
if (!otherpad)
|
2003-12-08 20:01:01 +00:00
|
|
|
return NULL;
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
/* need to drop the ref, internal linked pads is not MT safe */
|
|
|
|
gst_object_unref (otherpad);
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
return g_list_append (NULL, otherpad);
|
|
|
|
}
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
static gboolean
|
|
|
|
gst_selector_pad_event (GstPad * pad, GstEvent * event)
|
|
|
|
{
|
|
|
|
gboolean res = TRUE;
|
|
|
|
gboolean forward = TRUE;
|
|
|
|
GstStreamSelector *sel;
|
|
|
|
GstSelectorPad *selpad;
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
sel = GST_STREAM_SELECTOR (gst_pad_get_parent (pad));
|
|
|
|
selpad = GST_SELECTOR_PAD_CAST (pad);
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
/* only forward if we are dealing with the active sinkpad */
|
|
|
|
forward = gst_stream_selector_is_active_sinkpad (sel, pad);
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
switch (GST_EVENT_TYPE (event)) {
|
|
|
|
case GST_EVENT_FLUSH_STOP:
|
|
|
|
gst_selector_pad_reset (selpad);
|
|
|
|
break;
|
|
|
|
case GST_EVENT_NEWSEGMENT:
|
|
|
|
{
|
|
|
|
gboolean update;
|
|
|
|
GstFormat format;
|
|
|
|
gdouble rate, arate;
|
|
|
|
gint64 start, stop, time;
|
|
|
|
|
|
|
|
gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format,
|
|
|
|
&start, &stop, &time);
|
|
|
|
|
|
|
|
GST_DEBUG_OBJECT (sel,
|
|
|
|
"configured NEWSEGMENT update %d, rate %lf, applied rate %lf, "
|
|
|
|
"format %d, "
|
|
|
|
"%" G_GINT64_FORMAT " -- %" G_GINT64_FORMAT ", time %"
|
|
|
|
G_GINT64_FORMAT, update, rate, arate, format, start, stop, time);
|
|
|
|
|
|
|
|
gst_segment_set_newsegment_full (&selpad->segment, update,
|
|
|
|
rate, arate, format, start, stop, time);
|
|
|
|
/* if we are not going to forward the segment, mark the segment as
|
|
|
|
* pending */
|
|
|
|
if (!forward)
|
|
|
|
selpad->segment_pending = TRUE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case GST_EVENT_EOS:
|
|
|
|
selpad->eos = TRUE;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (forward)
|
|
|
|
res = gst_pad_push_event (sel->srcpad, event);
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
gst_object_unref (sel);
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
static GstCaps *
|
|
|
|
gst_selector_pad_getcaps (GstPad * pad)
|
|
|
|
{
|
|
|
|
GstStreamSelector *sel;
|
|
|
|
GstCaps *caps;
|
|
|
|
|
|
|
|
sel = GST_STREAM_SELECTOR (gst_pad_get_parent (pad));
|
|
|
|
|
|
|
|
GST_DEBUG_OBJECT (sel, "Getting caps of srcpad peer");
|
|
|
|
caps = gst_pad_peer_get_caps (sel->srcpad);
|
|
|
|
if (caps == NULL)
|
|
|
|
caps = gst_caps_new_any ();
|
|
|
|
|
|
|
|
gst_object_unref (sel);
|
|
|
|
|
|
|
|
return caps;
|
2003-12-08 20:01:01 +00:00
|
|
|
}
|
|
|
|
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
static GstFlowReturn
|
2007-12-17 14:43:04 +00:00
|
|
|
gst_selector_pad_bufferalloc (GstPad * pad, guint64 offset,
|
|
|
|
guint size, GstCaps * caps, GstBuffer ** buf)
|
2003-12-08 20:01:01 +00:00
|
|
|
{
|
2007-12-17 14:43:04 +00:00
|
|
|
GstStreamSelector *sel;
|
|
|
|
GstFlowReturn result;
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
GstPad *active_sinkpad;
|
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
sel = GST_STREAM_SELECTOR (gst_pad_get_parent (pad));
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
active_sinkpad = gst_stream_selector_activate_sinkpad (sel, pad);
|
|
|
|
|
|
|
|
/* Fallback allocation for buffers from pads except the selected one */
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
if (pad != active_sinkpad) {
|
2007-12-17 14:43:04 +00:00
|
|
|
GST_DEBUG_OBJECT (sel,
|
|
|
|
"Pad %s:%s is not selected. Performing fallback allocation",
|
|
|
|
GST_DEBUG_PAD_NAME (pad));
|
examples/switch/switcher.c (my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c (gst_...
Original commit message from CVS:
* examples/switch/switcher.c (my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_dispose, gst_switch_init):
* gst/switch/gstswitch.h (switch_mutex, GST_SWITCH_LOCK,
GST_SWITCH_UNLOCK):
Add an extra lock to protect against certain variables instead of
using the object lock. Fix case where caps are different in the
sink pads causes deadlock. Update example to use different caps
on each sink pad.
2007-06-22 15:30:00 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
*buf = NULL;
|
|
|
|
result = GST_FLOW_OK;
|
|
|
|
} else {
|
|
|
|
result = gst_pad_alloc_buffer (sel->srcpad, offset, size, caps, buf);
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
/* FIXME: HACK. If buffer alloc returns not-linked, perform a fallback
|
|
|
|
* allocation. This should NOT be necessary, because playbin should
|
|
|
|
* properly block the source pad from running until it's finished hooking
|
|
|
|
* everything up, but playbin needs refactoring first. */
|
|
|
|
if (result == GST_FLOW_NOT_LINKED) {
|
|
|
|
GST_DEBUG_OBJECT (sel,
|
|
|
|
"No peer pad yet - performing fallback allocation for pad %s:%s",
|
|
|
|
GST_DEBUG_PAD_NAME (pad));
|
|
|
|
|
|
|
|
*buf = NULL;
|
|
|
|
result = GST_FLOW_OK;
|
|
|
|
}
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
}
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
gst_object_unref (sel);
|
2007-08-29 16:20:28 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
static GstFlowReturn
|
|
|
|
gst_selector_pad_chain (GstPad * pad, GstBuffer * buf)
|
|
|
|
{
|
|
|
|
GstStreamSelector *sel;
|
|
|
|
GstFlowReturn res;
|
|
|
|
GstPad *active_sinkpad;
|
|
|
|
GstSelectorPad *selpad;
|
|
|
|
GstClockTime timestamp;
|
|
|
|
GstSegment *seg;
|
|
|
|
|
|
|
|
sel = GST_STREAM_SELECTOR (gst_pad_get_parent (pad));
|
|
|
|
selpad = GST_SELECTOR_PAD_CAST (pad);
|
|
|
|
seg = &selpad->segment;
|
|
|
|
|
|
|
|
active_sinkpad = gst_stream_selector_activate_sinkpad (sel, pad);
|
|
|
|
|
|
|
|
timestamp = GST_BUFFER_TIMESTAMP (buf);
|
|
|
|
if (GST_CLOCK_TIME_IS_VALID (timestamp)) {
|
|
|
|
GST_DEBUG_OBJECT (sel, "received timestamp %" GST_TIME_FORMAT,
|
|
|
|
GST_TIME_ARGS (timestamp));
|
|
|
|
gst_segment_set_last_stop (seg, seg->format, timestamp);
|
gst/switch/gstswitch.c (ARG_0, ARG_NB_SOURCES, ARG_ACTIVE_SOURCE,
Original commit message from CVS:
* gst/switch/gstswitch.c (ARG_0, ARG_NB_SOURCES, ARG_ACTIVE_SOURCE,
ARG_START_VALUE, ARG_STOP_VALUE, ARG_LAST_TS, ARG_QUEUE_BUFFERS,
parent_class, gst_switch_release_pad, gst_switch_request_new_pad,
gst_switch_chain, gst_switch_event, gst_switch_set_property,
gst_switch_get_property, gst_switch_getcaps, gst_switch_dispose,
unref_buffer, unref_buffers_and_destroy_list, gst_switch_init,
gst_switch_base_init, gst_switch_class_init):
* gst/switch/gstswitch.h (need_to_send_newsegment, queue_buffers,
stop_value, start_value, current_start, last_ts, stored_buffers):
Add handling of application provided stop and start values, allowing
A/V sync across 2 switch elements.
2007-05-17 10:08:24 +00:00
|
|
|
}
|
2007-08-29 16:20:28 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
/* Ignore buffers from pads except the selected one */
|
|
|
|
if (pad != active_sinkpad)
|
|
|
|
goto ignore;
|
|
|
|
|
|
|
|
/* if we have a pending segment, push it out now */
|
|
|
|
if (selpad->segment_pending) {
|
|
|
|
gst_pad_push_event (sel->srcpad, gst_event_new_new_segment_full (FALSE,
|
|
|
|
seg->rate, seg->applied_rate, seg->format, seg->start, seg->stop,
|
|
|
|
seg->time));
|
|
|
|
|
|
|
|
selpad->segment_pending = FALSE;
|
2003-12-08 20:01:01 +00:00
|
|
|
}
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
/* forward */
|
|
|
|
GST_DEBUG_OBJECT (sel, "Forwarding buffer %p from pad %s:%s", buf,
|
|
|
|
GST_DEBUG_PAD_NAME (pad));
|
|
|
|
res = gst_pad_push (sel->srcpad, buf);
|
|
|
|
done:
|
|
|
|
gst_object_unref (sel);
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
return res;
|
2007-12-17 14:43:04 +00:00
|
|
|
/* dropped buffers */
|
|
|
|
ignore:
|
|
|
|
{
|
|
|
|
GST_DEBUG_OBJECT (sel, "Ignoring buffer %p from pad %s:%s",
|
|
|
|
buf, GST_DEBUG_PAD_NAME (pad));
|
|
|
|
gst_buffer_unref (buf);
|
|
|
|
res = GST_FLOW_NOT_LINKED;
|
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
|
2003-12-08 20:01:01 +00:00
|
|
|
}
|
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
static void gst_stream_selector_dispose (GObject * object);
|
|
|
|
static void gst_stream_selector_init (GstStreamSelector * sel);
|
|
|
|
static void gst_stream_selector_base_init (GstStreamSelectorClass * klass);
|
|
|
|
static void gst_stream_selector_class_init (GstStreamSelectorClass * klass);
|
|
|
|
static void gst_stream_selector_set_property (GObject * object,
|
|
|
|
guint prop_id, const GValue * value, GParamSpec * pspec);
|
|
|
|
static void gst_stream_selector_get_property (GObject * object,
|
|
|
|
guint prop_id, GValue * value, GParamSpec * pspec);
|
|
|
|
static GstPad *gst_stream_selector_request_new_pad (GstElement * element,
|
|
|
|
GstPadTemplate * templ, const gchar * unused);
|
|
|
|
static void gst_stream_selector_release_pad (GstElement * element,
|
|
|
|
GstPad * pad);
|
|
|
|
static GList *gst_stream_selector_get_linked_pads (GstPad * pad);
|
|
|
|
static GstCaps *gst_stream_selector_getcaps (GstPad * pad);
|
|
|
|
static GstElementClass *parent_class = NULL;
|
|
|
|
|
|
|
|
GType
|
|
|
|
gst_stream_selector_get_type (void)
|
2004-02-15 18:05:04 +00:00
|
|
|
{
|
2007-12-17 14:43:04 +00:00
|
|
|
static GType stream_selector_type = 0;
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
if (!stream_selector_type) {
|
|
|
|
static const GTypeInfo stream_selector_info = {
|
|
|
|
sizeof (GstStreamSelectorClass),
|
|
|
|
(GBaseInitFunc) gst_stream_selector_base_init,
|
|
|
|
NULL,
|
|
|
|
(GClassInitFunc) gst_stream_selector_class_init,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
sizeof (GstStreamSelector),
|
|
|
|
0,
|
|
|
|
(GInstanceInitFunc) gst_stream_selector_init,
|
|
|
|
};
|
|
|
|
stream_selector_type =
|
|
|
|
g_type_register_static (GST_TYPE_ELEMENT,
|
|
|
|
"GstSwitch", &stream_selector_info, 0);
|
|
|
|
GST_DEBUG_CATEGORY_INIT (stream_selector_debug,
|
|
|
|
"streamselector", 0, "A stream-selector element");
|
2004-02-15 18:05:04 +00:00
|
|
|
}
|
2007-12-17 14:43:04 +00:00
|
|
|
|
|
|
|
return stream_selector_type;
|
2004-02-15 18:05:04 +00:00
|
|
|
}
|
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
static void
|
|
|
|
gst_stream_selector_base_init (GstStreamSelectorClass * klass)
|
|
|
|
{
|
|
|
|
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
|
|
|
|
|
|
|
|
gst_element_class_set_details (element_class, &gst_stream_selector_details);
|
|
|
|
gst_element_class_add_pad_template (element_class,
|
|
|
|
gst_static_pad_template_get (&gst_stream_selector_sink_factory));
|
|
|
|
gst_element_class_add_pad_template (element_class,
|
|
|
|
gst_static_pad_template_get (&gst_stream_selector_src_factory));
|
|
|
|
}
|
2003-12-08 20:01:01 +00:00
|
|
|
|
|
|
|
static void
|
2007-12-17 14:43:04 +00:00
|
|
|
gst_stream_selector_class_init (GstStreamSelectorClass * klass)
|
2003-12-08 20:01:01 +00:00
|
|
|
{
|
2007-12-17 14:43:04 +00:00
|
|
|
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
|
|
|
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
parent_class = g_type_class_peek_parent (klass);
|
|
|
|
gobject_class->set_property =
|
|
|
|
GST_DEBUG_FUNCPTR (gst_stream_selector_set_property);
|
|
|
|
gobject_class->get_property =
|
|
|
|
GST_DEBUG_FUNCPTR (gst_stream_selector_get_property);
|
|
|
|
g_object_class_install_property (gobject_class, PROP_ACTIVE_PAD,
|
|
|
|
g_param_spec_string ("active-pad", "Active pad",
|
|
|
|
"Name of the currently" " active sink pad", NULL, G_PARAM_READWRITE));
|
|
|
|
gobject_class->dispose = gst_stream_selector_dispose;
|
|
|
|
gstelement_class->request_new_pad = gst_stream_selector_request_new_pad;
|
|
|
|
gstelement_class->release_pad = gst_stream_selector_release_pad;
|
|
|
|
}
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
static void
|
|
|
|
gst_stream_selector_init (GstStreamSelector * sel)
|
|
|
|
{
|
|
|
|
sel->srcpad = gst_pad_new ("src", GST_PAD_SRC);
|
|
|
|
gst_pad_set_internal_link_function (sel->srcpad,
|
|
|
|
GST_DEBUG_FUNCPTR (gst_stream_selector_get_linked_pads));
|
|
|
|
gst_pad_set_getcaps_function (sel->srcpad,
|
|
|
|
GST_DEBUG_FUNCPTR (gst_stream_selector_getcaps));
|
|
|
|
gst_element_add_pad (GST_ELEMENT (sel), sel->srcpad);
|
|
|
|
/* sinkpad management */
|
|
|
|
sel->active_sinkpad = NULL;
|
|
|
|
sel->nb_sinkpads = 0;
|
|
|
|
gst_segment_init (&sel->segment, GST_FORMAT_UNDEFINED);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gst_stream_selector_dispose (GObject * object)
|
|
|
|
{
|
|
|
|
GstStreamSelector *sel = GST_STREAM_SELECTOR (object);
|
|
|
|
|
|
|
|
if (sel->active_sinkpad) {
|
|
|
|
gst_object_unref (sel->active_sinkpad);
|
|
|
|
sel->active_sinkpad = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
G_OBJECT_CLASS (parent_class)->dispose (object);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gst_stream_selector_set_property (GObject * object, guint prop_id,
|
|
|
|
const GValue * value, GParamSpec * pspec)
|
|
|
|
{
|
|
|
|
GstStreamSelector *sel = GST_STREAM_SELECTOR (object);
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2003-12-08 20:01:01 +00:00
|
|
|
switch (prop_id) {
|
2007-12-17 14:43:04 +00:00
|
|
|
case PROP_ACTIVE_PAD:{
|
|
|
|
const gchar *pad_name = g_value_get_string (value);
|
|
|
|
GstPad *pad = NULL;
|
|
|
|
GstPad **active_pad_p;
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
if (strcmp (pad_name, "") != 0)
|
|
|
|
pad = gst_element_get_pad (GST_ELEMENT (object), pad_name);
|
|
|
|
GST_OBJECT_LOCK (object);
|
|
|
|
if (pad != sel->active_sinkpad) {
|
|
|
|
GstSelectorPad *selpad;
|
|
|
|
|
|
|
|
selpad = GST_SELECTOR_PAD_CAST (pad);
|
|
|
|
/* we can only activate pads that have data received */
|
|
|
|
if (selpad && !selpad->active) {
|
|
|
|
GST_DEBUG_OBJECT (sel, "No data received on pad %" GST_PTR_FORMAT,
|
|
|
|
pad);
|
2007-08-29 16:20:28 +00:00
|
|
|
} else {
|
2007-12-17 14:43:04 +00:00
|
|
|
active_pad_p = &sel->active_sinkpad;
|
|
|
|
gst_object_replace ((GstObject **) active_pad_p,
|
|
|
|
GST_OBJECT_CAST (pad));
|
|
|
|
GST_DEBUG_OBJECT (sel, "New active pad is %" GST_PTR_FORMAT,
|
|
|
|
sel->active_sinkpad);
|
2007-08-29 16:20:28 +00:00
|
|
|
}
|
|
|
|
}
|
2007-12-17 14:43:04 +00:00
|
|
|
GST_OBJECT_UNLOCK (object);
|
|
|
|
if (pad)
|
|
|
|
gst_object_unref (pad);
|
gst/switch/gstswitch.c (ARG_0, ARG_NB_SOURCES, ARG_ACTIVE_SOURCE,
Original commit message from CVS:
* gst/switch/gstswitch.c (ARG_0, ARG_NB_SOURCES, ARG_ACTIVE_SOURCE,
ARG_START_VALUE, ARG_STOP_VALUE, ARG_LAST_TS, ARG_QUEUE_BUFFERS,
parent_class, gst_switch_release_pad, gst_switch_request_new_pad,
gst_switch_chain, gst_switch_event, gst_switch_set_property,
gst_switch_get_property, gst_switch_getcaps, gst_switch_dispose,
unref_buffer, unref_buffers_and_destroy_list, gst_switch_init,
gst_switch_base_init, gst_switch_class_init):
* gst/switch/gstswitch.h (need_to_send_newsegment, queue_buffers,
stop_value, start_value, current_start, last_ts, stored_buffers):
Add handling of application provided stop and start values, allowing
A/V sync across 2 switch elements.
2007-05-17 10:08:24 +00:00
|
|
|
break;
|
2007-12-17 14:43:04 +00:00
|
|
|
}
|
2003-12-08 20:01:01 +00:00
|
|
|
default:
|
|
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2007-12-17 14:43:04 +00:00
|
|
|
gst_stream_selector_get_property (GObject * object, guint prop_id,
|
2004-03-14 22:34:33 +00:00
|
|
|
GValue * value, GParamSpec * pspec)
|
2003-12-08 20:01:01 +00:00
|
|
|
{
|
2007-12-17 14:43:04 +00:00
|
|
|
GstStreamSelector *sel = GST_STREAM_SELECTOR (object);
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2003-12-08 20:01:01 +00:00
|
|
|
switch (prop_id) {
|
2007-12-17 14:43:04 +00:00
|
|
|
case PROP_ACTIVE_PAD:{
|
|
|
|
GST_OBJECT_LOCK (object);
|
|
|
|
if (sel->active_sinkpad != NULL) {
|
|
|
|
g_value_take_string (value, gst_pad_get_name (sel->active_sinkpad));
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
} else {
|
|
|
|
g_value_set_string (value, "");
|
|
|
|
}
|
gst/switch/gstswitch.c (ARG_ACTIVE_SOURCE, ARG_STOP_VALUE,
Original commit message from CVS:
* gst/switch/gstswitch.c (ARG_ACTIVE_SOURCE, ARG_STOP_VALUE,
ARG_LAST_TS, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property, gst_switch_getcaps,
gst_switch_dispose, gst_switch_init, gst_switch_class_init):
* gst/switch/gstswitch.h (previous_sinkpad, nb_sinkpads, stop_value,
current_start, last_ts):
Allow application to provide a stop timestamp, so a new segment
update can be sent before switching.
2007-05-14 18:03:58 +00:00
|
|
|
GST_OBJECT_UNLOCK (object);
|
|
|
|
break;
|
2007-12-17 14:43:04 +00:00
|
|
|
}
|
2003-12-08 20:01:01 +00:00
|
|
|
default:
|
|
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
static GstPad *
|
2007-12-17 14:43:04 +00:00
|
|
|
gst_stream_selector_get_linked_pad (GstPad * pad, gboolean strict)
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
{
|
2007-12-17 14:43:04 +00:00
|
|
|
GstStreamSelector *sel;
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
GstPad *otherpad = NULL;
|
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
sel = GST_STREAM_SELECTOR (gst_pad_get_parent (pad));
|
|
|
|
GST_OBJECT_LOCK (sel);
|
|
|
|
if (pad == sel->srcpad)
|
|
|
|
otherpad = sel->active_sinkpad;
|
|
|
|
else if (pad == sel->active_sinkpad || !strict)
|
|
|
|
otherpad = sel->srcpad;
|
|
|
|
if (otherpad)
|
|
|
|
gst_object_ref (otherpad);
|
|
|
|
GST_OBJECT_UNLOCK (sel);
|
|
|
|
gst_object_unref (sel);
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
return otherpad;
|
|
|
|
}
|
|
|
|
|
|
|
|
static GstCaps *
|
2007-12-17 14:43:04 +00:00
|
|
|
gst_stream_selector_getcaps (GstPad * pad)
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
{
|
examples/switch/switcher.c (my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c (gst_...
Original commit message from CVS:
* examples/switch/switcher.c (my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_dispose, gst_switch_init):
* gst/switch/gstswitch.h (switch_mutex, GST_SWITCH_LOCK,
GST_SWITCH_UNLOCK):
Add an extra lock to protect against certain variables instead of
using the object lock. Fix case where caps are different in the
sink pads causes deadlock. Update example to use different caps
on each sink pad.
2007-06-22 15:30:00 +00:00
|
|
|
GstPad *otherpad;
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
GstObject *parent;
|
|
|
|
GstCaps *caps;
|
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
otherpad = gst_stream_selector_get_linked_pad (pad, FALSE);
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
parent = gst_object_get_parent (GST_OBJECT (pad));
|
|
|
|
if (!otherpad) {
|
|
|
|
GST_DEBUG_OBJECT (parent,
|
|
|
|
"Pad %s:%s not linked, returning ANY", GST_DEBUG_PAD_NAME (pad));
|
2007-12-17 14:43:04 +00:00
|
|
|
caps = gst_caps_new_any ();
|
|
|
|
} else {
|
|
|
|
GST_DEBUG_OBJECT (parent,
|
|
|
|
"Pad %s:%s is linked (to %s:%s), returning peer caps",
|
|
|
|
GST_DEBUG_PAD_NAME (pad), GST_DEBUG_PAD_NAME (otherpad));
|
|
|
|
/* if the peer has caps, use those. If the pad is not linked, this function
|
|
|
|
* returns NULL and we return ANY */
|
|
|
|
if (!(caps = gst_pad_peer_get_caps (otherpad)))
|
|
|
|
caps = gst_caps_new_any ();
|
|
|
|
gst_object_unref (otherpad);
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
gst_object_unref (parent);
|
|
|
|
return caps;
|
|
|
|
}
|
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
/* check if the pad is the active sinkpad */
|
|
|
|
static gboolean
|
|
|
|
gst_stream_selector_is_active_sinkpad (GstStreamSelector * sel, GstPad * pad)
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
{
|
2007-12-17 14:43:04 +00:00
|
|
|
GstSelectorPad *selpad;
|
|
|
|
gboolean res;
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
selpad = GST_SELECTOR_PAD_CAST (pad);
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
GST_OBJECT_LOCK (sel);
|
|
|
|
res = (pad == sel->active_sinkpad);
|
|
|
|
GST_OBJECT_UNLOCK (sel);
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
return res;
|
|
|
|
}
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
/* Get or create the active sinkpad */
|
|
|
|
static GstPad *
|
|
|
|
gst_stream_selector_activate_sinkpad (GstStreamSelector * sel, GstPad * pad)
|
|
|
|
{
|
|
|
|
GstPad *active_sinkpad;
|
|
|
|
GstSelectorPad *selpad;
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
selpad = GST_SELECTOR_PAD_CAST (pad);
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
GST_OBJECT_LOCK (sel);
|
|
|
|
selpad->active = TRUE;
|
|
|
|
active_sinkpad = sel->active_sinkpad;
|
|
|
|
if (active_sinkpad == NULL) {
|
|
|
|
/* first pad we get an alloc on becomes the activated pad by default */
|
|
|
|
active_sinkpad = sel->active_sinkpad = gst_object_ref (pad);
|
|
|
|
GST_DEBUG_OBJECT (sel, "Activating pad %s:%s", GST_DEBUG_PAD_NAME (pad));
|
|
|
|
}
|
|
|
|
GST_OBJECT_UNLOCK (sel);
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
return active_sinkpad;
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static GList *
|
2007-12-17 14:43:04 +00:00
|
|
|
gst_stream_selector_get_linked_pads (GstPad * pad)
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
{
|
2007-12-17 14:43:04 +00:00
|
|
|
GstPad *otherpad;
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
otherpad = gst_stream_selector_get_linked_pad (pad, TRUE);
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
if (!otherpad)
|
|
|
|
return NULL;
|
2007-12-17 14:43:04 +00:00
|
|
|
/* need to drop the ref, internal linked pads is not MT safe */
|
|
|
|
gst_object_unref (otherpad);
|
examples/switch/switcher.c (loop, my_bus_callback, switch_timer, last_message_received, main): gst/switch/gstswitch.c...
Original commit message from CVS:
* configure.ac:
* examples/Makefile.am:
* examples/switch/switcher.c (loop, my_bus_callback, switch_timer,
last_message_received, main):
* gst/switch/gstswitch.c (GST_CAT_DEFAULT, gst_switch_details,
gst_switch_src_factory, parent_class, gst_switch_release_pad,
gst_switch_request_new_pad, gst_switch_chain, gst_switch_event,
gst_switch_set_property, gst_switch_get_property,
gst_switch_get_linked_pad, gst_switch_getcaps,
gst_switch_bufferalloc, gst_switch_get_linked_pads,
gst_switch_dispose, gst_switch_init, gst_switch_base_init,
gst_switch_class_init):
* gst/switch/gstswitch.h (GstSwitch, GstSwitchClass, _GstSwitch,
element, active_sinkpad, srcpad, nb_sinkpads, newsegment_events,
need_to_send_newsegment):
Port switch element and example program to 0.10.
2007-05-03 16:49:05 +00:00
|
|
|
return g_list_append (NULL, otherpad);
|
|
|
|
}
|
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
static GstPad *
|
|
|
|
gst_stream_selector_request_new_pad (GstElement * element,
|
|
|
|
GstPadTemplate * templ, const gchar * unused)
|
2003-12-08 20:01:01 +00:00
|
|
|
{
|
2007-12-17 14:43:04 +00:00
|
|
|
GstStreamSelector *sel;
|
|
|
|
gchar *name = NULL;
|
|
|
|
GstPad *sinkpad = NULL;
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
sel = GST_STREAM_SELECTOR (element);
|
|
|
|
g_return_val_if_fail (templ->direction == GST_PAD_SINK, NULL);
|
|
|
|
GST_LOG_OBJECT (sel, "Creating new pad %d", sel->nb_sinkpads);
|
|
|
|
GST_OBJECT_LOCK (sel);
|
|
|
|
name = g_strdup_printf ("sink%d", sel->nb_sinkpads++);
|
|
|
|
sinkpad = g_object_new (GST_TYPE_SELECTOR_PAD,
|
|
|
|
"name", name, "direction", templ->direction, "template", templ, NULL);
|
|
|
|
g_free (name);
|
|
|
|
GST_OBJECT_UNLOCK (sel);
|
|
|
|
|
|
|
|
gst_pad_set_event_function (sinkpad,
|
|
|
|
GST_DEBUG_FUNCPTR (gst_selector_pad_event));
|
|
|
|
gst_pad_set_getcaps_function (sinkpad,
|
|
|
|
GST_DEBUG_FUNCPTR (gst_selector_pad_getcaps));
|
|
|
|
gst_pad_set_chain_function (sinkpad,
|
|
|
|
GST_DEBUG_FUNCPTR (gst_selector_pad_chain));
|
|
|
|
gst_pad_set_internal_link_function (sinkpad,
|
|
|
|
GST_DEBUG_FUNCPTR (gst_selector_pad_get_linked_pads));
|
|
|
|
gst_pad_set_bufferalloc_function (sinkpad,
|
|
|
|
GST_DEBUG_FUNCPTR (gst_selector_pad_bufferalloc));
|
2003-12-08 20:01:01 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
gst_pad_set_active (sinkpad, TRUE);
|
|
|
|
gst_element_add_pad (GST_ELEMENT (sel), sinkpad);
|
|
|
|
return sinkpad;
|
2003-12-08 20:01:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2007-12-17 14:43:04 +00:00
|
|
|
gst_stream_selector_release_pad (GstElement * element, GstPad * pad)
|
2003-12-08 20:01:01 +00:00
|
|
|
{
|
2007-12-17 14:43:04 +00:00
|
|
|
GstStreamSelector *sel;
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
sel = GST_STREAM_SELECTOR (element);
|
|
|
|
GST_LOG_OBJECT (sel, "Releasing pad %s:%s", GST_DEBUG_PAD_NAME (pad));
|
2004-05-11 03:56:20 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
GST_OBJECT_LOCK (sel);
|
|
|
|
/* if the pad was the active pad, makes us select a new one */
|
|
|
|
if (sel->active_sinkpad == pad) {
|
|
|
|
GST_DEBUG_OBJECT (sel, "Deactivating pad %s:%s", GST_DEBUG_PAD_NAME (pad));
|
|
|
|
sel->active_sinkpad = NULL;
|
2003-12-08 20:01:01 +00:00
|
|
|
}
|
2007-12-17 14:43:04 +00:00
|
|
|
GST_OBJECT_UNLOCK (sel);
|
2004-03-14 22:34:33 +00:00
|
|
|
|
2007-12-17 14:43:04 +00:00
|
|
|
gst_pad_set_active (pad, FALSE);
|
|
|
|
gst_element_remove_pad (GST_ELEMENT (sel), pad);
|
2003-12-08 20:01:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2004-03-14 22:34:33 +00:00
|
|
|
plugin_init (GstPlugin * plugin)
|
2003-12-08 20:01:01 +00:00
|
|
|
{
|
|
|
|
return gst_element_register (plugin, "switch", GST_RANK_NONE,
|
2007-12-17 14:43:04 +00:00
|
|
|
GST_TYPE_STREAM_SELECTOR);
|
2003-12-08 20:01:01 +00:00
|
|
|
}
|
|
|
|
|
2004-03-14 22:34:33 +00:00
|
|
|
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
|
|
|
|
GST_VERSION_MINOR,
|
|
|
|
"switch",
|
|
|
|
"N-to-1 input switching",
|
2006-04-01 10:09:11 +00:00
|
|
|
plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
|