1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
|
/* $Id$ */
/*
* Copyright (C) 2003-2006 Benny Prijono <benny@prijono.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef __PJMEDIA_RTCP_H__
#define __PJMEDIA_RTCP_H__
/**
* @file rtcp.h
* @brief RTCP implementation.
*/
#include <pjmedia/types.h>
#include <pjmedia/rtp.h>
PJ_BEGIN_DECL
/**
* @defgroup PJMED_RTCP RTCP Management
* @ingroup PJMEDIA
* @{
*/
#pragma pack(1)
/**
* RTCP sender report.
*/
struct pjmedia_rtcp_sr
{
pj_uint32_t ssrc; /**< SSRC identification. */
pj_uint32_t ntp_sec; /**< NTP time, seconds part. */
pj_uint32_t ntp_frac; /**< NTP time, fractions part. */
pj_uint32_t rtp_ts; /**< RTP timestamp. */
pj_uint32_t sender_pcount; /**< Sender packet cound. */
pj_uint32_t sender_bcount; /**< Sender octet/bytes count. */
};
/**
* @see pjmedia_rtcp_sr
*/
typedef struct pjmedia_rtcp_sr pjmedia_rtcp_sr;
/**
* RTCP receiver report.
*/
struct pjmedia_rtcp_rr
{
pj_uint32_t ssrc; /**< SSRC identification. */
#if defined(PJ_IS_BIG_ENDIAN) && PJ_IS_BIG_ENDIAN!=0
pj_uint32_t fract_lost:8; /**< Fraction lost. */
pj_uint32_t total_lost_2:8; /**< Total lost, bit 16-23. */
pj_uint32_t total_lost_1:8; /**< Total lost, bit 8-15. */
pj_uint32_t total_lost_0:8; /**< Total lost, bit 0-7. */
#else
pj_uint32_t fract_lost:8; /**< Fraction lost. */
pj_uint32_t total_lost_0:8; /**< Total lost, bit 0-7. */
pj_uint32_t total_lost_1:8; /**< Total lost, bit 8-15. */
pj_uint32_t total_lost_2:8; /**< Total lost, bit 16-23. */
#endif
pj_uint32_t last_seq; /**< Last sequence number. */
pj_uint32_t jitter; /**< Jitter. */
pj_uint32_t lsr; /**< Last SR. */
pj_uint32_t dlsr; /**< Delay since last SR. */
};
/**
* @see pjmedia_rtcp_rr
*/
typedef struct pjmedia_rtcp_rr pjmedia_rtcp_rr;
/**
* RTCP common header.
*/
struct pjmedia_rtcp_common
{
#if defined(PJ_IS_BIG_ENDIAN) && PJ_IS_BIG_ENDIAN!=0
unsigned version:2; /**< packet type */
unsigned p:1; /**< padding flag */
unsigned count:5; /**< varies by payload type */
unsigned pt:8; /**< payload type */
#else
unsigned count:5; /**< varies by payload type */
unsigned p:1; /**< padding flag */
unsigned version:2; /**< packet type */
unsigned pt:8; /**< payload type */
#endif
unsigned length:16; /**< packet length */
};
/**
* @see pjmedia_rtcp_common
*/
typedef struct pjmedia_rtcp_common pjmedia_rtcp_common;
/**
* RTCP packet.
*/
struct pjmedia_rtcp_pkt
{
pjmedia_rtcp_common common; /**< Common header. */
pjmedia_rtcp_sr sr; /**< Sender report. */
pjmedia_rtcp_rr rr; /**< variable-length list */
};
/**
* @see pjmedia_rtcp_pkt
*/
typedef struct pjmedia_rtcp_pkt pjmedia_rtcp_pkt;
#pragma pack()
/**
* NTP time representation.
*/
struct pjmedia_rtcp_ntp_rec
{
pj_uint32_t hi; /**< High order 32-bit part. */
pj_uint32_t lo; /**< Lo order 32-bit part. */
};
/**
* @see pjmedia_rtcp_ntp_rec
*/
typedef struct pjmedia_rtcp_ntp_rec pjmedia_rtcp_ntp_rec;
/**
* RTCP session is used to monitor the RTP session of one endpoint. There
* should only be one RTCP session for a bidirectional RTP streams.
*/
struct pjmedia_rtcp_session
{
pjmedia_rtcp_pkt rtcp_pkt; /**< Cached RTCP packet. */
pjmedia_rtp_seq_session seq_ctrl; /**< RTCP sequence number control. */
unsigned clock_rate; /**< Clock rate of the stream */
pj_uint32_t received; /**< # pkt received */
pj_uint32_t exp_prior; /**< # pkt expected at last interval*/
pj_uint32_t rx_prior; /**< # pkt received at last interval*/
pj_int32_t transit; /**< Rel transit time for prev pkt */
pj_uint32_t jitter; /**< Scaled jitter */
pj_timestamp ts_freq; /**< System timestamp frequency. */
pjmedia_rtcp_ntp_rec rtcp_lsr; /**< NTP ts in last SR received */
pj_timestamp rtcp_lsr_time;/**< Time when last SR is received*/
pj_uint32_t peer_ssrc; /**< Peer SSRC */
unsigned rtt_us; /**< End-to-end delay, in usec. */
};
/**
* @see pjmedia_rtcp_session
*/
typedef struct pjmedia_rtcp_session pjmedia_rtcp_session;
/**
* Initialize RTCP session.
*
* @param session The session
* @param ssrc The SSRC used in to identify the session.
*/
PJ_DECL(void) pjmedia_rtcp_init( pjmedia_rtcp_session *session,
unsigned clock_rate,
pj_uint32_t ssrc );
/**
* Deinitialize RTCP session.
*
* @param session The session.
*/
PJ_DECL(void) pjmedia_rtcp_fini( pjmedia_rtcp_session *session);
/**
* Call this function everytime an RTP packet is received to let the RTCP
* session do its internal calculations.
*
* @param session The session.
* @param seq The RTP packet sequence number, in host byte order.
* @param ts The RTP packet timestamp, in host byte order.
*/
PJ_DECL(void) pjmedia_rtcp_rx_rtp( pjmedia_rtcp_session *session,
pj_uint16_t seq,
pj_uint32_t ts );
/**
* Call this function everytime an RTP packet is sent to let the RTCP session
* do its internal calculations.
*
* @param session The session.
* @param ptsize The payload size of the RTP packet (ie packet minus
* RTP header) in bytes.
*/
PJ_DECL(void) pjmedia_rtcp_tx_rtp( pjmedia_rtcp_session *session,
pj_uint16_t ptsize );
/**
* Call this function when an RTCP packet is received from remote peer.
* This RTCP packet received from remote is used to calculate the end-to-
* end delay of the network.
*
* @param session RTCP session.
* @param rtcp_pkt The received RTCP packet.
* @param size Size of the incoming packet.
*/
PJ_DECL(void) pjmedia_rtcp_rx_rtcp( pjmedia_rtcp_session *session,
const void *rtcp_pkt,
pj_size_t size);
/**
* Build a RTCP SR+RR packet to be transmitted to remote RTP peer.
* Note that this function will reset the interval counters (such as
* the ones to calculate fraction lost) in the session.
*
* @param session The RTCP session.
* @param rtcp_pkt Upon return, it will contain pointer to the
* RTCP packet.
* @param len Upon return, it will indicate the size of
* the RTCP packet.
*/
PJ_DECL(void) pjmedia_rtcp_build_rtcp( pjmedia_rtcp_session *session,
pjmedia_rtcp_pkt **rtcp_pkt,
int *len);
/**
* @}
*/
PJ_END_DECL
#endif /* __PJMEDIA_RTCP_H__ */
|