#include "gststreamsplitter.h"
static GstStaticPadTemplate src_template =
-GST_STATIC_PAD_TEMPLATE ("src_%d", GST_PAD_SRC, GST_PAD_REQUEST,
+GST_STATIC_PAD_TEMPLATE ("src_%u", GST_PAD_SRC, GST_PAD_REQUEST,
GST_STATIC_CAPS_ANY);
static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
static void gst_stream_splitter_dispose (GObject * object);
+static gboolean gst_stream_splitter_sink_setcaps (GstPad * pad, GstCaps * caps);
+
static GstPad *gst_stream_splitter_request_new_pad (GstElement * element,
- GstPadTemplate * templ, const gchar * name);
+ GstPadTemplate * templ, const gchar * name, const GstCaps * caps);
static void gst_stream_splitter_release_pad (GstElement * element,
GstPad * pad);
GST_DEBUG_CATEGORY_INIT (gst_stream_splitter_debug, "streamsplitter", 0,
"Stream Splitter");
- gst_element_class_add_static_pad_template (gstelement_klass,
- &src_template);
- gst_element_class_add_static_pad_template (gstelement_klass,
- &sink_template);
+ gst_element_class_add_pad_template (gstelement_klass,
+ gst_static_pad_template_get (&src_template));
+ gst_element_class_add_pad_template (gstelement_klass,
+ gst_static_pad_template_get (&sink_template));
gstelement_klass->request_new_pad =
GST_DEBUG_FUNCPTR (gst_stream_splitter_request_new_pad);
}
static GstFlowReturn
-gst_stream_splitter_chain (GstPad * pad, GstBuffer * buf)
+gst_stream_splitter_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
{
- GstStreamSplitter *stream_splitter =
- (GstStreamSplitter *) GST_PAD_PARENT (pad);
+ GstStreamSplitter *stream_splitter = (GstStreamSplitter *) parent;
GstFlowReturn res;
GstPad *srcpad = NULL;
}
static gboolean
-gst_stream_splitter_sink_event (GstPad * pad, GstEvent * event)
+gst_stream_splitter_sink_event (GstPad * pad, GstObject * parent,
+ GstEvent * event)
{
- GstStreamSplitter *stream_splitter =
- (GstStreamSplitter *) GST_PAD_PARENT (pad);
+ GstStreamSplitter *stream_splitter = (GstStreamSplitter *) parent;
gboolean res = TRUE;
gboolean toall = FALSE;
gboolean store = FALSE;
GST_EVENT_TYPE_NAME (event));
switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+ res = gst_stream_splitter_sink_setcaps (pad, caps);
+
+ store = TRUE;
+ break;
+ }
case GST_EVENT_FLUSH_STOP:
flushpending = TRUE;
toall = TRUE;
gst_event_unref (event);
event =
gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM,
- gst_structure_empty_new ("stream-switching-eos"));
+ gst_structure_new_empty ("stream-switching-eos"));
toall = TRUE;
eos = TRUE;
break;
}
static GstCaps *
-gst_stream_splitter_sink_getcaps (GstPad * pad)
+gst_stream_splitter_sink_getcaps (GstPad * pad, GstCaps * filter)
{
GstStreamSplitter *stream_splitter =
(GstStreamSplitter *) GST_PAD_PARENT (pad);
resync:
if (G_UNLIKELY (stream_splitter->srcpads == NULL)) {
- res = gst_caps_new_any ();
+ res = (filter ? gst_caps_ref (filter) : gst_caps_new_any ());
goto beach;
}
STREAMS_UNLOCK (stream_splitter);
if (res) {
- GstCaps *peercaps = gst_pad_peer_get_caps_reffed (srcpad);
+ GstCaps *peercaps = gst_pad_peer_query_caps (srcpad, filter);
if (peercaps)
gst_caps_merge (res, gst_caps_make_writable (peercaps));
} else {
- res = gst_pad_peer_get_caps (srcpad);
+ res = gst_pad_peer_query_caps (srcpad, filter);
}
STREAMS_LOCK (stream_splitter);
}
static gboolean
+gst_stream_splitter_sink_query (GstPad * pad, GstObject * parent,
+ GstQuery * query)
+{
+ gboolean res;
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_CAPS:
+ {
+ GstCaps *filter, *caps;
+
+ gst_query_parse_caps (query, &filter);
+ caps = gst_stream_splitter_sink_getcaps (pad, filter);
+ gst_query_set_caps_result (query, caps);
+ gst_caps_unref (caps);
+ res = TRUE;
+ break;
+ }
+ default:
+ res = gst_pad_query_default (pad, parent, query);
+ break;
+ }
+ return res;
+}
+
+static gboolean
gst_stream_splitter_sink_setcaps (GstPad * pad, GstCaps * caps)
{
GstStreamSplitter *stream_splitter =
GstCaps *peercaps;
STREAMS_UNLOCK (stream_splitter);
- peercaps = gst_pad_peer_get_caps_reffed (srcpad);
+ peercaps = gst_pad_peer_query_caps (srcpad, NULL);
if (peercaps) {
res = gst_caps_can_intersect (caps, peercaps);
gst_caps_unref (peercaps);
}
static gboolean
-gst_stream_splitter_src_event (GstPad * pad, GstEvent * event)
+gst_stream_splitter_src_event (GstPad * pad, GstObject * parent,
+ GstEvent * event)
{
- GstStreamSplitter *stream_splitter =
- (GstStreamSplitter *) GST_PAD_PARENT (pad);
+ GstStreamSplitter *stream_splitter = (GstStreamSplitter *) parent;
GST_DEBUG_OBJECT (pad, "%s", GST_EVENT_TYPE_NAME (event));
}
static gboolean
-gst_stream_splitter_src_query (GstPad * pad, GstQuery * query)
+gst_stream_splitter_src_query (GstPad * pad, GstObject * parent,
+ GstQuery * query)
{
- GstStreamSplitter *stream_splitter =
- (GstStreamSplitter *) GST_PAD_PARENT (pad);
+ GstStreamSplitter *stream_splitter = (GstStreamSplitter *) parent;
GST_DEBUG_OBJECT (pad, "%s", GST_QUERY_TYPE_NAME (query));
{
stream_splitter->sinkpad =
gst_pad_new_from_static_template (&sink_template, "sink");
- /* FIXME : No buffer alloc for the time being, it will resort to the fallback */
- /* gst_pad_set_bufferalloc_function (stream_splitter->sinkpad, */
- /* gst_stream_splitter_buffer_alloc); */
gst_pad_set_chain_function (stream_splitter->sinkpad,
gst_stream_splitter_chain);
gst_pad_set_event_function (stream_splitter->sinkpad,
gst_stream_splitter_sink_event);
- gst_pad_set_getcaps_function (stream_splitter->sinkpad,
- gst_stream_splitter_sink_getcaps);
- gst_pad_set_setcaps_function (stream_splitter->sinkpad,
- gst_stream_splitter_sink_setcaps);
+ gst_pad_set_query_function (stream_splitter->sinkpad,
+ gst_stream_splitter_sink_query);
gst_element_add_pad (GST_ELEMENT (stream_splitter), stream_splitter->sinkpad);
stream_splitter->lock = g_mutex_new ();
static GstPad *
gst_stream_splitter_request_new_pad (GstElement * element,
- GstPadTemplate * templ, const gchar * name)
+ GstPadTemplate * templ, const gchar * name, const GstCaps * caps)
{
GstStreamSplitter *stream_splitter = (GstStreamSplitter *) element;
GstPad *srcpad;