Mercurial > libavformat.hg
comparison rtpdec.c @ 2891:a6c922b05571 libavformat
Split the RTP demuxing functions out of rtp.c, to simplify the RTP muxer's dependencies
author | lucabe |
---|---|
date | Fri, 04 Jan 2008 19:33:50 +0000 |
parents | rtp.c@dd1fbe36d103 |
children | 62ff44e23c10 |
comparison
equal
deleted
inserted
replaced
2890:31199df992f8 | 2891:a6c922b05571 |
---|---|
1 /* | |
2 * RTP input format | |
3 * Copyright (c) 2002 Fabrice Bellard. | |
4 * | |
5 * This file is part of FFmpeg. | |
6 * | |
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. | |
11 * | |
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. | |
16 * | |
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 | |
20 */ | |
21 #include "avformat.h" | |
22 #include "mpegts.h" | |
23 #include "bitstream.h" | |
24 | |
25 #include <unistd.h> | |
26 #include "network.h" | |
27 | |
28 #include "rtp_internal.h" | |
29 #include "rtp_h264.h" | |
30 | |
31 //#define DEBUG | |
32 | |
33 /* TODO: - add RTCP statistics reporting (should be optional). | |
34 | |
35 - add support for h263/mpeg4 packetized output : IDEA: send a | |
36 buffer to 'rtp_write_packet' contains all the packets for ONE | |
37 frame. Each packet should have a four byte header containing | |
38 the length in big endian format (same trick as | |
39 'url_open_dyn_packet_buf') | |
40 */ | |
41 | |
42 /* statistics functions */ | |
43 RTPDynamicProtocolHandler *RTPFirstDynamicPayloadHandler= NULL; | |
44 | |
45 static RTPDynamicProtocolHandler mp4v_es_handler= {"MP4V-ES", CODEC_TYPE_VIDEO, CODEC_ID_MPEG4}; | |
46 static RTPDynamicProtocolHandler mpeg4_generic_handler= {"mpeg4-generic", CODEC_TYPE_AUDIO, CODEC_ID_AAC}; | |
47 | |
48 static void register_dynamic_payload_handler(RTPDynamicProtocolHandler *handler) | |
49 { | |
50 handler->next= RTPFirstDynamicPayloadHandler; | |
51 RTPFirstDynamicPayloadHandler= handler; | |
52 } | |
53 | |
54 void av_register_rtp_dynamic_payload_handlers(void) | |
55 { | |
56 register_dynamic_payload_handler(&mp4v_es_handler); | |
57 register_dynamic_payload_handler(&mpeg4_generic_handler); | |
58 register_dynamic_payload_handler(&ff_h264_dynamic_handler); | |
59 } | |
60 | |
61 static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int len) | |
62 { | |
63 if (buf[1] != 200) | |
64 return -1; | |
65 s->last_rtcp_ntp_time = AV_RB64(buf + 8); | |
66 if (s->first_rtcp_ntp_time == AV_NOPTS_VALUE) | |
67 s->first_rtcp_ntp_time = s->last_rtcp_ntp_time; | |
68 s->last_rtcp_timestamp = AV_RB32(buf + 16); | |
69 return 0; | |
70 } | |
71 | |
72 #define RTP_SEQ_MOD (1<<16) | |
73 | |
74 /** | |
75 * called on parse open packet | |
76 */ | |
77 static void rtp_init_statistics(RTPStatistics *s, uint16_t base_sequence) // called on parse open packet. | |
78 { | |
79 memset(s, 0, sizeof(RTPStatistics)); | |
80 s->max_seq= base_sequence; | |
81 s->probation= 1; | |
82 } | |
83 | |
84 /** | |
85 * called whenever there is a large jump in sequence numbers, or when they get out of probation... | |
86 */ | |
87 static void rtp_init_sequence(RTPStatistics *s, uint16_t seq) | |
88 { | |
89 s->max_seq= seq; | |
90 s->cycles= 0; | |
91 s->base_seq= seq -1; | |
92 s->bad_seq= RTP_SEQ_MOD + 1; | |
93 s->received= 0; | |
94 s->expected_prior= 0; | |
95 s->received_prior= 0; | |
96 s->jitter= 0; | |
97 s->transit= 0; | |
98 } | |
99 | |
100 /** | |
101 * returns 1 if we should handle this packet. | |
102 */ | |
103 static int rtp_valid_packet_in_sequence(RTPStatistics *s, uint16_t seq) | |
104 { | |
105 uint16_t udelta= seq - s->max_seq; | |
106 const int MAX_DROPOUT= 3000; | |
107 const int MAX_MISORDER = 100; | |
108 const int MIN_SEQUENTIAL = 2; | |
109 | |
110 /* source not valid until MIN_SEQUENTIAL packets with sequence seq. numbers have been received */ | |
111 if(s->probation) | |
112 { | |
113 if(seq==s->max_seq + 1) { | |
114 s->probation--; | |
115 s->max_seq= seq; | |
116 if(s->probation==0) { | |
117 rtp_init_sequence(s, seq); | |
118 s->received++; | |
119 return 1; | |
120 } | |
121 } else { | |
122 s->probation= MIN_SEQUENTIAL - 1; | |
123 s->max_seq = seq; | |
124 } | |
125 } else if (udelta < MAX_DROPOUT) { | |
126 // in order, with permissible gap | |
127 if(seq < s->max_seq) { | |
128 //sequence number wrapped; count antother 64k cycles | |
129 s->cycles += RTP_SEQ_MOD; | |
130 } | |
131 s->max_seq= seq; | |
132 } else if (udelta <= RTP_SEQ_MOD - MAX_MISORDER) { | |
133 // sequence made a large jump... | |
134 if(seq==s->bad_seq) { | |
135 // two sequential packets-- assume that the other side restarted without telling us; just resync. | |
136 rtp_init_sequence(s, seq); | |
137 } else { | |
138 s->bad_seq= (seq + 1) & (RTP_SEQ_MOD-1); | |
139 return 0; | |
140 } | |
141 } else { | |
142 // duplicate or reordered packet... | |
143 } | |
144 s->received++; | |
145 return 1; | |
146 } | |
147 | |
148 #if 0 | |
149 /** | |
150 * This function is currently unused; without a valid local ntp time, I don't see how we could calculate the | |
151 * difference between the arrival and sent timestamp. As a result, the jitter and transit statistics values | |
152 * never change. I left this in in case someone else can see a way. (rdm) | |
153 */ | |
154 static void rtcp_update_jitter(RTPStatistics *s, uint32_t sent_timestamp, uint32_t arrival_timestamp) | |
155 { | |
156 uint32_t transit= arrival_timestamp - sent_timestamp; | |
157 int d; | |
158 s->transit= transit; | |
159 d= FFABS(transit - s->transit); | |
160 s->jitter += d - ((s->jitter + 8)>>4); | |
161 } | |
162 #endif | |
163 | |
164 int rtp_check_and_send_back_rr(RTPDemuxContext *s, int count) | |
165 { | |
166 ByteIOContext *pb; | |
167 uint8_t *buf; | |
168 int len; | |
169 int rtcp_bytes; | |
170 RTPStatistics *stats= &s->statistics; | |
171 uint32_t lost; | |
172 uint32_t extended_max; | |
173 uint32_t expected_interval; | |
174 uint32_t received_interval; | |
175 uint32_t lost_interval; | |
176 uint32_t expected; | |
177 uint32_t fraction; | |
178 uint64_t ntp_time= s->last_rtcp_ntp_time; // TODO: Get local ntp time? | |
179 | |
180 if (!s->rtp_ctx || (count < 1)) | |
181 return -1; | |
182 | |
183 /* TODO: I think this is way too often; RFC 1889 has algorithm for this */ | |
184 /* XXX: mpeg pts hardcoded. RTCP send every 0.5 seconds */ | |
185 s->octet_count += count; | |
186 rtcp_bytes = ((s->octet_count - s->last_octet_count) * RTCP_TX_RATIO_NUM) / | |
187 RTCP_TX_RATIO_DEN; | |
188 rtcp_bytes /= 50; // mmu_man: that's enough for me... VLC sends much less btw !? | |
189 if (rtcp_bytes < 28) | |
190 return -1; | |
191 s->last_octet_count = s->octet_count; | |
192 | |
193 if (url_open_dyn_buf(&pb) < 0) | |
194 return -1; | |
195 | |
196 // Receiver Report | |
197 put_byte(pb, (RTP_VERSION << 6) + 1); /* 1 report block */ | |
198 put_byte(pb, 201); | |
199 put_be16(pb, 7); /* length in words - 1 */ | |
200 put_be32(pb, s->ssrc); // our own SSRC | |
201 put_be32(pb, s->ssrc); // XXX: should be the server's here! | |
202 // some placeholders we should really fill... | |
203 // RFC 1889/p64 | |
204 extended_max= stats->cycles + stats->max_seq; | |
205 expected= extended_max - stats->base_seq + 1; | |
206 lost= expected - stats->received; | |
207 lost= FFMIN(lost, 0xffffff); // clamp it since it's only 24 bits... | |
208 expected_interval= expected - stats->expected_prior; | |
209 stats->expected_prior= expected; | |
210 received_interval= stats->received - stats->received_prior; | |
211 stats->received_prior= stats->received; | |
212 lost_interval= expected_interval - received_interval; | |
213 if (expected_interval==0 || lost_interval<=0) fraction= 0; | |
214 else fraction = (lost_interval<<8)/expected_interval; | |
215 | |
216 fraction= (fraction<<24) | lost; | |
217 | |
218 put_be32(pb, fraction); /* 8 bits of fraction, 24 bits of total packets lost */ | |
219 put_be32(pb, extended_max); /* max sequence received */ | |
220 put_be32(pb, stats->jitter>>4); /* jitter */ | |
221 | |
222 if(s->last_rtcp_ntp_time==AV_NOPTS_VALUE) | |
223 { | |
224 put_be32(pb, 0); /* last SR timestamp */ | |
225 put_be32(pb, 0); /* delay since last SR */ | |
226 } else { | |
227 uint32_t middle_32_bits= s->last_rtcp_ntp_time>>16; // this is valid, right? do we need to handle 64 bit values special? | |
228 uint32_t delay_since_last= ntp_time - s->last_rtcp_ntp_time; | |
229 | |
230 put_be32(pb, middle_32_bits); /* last SR timestamp */ | |
231 put_be32(pb, delay_since_last); /* delay since last SR */ | |
232 } | |
233 | |
234 // CNAME | |
235 put_byte(pb, (RTP_VERSION << 6) + 1); /* 1 report block */ | |
236 put_byte(pb, 202); | |
237 len = strlen(s->hostname); | |
238 put_be16(pb, (6 + len + 3) / 4); /* length in words - 1 */ | |
239 put_be32(pb, s->ssrc); | |
240 put_byte(pb, 0x01); | |
241 put_byte(pb, len); | |
242 put_buffer(pb, s->hostname, len); | |
243 // padding | |
244 for (len = (6 + len) % 4; len % 4; len++) { | |
245 put_byte(pb, 0); | |
246 } | |
247 | |
248 put_flush_packet(pb); | |
249 len = url_close_dyn_buf(pb, &buf); | |
250 if ((len > 0) && buf) { | |
251 int result; | |
252 #if defined(DEBUG) | |
253 printf("sending %d bytes of RR\n", len); | |
254 #endif | |
255 result= url_write(s->rtp_ctx, buf, len); | |
256 #if defined(DEBUG) | |
257 printf("result from url_write: %d\n", result); | |
258 #endif | |
259 av_free(buf); | |
260 } | |
261 return 0; | |
262 } | |
263 | |
264 /** | |
265 * open a new RTP parse context for stream 'st'. 'st' can be NULL for | |
266 * MPEG2TS streams to indicate that they should be demuxed inside the | |
267 * rtp demux (otherwise CODEC_ID_MPEG2TS packets are returned) | |
268 * TODO: change this to not take rtp_payload data, and use the new dynamic payload system. | |
269 */ | |
270 RTPDemuxContext *rtp_parse_open(AVFormatContext *s1, AVStream *st, URLContext *rtpc, int payload_type, rtp_payload_data_t *rtp_payload_data) | |
271 { | |
272 RTPDemuxContext *s; | |
273 | |
274 s = av_mallocz(sizeof(RTPDemuxContext)); | |
275 if (!s) | |
276 return NULL; | |
277 s->payload_type = payload_type; | |
278 s->last_rtcp_ntp_time = AV_NOPTS_VALUE; | |
279 s->first_rtcp_ntp_time = AV_NOPTS_VALUE; | |
280 s->ic = s1; | |
281 s->st = st; | |
282 s->rtp_payload_data = rtp_payload_data; | |
283 rtp_init_statistics(&s->statistics, 0); // do we know the initial sequence from sdp? | |
284 if (!strcmp(ff_rtp_enc_name(payload_type), "MP2T")) { | |
285 s->ts = mpegts_parse_open(s->ic); | |
286 if (s->ts == NULL) { | |
287 av_free(s); | |
288 return NULL; | |
289 } | |
290 } else { | |
291 switch(st->codec->codec_id) { | |
292 case CODEC_ID_MPEG1VIDEO: | |
293 case CODEC_ID_MPEG2VIDEO: | |
294 case CODEC_ID_MP2: | |
295 case CODEC_ID_MP3: | |
296 case CODEC_ID_MPEG4: | |
297 case CODEC_ID_H264: | |
298 st->need_parsing = AVSTREAM_PARSE_FULL; | |
299 break; | |
300 default: | |
301 break; | |
302 } | |
303 } | |
304 // needed to send back RTCP RR in RTSP sessions | |
305 s->rtp_ctx = rtpc; | |
306 gethostname(s->hostname, sizeof(s->hostname)); | |
307 return s; | |
308 } | |
309 | |
310 static int rtp_parse_mp4_au(RTPDemuxContext *s, const uint8_t *buf) | |
311 { | |
312 int au_headers_length, au_header_size, i; | |
313 GetBitContext getbitcontext; | |
314 rtp_payload_data_t *infos; | |
315 | |
316 infos = s->rtp_payload_data; | |
317 | |
318 if (infos == NULL) | |
319 return -1; | |
320 | |
321 /* decode the first 2 bytes where are stored the AUHeader sections | |
322 length in bits */ | |
323 au_headers_length = AV_RB16(buf); | |
324 | |
325 if (au_headers_length > RTP_MAX_PACKET_LENGTH) | |
326 return -1; | |
327 | |
328 infos->au_headers_length_bytes = (au_headers_length + 7) / 8; | |
329 | |
330 /* skip AU headers length section (2 bytes) */ | |
331 buf += 2; | |
332 | |
333 init_get_bits(&getbitcontext, buf, infos->au_headers_length_bytes * 8); | |
334 | |
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)) | |
338 return -1; | |
339 | |
340 infos->nb_au_headers = au_headers_length / au_header_size; | |
341 infos->au_headers = av_malloc(sizeof(struct AUHeaders) * infos->nb_au_headers); | |
342 | |
343 /* XXX: We handle multiple AU Section as only one (need to fix this for interleaving) | |
344 In my test, the FAAD decoder does not 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); | |
351 } | |
352 | |
353 infos->nb_au_headers = 1; | |
354 | |
355 return 0; | |
356 } | |
357 | |
358 /** | |
359 * This was the second switch in rtp_parse packet. Normalizes time, if required, sets stream_index, etc. | |
360 */ | |
361 static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp) | |
362 { | |
363 switch(s->st->codec->codec_id) { | |
364 case CODEC_ID_MP2: | |
365 case CODEC_ID_MPEG1VIDEO: | |
366 case CODEC_ID_MPEG2VIDEO: | |
367 if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE) { | |
368 int64_t addend; | |
369 | |
370 int delta_timestamp; | |
371 /* XXX: is it really necessary to unify the timestamp base ? */ | |
372 /* compute pts from timestamp with received ntp_time */ | |
373 delta_timestamp = timestamp - s->last_rtcp_timestamp; | |
374 /* convert to 90 kHz without overflow */ | |
375 addend = (s->last_rtcp_ntp_time - s->first_rtcp_ntp_time) >> 14; | |
376 addend = (addend * 5625) >> 14; | |
377 pkt->pts = addend + delta_timestamp; | |
378 } | |
379 break; | |
380 case CODEC_ID_AAC: | |
381 case CODEC_ID_H264: | |
382 case CODEC_ID_MPEG4: | |
383 pkt->pts = timestamp; | |
384 break; | |
385 default: | |
386 /* no timestamp info yet */ | |
387 break; | |
388 } | |
389 pkt->stream_index = s->st->index; | |
390 } | |
391 | |
392 /** | |
393 * Parse an RTP or RTCP packet directly sent as a buffer. | |
394 * @param s RTP parse context. | |
395 * @param pkt returned packet | |
396 * @param buf input buffer or NULL to read the next packets | |
397 * @param len buffer len | |
398 * @return 0 if a packet is returned, 1 if a packet is returned and more can follow | |
399 * (use buf as NULL to read the next). -1 if no packet (error or no more packet). | |
400 */ | |
401 int rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt, | |
402 const uint8_t *buf, int len) | |
403 { | |
404 unsigned int ssrc, h; | |
405 int payload_type, seq, ret; | |
406 AVStream *st; | |
407 uint32_t timestamp; | |
408 int rv= 0; | |
409 | |
410 if (!buf) { | |
411 /* return the next packets, if any */ | |
412 if(s->st && s->parse_packet) { | |
413 timestamp= 0; ///< Should not be used if buf is NULL, but should be set to the timestamp of the packet returned.... | |
414 rv= s->parse_packet(s, pkt, ×tamp, NULL, 0); | |
415 finalize_packet(s, pkt, timestamp); | |
416 return rv; | |
417 } else { | |
418 // TODO: Move to a dynamic packet handler (like above) | |
419 if (s->read_buf_index >= s->read_buf_size) | |
420 return -1; | |
421 ret = mpegts_parse_packet(s->ts, pkt, s->buf + s->read_buf_index, | |
422 s->read_buf_size - s->read_buf_index); | |
423 if (ret < 0) | |
424 return -1; | |
425 s->read_buf_index += ret; | |
426 if (s->read_buf_index < s->read_buf_size) | |
427 return 1; | |
428 else | |
429 return 0; | |
430 } | |
431 } | |
432 | |
433 if (len < 12) | |
434 return -1; | |
435 | |
436 if ((buf[0] & 0xc0) != (RTP_VERSION << 6)) | |
437 return -1; | |
438 if (buf[1] >= 200 && buf[1] <= 204) { | |
439 rtcp_parse_packet(s, buf, len); | |
440 return -1; | |
441 } | |
442 payload_type = buf[1] & 0x7f; | |
443 seq = AV_RB16(buf + 2); | |
444 timestamp = AV_RB32(buf + 4); | |
445 ssrc = AV_RB32(buf + 8); | |
446 /* store the ssrc in the RTPDemuxContext */ | |
447 s->ssrc = ssrc; | |
448 | |
449 /* NOTE: we can handle only one payload type */ | |
450 if (s->payload_type != payload_type) | |
451 return -1; | |
452 | |
453 st = s->st; | |
454 // only do something with this if all the rtp checks pass... | |
455 if(!rtp_valid_packet_in_sequence(&s->statistics, seq)) | |
456 { | |
457 av_log(st?st->codec:NULL, AV_LOG_ERROR, "RTP: PT=%02x: bad cseq %04x expected=%04x\n", | |
458 payload_type, seq, ((s->seq + 1) & 0xffff)); | |
459 return -1; | |
460 } | |
461 | |
462 s->seq = seq; | |
463 len -= 12; | |
464 buf += 12; | |
465 | |
466 if (!st) { | |
467 /* specific MPEG2TS demux support */ | |
468 ret = mpegts_parse_packet(s->ts, pkt, buf, len); | |
469 if (ret < 0) | |
470 return -1; | |
471 if (ret < len) { | |
472 s->read_buf_size = len - ret; | |
473 memcpy(s->buf, buf + ret, s->read_buf_size); | |
474 s->read_buf_index = 0; | |
475 return 1; | |
476 } | |
477 } else { | |
478 // at this point, the RTP header has been stripped; This is ASSUMING that there is only 1 CSRC, which in't wise. | |
479 switch(st->codec->codec_id) { | |
480 case CODEC_ID_MP2: | |
481 /* better than nothing: skip mpeg audio RTP header */ | |
482 if (len <= 4) | |
483 return -1; | |
484 h = AV_RB32(buf); | |
485 len -= 4; | |
486 buf += 4; | |
487 av_new_packet(pkt, len); | |
488 memcpy(pkt->data, buf, len); | |
489 break; | |
490 case CODEC_ID_MPEG1VIDEO: | |
491 case CODEC_ID_MPEG2VIDEO: | |
492 /* better than nothing: skip mpeg video RTP header */ | |
493 if (len <= 4) | |
494 return -1; | |
495 h = AV_RB32(buf); | |
496 buf += 4; | |
497 len -= 4; | |
498 if (h & (1 << 26)) { | |
499 /* mpeg2 */ | |
500 if (len <= 4) | |
501 return -1; | |
502 buf += 4; | |
503 len -= 4; | |
504 } | |
505 av_new_packet(pkt, len); | |
506 memcpy(pkt->data, buf, len); | |
507 break; | |
508 // moved from below, verbatim. this is because this section handles packets, and the lower switch handles | |
509 // timestamps. | |
510 // TODO: Put this into a dynamic packet handler... | |
511 case CODEC_ID_AAC: | |
512 if (rtp_parse_mp4_au(s, buf)) | |
513 return -1; | |
514 { | |
515 rtp_payload_data_t *infos = s->rtp_payload_data; | |
516 if (infos == NULL) | |
517 return -1; | |
518 buf += infos->au_headers_length_bytes + 2; | |
519 len -= infos->au_headers_length_bytes + 2; | |
520 | |
521 /* XXX: Fixme we only handle the case where rtp_parse_mp4_au define | |
522 one au_header */ | |
523 av_new_packet(pkt, infos->au_headers[0].size); | |
524 memcpy(pkt->data, buf, infos->au_headers[0].size); | |
525 buf += infos->au_headers[0].size; | |
526 len -= infos->au_headers[0].size; | |
527 } | |
528 s->read_buf_size = len; | |
529 rv= 0; | |
530 break; | |
531 default: | |
532 if(s->parse_packet) { | |
533 rv= s->parse_packet(s, pkt, ×tamp, buf, len); | |
534 } else { | |
535 av_new_packet(pkt, len); | |
536 memcpy(pkt->data, buf, len); | |
537 } | |
538 break; | |
539 } | |
540 | |
541 // now perform timestamp things.... | |
542 finalize_packet(s, pkt, timestamp); | |
543 } | |
544 return rv; | |
545 } | |
546 | |
547 void rtp_parse_close(RTPDemuxContext *s) | |
548 { | |
549 // TODO: fold this into the protocol specific data fields. | |
550 if (!strcmp(ff_rtp_enc_name(s->payload_type), "MP2T")) { | |
551 mpegts_parse_close(s->ts); | |
552 } | |
553 av_free(s); | |
554 } |