outputselector: implement pad_alloc on active pad.

This commit is contained in:
Stefan Kost 2009-05-28 10:12:58 +03:00
parent 4d5a48db97
commit addb247436
2 changed files with 40 additions and 6 deletions

View file

@ -19,7 +19,7 @@
/** /**
* SECTION:element-output-selector * SECTION:element-output-selector
* @see_also: #GstTee, #GstInputSelector * @see_also: #GstOutputSelector, #GstInputSelector
* *
* Direct input stream to one out of N output pads. * Direct input stream to one out of N output pads.
*/ */
@ -74,6 +74,8 @@ static GstPad *gst_output_selector_request_new_pad (GstElement * element,
static void gst_output_selector_release_pad (GstElement * element, static void gst_output_selector_release_pad (GstElement * element,
GstPad * pad); GstPad * pad);
static GstFlowReturn gst_output_selector_chain (GstPad * pad, GstBuffer * buf); static GstFlowReturn gst_output_selector_chain (GstPad * pad, GstBuffer * buf);
static GstFlowReturn gst_output_selector_buffer_alloc (GstPad * pad,
guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf);
static GstStateChangeReturn gst_output_selector_change_state (GstElement * static GstStateChangeReturn gst_output_selector_change_state (GstElement *
element, GstStateChange transition); element, GstStateChange transition);
static gboolean gst_output_selector_handle_sink_event (GstPad * pad, static gboolean gst_output_selector_handle_sink_event (GstPad * pad,
@ -136,17 +138,17 @@ gst_output_selector_init (GstOutputSelector * sel,
GST_DEBUG_FUNCPTR (gst_output_selector_chain)); GST_DEBUG_FUNCPTR (gst_output_selector_chain));
gst_pad_set_event_function (sel->sinkpad, gst_pad_set_event_function (sel->sinkpad,
GST_DEBUG_FUNCPTR (gst_output_selector_handle_sink_event)); GST_DEBUG_FUNCPTR (gst_output_selector_handle_sink_event));
gst_pad_set_bufferalloc_function (sel->sinkpad,
gst_element_add_pad (GST_ELEMENT (sel), sel->sinkpad); GST_DEBUG_FUNCPTR (gst_output_selector_buffer_alloc));
/* /*
gst_pad_set_bufferalloc_function (sel->sinkpad,
GST_DEBUG_FUNCPTR (gst_output_selector_bufferalloc));
gst_pad_set_setcaps_function (sel->sinkpad, gst_pad_set_setcaps_function (sel->sinkpad,
GST_DEBUG_FUNCPTR (gst_pad_proxy_setcaps)); GST_DEBUG_FUNCPTR (gst_pad_proxy_setcaps));
gst_pad_set_getcaps_function (sel->sinkpad, gst_pad_set_getcaps_function (sel->sinkpad,
GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps)); GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps));
*/ */
gst_element_add_pad (GST_ELEMENT (sel), sel->sinkpad);
/* srcpad management */ /* srcpad management */
sel->active_srcpad = NULL; sel->active_srcpad = NULL;
sel->nb_srcpads = 0; sel->nb_srcpads = 0;
@ -251,6 +253,37 @@ gst_output_selector_get_property (GObject * object, guint prop_id,
} }
} }
static GstFlowReturn
gst_output_selector_buffer_alloc (GstPad * pad, guint64 offset, guint size,
GstCaps * caps, GstBuffer ** buf)
{
GstOutputSelector *sel;
GstFlowReturn res;
GstPad *allocpad;
sel = GST_OUTPUT_SELECTOR (GST_PAD_PARENT (pad));
res = GST_FLOW_NOT_LINKED;
GST_OBJECT_LOCK (sel);
if ((allocpad = sel->active_srcpad)) {
/* if we had a previous pad we used for allocating a buffer, continue using
* it. */
GST_DEBUG_OBJECT (sel, "using pad %s:%s for alloc",
GST_DEBUG_PAD_NAME (allocpad));
gst_object_ref (allocpad);
GST_OBJECT_UNLOCK (sel);
res = gst_pad_alloc_buffer (allocpad, offset, size, caps, buf);
gst_object_unref (allocpad);
GST_OBJECT_LOCK (sel);
}
GST_OBJECT_UNLOCK (sel);
return res;
}
static GstPad * static GstPad *
gst_output_selector_request_new_pad (GstElement * element, gst_output_selector_request_new_pad (GstElement * element,
GstPadTemplate * templ, const gchar * name) GstPadTemplate * templ, const gchar * name)

View file

@ -42,6 +42,7 @@ struct _GstOutputSelector {
GstElement element; GstElement element;
GstPad *sinkpad; GstPad *sinkpad;
GstPad *allocpad;
GstPad *active_srcpad; GstPad *active_srcpad;
GstPad *pending_srcpad; GstPad *pending_srcpad;