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
|
/*
* rtcp.h: RFC1889: RTCP
*
* See the main source file 'xineliboutput.c' for copyright information and
* how to reach the author.
*
* $Id: rtcp.h,v 1.1 2006-12-14 12:01:54 phintuka Exp $
*
*/
#ifndef XINELIBOUTPUT_RTCP_H_
#define XINELIBOUTPUT_RTCP_H_
#include <endian.h>
#ifndef PACKED
# define PACKED __attribute__((packed))
#endif
#if __BYTE_ORDER == __BIG_ENDIAN
#elif __BYTE_ORDER == __LITTLE_ENDIAN
#else
# error __BYTE_ORDER not defined
#endif
#if defined __cplusplus
extern "C" {
#endif
/* RTCP packet types */
typedef enum {
RTCP_SR = 200,
RTCP_RR = 201,
RTCP_SDES = 202,
RTCP_BYE = 203,
RTCP_APP = 204
} rtcp_type_t;
/* RTCP SDES types */
typedef enum {
RTCP_SDES_END = 0,
RTCP_SDES_CNAME = 1,
RTCP_SDES_NAME = 2,
RTCP_SDES_EMAIL = 3,
RTCP_SDES_PHONE = 4,
RTCP_SDES_LOC = 5,
RTCP_SDES_TOOL = 6,
RTCP_SDES_NOTE = 7,
RTCP_SDES_PRIV = 8
} rtcp_sdes_type_t;
/* RTCP common header word */
typedef struct {
union {
uint8_t raw[4];
struct {
#if __BYTE_ORDER == __BIG_ENDIAN
unsigned int version:2; /* protocol version */
unsigned int padding:1; /* padding flag */
unsigned int count:5; /* varies by packet type */
#else
unsigned int count:5; /* varies by packet type */
unsigned int padding:1; /* padding flag */
unsigned int version:2; /* protocol version */
#endif
unsigned int ptype:8; /* RTCP packet type */
uint16_t length; /* pkt len in words, w/o this word */
} PACKED;
} PACKED;
} PACKED rtcp_common_t;
/* RTCP RR (Reception report) */
typedef struct {
uint32_t ssrc; /* data source being reported */
unsigned int fraction:8; /* fraction lost since last SR/RR */
int lost:24; /* cumul. no. pkts lost (signed!) */
uint32_t last_seq; /* extended last seq. no. received */
uint32_t jitter; /* interarrival jitter */
uint32_t lsr; /* last SR packet from this source */
uint32_t dlsr; /* delay since last SR packet */
} PACKED rtcp_rr_t;
/* RTCP SR (Sender report) */
typedef struct {
uint32_t ssrc;
uint32_t ntp_sec; /* NTP timestamp, most significant word / seconds */
uint32_t ntp_frac;
uint32_t rtp_ts;
uint32_t psent; /* packets sent */
uint32_t osent; /* octets sent */
rtcp_rr_t rr[0]; /* variable-length list */
} PACKED rtcp_sr_t;
/* RTCP SDES item */
typedef struct {
uint8_t type; /* type of item (rtcp_sdes_type_t) */
uint8_t length; /* length of item (in octets) */
char data[0]; /* text, not null-terminated */
} PACKED rtcp_sdes_item_t;
/* RTCP packet */
typedef struct {
rtcp_common_t hdr;
union {
rtcp_sr_t sr;
struct {
uint32_t ssrc;
rtcp_rr_t rr[0];
} PACKED rr;
struct {
uint32_t ssrc; /* first SSRC/CSRC */
rtcp_sdes_item_t item[0]; /* list of SDES items */
} PACKED sdes;
struct {
uint32_t src[0]; /* list of sources */
/* can't express trailing text for reason */
} PACKED bye;
} PACKED;
} PACKED rtcp_packet_t;
#if defined __cplusplus
};
#endif
#endif /* XINELIBOUTPUT_RTCP_H_ */
|