c9a2114fad06e6308e7013f5f825820c6f986065
[platform/upstream/gst-plugins-good.git] / gst / rtpmanager / rtpsession.h
1 /* GStreamer
2  * Copyright (C) <2007> Wim Taymans <wim@fluendo.com>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19
20 #ifndef __RTP_SESSION_H__
21 #define __RTP_SESSION_H__
22
23 #include <gst/gst.h>
24 #include <gst/netbuffer/gstnetbuffer.h>
25
26 #include "rtpsource.h"
27
28 typedef struct _RTPSession RTPSession;
29 typedef struct _RTPSessionClass RTPSessionClass;
30
31 #define RTP_TYPE_SESSION             (rtp_session_get_type())
32 #define RTP_SESSION(sess)            (G_TYPE_CHECK_INSTANCE_CAST((sess),RTP_TYPE_SESSION,RTPSession))
33 #define RTP_SESSION_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass),RTP_TYPE_SESSION,RTPSessionClass))
34 #define RTP_IS_SESSION(sess)         (G_TYPE_CHECK_INSTANCE_TYPE((sess),RTP_TYPE_SESSION))
35 #define RTP_IS_SESSION_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE((klass),RTP_TYPE_SESSION))
36 #define RTP_SESSION_CAST(sess)       ((RTPSession *)(sess))
37
38 #define RTP_SESSION_LOCK(sess)     (g_mutex_lock ((sess)->lock))
39 #define RTP_SESSION_UNLOCK(sess)   (g_mutex_unlock ((sess)->lock))
40
41 /**
42  * RTPSessionProcessRTP:
43  * @sess: an #RTPSession
44  * @src: the #RTPSource
45  * @buffer: the RTP buffer ready for processing
46  * @user_data: user data specified when registering
47  *
48  * This callback will be called when @sess has @buffer ready for further
49  * processing. Processing the buffer typically includes decoding and displaying
50  * the buffer.
51  *
52  * Returns: a #GstFlowReturn.
53  */
54 typedef GstFlowReturn (*RTPSessionProcessRTP) (RTPSession *sess, RTPSource *src, GstBuffer *buffer, gpointer user_data);
55
56 /**
57  * RTPSessionSendRTP:
58  * @sess: an #RTPSession
59  * @src: the #RTPSource
60  * @buffer: the RTP buffer ready for sending
61  * @user_data: user data specified when registering
62  *
63  * This callback will be called when @sess has @buffer ready for sending to
64  * all listening participants in this session.
65  *
66  * Returns: a #GstFlowReturn.
67  */
68 typedef GstFlowReturn (*RTPSessionSendRTP) (RTPSession *sess, RTPSource *src, GstBuffer *buffer, gpointer user_data);
69
70 /**
71  * RTPSessionSendRTCP:
72  * @sess: an #RTPSession
73  * @src: the #RTPSource
74  * @buffer: the RTCP buffer ready for sending
75  * @user_data: user data specified when registering
76  *
77  * This callback will be called when @sess has @buffer ready for sending to
78  * all listening participants in this session.
79  *
80  * Returns: a #GstFlowReturn.
81  */
82 typedef GstFlowReturn (*RTPSessionSendRTCP) (RTPSession *sess, RTPSource *src, GstBuffer *buffer, gpointer user_data);
83
84 /**
85  * RTPSessionClockRate:
86  * @sess: an #RTPSession
87  * @payload: the payload
88  * @user_data: user data specified when registering
89  *
90  * This callback will be called when @sess needs the clock-rate of @payload.
91  *
92  * Returns: the clock-rate of @pt.
93  */
94 typedef gint (*RTPSessionClockRate) (RTPSession *sess, guint8 payload, gpointer user_data);
95
96 /**
97  * RTPSessionGetTime:
98  * @sess: an #RTPSession
99  * @user_data: user data specified when registering
100  *
101  * This callback will be called when @sess needs the current time in
102  * nanoseconds.
103  *
104  * Returns: a #GstClockTime with the current time in nanoseconds.
105  */
106 typedef GstClockTime (*RTPSessionGetTime) (RTPSession *sess, gpointer user_data);
107
108 /**
109  * RTPSessionReconsider:
110  * @sess: an #RTPSession
111  * @user_data: user data specified when registering
112  *
113  * This callback will be called when @sess needs to cancel the previous timeout. 
114  * The currently running timeout should be canceled and a new reporting interval
115  * should be requested from @sess.
116  */
117 typedef void (*RTPSessionReconsider) (RTPSession *sess, gpointer user_data);
118
119 /**
120  * RTPSessionCallbacks:
121  * @RTPSessionProcessRTP: callback to process RTP packets
122  * @RTPSessionSendRTP: callback for sending RTP packets
123  * @RTPSessionSendRTCP: callback for sending RTCP packets
124  * @RTPSessionGetTime: callback for returning the current time
125  *
126  * These callbacks can be installed on the session manager to get notification
127  * when RTP and RTCP packets are ready for further processing. These callbacks
128  * are not implemented with signals for performance reasons.
129  */
130 typedef struct {
131   RTPSessionProcessRTP  process_rtp;
132   RTPSessionSendRTP     send_rtp;
133   RTPSessionSendRTCP    send_rtcp;
134   RTPSessionClockRate   clock_rate;
135   RTPSessionGetTime     get_time;
136   RTPSessionReconsider  reconsider;
137 } RTPSessionCallbacks;
138
139 /**
140  * RTPSession:
141  * @lock: lock to protect the session
142  * @source: the source of this session
143  * @ssrcs: Hashtable of sources indexed by SSRC
144  * @cnames: Hashtable of sources indexed by CNAME
145  * @num_sources: the number of sources
146  * @activecount: the number of active sources
147  * @callbacks: callbacks
148  * @user_data: user data passed in callbacks
149  *
150  * The RTP session manager object
151  */
152 struct _RTPSession {
153   GObject       object;
154
155   GMutex       *lock;
156
157   guint         header_len;
158   guint         mtu;
159
160   RTPSource    *source;
161
162   /* info for creating reports */
163   gchar        *cname;
164   gchar        *name;
165   gchar        *email;
166   gchar        *phone;
167   gchar        *location;
168   gchar        *tool;
169   gchar        *note;
170
171   /* for sender/receiver counting */
172   guint32       key;
173   guint32       mask_idx;
174   guint32       mask;
175   GHashTable   *ssrcs[32];
176   GHashTable   *cnames;
177   guint         total_sources;
178
179   GstClockTime  next_rtcp_check_time;
180   GstClockTime  last_rtcp_send_time;
181   gboolean      first_rtcp;
182
183   GstBuffer    *bye_packet;
184   gchar        *bye_reason;
185   gboolean      sent_bye;
186
187   RTPSessionCallbacks callbacks;
188   gpointer            user_data;
189
190   RTPSessionStats stats;
191 };
192
193 /**
194  * RTPSessionClass:
195  * @on_new_ssrc: emited when a new source is found
196  * @on_bye_ssrc: emited when a source is gone
197  *
198  * The session class.
199  */
200 struct _RTPSessionClass {
201   GObjectClass   parent_class;
202
203   /* signals */
204   void (*on_new_ssrc)       (RTPSession *sess, RTPSource *source);
205   void (*on_ssrc_collision) (RTPSession *sess, RTPSource *source);
206   void (*on_ssrc_validated) (RTPSession *sess, RTPSource *source);
207   void (*on_bye_ssrc)       (RTPSession *sess, RTPSource *source);
208   void (*on_bye_timeout)    (RTPSession *sess, RTPSource *source);
209   void (*on_timeout)        (RTPSession *sess, RTPSource *source);
210 };
211
212 GType rtp_session_get_type (void);
213
214 /* create and configure */
215 RTPSession*     rtp_session_new           (void);
216 void            rtp_session_set_callbacks          (RTPSession *sess, 
217                                                     RTPSessionCallbacks *callbacks,
218                                                     gpointer user_data);
219 void            rtp_session_set_bandwidth          (RTPSession *sess, gdouble bandwidth);
220 gdouble         rtp_session_get_bandwidth          (RTPSession *sess);
221 void            rtp_session_set_rtcp_fraction      (RTPSession *sess, gdouble fraction);
222 gdouble         rtp_session_get_rtcp_fraction      (RTPSession *sess);
223
224 void            rtp_session_set_cname              (RTPSession *sess, const gchar *cname);
225 gchar*          rtp_session_get_cname              (RTPSession *sess);
226 void            rtp_session_set_name               (RTPSession *sess, const gchar *name);
227 gchar*          rtp_session_get_name               (RTPSession *sess);
228 void            rtp_session_set_email              (RTPSession *sess, const gchar *email);
229 gchar*          rtp_session_get_email              (RTPSession *sess);
230 void            rtp_session_set_phone              (RTPSession *sess, const gchar *phone);
231 gchar*          rtp_session_get_phone              (RTPSession *sess);
232 void            rtp_session_set_location           (RTPSession *sess, const gchar *location);
233 gchar*          rtp_session_get_location           (RTPSession *sess);
234 void            rtp_session_set_tool               (RTPSession *sess, const gchar *tool);
235 gchar*          rtp_session_get_tool               (RTPSession *sess);
236 void            rtp_session_set_note               (RTPSession *sess, const gchar *note);
237 gchar*          rtp_session_get_note               (RTPSession *sess);
238
239 /* handling sources */
240 gboolean        rtp_session_add_source             (RTPSession *sess, RTPSource *src);
241 guint           rtp_session_get_num_sources        (RTPSession *sess);
242 guint           rtp_session_get_num_active_sources (RTPSession *sess);
243 RTPSource*      rtp_session_get_source_by_ssrc     (RTPSession *sess, guint32 ssrc);
244 RTPSource*      rtp_session_get_source_by_cname    (RTPSession *sess, const gchar *cname);
245 RTPSource*      rtp_session_create_source          (RTPSession *sess);
246
247 /* processing packets from receivers */
248 GstFlowReturn   rtp_session_process_rtp            (RTPSession *sess, GstBuffer *buffer);
249 GstFlowReturn   rtp_session_process_rtcp           (RTPSession *sess, GstBuffer *buffer);
250
251 /* processing packets for sending */
252 GstFlowReturn   rtp_session_send_rtp               (RTPSession *sess, GstBuffer *buffer);
253
254 /* stopping the session */
255 GstFlowReturn   rtp_session_send_bye               (RTPSession *sess, const gchar *reason);
256
257 /* get interval for next RTCP interval */
258 GstClockTime    rtp_session_next_timeout          (RTPSession *sess, GstClockTime time);
259 GstFlowReturn   rtp_session_on_timeout            (RTPSession *sess, GstClockTime time);
260
261 #endif /* __RTP_SESSION_H__ */