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