38
37
buffer to 'rtp_write_packet' contains all the packets for ONE
39
38
frame. Each packet should have a four byte header containing
40
39
the length in big endian format (same trick as
41
'url_open_dyn_packet_buf')
40
'url_open_dyn_packet_buf')
46
#define RTP_MAX_SDES 256 /* maximum text length for SDES */
48
/* RTCP paquets use 0.5 % of the bandwidth */
49
#define RTCP_TX_RATIO_NUM 5
50
#define RTCP_TX_RATIO_DEN 1000
80
RTP_PT_S16BE_STEREO = 10,
81
RTP_PT_S16BE_MONO = 11,
82
RTP_PT_MPEGAUDIO = 14,
85
RTP_PT_MPEGVIDEO = 32,
87
RTP_PT_H263 = 34, /* old H263 encapsulation */
43
/* from http://www.iana.org/assignments/rtp-parameters last updated 05 January 2005 */
44
AVRtpPayloadType_t AVRtpPayloadTypes[]=
46
{0, "PCMU", CODEC_TYPE_AUDIO, CODEC_ID_PCM_MULAW, 8000, 1},
47
{1, "Reserved", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
48
{2, "Reserved", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
49
{3, "GSM", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
50
{4, "G723", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
51
{5, "DVI4", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
52
{6, "DVI4", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 16000, 1},
53
{7, "LPC", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
54
{8, "PCMA", CODEC_TYPE_AUDIO, CODEC_ID_PCM_ALAW, 8000, 1},
55
{9, "G722", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
56
{10, "L16", CODEC_TYPE_AUDIO, CODEC_ID_PCM_S16BE, 44100, 2},
57
{11, "L16", CODEC_TYPE_AUDIO, CODEC_ID_PCM_S16BE, 44100, 1},
58
{12, "QCELP", CODEC_TYPE_AUDIO, CODEC_ID_QCELP, 8000, 1},
59
{13, "CN", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
60
{14, "MPA", CODEC_TYPE_AUDIO, CODEC_ID_MP2, 90000, -1},
61
{15, "G728", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
62
{16, "DVI4", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 11025, 1},
63
{17, "DVI4", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 22050, 1},
64
{18, "G729", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
65
{19, "reserved", CODEC_TYPE_AUDIO, CODEC_ID_NONE, -1, -1},
66
{20, "unassigned", CODEC_TYPE_AUDIO, CODEC_ID_NONE, -1, -1},
67
{21, "unassigned", CODEC_TYPE_AUDIO, CODEC_ID_NONE, -1, -1},
68
{22, "unassigned", CODEC_TYPE_AUDIO, CODEC_ID_NONE, -1, -1},
69
{23, "unassigned", CODEC_TYPE_AUDIO, CODEC_ID_NONE, -1, -1},
70
{24, "unassigned", CODEC_TYPE_VIDEO, CODEC_ID_NONE, -1, -1},
71
{25, "CelB", CODEC_TYPE_VIDEO, CODEC_ID_NONE, 90000, -1},
72
{26, "JPEG", CODEC_TYPE_VIDEO, CODEC_ID_MJPEG, 90000, -1},
73
{27, "unassigned", CODEC_TYPE_VIDEO, CODEC_ID_NONE, -1, -1},
74
{28, "nv", CODEC_TYPE_VIDEO, CODEC_ID_NONE, 90000, -1},
75
{29, "unassigned", CODEC_TYPE_VIDEO, CODEC_ID_NONE, -1, -1},
76
{30, "unassigned", CODEC_TYPE_VIDEO, CODEC_ID_NONE, -1, -1},
77
{31, "H261", CODEC_TYPE_VIDEO, CODEC_ID_H261, 90000, -1},
78
{32, "MPV", CODEC_TYPE_VIDEO, CODEC_ID_MPEG1VIDEO, 90000, -1},
79
{33, "MP2T", CODEC_TYPE_DATA, CODEC_ID_MPEG2TS, 90000, -1},
80
{34, "H263", CODEC_TYPE_VIDEO, CODEC_ID_H263, 90000, -1},
81
{35, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
82
{36, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
83
{37, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
84
{38, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
85
{39, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
86
{40, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
87
{41, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
88
{42, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
89
{43, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
90
{44, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
91
{45, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
92
{46, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
93
{47, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
94
{48, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
95
{49, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
96
{50, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
97
{51, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
98
{52, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
99
{53, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
100
{54, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
101
{55, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
102
{56, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
103
{57, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
104
{58, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
105
{59, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
106
{60, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
107
{61, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
108
{62, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
109
{63, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
110
{64, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
111
{65, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
112
{66, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
113
{67, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
114
{68, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
115
{69, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
116
{70, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
117
{71, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
118
{72, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
119
{73, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
120
{74, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
121
{75, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
122
{76, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
123
{77, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
124
{78, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
125
{79, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
126
{80, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
127
{81, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
128
{82, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
129
{83, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
130
{84, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
131
{85, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
132
{86, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
133
{87, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
134
{88, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
135
{89, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
136
{90, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
137
{91, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
138
{92, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
139
{93, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
140
{94, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
141
{95, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
142
{96, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
143
{97, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
144
{98, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
145
{99, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
146
{100, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
147
{101, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
148
{102, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
149
{103, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
150
{104, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
151
{105, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
152
{106, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
153
{107, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
154
{108, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
155
{109, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
156
{110, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
157
{111, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
158
{112, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
159
{113, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
160
{114, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
161
{115, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
162
{116, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
163
{117, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
164
{118, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
165
{119, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
166
{120, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
167
{121, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
168
{122, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
169
{123, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
170
{124, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
171
{125, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
172
{126, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
173
{127, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
174
{-1, "", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}
91
typedef struct RTPContext {
96
uint32_t base_timestamp;
97
uint32_t cur_timestamp;
99
/* rtcp sender statistics receive */
100
int64_t last_rtcp_ntp_time;
101
int64_t first_rtcp_ntp_time;
102
uint32_t last_rtcp_timestamp;
103
/* rtcp sender statistics */
104
unsigned int packet_count;
105
unsigned int octet_count;
106
unsigned int last_octet_count;
108
/* buffer for output */
109
uint8_t buf[RTP_MAX_PACKET_LENGTH];
177
/* statistics functions */
178
RTPDynamicProtocolHandler *RTPFirstDynamicPayloadHandler= NULL;
180
static RTPDynamicProtocolHandler mp4v_es_handler= {"MP4V-ES", CODEC_TYPE_VIDEO, CODEC_ID_MPEG4};
181
static RTPDynamicProtocolHandler mpeg4_generic_handler= {"mpeg4-generic", CODEC_TYPE_AUDIO, CODEC_ID_AAC};
183
static void register_dynamic_payload_handler(RTPDynamicProtocolHandler *handler)
185
handler->next= RTPFirstDynamicPayloadHandler;
186
RTPFirstDynamicPayloadHandler= handler;
189
void av_register_rtp_dynamic_payload_handlers()
191
register_dynamic_payload_handler(&mp4v_es_handler);
192
register_dynamic_payload_handler(&mpeg4_generic_handler);
193
register_dynamic_payload_handler(&ff_h264_dynamic_handler);
113
196
int rtp_get_codec_info(AVCodecContext *codec, int payload_type)
115
switch(payload_type) {
117
codec->codec_id = CODEC_ID_PCM_MULAW;
119
codec->sample_rate = 8000;
122
codec->codec_id = CODEC_ID_PCM_ALAW;
124
codec->sample_rate = 8000;
126
case RTP_PT_S16BE_STEREO:
127
codec->codec_id = CODEC_ID_PCM_S16BE;
129
codec->sample_rate = 44100;
131
case RTP_PT_S16BE_MONO:
132
codec->codec_id = CODEC_ID_PCM_S16BE;
134
codec->sample_rate = 44100;
136
case RTP_PT_MPEGAUDIO:
137
codec->codec_id = CODEC_ID_MP2;
140
codec->codec_id = CODEC_ID_MJPEG;
142
case RTP_PT_MPEGVIDEO:
143
codec->codec_id = CODEC_ID_MPEG1VIDEO;
198
if (AVRtpPayloadTypes[payload_type].codec_id != CODEC_ID_NONE) {
199
codec->codec_type = AVRtpPayloadTypes[payload_type].codec_type;
200
codec->codec_id = AVRtpPayloadTypes[payload_type].codec_id;
201
if (AVRtpPayloadTypes[payload_type].audio_channels > 0)
202
codec->channels = AVRtpPayloadTypes[payload_type].audio_channels;
203
if (AVRtpPayloadTypes[payload_type].clock_rate > 0)
204
codec->sample_rate = AVRtpPayloadTypes[payload_type].clock_rate;
151
210
/* return < 0 if unknown payload type */
152
211
int rtp_get_payload_type(AVCodecContext *codec)
156
215
/* compute the payload type */
158
switch(codec->codec_id) {
159
case CODEC_ID_PCM_MULAW:
160
payload_type = RTP_PT_ULAW;
162
case CODEC_ID_PCM_ALAW:
163
payload_type = RTP_PT_ALAW;
165
case CODEC_ID_PCM_S16BE:
166
if (codec->channels == 1) {
167
payload_type = RTP_PT_S16BE_MONO;
168
} else if (codec->channels == 2) {
169
payload_type = RTP_PT_S16BE_STEREO;
216
for (payload_type = -1, i = 0; AVRtpPayloadTypes[i].pt >= 0; ++i)
217
if (AVRtpPayloadTypes[i].codec_id == codec->codec_id) {
218
if (codec->codec_id == CODEC_ID_PCM_S16BE)
219
if (codec->channels != AVRtpPayloadTypes[i].audio_channels)
221
payload_type = AVRtpPayloadTypes[i].pt;
174
payload_type = RTP_PT_MPEGAUDIO;
177
payload_type = RTP_PT_JPEG;
179
case CODEC_ID_MPEG1VIDEO:
180
payload_type = RTP_PT_MPEGVIDEO;
185
223
return payload_type;
212
* Parse an RTP packet directly sent as raw data. Can only be used if
213
* 'raw' is given as input file
214
* @param s1 media file context
247
#define RTP_SEQ_MOD (1<<16)
250
* called on parse open packet
252
static void rtp_init_statistics(RTPStatistics *s, uint16_t base_sequence) // called on parse open packet.
254
memset(s, 0, sizeof(RTPStatistics));
255
s->max_seq= base_sequence;
260
* called whenever there is a large jump in sequence numbers, or when they get out of probation...
262
static void rtp_init_sequence(RTPStatistics *s, uint16_t seq)
267
s->bad_seq= RTP_SEQ_MOD + 1;
269
s->expected_prior= 0;
270
s->received_prior= 0;
276
* returns 1 if we should handle this packet.
278
static int rtp_valid_packet_in_sequence(RTPStatistics *s, uint16_t seq)
280
uint16_t udelta= seq - s->max_seq;
281
const int MAX_DROPOUT= 3000;
282
const int MAX_MISORDER = 100;
283
const int MIN_SEQUENTIAL = 2;
285
/* source not valid until MIN_SEQUENTIAL packets with sequence seq. numbers have been received */
288
if(seq==s->max_seq + 1) {
291
if(s->probation==0) {
292
rtp_init_sequence(s, seq);
297
s->probation= MIN_SEQUENTIAL - 1;
300
} else if (udelta < MAX_DROPOUT) {
301
// in order, with permissible gap
302
if(seq < s->max_seq) {
303
//sequence number wrapped; count antother 64k cycles
304
s->cycles += RTP_SEQ_MOD;
307
} else if (udelta <= RTP_SEQ_MOD - MAX_MISORDER) {
308
// sequence made a large jump...
309
if(seq==s->bad_seq) {
310
// two sequential packets-- assume that the other side restarted without telling us; just resync.
311
rtp_init_sequence(s, seq);
313
s->bad_seq= (seq + 1) & (RTP_SEQ_MOD-1);
317
// duplicate or reordered packet...
325
* This function is currently unused; without a valid local ntp time, I don't see how we could calculate the
326
* difference between the arrival and sent timestamp. As a result, the jitter and transit statistics values
327
* never change. I left this in in case someone else can see a way. (rdm)
329
static void rtcp_update_jitter(RTPStatistics *s, uint32_t sent_timestamp, uint32_t arrival_timestamp)
331
uint32_t transit= arrival_timestamp - sent_timestamp;
334
d= FFABS(transit - s->transit);
335
s->jitter += d - ((s->jitter + 8)>>4);
340
* some rtp servers assume client is dead if they don't hear from them...
341
* so we send a Receiver Report to the provided ByteIO context
342
* (we don't have access to the rtcp handle from here)
344
int rtp_check_and_send_back_rr(RTPDemuxContext *s, int count)
350
RTPStatistics *stats= &s->statistics;
352
uint32_t extended_max;
353
uint32_t expected_interval;
354
uint32_t received_interval;
355
uint32_t lost_interval;
358
uint64_t ntp_time= s->last_rtcp_ntp_time; // TODO: Get local ntp time?
360
if (!s->rtp_ctx || (count < 1))
363
/* TODO: I think this is way too often; RFC 1889 has algorithm for this */
364
/* XXX: mpeg pts hardcoded. RTCP send every 0.5 seconds */
365
s->octet_count += count;
366
rtcp_bytes = ((s->octet_count - s->last_octet_count) * RTCP_TX_RATIO_NUM) /
368
rtcp_bytes /= 50; // mmu_man: that's enough for me... VLC sends much less btw !?
371
s->last_octet_count = s->octet_count;
373
if (url_open_dyn_buf(&pb) < 0)
377
put_byte(&pb, (RTP_VERSION << 6) + 1); /* 1 report block */
379
put_be16(&pb, 7); /* length in words - 1 */
380
put_be32(&pb, s->ssrc); // our own SSRC
381
put_be32(&pb, s->ssrc); // XXX: should be the server's here!
382
// some placeholders we should really fill...
384
extended_max= stats->cycles + stats->max_seq;
385
expected= extended_max - stats->base_seq + 1;
386
lost= expected - stats->received;
387
lost= FFMIN(lost, 0xffffff); // clamp it since it's only 24 bits...
388
expected_interval= expected - stats->expected_prior;
389
stats->expected_prior= expected;
390
received_interval= stats->received - stats->received_prior;
391
stats->received_prior= stats->received;
392
lost_interval= expected_interval - received_interval;
393
if (expected_interval==0 || lost_interval<=0) fraction= 0;
394
else fraction = (lost_interval<<8)/expected_interval;
396
fraction= (fraction<<24) | lost;
398
put_be32(&pb, fraction); /* 8 bits of fraction, 24 bits of total packets lost */
399
put_be32(&pb, extended_max); /* max sequence received */
400
put_be32(&pb, stats->jitter>>4); /* jitter */
402
if(s->last_rtcp_ntp_time==AV_NOPTS_VALUE)
404
put_be32(&pb, 0); /* last SR timestamp */
405
put_be32(&pb, 0); /* delay since last SR */
407
uint32_t middle_32_bits= s->last_rtcp_ntp_time>>16; // this is valid, right? do we need to handle 64 bit values special?
408
uint32_t delay_since_last= ntp_time - s->last_rtcp_ntp_time;
410
put_be32(&pb, middle_32_bits); /* last SR timestamp */
411
put_be32(&pb, delay_since_last); /* delay since last SR */
415
put_byte(&pb, (RTP_VERSION << 6) + 1); /* 1 report block */
417
len = strlen(s->hostname);
418
put_be16(&pb, (6 + len + 3) / 4); /* length in words - 1 */
419
put_be32(&pb, s->ssrc);
422
put_buffer(&pb, s->hostname, len);
424
for (len = (6 + len) % 4; len % 4; len++) {
428
put_flush_packet(&pb);
429
len = url_close_dyn_buf(&pb, &buf);
430
if ((len > 0) && buf) {
433
printf("sending %d bytes of RR\n", len);
435
result= url_write(s->rtp_ctx, buf, len);
437
printf("result from url_write: %d\n", result);
445
* open a new RTP parse context for stream 'st'. 'st' can be NULL for
446
* MPEG2TS streams to indicate that they should be demuxed inside the
447
* rtp demux (otherwise CODEC_ID_MPEG2TS packets are returned)
448
* TODO: change this to not take rtp_payload data, and use the new dynamic payload system.
450
RTPDemuxContext *rtp_parse_open(AVFormatContext *s1, AVStream *st, URLContext *rtpc, int payload_type, rtp_payload_data_t *rtp_payload_data)
454
s = av_mallocz(sizeof(RTPDemuxContext));
457
s->payload_type = payload_type;
458
s->last_rtcp_ntp_time = AV_NOPTS_VALUE;
459
s->first_rtcp_ntp_time = AV_NOPTS_VALUE;
462
s->rtp_payload_data = rtp_payload_data;
463
rtp_init_statistics(&s->statistics, 0); // do we know the initial sequence from sdp?
464
if (!strcmp(AVRtpPayloadTypes[payload_type].enc_name, "MP2T")) {
465
s->ts = mpegts_parse_open(s->ic);
471
switch(st->codec->codec_id) {
472
case CODEC_ID_MPEG1VIDEO:
473
case CODEC_ID_MPEG2VIDEO:
478
st->need_parsing = 1;
484
// needed to send back RTCP RR in RTSP sessions
486
gethostname(s->hostname, sizeof(s->hostname));
490
static int rtp_parse_mp4_au(RTPDemuxContext *s, const uint8_t *buf)
492
int au_headers_length, au_header_size, i;
493
GetBitContext getbitcontext;
494
rtp_payload_data_t *infos;
496
infos = s->rtp_payload_data;
501
/* decode the first 2 bytes where are stored the AUHeader sections
503
au_headers_length = AV_RB16(buf);
505
if (au_headers_length > RTP_MAX_PACKET_LENGTH)
508
infos->au_headers_length_bytes = (au_headers_length + 7) / 8;
510
/* skip AU headers length section (2 bytes) */
513
init_get_bits(&getbitcontext, buf, infos->au_headers_length_bytes * 8);
515
/* XXX: Wrong if optionnal additional sections are present (cts, dts etc...) */
516
au_header_size = infos->sizelength + infos->indexlength;
517
if (au_header_size <= 0 || (au_headers_length % au_header_size != 0))
520
infos->nb_au_headers = au_headers_length / au_header_size;
521
infos->au_headers = av_malloc(sizeof(struct AUHeaders) * infos->nb_au_headers);
523
/* XXX: We handle multiple AU Section as only one (need to fix this for interleaving)
524
In my test, the faad decoder doesnt behave correctly when sending each AU one by one
525
but does when sending the whole as one big packet... */
526
infos->au_headers[0].size = 0;
527
infos->au_headers[0].index = 0;
528
for (i = 0; i < infos->nb_au_headers; ++i) {
529
infos->au_headers[0].size += get_bits_long(&getbitcontext, infos->sizelength);
530
infos->au_headers[0].index = get_bits_long(&getbitcontext, infos->indexlength);
533
infos->nb_au_headers = 1;
539
* This was the second switch in rtp_parse packet. Normalizes time, if required, sets stream_index, etc.
541
static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp)
543
switch(s->st->codec->codec_id) {
545
case CODEC_ID_MPEG1VIDEO:
546
if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE) {
550
/* XXX: is it really necessary to unify the timestamp base ? */
551
/* compute pts from timestamp with received ntp_time */
552
delta_timestamp = timestamp - s->last_rtcp_timestamp;
553
/* convert to 90 kHz without overflow */
554
addend = (s->last_rtcp_ntp_time - s->first_rtcp_ntp_time) >> 14;
555
addend = (addend * 5625) >> 14;
556
pkt->pts = addend + delta_timestamp;
562
pkt->pts = timestamp;
565
/* no timestamp info yet */
568
pkt->stream_index = s->st->index;
572
* Parse an RTP or RTCP packet directly sent as a buffer.
573
* @param s RTP parse context.
215
574
* @param pkt returned packet
216
* @param buf input buffer
575
* @param buf input buffer or NULL to read the next packets
217
576
* @param len buffer len
218
* @return zero if no error.
577
* @return 0 if a packet is returned, 1 if a packet is returned and more can follow
578
* (use buf as NULL to read the next). -1 if no packet (error or no more packet).
220
int rtp_parse_packet(AVFormatContext *s1, AVPacket *pkt,
221
const unsigned char *buf, int len)
580
int rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt,
581
const uint8_t *buf, int len)
223
RTPContext *s = s1->priv_data;
224
583
unsigned int ssrc, h;
225
int payload_type, seq, delta_timestamp;
584
int payload_type, seq, ret;
227
586
uint32_t timestamp;
590
/* return the next packets, if any */
591
if(s->st && s->parse_packet) {
592
timestamp= 0; ///< Should not be used if buf is NULL, but should be set to the timestamp of the packet returned....
593
rv= s->parse_packet(s, pkt, ×tamp, NULL, 0);
594
finalize_packet(s, pkt, timestamp);
597
// TODO: Move to a dynamic packet handler (like above)
598
if (s->read_buf_index >= s->read_buf_size)
600
ret = mpegts_parse_packet(s->ts, pkt, s->buf + s->read_buf_index,
601
s->read_buf_size - s->read_buf_index);
604
s->read_buf_index += ret;
605
if (s->read_buf_index < s->read_buf_size)
232
615
if ((buf[0] & 0xc0) != (RTP_VERSION << 6))
234
617
if (buf[1] >= 200 && buf[1] <= 204) {
235
rtcp_parse_packet(s1, buf, len);
618
rtcp_parse_packet(s, buf, len);
238
621
payload_type = buf[1] & 0x7f;
239
622
seq = (buf[2] << 8) | buf[3];
240
623
timestamp = decode_be32(buf + 4);
241
624
ssrc = decode_be32(buf + 8);
243
if (s->payload_type < 0) {
244
s->payload_type = payload_type;
246
if (payload_type == RTP_PT_MPEG2TS) {
247
/* XXX: special case : not a single codec but a whole stream */
250
st = av_new_stream(s1, 0);
253
rtp_get_codec_info(&st->codec, payload_type);
625
/* store the ssrc in the RTPDemuxContext */
257
628
/* NOTE: we can handle only one payload type */
258
629
if (s->payload_type != payload_type)
260
#if defined(DEBUG) || 1
261
if (seq != ((s->seq + 1) & 0xffff)) {
262
printf("RTP: PT=%02x: bad cseq %04x expected=%04x\n",
633
// only do something with this if all the rtp checks pass...
634
if(!rtp_valid_packet_in_sequence(&s->statistics, seq))
636
av_log(st?st->codec:NULL, AV_LOG_ERROR, "RTP: PT=%02x: bad cseq %04x expected=%04x\n",
263
637
payload_type, seq, ((s->seq + 1) & 0xffff));
270
switch(st->codec.codec_id) {
272
/* better than nothing: skip mpeg audio RTP header */
275
h = decode_be32(buf);
278
av_new_packet(pkt, len);
279
memcpy(pkt->data, buf, len);
281
case CODEC_ID_MPEG1VIDEO:
282
/* better than nothing: skip mpeg audio RTP header */
285
h = decode_be32(buf);
295
av_new_packet(pkt, len);
296
memcpy(pkt->data, buf, len);
299
av_new_packet(pkt, len);
300
memcpy(pkt->data, buf, len);
304
switch(st->codec.codec_id) {
306
case CODEC_ID_MPEG1VIDEO:
307
if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE) {
309
/* XXX: is it really necessary to unify the timestamp base ? */
310
/* compute pts from timestamp with received ntp_time */
311
delta_timestamp = timestamp - s->last_rtcp_timestamp;
312
/* convert to 90 kHz without overflow */
313
addend = (s->last_rtcp_ntp_time - s->first_rtcp_ntp_time) >> 14;
314
addend = (addend * 5625) >> 14;
315
pkt->pts = addend + delta_timestamp;
319
/* no timestamp info yet */
325
static int rtp_read_header(AVFormatContext *s1,
326
AVFormatParameters *ap)
328
RTPContext *s = s1->priv_data;
329
s->payload_type = -1;
330
s->last_rtcp_ntp_time = AV_NOPTS_VALUE;
331
s->first_rtcp_ntp_time = AV_NOPTS_VALUE;
335
static int rtp_read_packet(AVFormatContext *s1, AVPacket *pkt)
337
char buf[RTP_MAX_PACKET_LENGTH];
340
/* XXX: needs a better API for packet handling ? */
342
ret = url_read(url_fileno(&s1->pb), buf, sizeof(buf));
646
/* specific MPEG2TS demux support */
647
ret = mpegts_parse_packet(s->ts, pkt, buf, len);
345
if (rtp_parse_packet(s1, pkt, buf, ret) == 0)
351
static int rtp_read_close(AVFormatContext *s1)
353
// RTPContext *s = s1->priv_data;
357
static int rtp_probe(AVProbeData *p)
359
if (strstart(p->filename, "rtp://", NULL))
360
return AVPROBE_SCORE_MAX;
651
s->read_buf_size = len - ret;
652
memcpy(s->buf, buf + ret, s->read_buf_size);
653
s->read_buf_index = 0;
657
// at this point, the RTP header has been stripped; This is ASSUMING that there is only 1 CSRC, which in't wise.
658
switch(st->codec->codec_id) {
660
/* better than nothing: skip mpeg audio RTP header */
663
h = decode_be32(buf);
666
av_new_packet(pkt, len);
667
memcpy(pkt->data, buf, len);
669
case CODEC_ID_MPEG1VIDEO:
670
/* better than nothing: skip mpeg video RTP header */
673
h = decode_be32(buf);
683
av_new_packet(pkt, len);
684
memcpy(pkt->data, buf, len);
686
// moved from below, verbatim. this is because this section handles packets, and the lower switch handles
688
// TODO: Put this into a dynamic packet handler...
690
if (rtp_parse_mp4_au(s, buf))
693
rtp_payload_data_t *infos = s->rtp_payload_data;
696
buf += infos->au_headers_length_bytes + 2;
697
len -= infos->au_headers_length_bytes + 2;
699
/* XXX: Fixme we only handle the case where rtp_parse_mp4_au define
701
av_new_packet(pkt, infos->au_headers[0].size);
702
memcpy(pkt->data, buf, infos->au_headers[0].size);
703
buf += infos->au_headers[0].size;
704
len -= infos->au_headers[0].size;
706
s->read_buf_size = len;
711
if(s->parse_packet) {
712
rv= s->parse_packet(s, pkt, ×tamp, buf, len);
714
av_new_packet(pkt, len);
715
memcpy(pkt->data, buf, len);
720
// now perform timestamp things....
721
finalize_packet(s, pkt, timestamp);
726
void rtp_parse_close(RTPDemuxContext *s)
728
// TODO: fold this into the protocol specific data fields.
729
if (!strcmp(AVRtpPayloadTypes[s->payload_type].enc_name, "MP2T")) {
730
mpegts_parse_close(s->ts);
366
737
static int rtp_write_header(AVFormatContext *s1)
368
RTPContext *s = s1->priv_data;
369
int payload_type, max_packet_size;
739
RTPDemuxContext *s = s1->priv_data;
740
int payload_type, max_packet_size, n;
372
743
if (s1->nb_streams != 1)
374
745
st = s1->streams[0];
376
payload_type = rtp_get_payload_type(&st->codec);
747
payload_type = rtp_get_payload_type(st->codec);
377
748
if (payload_type < 0)
378
749
payload_type = RTP_PT_PRIVATE; /* private payload type */
379
750
s->payload_type = payload_type;
381
s->base_timestamp = random();
752
// following 2 FIXMies could be set based on the current time, theres normaly no info leak, as rtp will likely be transmitted immedeatly
753
s->base_timestamp = 0; /* FIXME: was random(), what should this be? */
382
754
s->timestamp = s->base_timestamp;
755
s->ssrc = 0; /* FIXME: was random(), what should this be? */
384
756
s->first_packet = 1;
386
758
max_packet_size = url_fget_max_packet_size(&s1->pb);