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