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"
26 #include <sys/types.h>
27 #include <sys/socket.h>
28 #include <netinet/in.h>
30 # include <arpa/inet.h>
32 # include "barpainet.h"
39 /* TODO: - add RTCP statistics reporting (should be optional).
41 - add support for h263/mpeg4 packetized output : IDEA: send a
42 buffer to 'rtp_write_packet' contains all the packets for ONE
43 frame. Each packet should have a four byte header containing
44 the length in big endian format (same trick as
45 'url_open_dyn_packet_buf')
48 /* from http://www.iana.org/assignments/rtp-parameters last updated 05 January 2005 */
49 AVRtpPayloadType_t AVRtpPayloadTypes[]=
51 {0, "PCMU", CODEC_TYPE_AUDIO, CODEC_ID_PCM_MULAW, 8000, 1},
52 {1, "Reserved", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
53 {2, "Reserved", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
54 {3, "GSM", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
55 {4, "G723", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
56 {5, "DVI4", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
57 {6, "DVI4", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 16000, 1},
58 {7, "LPC", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
59 {8, "PCMA", CODEC_TYPE_AUDIO, CODEC_ID_PCM_ALAW, 8000, 1},
60 {9, "G722", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
61 {10, "L16", CODEC_TYPE_AUDIO, CODEC_ID_PCM_S16BE, 44100, 2},
62 {11, "L16", CODEC_TYPE_AUDIO, CODEC_ID_PCM_S16BE, 44100, 1},
63 {12, "QCELP", CODEC_TYPE_AUDIO, CODEC_ID_QCELP, 8000, 1},
64 {13, "CN", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
65 {14, "MPA", CODEC_TYPE_AUDIO, CODEC_ID_MP2, 90000, -1},
66 {15, "G728", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
67 {16, "DVI4", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 11025, 1},
68 {17, "DVI4", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 22050, 1},
69 {18, "G729", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1},
70 {19, "reserved", CODEC_TYPE_AUDIO, CODEC_ID_NONE, -1, -1},
71 {20, "unassigned", CODEC_TYPE_AUDIO, CODEC_ID_NONE, -1, -1},
72 {21, "unassigned", CODEC_TYPE_AUDIO, CODEC_ID_NONE, -1, -1},
73 {22, "unassigned", CODEC_TYPE_AUDIO, CODEC_ID_NONE, -1, -1},
74 {23, "unassigned", CODEC_TYPE_AUDIO, CODEC_ID_NONE, -1, -1},
75 {24, "unassigned", CODEC_TYPE_VIDEO, CODEC_ID_NONE, -1, -1},
76 {25, "CelB", CODEC_TYPE_VIDEO, CODEC_ID_NONE, 90000, -1},
77 {26, "JPEG", CODEC_TYPE_VIDEO, CODEC_ID_MJPEG, 90000, -1},
78 {27, "unassigned", CODEC_TYPE_VIDEO, CODEC_ID_NONE, -1, -1},
79 {28, "nv", CODEC_TYPE_VIDEO, CODEC_ID_NONE, 90000, -1},
80 {29, "unassigned", CODEC_TYPE_VIDEO, CODEC_ID_NONE, -1, -1},
81 {30, "unassigned", CODEC_TYPE_VIDEO, CODEC_ID_NONE, -1, -1},
82 {31, "H261", CODEC_TYPE_VIDEO, CODEC_ID_H261, 90000, -1},
83 {32, "MPV", CODEC_TYPE_VIDEO, CODEC_ID_MPEG1VIDEO, 90000, -1},
84 {33, "MP2T", CODEC_TYPE_DATA, CODEC_ID_MPEG2TS, 90000, -1},
85 {34, "H263", CODEC_TYPE_VIDEO, CODEC_ID_H263, 90000, -1},
86 {35, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
87 {36, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
88 {37, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
89 {38, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
90 {39, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
91 {40, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
92 {41, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
93 {42, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
94 {43, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
95 {44, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
96 {45, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
97 {46, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
98 {47, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
99 {48, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
100 {49, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
101 {50, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
102 {51, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
103 {52, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
104 {53, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
105 {54, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
106 {55, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
107 {56, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
108 {57, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
109 {58, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
110 {59, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
111 {60, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
112 {61, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
113 {62, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
114 {63, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
115 {64, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
116 {65, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
117 {66, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
118 {67, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
119 {68, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
120 {69, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
121 {70, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
122 {71, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
123 {72, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
124 {73, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
125 {74, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
126 {75, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
127 {76, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
128 {77, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
129 {78, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
130 {79, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
131 {80, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
132 {81, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
133 {82, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
134 {83, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
135 {84, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
136 {85, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
137 {86, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
138 {87, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
139 {88, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
140 {89, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
141 {90, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
142 {91, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
143 {92, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
144 {93, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
145 {94, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
146 {95, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
147 {96, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
148 {97, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
149 {98, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
150 {99, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
151 {100, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
152 {101, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
153 {102, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
154 {103, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
155 {104, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
156 {105, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
157 {106, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
158 {107, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
159 {108, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
160 {109, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
161 {110, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
162 {111, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
163 {112, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
164 {113, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
165 {114, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
166 {115, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
167 {116, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
168 {117, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
169 {118, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
170 {119, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
171 {120, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
172 {121, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
173 {122, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
174 {123, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
175 {124, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
176 {125, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
177 {126, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
178 {127, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1},
179 {-1, "", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}
182 AVRtpDynamicPayloadType_t AVRtpDynamicPayloadTypes[]=
184 {"MP4V-ES", CODEC_TYPE_VIDEO, CODEC_ID_MPEG4},
185 {"mpeg4-generic", CODEC_TYPE_AUDIO, CODEC_ID_MPEG4AAC},
186 {"", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE}
189 struct RTPDemuxContext {
196 uint32_t base_timestamp;
197 uint32_t cur_timestamp;
198 int max_payload_size;
199 MpegTSContext *ts; /* only used for MP2T payloads */
203 /* rtcp sender statistics receive */
204 int64_t last_rtcp_ntp_time;
205 int64_t first_rtcp_ntp_time;
206 uint32_t last_rtcp_timestamp;
207 /* rtcp sender statistics */
208 unsigned int packet_count;
209 unsigned int octet_count;
210 unsigned int last_octet_count;
212 /* buffer for output */
213 uint8_t buf[RTP_MAX_PACKET_LENGTH];
215 /* special infos for au headers parsing */
216 rtp_payload_data_t *rtp_payload_data;
219 int rtp_get_codec_info(AVCodecContext *codec, int payload_type)
221 if (AVRtpPayloadTypes[payload_type].codec_id != CODEC_ID_NONE) {
222 codec->codec_type = AVRtpPayloadTypes[payload_type].codec_type;
223 codec->codec_id = AVRtpPayloadTypes[payload_type].codec_id;
224 if (AVRtpPayloadTypes[payload_type].audio_channels > 0)
225 codec->channels = AVRtpPayloadTypes[payload_type].audio_channels;
226 if (AVRtpPayloadTypes[payload_type].clock_rate > 0)
227 codec->sample_rate = AVRtpPayloadTypes[payload_type].clock_rate;
233 /* return < 0 if unknown payload type */
234 int rtp_get_payload_type(AVCodecContext *codec)
238 /* compute the payload type */
239 for (payload_type = -1, i = 0; AVRtpPayloadTypes[i].pt >= 0; ++i)
240 if (AVRtpPayloadTypes[i].codec_id == codec->codec_id) {
241 if (codec->codec_id == CODEC_ID_PCM_S16BE)
242 if (codec->channels != AVRtpPayloadTypes[i].audio_channels)
244 payload_type = AVRtpPayloadTypes[i].pt;
249 static inline uint32_t decode_be32(const uint8_t *p)
251 return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
254 static inline uint64_t decode_be64(const uint8_t *p)
256 return ((uint64_t)decode_be32(p) << 32) | decode_be32(p + 4);
259 static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int len)
263 s->last_rtcp_ntp_time = decode_be64(buf + 8);
264 if (s->first_rtcp_ntp_time == AV_NOPTS_VALUE)
265 s->first_rtcp_ntp_time = s->last_rtcp_ntp_time;
266 s->last_rtcp_timestamp = decode_be32(buf + 16);
271 * open a new RTP parse context for stream 'st'. 'st' can be NULL for
272 * MPEG2TS streams to indicate that they should be demuxed inside the
273 * rtp demux (otherwise CODEC_ID_MPEG2TS packets are returned)
275 RTPDemuxContext *rtp_parse_open(AVFormatContext *s1, AVStream *st, int payload_type, rtp_payload_data_t *rtp_payload_data)
279 s = av_mallocz(sizeof(RTPDemuxContext));
282 s->payload_type = payload_type;
283 s->last_rtcp_ntp_time = AV_NOPTS_VALUE;
284 s->first_rtcp_ntp_time = AV_NOPTS_VALUE;
287 s->rtp_payload_data = rtp_payload_data;
288 if (!strcmp(AVRtpPayloadTypes[payload_type].enc_name, "MP2T")) {
289 s->ts = mpegts_parse_open(s->ic);
295 switch(st->codec->codec_id) {
296 case CODEC_ID_MPEG1VIDEO:
297 case CODEC_ID_MPEG2VIDEO:
301 st->need_parsing = 1;
310 static int rtp_parse_mp4_au(RTPDemuxContext *s, const uint8_t *buf)
312 int au_headers_length, au_header_size, i;
313 GetBitContext getbitcontext;
314 rtp_payload_data_t *infos;
316 infos = s->rtp_payload_data;
321 /* decode the first 2 bytes where are stored the AUHeader sections
323 au_headers_length = BE_16(buf);
325 if (au_headers_length > RTP_MAX_PACKET_LENGTH)
328 infos->au_headers_length_bytes = (au_headers_length + 7) / 8;
330 /* skip AU headers length section (2 bytes) */
333 init_get_bits(&getbitcontext, buf, infos->au_headers_length_bytes * 8);
335 /* XXX: Wrong if optionnal additional sections are present (cts, dts etc...) */
336 au_header_size = infos->sizelength + infos->indexlength;
337 if (au_header_size <= 0 || (au_headers_length % au_header_size != 0))
340 infos->nb_au_headers = au_headers_length / au_header_size;
341 infos->au_headers = av_malloc(sizeof(struct AUHeaders) * infos->nb_au_headers);
343 /* XXX: We handle multiple AU Section as only one (need to fix this for interleaving)
344 In my test, the faad decoder doesnt behave correctly when sending each AU one by one
345 but does when sending the whole as one big packet... */
346 infos->au_headers[0].size = 0;
347 infos->au_headers[0].index = 0;
348 for (i = 0; i < infos->nb_au_headers; ++i) {
349 infos->au_headers[0].size += get_bits_long(&getbitcontext, infos->sizelength);
350 infos->au_headers[0].index = get_bits_long(&getbitcontext, infos->indexlength);
353 infos->nb_au_headers = 1;
359 * Parse an RTP or RTCP packet directly sent as a buffer.
360 * @param s RTP parse context.
361 * @param pkt returned packet
362 * @param buf input buffer or NULL to read the next packets
363 * @param len buffer len
364 * @return 0 if a packet is returned, 1 if a packet is returned and more can follow
365 * (use buf as NULL to read the next). -1 if no packet (error or no more packet).
367 int rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt,
368 const uint8_t *buf, int len)
370 unsigned int ssrc, h;
371 int payload_type, seq, delta_timestamp, ret;
376 /* return the next packets, if any */
377 if (s->read_buf_index >= s->read_buf_size)
379 ret = mpegts_parse_packet(s->ts, pkt, s->buf + s->read_buf_index,
380 s->read_buf_size - s->read_buf_index);
383 s->read_buf_index += ret;
384 if (s->read_buf_index < s->read_buf_size)
393 if ((buf[0] & 0xc0) != (RTP_VERSION << 6))
395 if (buf[1] >= 200 && buf[1] <= 204) {
396 rtcp_parse_packet(s, buf, len);
399 payload_type = buf[1] & 0x7f;
400 seq = (buf[2] << 8) | buf[3];
401 timestamp = decode_be32(buf + 4);
402 ssrc = decode_be32(buf + 8);
404 /* NOTE: we can handle only one payload type */
405 if (s->payload_type != payload_type)
409 #if defined(DEBUG) || 1
410 if (seq != ((s->seq + 1) & 0xffff)) {
411 av_log(st?st->codec:NULL, AV_LOG_ERROR, "RTP: PT=%02x: bad cseq %04x expected=%04x\n",
412 payload_type, seq, ((s->seq + 1) & 0xffff));
420 /* specific MPEG2TS demux support */
421 ret = mpegts_parse_packet(s->ts, pkt, buf, len);
425 s->read_buf_size = len - ret;
426 memcpy(s->buf, buf + ret, s->read_buf_size);
427 s->read_buf_index = 0;
431 switch(st->codec->codec_id) {
433 /* better than nothing: skip mpeg audio RTP header */
436 h = decode_be32(buf);
439 av_new_packet(pkt, len);
440 memcpy(pkt->data, buf, len);
442 case CODEC_ID_MPEG1VIDEO:
443 /* better than nothing: skip mpeg video RTP header */
446 h = decode_be32(buf);
456 av_new_packet(pkt, len);
457 memcpy(pkt->data, buf, len);
460 av_new_packet(pkt, len);
461 memcpy(pkt->data, buf, len);
465 switch(st->codec->codec_id) {
467 case CODEC_ID_MPEG1VIDEO:
468 if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE) {
470 /* XXX: is it really necessary to unify the timestamp base ? */
471 /* compute pts from timestamp with received ntp_time */
472 delta_timestamp = timestamp - s->last_rtcp_timestamp;
473 /* convert to 90 kHz without overflow */
474 addend = (s->last_rtcp_ntp_time - s->first_rtcp_ntp_time) >> 14;
475 addend = (addend * 5625) >> 14;
476 pkt->pts = addend + delta_timestamp;
480 pkt->pts = timestamp;
482 case CODEC_ID_MPEG4AAC:
483 if (rtp_parse_mp4_au(s, buf))
486 rtp_payload_data_t *infos = s->rtp_payload_data;
489 buf += infos->au_headers_length_bytes + 2;
490 len -= infos->au_headers_length_bytes + 2;
492 /* XXX: Fixme we only handle the case where rtp_parse_mp4_au define
494 av_new_packet(pkt, infos->au_headers[0].size);
495 memcpy(pkt->data, buf, infos->au_headers[0].size);
496 buf += infos->au_headers[0].size;
497 len -= infos->au_headers[0].size;
499 s->read_buf_size = len;
501 pkt->stream_index = s->st->index;
504 /* no timestamp info yet */
507 pkt->stream_index = s->st->index;
512 void rtp_parse_close(RTPDemuxContext *s)
514 if (!strcmp(AVRtpPayloadTypes[s->payload_type].enc_name, "MP2T")) {
515 mpegts_parse_close(s->ts);
522 static int rtp_write_header(AVFormatContext *s1)
524 RTPDemuxContext *s = s1->priv_data;
525 int payload_type, max_packet_size, n;
528 if (s1->nb_streams != 1)
532 payload_type = rtp_get_payload_type(st->codec);
533 if (payload_type < 0)
534 payload_type = RTP_PT_PRIVATE; /* private payload type */
535 s->payload_type = payload_type;
537 // following 2 FIXMies could be set based on the current time, theres normaly no info leak, as rtp will likely be transmitted immedeatly
538 s->base_timestamp = 0; /* FIXME: was random(), what should this be? */
539 s->timestamp = s->base_timestamp;
540 s->ssrc = 0; /* FIXME: was random(), what should this be? */
543 max_packet_size = url_fget_max_packet_size(&s1->pb);
544 if (max_packet_size <= 12)
546 s->max_payload_size = max_packet_size - 12;
548 switch(st->codec->codec_id) {
551 s->buf_ptr = s->buf + 4;
552 s->cur_timestamp = 0;
554 case CODEC_ID_MPEG1VIDEO:
555 s->cur_timestamp = 0;
557 case CODEC_ID_MPEG2TS:
558 n = s->max_payload_size / TS_PACKET_SIZE;
561 s->max_payload_size = n * TS_PACKET_SIZE;
572 /* send an rtcp sender report packet */
573 static void rtcp_send_sr(AVFormatContext *s1, int64_t ntp_time)
575 RTPDemuxContext *s = s1->priv_data;
577 printf("RTCP: %02x %Lx %x\n", s->payload_type, ntp_time, s->timestamp);
579 put_byte(&s1->pb, (RTP_VERSION << 6));
580 put_byte(&s1->pb, 200);
581 put_be16(&s1->pb, 6); /* length in words - 1 */
582 put_be32(&s1->pb, s->ssrc);
583 put_be64(&s1->pb, ntp_time);
584 put_be32(&s1->pb, s->timestamp);
585 put_be32(&s1->pb, s->packet_count);
586 put_be32(&s1->pb, s->octet_count);
587 put_flush_packet(&s1->pb);
590 /* send an rtp packet. sequence number is incremented, but the caller
591 must update the timestamp itself */
592 static void rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m)
594 RTPDemuxContext *s = s1->priv_data;
597 printf("rtp_send_data size=%d\n", len);
600 /* build the RTP header */
601 put_byte(&s1->pb, (RTP_VERSION << 6));
602 put_byte(&s1->pb, (s->payload_type & 0x7f) | ((m & 0x01) << 7));
603 put_be16(&s1->pb, s->seq);
604 put_be32(&s1->pb, s->timestamp);
605 put_be32(&s1->pb, s->ssrc);
607 put_buffer(&s1->pb, buf1, len);
608 put_flush_packet(&s1->pb);
611 s->octet_count += len;
615 /* send an integer number of samples and compute time stamp and fill
616 the rtp send buffer before sending. */
617 static void rtp_send_samples(AVFormatContext *s1,
618 const uint8_t *buf1, int size, int sample_size)
620 RTPDemuxContext *s = s1->priv_data;
621 int len, max_packet_size, n;
623 max_packet_size = (s->max_payload_size / sample_size) * sample_size;
624 /* not needed, but who nows */
625 if ((size % sample_size) != 0)
628 len = (max_packet_size - (s->buf_ptr - s->buf));
633 memcpy(s->buf_ptr, buf1, len);
637 n = (s->buf_ptr - s->buf);
638 /* if buffer full, then send it */
639 if (n >= max_packet_size) {
640 rtp_send_data(s1, s->buf, n, 0);
642 /* update timestamp */
643 s->timestamp += n / sample_size;
648 /* NOTE: we suppose that exactly one frame is given as argument here */
650 static void rtp_send_mpegaudio(AVFormatContext *s1,
651 const uint8_t *buf1, int size)
653 RTPDemuxContext *s = s1->priv_data;
654 AVStream *st = s1->streams[0];
655 int len, count, max_packet_size;
657 max_packet_size = s->max_payload_size;
659 /* test if we must flush because not enough space */
660 len = (s->buf_ptr - s->buf);
661 if ((len + size) > max_packet_size) {
663 rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 0);
664 s->buf_ptr = s->buf + 4;
665 /* 90 KHz time stamp */
666 s->timestamp = s->base_timestamp +
667 (s->cur_timestamp * 90000LL) / st->codec->sample_rate;
672 if (size > max_packet_size) {
673 /* big packet: fragment */
676 len = max_packet_size - 4;
679 /* build fragmented packet */
682 s->buf[2] = count >> 8;
684 memcpy(s->buf + 4, buf1, len);
685 rtp_send_data(s1, s->buf, len + 4, 0);
691 if (s->buf_ptr == s->buf + 4) {
692 /* no fragmentation possible */
698 memcpy(s->buf_ptr, buf1, size);
701 s->cur_timestamp += st->codec->frame_size;
704 /* NOTE: a single frame must be passed with sequence header if
705 needed. XXX: use slices. */
706 static void rtp_send_mpegvideo(AVFormatContext *s1,
707 const uint8_t *buf1, int size)
709 RTPDemuxContext *s = s1->priv_data;
710 AVStream *st = s1->streams[0];
711 int len, h, max_packet_size;
714 max_packet_size = s->max_payload_size;
717 /* XXX: more correct headers */
719 if (st->codec->sub_id == 2)
720 h |= 1 << 26; /* mpeg 2 indicator */
727 if (st->codec->sub_id == 2) {
735 len = max_packet_size - (q - s->buf);
739 memcpy(q, buf1, len);
742 /* 90 KHz time stamp */
743 s->timestamp = s->base_timestamp +
744 av_rescale((int64_t)s->cur_timestamp * st->codec->time_base.num, 90000, st->codec->time_base.den); //FIXME pass timestamps
745 rtp_send_data(s1, s->buf, q - s->buf, (len == size));
753 static void rtp_send_raw(AVFormatContext *s1,
754 const uint8_t *buf1, int size)
756 RTPDemuxContext *s = s1->priv_data;
757 AVStream *st = s1->streams[0];
758 int len, max_packet_size;
760 max_packet_size = s->max_payload_size;
763 len = max_packet_size;
767 /* 90 KHz time stamp */
768 s->timestamp = s->base_timestamp +
769 av_rescale((int64_t)s->cur_timestamp * st->codec->time_base.num, 90000, st->codec->time_base.den); //FIXME pass timestamps
770 rtp_send_data(s1, buf1, len, (len == size));
778 /* NOTE: size is assumed to be an integer multiple of TS_PACKET_SIZE */
779 static void rtp_send_mpegts_raw(AVFormatContext *s1,
780 const uint8_t *buf1, int size)
782 RTPDemuxContext *s = s1->priv_data;
785 while (size >= TS_PACKET_SIZE) {
786 len = s->max_payload_size - (s->buf_ptr - s->buf);
789 memcpy(s->buf_ptr, buf1, len);
794 out_len = s->buf_ptr - s->buf;
795 if (out_len >= s->max_payload_size) {
796 rtp_send_data(s1, s->buf, out_len, 0);
802 /* write an RTP packet. 'buf1' must contain a single specific frame. */
803 static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt)
805 RTPDemuxContext *s = s1->priv_data;
806 AVStream *st = s1->streams[0];
810 uint8_t *buf1= pkt->data;
813 printf("%d: write len=%d\n", pkt->stream_index, size);
816 /* XXX: mpeg pts hardcoded. RTCP send every 0.5 seconds */
817 rtcp_bytes = ((s->octet_count - s->last_octet_count) * RTCP_TX_RATIO_NUM) /
819 if (s->first_packet || rtcp_bytes >= 28) {
820 /* compute NTP time */
821 /* XXX: 90 kHz timestamp hardcoded */
822 ntp_time = (pkt->pts << 28) / 5625;
823 rtcp_send_sr(s1, ntp_time);
824 s->last_octet_count = s->octet_count;
828 switch(st->codec->codec_id) {
829 case CODEC_ID_PCM_MULAW:
830 case CODEC_ID_PCM_ALAW:
831 case CODEC_ID_PCM_U8:
832 case CODEC_ID_PCM_S8:
833 rtp_send_samples(s1, buf1, size, 1 * st->codec->channels);
835 case CODEC_ID_PCM_U16BE:
836 case CODEC_ID_PCM_U16LE:
837 case CODEC_ID_PCM_S16BE:
838 case CODEC_ID_PCM_S16LE:
839 rtp_send_samples(s1, buf1, size, 2 * st->codec->channels);
843 rtp_send_mpegaudio(s1, buf1, size);
845 case CODEC_ID_MPEG1VIDEO:
846 rtp_send_mpegvideo(s1, buf1, size);
848 case CODEC_ID_MPEG2TS:
849 rtp_send_mpegts_raw(s1, buf1, size);
852 /* better than nothing : send the codec raw data */
853 rtp_send_raw(s1, buf1, size);
859 static int rtp_write_trailer(AVFormatContext *s1)
861 // RTPDemuxContext *s = s1->priv_data;
865 AVOutputFormat rtp_muxer = {
870 sizeof(RTPDemuxContext),