summaryrefslogtreecommitdiffstats
path: root/gst/rtpmanager/gstrtpptdemux.c
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2007-04-12 08:18:32 +0000
committerTim-Philipp Müller <tim.muller@collabora.co.uk>2009-08-11 02:30:25 +0100
commit8bbea77a41c38fe63172fd511cdd8632d577fd72 (patch)
tree1cf93df9a6c8a722ebdbba6ccd1757364eab8798 /gst/rtpmanager/gstrtpptdemux.c
parent03bf43d50edb50f8114419cd62278afd7f67922b (diff)
gst/rtpmanager/gstrtpbin.c: Emit pt map requests and cache results.
Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (create_session), (get_pt_map), (create_stream), (gst_rtp_bin_class_init), (pt_map_requested): Emit pt map requests and cache results. * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_class_init), (gst_jitter_buffer_sink_parse_caps), (gst_jitter_buffer_sink_setcaps), (gst_rtp_jitter_buffer_get_clock_rate), (gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop): * gst/rtpmanager/gstrtpjitterbuffer.h: * gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_chain): Emit request-pt-map signals.
Diffstat (limited to 'gst/rtpmanager/gstrtpptdemux.c')
-rw-r--r--gst/rtpmanager/gstrtpptdemux.c53
1 files changed, 33 insertions, 20 deletions
diff --git a/gst/rtpmanager/gstrtpptdemux.c b/gst/rtpmanager/gstrtpptdemux.c
index 7ac6e90c..247df148 100644
--- a/gst/rtpmanager/gstrtpptdemux.c
+++ b/gst/rtpmanager/gstrtpptdemux.c
@@ -97,7 +97,6 @@ static void gst_rtp_pt_demux_release (GstElement * element);
static gboolean gst_rtp_pt_demux_setup (GstElement * element);
static GstFlowReturn gst_rtp_pt_demux_chain (GstPad * pad, GstBuffer * buf);
-static GstCaps *gst_rtp_pt_demux_getcaps (GstPad * pad);
static GstStateChangeReturn gst_rtp_pt_demux_change_state (GstElement * element,
GstStateChange transition);
@@ -234,6 +233,11 @@ gst_rtp_pt_demux_chain (GstPad * pad, GstBuffer * buf)
gchar *padname;
GstCaps *caps;
GstRTPPtDemuxPad *rtpdemuxpad;
+ GValue ret = { 0 };
+ GValue args[2] = { {0}
+ , {0}
+ };
+
klass = GST_ELEMENT_GET_CLASS (rtpdemux);
templ = gst_element_class_get_pad_template (klass, "src_%d");
@@ -241,22 +245,35 @@ gst_rtp_pt_demux_chain (GstPad * pad, GstBuffer * buf)
srcpad = gst_pad_new_from_template (templ, padname);
g_free (padname);
- caps = gst_buffer_get_caps (buf);
+ /* figure out the caps */
+ g_value_init (&args[0], GST_TYPE_ELEMENT);
+ g_value_set_object (&args[0], rtpdemux);
+ g_value_init (&args[1], G_TYPE_UINT);
+ g_value_set_uint (&args[1], pt);
+
+ g_value_init (&ret, GST_TYPE_CAPS);
+ g_value_set_boxed (&ret, NULL);
+
+ g_signal_emitv (args, gst_rtp_pt_demux_signals[SIGNAL_REQUEST_PT_MAP], 0,
+ &ret);
+
+ caps = g_value_get_boxed (&ret);
+ if (!caps)
+ goto no_caps;
+
caps = gst_caps_make_writable (caps);
gst_caps_set_simple (caps, "payload", G_TYPE_INT, pt, NULL);
gst_pad_set_caps (srcpad, caps);
- /* XXX: set _link () function */
- gst_pad_set_getcaps_function (srcpad, gst_rtp_pt_demux_getcaps);
- gst_pad_set_active (srcpad, TRUE);
- gst_element_add_pad (element, srcpad);
-
GST_DEBUG ("Adding pt=%d to the list.", pt);
rtpdemuxpad = g_new0 (GstRTPPtDemuxPad, 1);
rtpdemuxpad->pt = pt;
rtpdemuxpad->pad = srcpad;
rtpdemux->srcpads = g_slist_append (rtpdemux->srcpads, rtpdemuxpad);
+ gst_pad_set_active (srcpad, TRUE);
+ gst_element_add_pad (element, srcpad);
+
GST_DEBUG ("emitting new-payload_type for pt %d", pt);
g_signal_emit (G_OBJECT (rtpdemux),
gst_rtp_pt_demux_signals[SIGNAL_NEW_PAYLOAD_TYPE], 0, pt, srcpad);
@@ -272,6 +289,8 @@ gst_rtp_pt_demux_chain (GstPad * pad, GstBuffer * buf)
gst_rtp_pt_demux_signals[SIGNAL_PAYLOAD_TYPE_CHANGE], 0, emit_pt);
}
+ gst_buffer_set_caps (buf, GST_PAD_CAPS (srcpad));
+
/* push to srcpad */
if (srcpad)
ret = gst_pad_push (srcpad, GST_BUFFER (buf));
@@ -287,19 +306,13 @@ invalid_buffer:
gst_buffer_unref (buf);
return GST_FLOW_ERROR;
}
-}
-
-static GstCaps *
-gst_rtp_pt_demux_getcaps (GstPad * pad)
-{
- GstCaps *caps;
-
- GST_OBJECT_LOCK (pad);
- if ((caps = GST_PAD_CAPS (pad)))
- caps = gst_caps_ref (caps);
- GST_OBJECT_UNLOCK (pad);
-
- return caps;
+no_caps:
+ {
+ GST_ELEMENT_ERROR (rtpdemux, STREAM, DECODE, (NULL),
+ ("Could not get caps for payload"));
+ gst_buffer_unref (buf);
+ return GST_FLOW_ERROR;
+ }
}
static GstPad *