gst/rtpmanager/gstrtpbin.*: Add signal to notify listeners when a sender becomes...
[platform/upstream/gst-plugins-good.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  * RTPSource:
105  *
106  * A source in the #RTPSession
107  */
108 struct _RTPSource {
109   GObject       object;
110
111   /*< private >*/
112   guint32       ssrc;
113
114   gint          probation;
115   gboolean      validated;
116   gboolean      is_csrc;
117   gboolean      is_sender;
118
119   guint8       *sdes[9];
120   guint         sdes_len[9];
121
122   gboolean      received_bye;
123   gchar        *bye_reason;
124
125   gboolean      have_rtp_from;
126   GstNetAddress rtp_from;
127   gboolean      have_rtcp_from;
128   GstNetAddress rtcp_from;
129
130   guint8        payload;
131   GstCaps      *caps;
132   gint          clock_rate;
133   gint32        seqnum_base;
134
135   GstClockTime  bye_time;
136   GstClockTime  last_activity;
137   GstClockTime  last_rtp_activity;
138
139   GstClockTime  last_rtptime;
140   GstClockTime  last_ntpnstime;
141
142   GQueue       *packets;
143
144   RTPSourceCallbacks callbacks;
145   gpointer           user_data;
146
147   RTPSourceStats stats;
148 };
149
150 struct _RTPSourceClass {
151   GObjectClass   parent_class;
152 };
153
154 GType rtp_source_get_type (void);
155
156 /* managing lifetime of sources */
157 RTPSource*      rtp_source_new                 (guint32 ssrc);
158 void            rtp_source_set_callbacks       (RTPSource *src, RTPSourceCallbacks *cb, gpointer data);
159
160 /* properties */
161 guint32         rtp_source_get_ssrc            (RTPSource *src);
162
163 void            rtp_source_set_as_csrc         (RTPSource *src);
164 gboolean        rtp_source_is_as_csrc          (RTPSource *src);
165
166 gboolean        rtp_source_is_active           (RTPSource *src);
167 gboolean        rtp_source_is_validated        (RTPSource *src);
168 gboolean        rtp_source_is_sender           (RTPSource *src);
169
170 gboolean        rtp_source_received_bye        (RTPSource *src);
171 gchar *         rtp_source_get_bye_reason      (RTPSource *src);
172
173 void            rtp_source_update_caps         (RTPSource *src, GstCaps *caps);
174
175 /* SDES info */
176 gboolean        rtp_source_set_sdes            (RTPSource *src, GstRTCPSDESType type, 
177                                                 const guint8 *data, guint len);
178 gboolean        rtp_source_set_sdes_string     (RTPSource *src, GstRTCPSDESType type,
179                                                 const gchar *data);
180 gboolean        rtp_source_get_sdes            (RTPSource *src, GstRTCPSDESType type,
181                                                 guint8 **data, guint *len);
182 gchar*          rtp_source_get_sdes_string     (RTPSource *src, GstRTCPSDESType type);
183
184 /* handling network address */
185 void            rtp_source_set_rtp_from        (RTPSource *src, GstNetAddress *address);
186 void            rtp_source_set_rtcp_from       (RTPSource *src, GstNetAddress *address);
187
188 /* handling RTP */
189 GstFlowReturn   rtp_source_process_rtp         (RTPSource *src, GstBuffer *buffer, RTPArrivalStats *arrival);
190
191 GstFlowReturn   rtp_source_send_rtp            (RTPSource *src, GstBuffer *buffer, guint64 ntpnstime);
192
193 /* RTCP messages */
194 void            rtp_source_process_bye         (RTPSource *src, const gchar *reason);
195 void            rtp_source_process_sr          (RTPSource *src, GstClockTime time, guint64 ntptime,
196                                                 guint32 rtptime, guint32 packet_count, guint32 octet_count);
197 void            rtp_source_process_rb          (RTPSource *src, GstClockTime time, guint8 fractionlost,
198                                                 gint32 packetslost, guint32 exthighestseq, guint32 jitter,
199                                                 guint32 lsr, guint32 dlsr);
200
201 gboolean        rtp_source_get_new_sr          (RTPSource *src, GstClockTime time, guint64 *ntptime,
202                                                 guint32 *rtptime, guint32 *packet_count,
203                                                 guint32 *octet_count);
204 gboolean        rtp_source_get_new_rb          (RTPSource *src, GstClockTime time, guint8 *fractionlost,
205                                                 gint32 *packetslost, guint32 *exthighestseq, guint32 *jitter,
206                                                 guint32 *lsr, guint32 *dlsr);
207
208 gboolean        rtp_source_get_last_sr         (RTPSource *src, GstClockTime *time, guint64 *ntptime,
209                                                 guint32 *rtptime, guint32 *packet_count,
210                                                 guint32 *octet_count);
211 gboolean        rtp_source_get_last_rb         (RTPSource *src, guint8 *fractionlost, gint32 *packetslost,
212                                                 guint32 *exthighestseq, guint32 *jitter,
213                                                 guint32 *lsr, guint32 *dlsr);
214
215 void            rtp_source_reset               (RTPSource * src);
216
217 #endif /* __RTP_SOURCE_H__ */