2 * RTP input/output format
3 * Copyright (c) 2002 Fabrice Bellard.
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 #include "bitstream.h"
28 #include "rtp_internal.h"
35 #define RTCP_SR_SIZE 28
37 /* TODO: - add RTCP statistics reporting (should be optional).
39 - add support for h263/mpeg4 packetized output : IDEA: send a
40 buffer to 'rtp_write_packet' contains all the packets for ONE
41 frame. Each packet should have a four byte header containing
42 the length in big endian format (same trick as
43 'url_open_dyn_packet_buf')
46 /* from http://www.iana.org/assignments/rtp-parameters last updated 05 January 2005 */
47 AVRtpPayloadType_t AVRtpPayloadTypes[]=
49 {0, "PCMU", CODEC_TYPE_AUDIO, CODEC_ID_PCM_MULAW, 8000, 1},
50 {1, "Reserved", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
51 {2, "Reserved", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
52 {3, "GSM", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
53 {4, "G723", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
54 {5, "DVI4", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
55 {6, "DVI4", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 16000, 1},
56 {7, "LPC", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
57 {8, "PCMA", CODEC_TYPE_AUDIO, CODEC_ID_PCM_ALAW, 8000, 1},
58 {9, "G722", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
59 {10, "L16", CODEC_TYPE_AUDIO, CODEC_ID_PCM_S16BE, 44100, 2},
60 {11, "L16", CODEC_TYPE_AUDIO, CODEC_ID_PCM_S16BE, 44100, 1},
61 {12, "QCELP", CODEC_TYPE_AUDIO, CODEC_ID_QCELP, 8000, 1},
62 {13, "CN", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
63 {14, "MPA", CODEC_TYPE_AUDIO, CODEC_ID_MP2, 90000, -1},
64 {15, "G728", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
65 {16, "DVI4", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 11025, 1},
66 {17, "DVI4", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 22050, 1},
67 {18, "G729", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
68 {19, "reserved", CODEC_TYPE_AUDIO, CODEC_ID_NONE, -1, -1},
69 {20, "unassigned", CODEC_TYPE_AUDIO, CODEC_ID_NONE, -1, -1},
70 {21, "unassigned", CODEC_TYPE_AUDIO, CODEC_ID_NONE, -1, -1},
71 {22, "unassigned", CODEC_TYPE_AUDIO, CODEC_ID_NONE, -1, -1},
72 {23, "unassigned", CODEC_TYPE_AUDIO, CODEC_ID_NONE, -1, -1},
73 {24, "unassigned", CODEC_TYPE_VIDEO, CODEC_ID_NONE, -1, -1},
74 {25, "CelB", CODEC_TYPE_VIDEO, CODEC_ID_NONE, 90000, -1},
75 {26, "JPEG", CODEC_TYPE_VIDEO, CODEC_ID_MJPEG, 90000, -1},
76 {27, "unassigned", CODEC_TYPE_VIDEO, CODEC_ID_NONE, -1, -1},
77 {28, "nv", CODEC_TYPE_VIDEO, CODEC_ID_NONE, 90000, -1},
78 {29, "unassigned", CODEC_TYPE_VIDEO, CODEC_ID_NONE, -1, -1},
79 {30, "unassigned", CODEC_TYPE_VIDEO, CODEC_ID_NONE, -1, -1},
80 {31, "H261", CODEC_TYPE_VIDEO, CODEC_ID_H261, 90000, -1},
81 {32, "MPV", CODEC_TYPE_VIDEO, CODEC_ID_MPEG1VIDEO, 90000, -1},
82 {32, "MPV", CODEC_TYPE_VIDEO, CODEC_ID_MPEG2VIDEO, 90000, -1},
83 {33, "MP2T", CODEC_TYPE_DATA, CODEC_ID_MPEG2TS, 90000, -1},
84 {34, "H263", CODEC_TYPE_VIDEO, CODEC_ID_H263, 90000, -1},
85 {35, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
86 {36, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
87 {37, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
88 {38, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
89 {39, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
90 {40, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
91 {41, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
92 {42, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
93 {43, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
94 {44, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
95 {45, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
96 {46, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
97 {47, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
98 {48, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
99 {49, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
100 {50, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
101 {51, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
102 {52, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
103 {53, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
104 {54, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
105 {55, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
106 {56, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
107 {57, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
108 {58, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
109 {59, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
110 {60, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
111 {61, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
112 {62, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
113 {63, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
114 {64, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
115 {65, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
116 {66, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
117 {67, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
118 {68, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
119 {69, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
120 {70, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
121 {71, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
122 {72, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
123 {73, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
124 {74, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
125 {75, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
126 {76, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
127 {77, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
128 {78, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
129 {79, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
130 {80, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
131 {81, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
132 {82, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
133 {83, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
134 {84, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
135 {85, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
136 {86, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
137 {87, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
138 {88, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
139 {89, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
140 {90, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
141 {91, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
142 {92, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
143 {93, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
144 {94, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
145 {95, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
146 {96, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
147 {97, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
148 {98, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
149 {99, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
150 {100, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
151 {101, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
152 {102, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
153 {103, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
154 {104, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
155 {105, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
156 {106, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
157 {107, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
158 {108, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
159 {109, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
160 {110, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
161 {111, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
162 {112, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
163 {113, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
164 {114, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
165 {115, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
166 {116, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
167 {117, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
168 {118, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
169 {119, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
170 {120, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
171 {121, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
172 {122, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
173 {123, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
174 {124, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
175 {125, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
176 {126, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
177 {127, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
178 {-1, "", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}
181 /* statistics functions */
182 RTPDynamicProtocolHandler *RTPFirstDynamicPayloadHandler= NULL;
184 static RTPDynamicProtocolHandler mp4v_es_handler= {"MP4V-ES", CODEC_TYPE_VIDEO, CODEC_ID_MPEG4};
185 static RTPDynamicProtocolHandler mpeg4_generic_handler= {"mpeg4-generic", CODEC_TYPE_AUDIO, CODEC_ID_AAC};
187 static void register_dynamic_payload_handler(RTPDynamicProtocolHandler *handler)
189 handler->next= RTPFirstDynamicPayloadHandler;
190 RTPFirstDynamicPayloadHandler= handler;
193 void av_register_rtp_dynamic_payload_handlers(void)
195 register_dynamic_payload_handler(&mp4v_es_handler);
196 register_dynamic_payload_handler(&mpeg4_generic_handler);
197 register_dynamic_payload_handler(&ff_h264_dynamic_handler);
200 int rtp_get_codec_info(AVCodecContext *codec, int payload_type)
204 for (i = 0; AVRtpPayloadTypes[i].pt >= 0; i++)
205 if (AVRtpPayloadTypes[i].pt == payload_type) {
206 if (AVRtpPayloadTypes[i].codec_id != CODEC_ID_NONE) {
207 codec->codec_type = AVRtpPayloadTypes[i].codec_type;
208 codec->codec_id = AVRtpPayloadTypes[i].codec_id;
209 if (AVRtpPayloadTypes[i].audio_channels > 0)
210 codec->channels = AVRtpPayloadTypes[i].audio_channels;
211 if (AVRtpPayloadTypes[i].clock_rate > 0)
212 codec->sample_rate = AVRtpPayloadTypes[i].clock_rate;
219 int rtp_get_payload_type(AVCodecContext *codec)
223 /* compute the payload type */
224 for (payload_type = -1, i = 0; AVRtpPayloadTypes[i].pt >= 0; ++i)
225 if (AVRtpPayloadTypes[i].codec_id == codec->codec_id) {
226 if (codec->codec_id == CODEC_ID_PCM_S16BE)
227 if (codec->channels != AVRtpPayloadTypes[i].audio_channels)
229 payload_type = AVRtpPayloadTypes[i].pt;
234 const char *ff_rtp_enc_name(int payload_type)
238 for (i = 0; AVRtpPayloadTypes[i].pt >= 0; i++)
239 if (AVRtpPayloadTypes[i].pt == payload_type) {
240 return AVRtpPayloadTypes[i].enc_name;
246 enum CodecID ff_rtp_codec_id(const char *buf, enum CodecType codec_type)
250 for (i = 0; AVRtpPayloadTypes[i].pt >= 0; i++)
251 if (!strcmp(buf, AVRtpPayloadTypes[i].enc_name) && (codec_type == AVRtpPayloadTypes[i].codec_type)){
252 return AVRtpPayloadTypes[i].codec_id;
255 return CODEC_ID_NONE;
258 static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int len)
262 s->last_rtcp_ntp_time = AV_RB64(buf + 8);
263 if (s->first_rtcp_ntp_time == AV_NOPTS_VALUE)
264 s->first_rtcp_ntp_time = s->last_rtcp_ntp_time;
265 s->last_rtcp_timestamp = AV_RB32(buf + 16);
269 #define RTP_SEQ_MOD (1<<16)
272 * called on parse open packet
274 static void rtp_init_statistics(RTPStatistics *s, uint16_t base_sequence) // called on parse open packet.
276 memset(s, 0, sizeof(RTPStatistics));
277 s->max_seq= base_sequence;
282 * called whenever there is a large jump in sequence numbers, or when they get out of probation...
284 static void rtp_init_sequence(RTPStatistics *s, uint16_t seq)
289 s->bad_seq= RTP_SEQ_MOD + 1;
291 s->expected_prior= 0;
292 s->received_prior= 0;
298 * returns 1 if we should handle this packet.
300 static int rtp_valid_packet_in_sequence(RTPStatistics *s, uint16_t seq)
302 uint16_t udelta= seq - s->max_seq;
303 const int MAX_DROPOUT= 3000;
304 const int MAX_MISORDER = 100;
305 const int MIN_SEQUENTIAL = 2;
307 /* source not valid until MIN_SEQUENTIAL packets with sequence seq. numbers have been received */
310 if(seq==s->max_seq + 1) {
313 if(s->probation==0) {
314 rtp_init_sequence(s, seq);
319 s->probation= MIN_SEQUENTIAL - 1;
322 } else if (udelta < MAX_DROPOUT) {
323 // in order, with permissible gap
324 if(seq < s->max_seq) {
325 //sequence number wrapped; count antother 64k cycles
326 s->cycles += RTP_SEQ_MOD;
329 } else if (udelta <= RTP_SEQ_MOD - MAX_MISORDER) {
330 // sequence made a large jump...
331 if(seq==s->bad_seq) {
332 // two sequential packets-- assume that the other side restarted without telling us; just resync.
333 rtp_init_sequence(s, seq);
335 s->bad_seq= (seq + 1) & (RTP_SEQ_MOD-1);
339 // duplicate or reordered packet...
347 * This function is currently unused; without a valid local ntp time, I don't see how we could calculate the
348 * difference between the arrival and sent timestamp. As a result, the jitter and transit statistics values
349 * never change. I left this in in case someone else can see a way. (rdm)
351 static void rtcp_update_jitter(RTPStatistics *s, uint32_t sent_timestamp, uint32_t arrival_timestamp)
353 uint32_t transit= arrival_timestamp - sent_timestamp;
356 d= FFABS(transit - s->transit);
357 s->jitter += d - ((s->jitter + 8)>>4);
361 int rtp_check_and_send_back_rr(RTPDemuxContext *s, int count)
367 RTPStatistics *stats= &s->statistics;
369 uint32_t extended_max;
370 uint32_t expected_interval;
371 uint32_t received_interval;
372 uint32_t lost_interval;
375 uint64_t ntp_time= s->last_rtcp_ntp_time; // TODO: Get local ntp time?
377 if (!s->rtp_ctx || (count < 1))
380 /* TODO: I think this is way too often; RFC 1889 has algorithm for this */
381 /* XXX: mpeg pts hardcoded. RTCP send every 0.5 seconds */
382 s->octet_count += count;
383 rtcp_bytes = ((s->octet_count - s->last_octet_count) * RTCP_TX_RATIO_NUM) /
385 rtcp_bytes /= 50; // mmu_man: that's enough for me... VLC sends much less btw !?
388 s->last_octet_count = s->octet_count;
390 if (url_open_dyn_buf(&pb) < 0)
394 put_byte(pb, (RTP_VERSION << 6) + 1); /* 1 report block */
396 put_be16(pb, 7); /* length in words - 1 */
397 put_be32(pb, s->ssrc); // our own SSRC
398 put_be32(pb, s->ssrc); // XXX: should be the server's here!
399 // some placeholders we should really fill...
401 extended_max= stats->cycles + stats->max_seq;
402 expected= extended_max - stats->base_seq + 1;
403 lost= expected - stats->received;
404 lost= FFMIN(lost, 0xffffff); // clamp it since it's only 24 bits...
405 expected_interval= expected - stats->expected_prior;
406 stats->expected_prior= expected;
407 received_interval= stats->received - stats->received_prior;
408 stats->received_prior= stats->received;
409 lost_interval= expected_interval - received_interval;
410 if (expected_interval==0 || lost_interval<=0) fraction= 0;
411 else fraction = (lost_interval<<8)/expected_interval;
413 fraction= (fraction<<24) | lost;
415 put_be32(pb, fraction); /* 8 bits of fraction, 24 bits of total packets lost */
416 put_be32(pb, extended_max); /* max sequence received */
417 put_be32(pb, stats->jitter>>4); /* jitter */
419 if(s->last_rtcp_ntp_time==AV_NOPTS_VALUE)
421 put_be32(pb, 0); /* last SR timestamp */
422 put_be32(pb, 0); /* delay since last SR */
424 uint32_t middle_32_bits= s->last_rtcp_ntp_time>>16; // this is valid, right? do we need to handle 64 bit values special?
425 uint32_t delay_since_last= ntp_time - s->last_rtcp_ntp_time;
427 put_be32(pb, middle_32_bits); /* last SR timestamp */
428 put_be32(pb, delay_since_last); /* delay since last SR */
432 put_byte(pb, (RTP_VERSION << 6) + 1); /* 1 report block */
434 len = strlen(s->hostname);
435 put_be16(pb, (6 + len + 3) / 4); /* length in words - 1 */
436 put_be32(pb, s->ssrc);
439 put_buffer(pb, s->hostname, len);
441 for (len = (6 + len) % 4; len % 4; len++) {
445 put_flush_packet(pb);
446 len = url_close_dyn_buf(pb, &buf);
447 if ((len > 0) && buf) {
450 printf("sending %d bytes of RR\n", len);
452 result= url_write(s->rtp_ctx, buf, len);
454 printf("result from url_write: %d\n", result);
462 * open a new RTP parse context for stream 'st'. 'st' can be NULL for
463 * MPEG2TS streams to indicate that they should be demuxed inside the
464 * rtp demux (otherwise CODEC_ID_MPEG2TS packets are returned)
465 * TODO: change this to not take rtp_payload data, and use the new dynamic payload system.
467 RTPDemuxContext *rtp_parse_open(AVFormatContext *s1, AVStream *st, URLContext *rtpc, int payload_type, rtp_payload_data_t *rtp_payload_data)
471 s = av_mallocz(sizeof(RTPDemuxContext));
474 s->payload_type = payload_type;
475 s->last_rtcp_ntp_time = AV_NOPTS_VALUE;
476 s->first_rtcp_ntp_time = AV_NOPTS_VALUE;
479 s->rtp_payload_data = rtp_payload_data;
480 rtp_init_statistics(&s->statistics, 0); // do we know the initial sequence from sdp?
481 if (!strcmp(ff_rtp_enc_name(payload_type), "MP2T")) {
482 s->ts = mpegts_parse_open(s->ic);
488 switch(st->codec->codec_id) {
489 case CODEC_ID_MPEG1VIDEO:
490 case CODEC_ID_MPEG2VIDEO:
495 st->need_parsing = AVSTREAM_PARSE_FULL;
501 // needed to send back RTCP RR in RTSP sessions
503 gethostname(s->hostname, sizeof(s->hostname));
507 static int rtp_parse_mp4_au(RTPDemuxContext *s, const uint8_t *buf)
509 int au_headers_length, au_header_size, i;
510 GetBitContext getbitcontext;
511 rtp_payload_data_t *infos;
513 infos = s->rtp_payload_data;
518 /* decode the first 2 bytes where are stored the AUHeader sections
520 au_headers_length = AV_RB16(buf);
522 if (au_headers_length > RTP_MAX_PACKET_LENGTH)
525 infos->au_headers_length_bytes = (au_headers_length + 7) / 8;
527 /* skip AU headers length section (2 bytes) */
530 init_get_bits(&getbitcontext, buf, infos->au_headers_length_bytes * 8);
532 /* XXX: Wrong if optionnal additional sections are present (cts, dts etc...) */
533 au_header_size = infos->sizelength + infos->indexlength;
534 if (au_header_size <= 0 || (au_headers_length % au_header_size != 0))
537 infos->nb_au_headers = au_headers_length / au_header_size;
538 infos->au_headers = av_malloc(sizeof(struct AUHeaders) * infos->nb_au_headers);
540 /* XXX: We handle multiple AU Section as only one (need to fix this for interleaving)
541 In my test, the FAAD decoder does not behave correctly when sending each AU one by one
542 but does when sending the whole as one big packet... */
543 infos->au_headers[0].size = 0;
544 infos->au_headers[0].index = 0;
545 for (i = 0; i < infos->nb_au_headers; ++i) {
546 infos->au_headers[0].size += get_bits_long(&getbitcontext, infos->sizelength);
547 infos->au_headers[0].index = get_bits_long(&getbitcontext, infos->indexlength);
550 infos->nb_au_headers = 1;
556 * This was the second switch in rtp_parse packet. Normalizes time, if required, sets stream_index, etc.
558 static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp)
560 switch(s->st->codec->codec_id) {
562 case CODEC_ID_MPEG1VIDEO:
563 case CODEC_ID_MPEG2VIDEO:
564 if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE) {
568 /* XXX: is it really necessary to unify the timestamp base ? */
569 /* compute pts from timestamp with received ntp_time */
570 delta_timestamp = timestamp - s->last_rtcp_timestamp;
571 /* convert to 90 kHz without overflow */
572 addend = (s->last_rtcp_ntp_time - s->first_rtcp_ntp_time) >> 14;
573 addend = (addend * 5625) >> 14;
574 pkt->pts = addend + delta_timestamp;
580 pkt->pts = timestamp;
583 /* no timestamp info yet */
586 pkt->stream_index = s->st->index;
590 * Parse an RTP or RTCP packet directly sent as a buffer.
591 * @param s RTP parse context.
592 * @param pkt returned packet
593 * @param buf input buffer or NULL to read the next packets
594 * @param len buffer len
595 * @return 0 if a packet is returned, 1 if a packet is returned and more can follow
596 * (use buf as NULL to read the next). -1 if no packet (error or no more packet).
598 int rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt,
599 const uint8_t *buf, int len)
601 unsigned int ssrc, h;
602 int payload_type, seq, ret;
608 /* return the next packets, if any */
609 if(s->st && s->parse_packet) {
610 timestamp= 0; ///< Should not be used if buf is NULL, but should be set to the timestamp of the packet returned....
611 rv= s->parse_packet(s, pkt, ×tamp, NULL, 0);
612 finalize_packet(s, pkt, timestamp);
615 // TODO: Move to a dynamic packet handler (like above)
616 if (s->read_buf_index >= s->read_buf_size)
618 ret = mpegts_parse_packet(s->ts, pkt, s->buf + s->read_buf_index,
619 s->read_buf_size - s->read_buf_index);
622 s->read_buf_index += ret;
623 if (s->read_buf_index < s->read_buf_size)
633 if ((buf[0] & 0xc0) != (RTP_VERSION << 6))
635 if (buf[1] >= 200 && buf[1] <= 204) {
636 rtcp_parse_packet(s, buf, len);
639 payload_type = buf[1] & 0x7f;
640 seq = AV_RB16(buf + 2);
641 timestamp = AV_RB32(buf + 4);
642 ssrc = AV_RB32(buf + 8);
643 /* store the ssrc in the RTPDemuxContext */
646 /* NOTE: we can handle only one payload type */
647 if (s->payload_type != payload_type)
651 // only do something with this if all the rtp checks pass...
652 if(!rtp_valid_packet_in_sequence(&s->statistics, seq))
654 av_log(st?st->codec:NULL, AV_LOG_ERROR, "RTP: PT=%02x: bad cseq %04x expected=%04x\n",
655 payload_type, seq, ((s->seq + 1) & 0xffff));
664 /* specific MPEG2TS demux support */
665 ret = mpegts_parse_packet(s->ts, pkt, buf, len);
669 s->read_buf_size = len - ret;
670 memcpy(s->buf, buf + ret, s->read_buf_size);
671 s->read_buf_index = 0;
675 // at this point, the RTP header has been stripped; This is ASSUMING that there is only 1 CSRC, which in't wise.
676 switch(st->codec->codec_id) {
678 /* better than nothing: skip mpeg audio RTP header */
684 av_new_packet(pkt, len);
685 memcpy(pkt->data, buf, len);
687 case CODEC_ID_MPEG1VIDEO:
688 case CODEC_ID_MPEG2VIDEO:
689 /* better than nothing: skip mpeg video RTP header */
702 av_new_packet(pkt, len);
703 memcpy(pkt->data, buf, len);
705 // moved from below, verbatim. this is because this section handles packets, and the lower switch handles
707 // TODO: Put this into a dynamic packet handler...
709 if (rtp_parse_mp4_au(s, buf))
712 rtp_payload_data_t *infos = s->rtp_payload_data;
715 buf += infos->au_headers_length_bytes + 2;
716 len -= infos->au_headers_length_bytes + 2;
718 /* XXX: Fixme we only handle the case where rtp_parse_mp4_au define
720 av_new_packet(pkt, infos->au_headers[0].size);
721 memcpy(pkt->data, buf, infos->au_headers[0].size);
722 buf += infos->au_headers[0].size;
723 len -= infos->au_headers[0].size;
725 s->read_buf_size = len;
729 if(s->parse_packet) {
730 rv= s->parse_packet(s, pkt, ×tamp, buf, len);
732 av_new_packet(pkt, len);
733 memcpy(pkt->data, buf, len);
738 // now perform timestamp things....
739 finalize_packet(s, pkt, timestamp);
744 void rtp_parse_close(RTPDemuxContext *s)
746 // TODO: fold this into the protocol specific data fields.
747 if (!strcmp(ff_rtp_enc_name(s->payload_type), "MP2T")) {
748 mpegts_parse_close(s->ts);
755 static int rtp_write_header(AVFormatContext *s1)
757 RTPDemuxContext *s = s1->priv_data;
758 int payload_type, max_packet_size, n;
761 if (s1->nb_streams != 1)
765 payload_type = rtp_get_payload_type(st->codec);
766 if (payload_type < 0)
767 payload_type = RTP_PT_PRIVATE; /* private payload type */
768 s->payload_type = payload_type;
770 // following 2 FIXMies could be set based on the current time, theres normaly no info leak, as rtp will likely be transmitted immedeatly
771 s->base_timestamp = 0; /* FIXME: was random(), what should this be? */
772 s->timestamp = s->base_timestamp;
773 s->cur_timestamp = 0;
774 s->ssrc = 0; /* FIXME: was random(), what should this be? */
776 s->first_rtcp_ntp_time = AV_NOPTS_VALUE;
778 max_packet_size = url_fget_max_packet_size(s1->pb);
779 if (max_packet_size <= 12)
781 s->max_payload_size = max_packet_size - 12;
783 s->max_frames_per_packet = 0;
785 if (st->codec->codec_type == CODEC_TYPE_AUDIO) {
786 if (st->codec->frame_size == 0) {
787 av_log(s1, AV_LOG_ERROR, "Cannot respect max delay: frame size = 0\n");
789 s->max_frames_per_packet = av_rescale_rnd(s1->max_delay, st->codec->sample_rate, AV_TIME_BASE * st->codec->frame_size, AV_ROUND_DOWN);
792 if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
793 /* FIXME: We should round down here... */
794 s->max_frames_per_packet = av_rescale_q(s1->max_delay, AV_TIME_BASE_Q, st->codec->time_base);
798 av_set_pts_info(st, 32, 1, 90000);
799 switch(st->codec->codec_id) {
802 s->buf_ptr = s->buf + 4;
804 case CODEC_ID_MPEG1VIDEO:
805 case CODEC_ID_MPEG2VIDEO:
807 case CODEC_ID_MPEG2TS:
808 n = s->max_payload_size / TS_PACKET_SIZE;
811 s->max_payload_size = n * TS_PACKET_SIZE;
815 s->read_buf_index = 0;
817 if (st->codec->codec_type == CODEC_TYPE_AUDIO) {
818 av_set_pts_info(st, 32, 1, st->codec->sample_rate);
827 /* send an rtcp sender report packet */
828 static void rtcp_send_sr(AVFormatContext *s1, int64_t ntp_time)
830 RTPDemuxContext *s = s1->priv_data;
834 printf("RTCP: %02x %"PRIx64" %x\n", s->payload_type, ntp_time, s->timestamp);
837 if (s->first_rtcp_ntp_time == AV_NOPTS_VALUE) s->first_rtcp_ntp_time = ntp_time;
838 s->last_rtcp_ntp_time = ntp_time;
839 rtp_ts = av_rescale_q(ntp_time - s->first_rtcp_ntp_time, AV_TIME_BASE_Q,
840 s1->streams[0]->time_base) + s->base_timestamp;
841 put_byte(s1->pb, (RTP_VERSION << 6));
842 put_byte(s1->pb, 200);
843 put_be16(s1->pb, 6); /* length in words - 1 */
844 put_be32(s1->pb, s->ssrc);
845 put_be32(s1->pb, ntp_time / 1000000);
846 put_be32(s1->pb, ((ntp_time % 1000000) << 32) / 1000000);
847 put_be32(s1->pb, rtp_ts);
848 put_be32(s1->pb, s->packet_count);
849 put_be32(s1->pb, s->octet_count);
850 put_flush_packet(s1->pb);
853 /* send an rtp packet. sequence number is incremented, but the caller
854 must update the timestamp itself */
855 void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m)
857 RTPDemuxContext *s = s1->priv_data;
860 printf("rtp_send_data size=%d\n", len);
863 /* build the RTP header */
864 put_byte(s1->pb, (RTP_VERSION << 6));
865 put_byte(s1->pb, (s->payload_type & 0x7f) | ((m & 0x01) << 7));
866 put_be16(s1->pb, s->seq);
867 put_be32(s1->pb, s->timestamp);
868 put_be32(s1->pb, s->ssrc);
870 put_buffer(s1->pb, buf1, len);
871 put_flush_packet(s1->pb);
874 s->octet_count += len;
878 /* send an integer number of samples and compute time stamp and fill
879 the rtp send buffer before sending. */
880 static void rtp_send_samples(AVFormatContext *s1,
881 const uint8_t *buf1, int size, int sample_size)
883 RTPDemuxContext *s = s1->priv_data;
884 int len, max_packet_size, n;
886 max_packet_size = (s->max_payload_size / sample_size) * sample_size;
887 /* not needed, but who nows */
888 if ((size % sample_size) != 0)
893 len = FFMIN(max_packet_size, size);
896 memcpy(s->buf_ptr, buf1, len);
900 s->timestamp = s->cur_timestamp + n / sample_size;
901 ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 0);
902 n += (s->buf_ptr - s->buf);
906 /* NOTE: we suppose that exactly one frame is given as argument here */
908 static void rtp_send_mpegaudio(AVFormatContext *s1,
909 const uint8_t *buf1, int size)
911 RTPDemuxContext *s = s1->priv_data;
912 int len, count, max_packet_size;
914 max_packet_size = s->max_payload_size;
916 /* test if we must flush because not enough space */
917 len = (s->buf_ptr - s->buf);
918 if ((len + size) > max_packet_size) {
920 ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 0);
921 s->buf_ptr = s->buf + 4;
924 if (s->buf_ptr == s->buf + 4) {
925 s->timestamp = s->cur_timestamp;
929 if (size > max_packet_size) {
930 /* big packet: fragment */
933 len = max_packet_size - 4;
936 /* build fragmented packet */
939 s->buf[2] = count >> 8;
941 memcpy(s->buf + 4, buf1, len);
942 ff_rtp_send_data(s1, s->buf, len + 4, 0);
948 if (s->buf_ptr == s->buf + 4) {
949 /* no fragmentation possible */
955 memcpy(s->buf_ptr, buf1, size);
960 static void rtp_send_raw(AVFormatContext *s1,
961 const uint8_t *buf1, int size)
963 RTPDemuxContext *s = s1->priv_data;
964 int len, max_packet_size;
966 max_packet_size = s->max_payload_size;
969 len = max_packet_size;
973 s->timestamp = s->cur_timestamp;
974 ff_rtp_send_data(s1, buf1, len, (len == size));
981 /* NOTE: size is assumed to be an integer multiple of TS_PACKET_SIZE */
982 static void rtp_send_mpegts_raw(AVFormatContext *s1,
983 const uint8_t *buf1, int size)
985 RTPDemuxContext *s = s1->priv_data;
988 while (size >= TS_PACKET_SIZE) {
989 len = s->max_payload_size - (s->buf_ptr - s->buf);
992 memcpy(s->buf_ptr, buf1, len);
997 out_len = s->buf_ptr - s->buf;
998 if (out_len >= s->max_payload_size) {
999 ff_rtp_send_data(s1, s->buf, out_len, 0);
1000 s->buf_ptr = s->buf;
1005 /* write an RTP packet. 'buf1' must contain a single specific frame. */
1006 static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt)
1008 RTPDemuxContext *s = s1->priv_data;
1009 AVStream *st = s1->streams[0];
1011 int size= pkt->size;
1012 uint8_t *buf1= pkt->data;
1015 printf("%d: write len=%d\n", pkt->stream_index, size);
1018 /* XXX: mpeg pts hardcoded. RTCP send every 0.5 seconds */
1019 rtcp_bytes = ((s->octet_count - s->last_octet_count) * RTCP_TX_RATIO_NUM) /
1021 if (s->first_packet || ((rtcp_bytes >= RTCP_SR_SIZE) &&
1022 (av_gettime() - s->last_rtcp_ntp_time > 5000000))) {
1023 rtcp_send_sr(s1, av_gettime());
1024 s->last_octet_count = s->octet_count;
1025 s->first_packet = 0;
1027 s->cur_timestamp = s->base_timestamp + pkt->pts;
1029 switch(st->codec->codec_id) {
1030 case CODEC_ID_PCM_MULAW:
1031 case CODEC_ID_PCM_ALAW:
1032 case CODEC_ID_PCM_U8:
1033 case CODEC_ID_PCM_S8:
1034 rtp_send_samples(s1, buf1, size, 1 * st->codec->channels);
1036 case CODEC_ID_PCM_U16BE:
1037 case CODEC_ID_PCM_U16LE:
1038 case CODEC_ID_PCM_S16BE:
1039 case CODEC_ID_PCM_S16LE:
1040 rtp_send_samples(s1, buf1, size, 2 * st->codec->channels);
1044 rtp_send_mpegaudio(s1, buf1, size);
1046 case CODEC_ID_MPEG1VIDEO:
1047 case CODEC_ID_MPEG2VIDEO:
1048 ff_rtp_send_mpegvideo(s1, buf1, size);
1051 ff_rtp_send_aac(s1, buf1, size);
1053 case CODEC_ID_MPEG2TS:
1054 rtp_send_mpegts_raw(s1, buf1, size);
1057 /* better than nothing : send the codec raw data */
1058 rtp_send_raw(s1, buf1, size);
1064 AVOutputFormat rtp_muxer = {
1066 "RTP output format",
1069 sizeof(RTPDemuxContext),