tizen 2.0 init
[framework/multimedia/gst-plugins-good0.10.git] / gst / rtpmanager / rtpsource.h
1 /* GStreamer
2  * Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.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_SOURCE_H__
21 #define __RTP_SOURCE_H__
22
23 #include <gst/gst.h>
24 #include <gst/rtp/gstrtcpbuffer.h>
25 #include <gst/netbuffer/gstnetbuffer.h>
26
27 #include "rtpstats.h"
28
29 /* the default number of consecutive RTP packets we need to receive before the
30  * source is considered valid */
31 #define RTP_NO_PROBATION        0
32 #define RTP_DEFAULT_PROBATION   2
33
34 #define RTP_SEQ_MOD          (1 << 16)
35
36 typedef struct _RTPSource RTPSource;
37 typedef struct _RTPSourceClass RTPSourceClass;
38
39 #define RTP_TYPE_SOURCE             (rtp_source_get_type())
40 #define RTP_SOURCE(src)             (G_TYPE_CHECK_INSTANCE_CAST((src),RTP_TYPE_SOURCE,RTPSource))
41 #define RTP_SOURCE_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass),RTP_TYPE_SOURCE,RTPSourceClass))
42 #define RTP_IS_SOURCE(src)          (G_TYPE_CHECK_INSTANCE_TYPE((src),RTP_TYPE_SOURCE))
43 #define RTP_IS_SOURCE_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE((klass),RTP_TYPE_SOURCE))
44 #define RTP_SOURCE_CAST(src)        ((RTPSource *)(src))
45
46 /**
47  * RTP_SOURCE_IS_ACTIVE:
48  * @src: an #RTPSource
49  *
50  * Check if @src is active. A source is active when it has been validated
51  * and has not yet received a BYE packet.
52  */
53 #define RTP_SOURCE_IS_ACTIVE(src)  (src->validated && !src->received_bye)
54
55 /**
56  * RTP_SOURCE_IS_SENDER:
57  * @src: an #RTPSource
58  *
59  * Check if @src is a sender.
60  */
61 #define RTP_SOURCE_IS_SENDER(src)  (src->is_sender)
62
63 /**
64  * RTPSourcePushRTP:
65  * @src: an #RTPSource
66  * @buffer: the RTP buffer ready for processing
67  * @user_data: user data specified when registering
68  *
69  * This callback will be called when @src has @buffer ready for further
70  * processing.
71  *
72  * Returns: a #GstFlowReturn.
73  */
74 typedef GstFlowReturn (*RTPSourcePushRTP) (RTPSource *src, GstBuffer *buffer, 
75         gpointer user_data);
76
77 /**
78  * RTPSourceClockRate:
79  * @src: an #RTPSource
80  * @payload: a payload type
81  * @user_data: user data specified when registering
82  *
83  * This callback will be called when @src needs the clock-rate of the
84  * @payload.
85  *
86  * Returns: a clock-rate for @payload.
87  */
88 typedef gint (*RTPSourceClockRate) (RTPSource *src, guint8 payload, gpointer user_data);
89
90 /**
91  * RTPSourceCallbacks:
92  * @push_rtp: a packet becomes available for handling
93  * @clock_rate: a clock-rate is requested
94  * @get_time: the current clock time is requested
95  *
96  * Callbacks performed by #RTPSource when actions need to be performed.
97  */
98 typedef struct {
99   RTPSourcePushRTP     push_rtp;
100   RTPSourceClockRate   clock_rate;
101 } RTPSourceCallbacks;
102
103 /**
104  * RTPConflictingAddress:
105  * @address: #GstNetAddress which conflicted
106  * @last_conflict_time: time when the last conflict was seen
107  *
108  * This structure is used to account for addresses that have conflicted to find
109  * loops.
110  */
111 typedef struct {
112   GstNetAddress address;
113   GstClockTime time;
114 } RTPConflictingAddress;
115
116 /**
117  * RTPSource:
118  *
119  * A source in the #RTPSession
120  *
121  * @conflicting_addresses: GList of conflicting addresses
122  */
123 struct _RTPSource {
124   GObject       object;
125
126   /*< private >*/
127   guint32       ssrc;
128
129   gint          probation;
130   gboolean      validated;
131   gboolean      internal;
132   gboolean      is_csrc;
133   gboolean      is_sender;
134   gboolean      closing;
135
136   GstStructure  *sdes;
137
138   gboolean      received_bye;
139   gchar        *bye_reason;
140
141   gboolean      have_rtp_from;
142   GstNetAddress rtp_from;
143   gboolean      have_rtcp_from;
144   GstNetAddress rtcp_from;
145
146   gint          payload;
147   GstCaps      *caps;
148   gint          clock_rate;
149   gint32        seqnum_base;
150
151   GstClockTime  bye_time;
152   GstClockTime  last_activity;
153   GstClockTime  last_rtp_activity;
154
155   GstClockTime  last_rtime;
156   GstClockTime  last_rtptime;
157
158   /* for bitrate estimation */
159   guint64       bitrate;
160   GstClockTime  prev_rtime;
161   guint64       bytes_sent;
162   guint64       bytes_received;
163
164   GQueue       *packets;
165
166   RTPSourceCallbacks callbacks;
167   gpointer           user_data;
168
169   RTPSourceStats stats;
170   RTPReceiverReport last_rr;
171
172   GList         *conflicting_addresses;
173
174   GQueue        *retained_feedback;
175
176   gboolean     send_pli;
177   gboolean     send_fir;
178   guint8       current_send_fir_seqnum;
179   gint         last_fir_count;
180 };
181
182 struct _RTPSourceClass {
183   GObjectClass   parent_class;
184 };
185
186 GType rtp_source_get_type (void);
187
188 /* managing lifetime of sources */
189 RTPSource*      rtp_source_new                 (guint32 ssrc);
190 void            rtp_source_set_callbacks       (RTPSource *src, RTPSourceCallbacks *cb, gpointer data);
191
192 /* properties */
193 guint32         rtp_source_get_ssrc            (RTPSource *src);
194
195 void            rtp_source_set_as_csrc         (RTPSource *src);
196 gboolean        rtp_source_is_as_csrc          (RTPSource *src);
197
198 gboolean        rtp_source_is_active           (RTPSource *src);
199 gboolean        rtp_source_is_validated        (RTPSource *src);
200 gboolean        rtp_source_is_sender           (RTPSource *src);
201
202 gboolean        rtp_source_received_bye        (RTPSource *src);
203 gchar *         rtp_source_get_bye_reason      (RTPSource *src);
204
205 void            rtp_source_update_caps         (RTPSource *src, GstCaps *caps);
206
207 /* SDES info */
208 gboolean        rtp_source_set_sdes_string     (RTPSource *src, GstRTCPSDESType type,
209                                                 const gchar *data);
210 gchar*          rtp_source_get_sdes_string     (RTPSource *src, GstRTCPSDESType type);
211 const GstStructure *
212                 rtp_source_get_sdes_struct     (RTPSource * src);
213 gboolean        rtp_source_set_sdes_struct     (RTPSource * src, GstStructure *sdes);
214
215 /* handling network address */
216 void            rtp_source_set_rtp_from        (RTPSource *src, GstNetAddress *address);
217 void            rtp_source_set_rtcp_from       (RTPSource *src, GstNetAddress *address);
218
219 /* handling RTP */
220 GstFlowReturn   rtp_source_process_rtp         (RTPSource *src, GstBuffer *buffer, RTPArrivalStats *arrival);
221
222 GstFlowReturn   rtp_source_send_rtp            (RTPSource *src, gpointer data, gboolean is_list,
223                                                 GstClockTime running_time);
224 /* RTCP messages */
225 void            rtp_source_process_bye         (RTPSource *src, const gchar *reason);
226 void            rtp_source_process_sr          (RTPSource *src, GstClockTime time, guint64 ntptime,
227                                                 guint32 rtptime, guint32 packet_count, guint32 octet_count);
228 void            rtp_source_process_rb          (RTPSource *src, guint64 ntpnstime, guint8 fractionlost,
229                                                 gint32 packetslost, guint32 exthighestseq, guint32 jitter,
230                                                 guint32 lsr, guint32 dlsr);
231
232 gboolean        rtp_source_get_new_sr          (RTPSource *src, guint64 ntpnstime, GstClockTime running_time,
233                                                 guint64 *ntptime, guint32 *rtptime, guint32 *packet_count,
234                                                 guint32 *octet_count);
235 gboolean        rtp_source_get_new_rb          (RTPSource *src, GstClockTime time, guint8 *fractionlost,
236                                                 gint32 *packetslost, guint32 *exthighestseq, guint32 *jitter,
237                                                 guint32 *lsr, guint32 *dlsr);
238
239 gboolean        rtp_source_get_last_sr         (RTPSource *src, GstClockTime *time, guint64 *ntptime,
240                                                 guint32 *rtptime, guint32 *packet_count,
241                                                 guint32 *octet_count);
242 gboolean        rtp_source_get_last_rb         (RTPSource *src, guint8 *fractionlost, gint32 *packetslost,
243                                                 guint32 *exthighestseq, guint32 *jitter,
244                                                 guint32 *lsr, guint32 *dlsr, guint32 *round_trip);
245
246 void            rtp_source_reset               (RTPSource * src);
247
248 gboolean        rtp_source_find_conflicting_address (RTPSource * src,
249                                                 GstNetAddress *address,
250                                                 GstClockTime time);
251
252 void            rtp_source_add_conflicting_address (RTPSource * src,
253                                                 GstNetAddress *address,
254                                                 GstClockTime time);
255
256 void            rtp_source_timeout             (RTPSource * src,
257                                                 GstClockTime current_time,
258                                                 GstClockTime collision_timeout,
259                                                 GstClockTime feedback_retention_window);
260
261 void            rtp_source_retain_rtcp_packet  (RTPSource * src,
262                                                 GstRTCPPacket *pkt,
263                                                 GstClockTime running_time);
264
265 gboolean        rtp_source_has_retained        (RTPSource * src,
266                                                 GCompareFunc func,
267                                                 gconstpointer data);
268
269
270 #endif /* __RTP_SOURCE_H__ */