Merge remote-tracking branch 'origin/master' into 0.11
[platform/upstream/gstreamer.git] / gst / encoding / gststreamsplitter.c
index 9221b35..d37f15e 100644 (file)
@@ -25,7 +25,7 @@
 #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",
@@ -43,8 +43,10 @@ G_DEFINE_TYPE (GstStreamSplitter, gst_stream_splitter, GST_TYPE_ELEMENT);
 
 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);
 
@@ -62,10 +64,10 @@ gst_stream_splitter_class_init (GstStreamSplitterClass * klass)
   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);
@@ -97,10 +99,9 @@ gst_stream_splitter_dispose (GObject * object)
 }
 
 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;
 
@@ -136,10 +137,10 @@ nopad:
 }
 
 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;
@@ -156,6 +157,16 @@ gst_stream_splitter_sink_event (GstPad * pad, GstEvent * event)
       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;
@@ -168,7 +179,7 @@ gst_stream_splitter_sink_event (GstPad * pad, GstEvent * event)
       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;
@@ -242,7 +253,7 @@ beach:
 }
 
 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);
@@ -256,7 +267,7 @@ gst_stream_splitter_sink_getcaps (GstPad * 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;
   }
 
@@ -269,11 +280,11 @@ resync:
 
     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);
 
@@ -291,6 +302,31 @@ beach:
 }
 
 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 =
@@ -319,7 +355,7 @@ resync:
     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);
@@ -344,10 +380,10 @@ beach:
 }
 
 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));
 
@@ -356,10 +392,10 @@ gst_stream_splitter_src_event (GstPad * pad, GstEvent * 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));
 
@@ -372,17 +408,12 @@ gst_stream_splitter_init (GstStreamSplitter * stream_splitter)
 {
   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 ();
@@ -390,7 +421,7 @@ gst_stream_splitter_init (GstStreamSplitter * stream_splitter)
 
 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;