From 81ebc0a82eeb87b71f5102ac34b99ae8b4fdcd60 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 2 Jun 2011 19:21:24 +0200 Subject: [PATCH] basertp: use caps event instead of setcaps function Use the caps event instead of the setcaps function to configure caps. Use a default event handler for the base rtp payloader instead of the awkward way of handling the return value. --- gst-libs/gst/rtp/gstbasertpaudiopayload.c | 13 ++-- gst-libs/gst/rtp/gstbasertpdepayload.c | 19 +++-- gst-libs/gst/rtp/gstbasertppayload.c | 95 ++++++++++++----------- gst-libs/gst/rtp/gstbasertppayload.h | 2 +- 4 files changed, 68 insertions(+), 61 deletions(-) diff --git a/gst-libs/gst/rtp/gstbasertpaudiopayload.c b/gst-libs/gst/rtp/gstbasertpaudiopayload.c index b8b78d59ae..d9a7c5b331 100644 --- a/gst-libs/gst/rtp/gstbasertpaudiopayload.c +++ b/gst-libs/gst/rtp/gstbasertpaudiopayload.c @@ -156,8 +156,8 @@ static GstFlowReturn gst_base_rtp_audio_payload_handle_buffer (GstBaseRTPPayload static GstStateChangeReturn gst_base_rtp_payload_audio_change_state (GstElement * element, GstStateChange transition); -static gboolean gst_base_rtp_payload_audio_handle_event (GstPad * pad, - GstEvent * event); +static gboolean gst_base_rtp_payload_audio_handle_event (GstBaseRTPPayload + * payload, GstEvent * event); #define gst_base_rtp_audio_payload_parent_class parent_class G_DEFINE_TYPE (GstBaseRTPAudioPayload, gst_base_rtp_audio_payload, @@ -953,12 +953,13 @@ gst_base_rtp_payload_audio_change_state (GstElement * element, } static gboolean -gst_base_rtp_payload_audio_handle_event (GstPad * pad, GstEvent * event) +gst_base_rtp_payload_audio_handle_event (GstBaseRTPPayload * basep, + GstEvent * event) { GstBaseRTPAudioPayload *payload; gboolean res = FALSE; - payload = GST_BASE_RTP_AUDIO_PAYLOAD (gst_pad_get_parent (pad)); + payload = GST_BASE_RTP_AUDIO_PAYLOAD (basep); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: @@ -972,9 +973,9 @@ gst_base_rtp_payload_audio_handle_event (GstPad * pad, GstEvent * event) break; } - gst_object_unref (payload); + /* let parent handle the remainder of the event */ + res = GST_BASE_RTP_PAYLOAD_CLASS (parent_class)->handle_event (basep, event); - /* return FALSE to let parent handle the remainder of the event */ return res; } diff --git a/gst-libs/gst/rtp/gstbasertpdepayload.c b/gst-libs/gst/rtp/gstbasertpdepayload.c index c8be565243..ab339408f7 100644 --- a/gst-libs/gst/rtp/gstbasertpdepayload.c +++ b/gst-libs/gst/rtp/gstbasertpdepayload.c @@ -68,7 +68,6 @@ static void gst_base_rtp_depayload_set_property (GObject * object, static void gst_base_rtp_depayload_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); -static gboolean gst_base_rtp_depayload_setcaps (GstPad * pad, GstCaps * caps); static GstFlowReturn gst_base_rtp_depayload_chain (GstPad * pad, GstBuffer * in); static gboolean gst_base_rtp_depayload_handle_sink_event (GstPad * pad, @@ -157,8 +156,6 @@ gst_base_rtp_depayload_init (GstBaseRTPDepayload * filter, gst_element_class_get_pad_template (GST_ELEMENT_CLASS (klass), "sink"); g_return_if_fail (pad_template != NULL); filter->sinkpad = gst_pad_new_from_template (pad_template, "sink"); - gst_pad_set_setcaps_function (filter->sinkpad, - gst_base_rtp_depayload_setcaps); gst_pad_set_chain_function (filter->sinkpad, gst_base_rtp_depayload_chain); gst_pad_set_event_function (filter->sinkpad, gst_base_rtp_depayload_handle_sink_event); @@ -181,16 +178,14 @@ gst_base_rtp_depayload_finalize (GObject * object) } static gboolean -gst_base_rtp_depayload_setcaps (GstPad * pad, GstCaps * caps) +gst_base_rtp_depayload_setcaps (GstBaseRTPDepayload * filter, GstCaps * caps) { - GstBaseRTPDepayload *filter; GstBaseRTPDepayloadClass *bclass; GstBaseRTPDepayloadPrivate *priv; gboolean res; GstStructure *caps_struct; const GValue *value; - filter = GST_BASE_RTP_DEPAYLOAD (gst_pad_get_parent (pad)); priv = filter->priv; bclass = GST_BASE_RTP_DEPAYLOAD_GET_CLASS (filter); @@ -239,8 +234,6 @@ gst_base_rtp_depayload_setcaps (GstPad * pad, GstCaps * caps) priv->negotiated = res; - gst_object_unref (filter); - return res; } @@ -401,6 +394,16 @@ gst_base_rtp_depayload_handle_event (GstBaseRTPDepayload * filter, filter->need_newsegment = TRUE; filter->priv->next_seqnum = -1; break; + case GST_EVENT_CAPS: + { + GstCaps *caps; + + gst_event_parse_caps (event, &caps); + + res = gst_base_rtp_depayload_setcaps (filter, caps); + forward = FALSE; + break; + } case GST_EVENT_SEGMENT: { gst_event_copy_segment (event, &filter->segment); diff --git a/gst-libs/gst/rtp/gstbasertppayload.c b/gst-libs/gst/rtp/gstbasertppayload.c index 33e6a90e4d..aeef4246bb 100644 --- a/gst-libs/gst/rtp/gstbasertppayload.c +++ b/gst-libs/gst/rtp/gstbasertppayload.c @@ -94,9 +94,10 @@ static void gst_basertppayload_init (GstBaseRTPPayload * basertppayload, gpointer g_class); static void gst_basertppayload_finalize (GObject * object); -static gboolean gst_basertppayload_sink_setcaps (GstPad * pad, GstCaps * caps); static GstCaps *gst_basertppayload_sink_getcaps (GstPad * pad, GstCaps * filter); +static gboolean gst_basertppayload_event_default (GstBaseRTPPayload * + basertppayload, GstEvent * event); static gboolean gst_basertppayload_event (GstPad * pad, GstEvent * event); static GstFlowReturn gst_basertppayload_chain (GstPad * pad, GstBuffer * buffer); @@ -240,6 +241,8 @@ gst_basertppayload_class_init (GstBaseRTPPayloadClass * klass) gstelement_class->change_state = gst_basertppayload_change_state; + klass->handle_event = gst_basertppayload_event_default; + GST_DEBUG_CATEGORY_INIT (basertppayload_debug, "basertppayload", 0, "Base class for RTP Payloaders"); } @@ -265,8 +268,6 @@ gst_basertppayload_init (GstBaseRTPPayload * basertppayload, gpointer g_class) g_return_if_fail (templ != NULL); basertppayload->sinkpad = gst_pad_new_from_template (templ, "sink"); - gst_pad_set_setcaps_function (basertppayload->sinkpad, - gst_basertppayload_sink_setcaps); gst_pad_set_getcaps_function (basertppayload->sinkpad, gst_basertppayload_sink_getcaps); gst_pad_set_event_function (basertppayload->sinkpad, @@ -324,25 +325,6 @@ gst_basertppayload_finalize (GObject * object) G_OBJECT_CLASS (parent_class)->finalize (object); } -static gboolean -gst_basertppayload_sink_setcaps (GstPad * pad, GstCaps * caps) -{ - GstBaseRTPPayload *basertppayload; - GstBaseRTPPayloadClass *basertppayload_class; - gboolean ret = TRUE; - - GST_DEBUG_OBJECT (pad, "setting caps %" GST_PTR_FORMAT, caps); - basertppayload = GST_BASE_RTP_PAYLOAD (gst_pad_get_parent (pad)); - basertppayload_class = GST_BASE_RTP_PAYLOAD_GET_CLASS (basertppayload); - - if (basertppayload_class->set_caps) - ret = basertppayload_class->set_caps (basertppayload, caps); - - gst_object_unref (basertppayload); - - return ret; -} - static GstCaps * gst_basertppayload_sink_getcaps (GstPad * pad, GstCaps * filter) { @@ -376,33 +358,32 @@ gst_basertppayload_sink_getcaps (GstPad * pad, GstCaps * filter) } static gboolean -gst_basertppayload_event (GstPad * pad, GstEvent * event) +gst_basertppayload_event_default (GstBaseRTPPayload * basertppayload, + GstEvent * event) { - GstBaseRTPPayload *basertppayload; - GstBaseRTPPayloadClass *basertppayload_class; - gboolean res; - - basertppayload = GST_BASE_RTP_PAYLOAD (gst_pad_get_parent (pad)); - if (G_UNLIKELY (basertppayload == NULL)) { - gst_event_unref (event); - return FALSE; - } - basertppayload_class = GST_BASE_RTP_PAYLOAD_GET_CLASS (basertppayload); - - if (basertppayload_class->handle_event) { - res = basertppayload_class->handle_event (pad, event); - if (res) - goto done; - } + gboolean res = FALSE; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_START: - res = gst_pad_event_default (pad, event); + res = gst_pad_event_default (basertppayload->sinkpad, event); break; case GST_EVENT_FLUSH_STOP: - res = gst_pad_event_default (pad, event); + res = gst_pad_event_default (basertppayload->sinkpad, event); gst_segment_init (&basertppayload->segment, GST_FORMAT_UNDEFINED); break; + case GST_EVENT_CAPS: + { + GstBaseRTPPayloadClass *basertppayload_class; + GstCaps *caps; + + gst_event_parse_caps (event, &caps); + GST_DEBUG_OBJECT (basertppayload, "setting caps %" GST_PTR_FORMAT, caps); + + basertppayload_class = GST_BASE_RTP_PAYLOAD_GET_CLASS (basertppayload); + if (basertppayload_class->set_caps) + res = basertppayload_class->set_caps (basertppayload, caps); + break; + } case GST_EVENT_SEGMENT: { GstSegment *segment; @@ -412,14 +393,36 @@ gst_basertppayload_event (GstPad * pad, GstEvent * event) GST_DEBUG_OBJECT (basertppayload, "configured SEGMENT %" GST_SEGMENT_FORMAT, segment); - /* fallthrough */ + res = gst_pad_event_default (basertppayload->sinkpad, event); + break; } default: - res = gst_pad_event_default (pad, event); + res = gst_pad_event_default (basertppayload->sinkpad, event); break; } + return res; +} + +static gboolean +gst_basertppayload_event (GstPad * pad, GstEvent * event) +{ + GstBaseRTPPayload *basertppayload; + GstBaseRTPPayloadClass *basertppayload_class; + gboolean res = FALSE; + + basertppayload = GST_BASE_RTP_PAYLOAD (gst_pad_get_parent (pad)); + if (G_UNLIKELY (basertppayload == NULL)) { + gst_event_unref (event); + return FALSE; + } + + basertppayload_class = GST_BASE_RTP_PAYLOAD_GET_CLASS (basertppayload); + + if (basertppayload_class->handle_event) + res = basertppayload_class->handle_event (basertppayload, event); + else + gst_event_unref (event); -done: gst_object_unref (basertppayload); return res; @@ -816,8 +819,8 @@ gst_basertppayload_prepare_push (GstBaseRTPPayload * payload, gst_buffer_get_size (GST_BUFFER (obj)), payload->seqnum, data.rtptime, GST_TIME_ARGS (data.timestamp)); - if (g_atomic_int_compare_and_exchange (&payload-> - priv->notified_first_timestamp, 1, 0)) { + if (g_atomic_int_compare_and_exchange (&payload->priv-> + notified_first_timestamp, 1, 0)) { g_object_notify (G_OBJECT (payload), "timestamp"); g_object_notify (G_OBJECT (payload), "seqnum"); } diff --git a/gst-libs/gst/rtp/gstbasertppayload.h b/gst-libs/gst/rtp/gstbasertppayload.h index 2987b3ccc4..1acc73a2f8 100644 --- a/gst-libs/gst/rtp/gstbasertppayload.h +++ b/gst-libs/gst/rtp/gstbasertppayload.h @@ -140,7 +140,7 @@ struct _GstBaseRTPPayloadClass * the RTP buffers. This function takes ownership of the buffer. */ GstFlowReturn (*handle_buffer) (GstBaseRTPPayload *payload, GstBuffer *buffer); - gboolean (*handle_event) (GstPad * pad, GstEvent * event); + gboolean (*handle_event) (GstBaseRTPPayload *payload, GstEvent * event); GstCaps * (*get_caps) (GstBaseRTPPayload *payload, GstPad * pad, GstCaps * filter); /*< private >*/