diff --git a/ChangeLog b/ChangeLog index 95e5d69656..0d4860e159 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,25 @@ +2008-10-07 Wim Taymans + + Patch by: HÃ¥vard Graff + + * gst/rtpmanager/gstrtpbin-marshal.list: + Add marshaller for new action signal. + + * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_get_internal_session), + (gst_rtp_bin_class_init): + * gst/rtpmanager/gstrtpbin.h: + Add action signal to retrieve the internal RTPSession object. + + * gst/rtpmanager/gstrtpsession.c: (gst_rtp_session_class_init), + (gst_rtp_session_get_property), (gst_rtp_session_release_pad): + Add property to access the internal RTPSession object. + + * gst/rtpmanager/rtpsession.c: (rtp_session_class_init), + (check_collision): + * gst/rtpmanager/rtpsession.h: + Add action signal to retrieve an RTPSource object by SSRC. + See #555396. + 2008-10-07 Stefan Kost * gst/selector/gstoutputselector.c: diff --git a/gst/rtpmanager/gstrtpbin-marshal.list b/gst/rtpmanager/gstrtpbin-marshal.list index e5c5fc428a..c4bc0bb25a 100644 --- a/gst/rtpmanager/gstrtpbin-marshal.list +++ b/gst/rtpmanager/gstrtpbin-marshal.list @@ -1,6 +1,7 @@ UINT:UINT BOXED:UINT BOXED:UINT,UINT +OBJECT:UINT VOID:UINT,OBJECT VOID:UINT,UINT VOID:OBJECT,OBJECT diff --git a/gst/rtpmanager/gstrtpbin.c b/gst/rtpmanager/gstrtpbin.c index 19d17656a5..605a73dd2e 100644 --- a/gst/rtpmanager/gstrtpbin.c +++ b/gst/rtpmanager/gstrtpbin.c @@ -119,6 +119,7 @@ #include "gstrtpbin-marshal.h" #include "gstrtpbin.h" +#include "rtpsession.h" #include "gstrtpsession.h" #include "gstrtpjitterbuffer.h" @@ -228,6 +229,7 @@ enum { SIGNAL_REQUEST_PT_MAP, SIGNAL_CLEAR_PT_MAP, + SIGNAL_GET_INTERNAL_SESSION, SIGNAL_ON_NEW_SSRC, SIGNAL_ON_SSRC_COLLISION, @@ -734,6 +736,25 @@ gst_rtp_bin_clear_pt_map (GstRtpBin * bin) GST_RTP_BIN_UNLOCK (bin); } +static RTPSession * +gst_rtp_bin_get_internal_session (GstRtpBin * bin, guint session_id) +{ + RTPSession *internal_session = NULL; + GstRtpBinSession *session; + + GST_RTP_BIN_LOCK (bin); + GST_DEBUG_OBJECT (bin, "retrieving internal RTPSession object, index: %d", + session_id); + session = find_session_by_id (bin, (gint) session_id); + if (session) { + g_object_get (session->session, "internal-session", &internal_session, + NULL); + } + GST_RTP_BIN_UNLOCK (bin); + + return internal_session; +} + static void gst_rtp_bin_propagate_property_to_jitterbuffer (GstRtpBin * bin, const gchar * name, const GValue * value) @@ -1290,6 +1311,18 @@ gst_rtp_bin_class_init (GstRtpBinClass * klass) G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstRtpBinClass, clear_pt_map), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); + /** + * GstRtpBin::get-internal-session: + * @rtpbin: the object which received the signal + * @id: the session id + * + * Request the internal RTPSession object as #GObject in session @id. + */ + gst_rtp_bin_signals[SIGNAL_GET_INTERNAL_SESSION] = + g_signal_new ("get-internal-session", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GstRtpBinClass, + get_internal_session), NULL, NULL, gst_rtp_bin_marshal_OBJECT__UINT, + RTP_TYPE_SESSION, 1, G_TYPE_UINT); /** * GstRtpBin::on-new-ssrc: @@ -1460,6 +1493,8 @@ gst_rtp_bin_class_init (GstRtpBinClass * klass) gstbin_class->handle_message = GST_DEBUG_FUNCPTR (gst_rtp_bin_handle_message); klass->clear_pt_map = GST_DEBUG_FUNCPTR (gst_rtp_bin_clear_pt_map); + klass->get_internal_session = + GST_DEBUG_FUNCPTR (gst_rtp_bin_get_internal_session); GST_DEBUG_CATEGORY_INIT (gst_rtp_bin_debug, "rtpbin", 0, "RTP bin"); } diff --git a/gst/rtpmanager/gstrtpbin.h b/gst/rtpmanager/gstrtpbin.h index 7ef605d1f9..71235fdafc 100644 --- a/gst/rtpmanager/gstrtpbin.h +++ b/gst/rtpmanager/gstrtpbin.h @@ -22,6 +22,8 @@ #include +#include "rtpsession.h" + #define GST_TYPE_RTP_BIN \ (gst_rtp_bin_get_type()) #define GST_RTP_BIN(obj) \ @@ -63,9 +65,13 @@ struct _GstRtpBinClass { GstBinClass parent_class; /* get the caps for pt */ - GstCaps* (*request_pt_map) (GstRtpBin *rtpbin, guint session, guint pt); - void (*clear_pt_map) (GstRtpBin *rtpbin); + GstCaps* (*request_pt_map) (GstRtpBin *rtpbin, guint session, guint pt); + /* action signals */ + void (*clear_pt_map) (GstRtpBin *rtpbin); + RTPSession* (*get_internal_session) (GstRtpBin *rtpbin, guint session_id); + + /* session manager signals */ void (*on_new_ssrc) (GstRtpBin *rtpbin, guint session, guint32 ssrc); void (*on_ssrc_collision) (GstRtpBin *rtpbin, guint session, guint32 ssrc); void (*on_ssrc_validated) (GstRtpBin *rtpbin, guint session, guint32 ssrc); diff --git a/gst/rtpmanager/gstrtpsession.c b/gst/rtpmanager/gstrtpsession.c index 5257b50ee3..fdc4ea2e54 100644 --- a/gst/rtpmanager/gstrtpsession.c +++ b/gst/rtpmanager/gstrtpsession.c @@ -225,6 +225,7 @@ enum PROP_SDES_NOTE, PROP_NUM_SOURCES, PROP_NUM_ACTIVE_SOURCES, + PROP_INTERNAL_SESSION, PROP_LAST }; @@ -655,6 +656,11 @@ gst_rtp_session_class_init (GstRtpSessionClass * klass) "The number of active sources in the session", 0, G_MAXUINT, DEFAULT_NUM_ACTIVE_SOURCES, G_PARAM_READABLE)); + g_object_class_install_property (gobject_class, PROP_INTERNAL_SESSION, + g_param_spec_object ("internal-session", "Internal Session", + "The internal RTPSession object", RTP_TYPE_SESSION, + G_PARAM_READABLE)); + gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_rtp_session_change_state); gstelement_class->request_new_pad = @@ -845,6 +851,9 @@ gst_rtp_session_get_property (GObject * object, guint prop_id, g_value_set_uint (value, rtp_session_get_num_active_sources (priv->session)); break; + case PROP_INTERNAL_SESSION: + g_value_set_object (value, priv->session); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1982,9 +1991,3 @@ wrong_pad: return; } } - -void -gst_rtp_session_set_ssrc (GstRtpSession * sess, guint32 ssrc) -{ - rtp_session_set_internal_ssrc (sess->priv->session, ssrc); -} diff --git a/gst/rtpmanager/rtpsession.c b/gst/rtpmanager/rtpsession.c index 8e543b3147..bf0a0aab9c 100644 --- a/gst/rtpmanager/rtpsession.c +++ b/gst/rtpmanager/rtpsession.c @@ -23,7 +23,7 @@ #include #include - +#include "gstrtpbin-marshal.h" #include "rtpsession.h" GST_DEBUG_CATEGORY_STATIC (rtp_session_debug); @@ -32,6 +32,7 @@ GST_DEBUG_CATEGORY_STATIC (rtp_session_debug); /* signals and args */ enum { + SIGNAL_GET_SOURCE_BY_SSRC, SIGNAL_ON_NEW_SSRC, SIGNAL_ON_SSRC_COLLISION, SIGNAL_ON_SSRC_VALIDATED, @@ -117,6 +118,19 @@ rtp_session_class_init (RTPSessionClass * klass) gobject_class->set_property = rtp_session_set_property; gobject_class->get_property = rtp_session_get_property; + /** + * RTPSession::get-source-by-ssrc: + * @session: the object which received the signal + * @ssrc: the SSRC of the RTPSource + * + * Request the #RTPSource object with SSRC @ssrc in @session. + */ + rtp_session_signals[SIGNAL_GET_SOURCE_BY_SSRC] = + g_signal_new ("get-source-by-ssrc", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (RTPSessionClass, + get_source_by_ssrc), NULL, NULL, gst_rtp_bin_marshal_OBJECT__UINT, + RTP_TYPE_SOURCE, 1, G_TYPE_UINT); + /** * RTPSession::on-new-ssrc: * @session: the object which received the signal @@ -286,6 +300,9 @@ rtp_session_class_init (RTPSessionClass * klass) "The number of active sources in the session", 0, G_MAXUINT, DEFAULT_NUM_ACTIVE_SOURCES, G_PARAM_READABLE)); + klass->get_source_by_ssrc = + GST_DEBUG_FUNCPTR (rtp_session_get_source_by_ssrc); + GST_DEBUG_CATEGORY_INIT (rtp_session_debug, "rtpsession", 0, "RTP Session"); } @@ -947,7 +964,7 @@ static gboolean check_collision (RTPSession * sess, RTPSource * source, RTPArrivalStats * arrival, gboolean rtp) { - /* If we have not arrival address, we can't do collision checking */ + /* If we have no arrival address, we can't do collision checking */ if (!arrival->have_address) return FALSE; diff --git a/gst/rtpmanager/rtpsession.h b/gst/rtpmanager/rtpsession.h index dd3fbc1354..8231119389 100644 --- a/gst/rtpmanager/rtpsession.h +++ b/gst/rtpmanager/rtpsession.h @@ -149,7 +149,6 @@ typedef struct { * This structure is used to account for addresses that have conflicted to find * loops. */ - typedef struct { GstNetAddress address; GstClockTime time; @@ -219,6 +218,9 @@ struct _RTPSession { struct _RTPSessionClass { GObjectClass parent_class; + /* action signals */ + RTPSource* (*get_source_by_ssrc) (RTPSession *sess, guint32 ssrc); + /* signals */ void (*on_new_ssrc) (RTPSession *sess, RTPSource *source); void (*on_ssrc_collision) (RTPSession *sess, RTPSource *source); @@ -279,17 +281,22 @@ RTPSource* rtp_session_get_source_by_cname (RTPSession *sess, const gcha RTPSource* rtp_session_create_source (RTPSession *sess); /* processing packets from receivers */ -GstFlowReturn rtp_session_process_rtp (RTPSession *sess, GstBuffer *buffer, GstClockTime current_time, guint64 ntpnstime); -GstFlowReturn rtp_session_process_rtcp (RTPSession *sess, GstBuffer *buffer, GstClockTime current_time); +GstFlowReturn rtp_session_process_rtp (RTPSession *sess, GstBuffer *buffer, + GstClockTime current_time, guint64 ntpnstime); +GstFlowReturn rtp_session_process_rtcp (RTPSession *sess, GstBuffer *buffer, + GstClockTime current_time); /* processing packets for sending */ -GstFlowReturn rtp_session_send_rtp (RTPSession *sess, GstBuffer *buffer, GstClockTime current_time, guint64 ntpnstime); +GstFlowReturn rtp_session_send_rtp (RTPSession *sess, GstBuffer *buffer, + GstClockTime current_time, guint64 ntpnstime); /* stopping the session */ -GstFlowReturn rtp_session_send_bye (RTPSession *sess, const gchar *reason, GstClockTime current_time); +GstFlowReturn rtp_session_send_bye (RTPSession *sess, const gchar *reason, + GstClockTime current_time); /* get interval for next RTCP interval */ GstClockTime rtp_session_next_timeout (RTPSession *sess, GstClockTime current_time); -GstFlowReturn rtp_session_on_timeout (RTPSession *sess, GstClockTime current_time, guint64 ntpnstime); +GstFlowReturn rtp_session_on_timeout (RTPSession *sess, GstClockTime current_time, + guint64 ntpnstime); #endif /* __RTP_SESSION_H__ */