rtpsession: Add action signal to request early RTCP
authorOlivier CrĂȘte <olivier.crete@collabora.co.uk>
Fri, 27 Aug 2010 18:11:53 +0000 (14:11 -0400)
committerWim Taymans <wim.taymans@collabora.co.uk>
Tue, 1 Feb 2011 17:28:51 +0000 (18:28 +0100)
gst/rtpmanager/gstrtpbin-marshal.list
gst/rtpmanager/rtpsession.c
gst/rtpmanager/rtpsession.h

index 5176b33..7d9821f 100644 (file)
@@ -9,3 +9,4 @@ VOID:OBJECT,OBJECT
 UINT64:BOOL,UINT64
 BOOL:POINTER,BOOL
 VOID:UINT,UINT,UINT,UINT,POINTER
+VOID:UINT64
index a60e7c0..49ce69b 100644 (file)
@@ -44,6 +44,7 @@ enum
   SIGNAL_ON_SENDER_TIMEOUT,
   SIGNAL_ON_SENDING_RTCP,
   SIGNAL_ON_FEEDBACK_RTCP,
+  SIGNAL_SEND_RTCP,
   LAST_SIGNAL
 };
 
@@ -104,6 +105,8 @@ static void rtp_session_get_property (GObject * object, guint prop_id,
 
 static gboolean rtp_session_on_sending_rtcp (RTPSession * sess,
     GstBuffer * buffer, gboolean early);
+static void rtp_session_send_rtcp (RTPSession * sess,
+    GstClockTimeDiff max_delay);
 
 
 static guint rtp_session_signals[LAST_SIGNAL] = { 0 };
@@ -299,6 +302,22 @@ rtp_session_class_init (RTPSessionClass * klass)
       G_TYPE_NONE, 4, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT,
       G_TYPE_POINTER);
 
+  /**
+   * RTPSession::send-rtcp:
+   * @session: the object which received the signal
+   * @max_delay: The maximum delay after which the feedback will not be useful
+   *  anymore
+   *
+   * Requests that the #RTPSession initiate a new RTCP packet as soon as
+   * possible within the requested delay.
+   */
+
+  rtp_session_signals[SIGNAL_SEND_RTCP] =
+      g_signal_new ("send-rtcp", G_TYPE_FROM_CLASS (klass),
+      G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+      G_STRUCT_OFFSET (RTPSessionClass, send_rtcp), NULL, NULL,
+      gst_rtp_bin_marshal_VOID__UINT64, G_TYPE_NONE, 1, G_TYPE_UINT64);
+
   g_object_class_install_property (gobject_class, PROP_INTERNAL_SSRC,
       g_param_spec_uint ("internal-ssrc", "Internal SSRC",
           "The internal SSRC used for the session",
@@ -408,6 +427,7 @@ rtp_session_class_init (RTPSessionClass * klass)
   klass->get_source_by_ssrc =
       GST_DEBUG_FUNCPTR (rtp_session_get_source_by_ssrc);
   klass->on_sending_rtcp = GST_DEBUG_FUNCPTR (rtp_session_on_sending_rtcp);
+  klass->send_rtcp = GST_DEBUG_FUNCPTR (rtp_session_send_rtcp);
 
   GST_DEBUG_CATEGORY_INIT (rtp_session_debug, "rtpsession", 0, "RTP Session");
 }
@@ -3134,3 +3154,16 @@ rtp_session_on_sending_rtcp (RTPSession * sess, GstBuffer * buffer,
 
   return ret;
 }
+
+static void
+rtp_session_send_rtcp (RTPSession * sess, GstClockTimeDiff max_delay)
+{
+  GstClockTime now;
+
+  if (!sess->callbacks.send_rtcp)
+    return;
+
+  now = sess->callbacks.request_time (sess, sess->request_time_user_data);
+
+  rtp_session_request_early_rtcp (sess, now, max_delay);
+}
index 3746a9b..3268490 100644 (file)
@@ -264,6 +264,7 @@ struct _RTPSessionClass {
       gboolean early);
   void (*on_feedback_rtcp)  (RTPSession *sess, guint type, guint fbtype,
       guint sender_ssrc, guint media_ssrc, GstBuffer *fci);
+  void (*send_rtcp)         (RTPSession *sess, GstClockTimeDiff max_delay);
 };
 
 GType rtp_session_get_type (void);