rtpdec.c 28.1 KB
Newer Older
1 2
/*
 * RTP input format
3
 * Copyright (c) 2002 Fabrice Bellard
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */
21

22
#include "libavutil/mathematics.h"
23
#include "libavutil/avstring.h"
24
#include "libavutil/time.h"
25
#include "libavcodec/get_bits.h"
26 27
#include "avformat.h"
#include "network.h"
28
#include "srtp.h"
29
#include "url.h"
30
#include "rtpdec.h"
31
#include "rtpdec_formats.h"
32

33 34
#define MIN_FEEDBACK_INTERVAL 200000 /* 200 ms in us */

35
static RTPDynamicProtocolHandler realmedia_mp3_dynamic_handler = {
36 37 38
    .enc_name   = "X-MP3-draft-00",
    .codec_type = AVMEDIA_TYPE_AUDIO,
    .codec_id   = AV_CODEC_ID_MP3ADU,
39 40
};

41
static RTPDynamicProtocolHandler speex_dynamic_handler = {
42 43 44
    .enc_name   = "speex",
    .codec_type = AVMEDIA_TYPE_AUDIO,
    .codec_id   = AV_CODEC_ID_SPEEX,
45 46
};

47
static RTPDynamicProtocolHandler opus_dynamic_handler = {
48 49 50
    .enc_name   = "opus",
    .codec_type = AVMEDIA_TYPE_AUDIO,
    .codec_id   = AV_CODEC_ID_OPUS,
51 52
};

53
static RTPDynamicProtocolHandler *rtp_first_dynamic_payload_handler = NULL;
54

55
void ff_register_dynamic_payload_handler(RTPDynamicProtocolHandler *handler)
56
{
57 58
    handler->next = rtp_first_dynamic_payload_handler;
    rtp_first_dynamic_payload_handler = handler;
59 60 61 62
}

void av_register_rtp_dynamic_payload_handlers(void)
{
63 64
    ff_register_dynamic_payload_handler(&ff_amr_nb_dynamic_handler);
    ff_register_dynamic_payload_handler(&ff_amr_wb_dynamic_handler);
65 66 67 68
    ff_register_dynamic_payload_handler(&ff_g726_16_dynamic_handler);
    ff_register_dynamic_payload_handler(&ff_g726_24_dynamic_handler);
    ff_register_dynamic_payload_handler(&ff_g726_32_dynamic_handler);
    ff_register_dynamic_payload_handler(&ff_g726_40_dynamic_handler);
69 70
    ff_register_dynamic_payload_handler(&ff_h263_1998_dynamic_handler);
    ff_register_dynamic_payload_handler(&ff_h263_2000_dynamic_handler);
71
    ff_register_dynamic_payload_handler(&ff_h263_rfc2190_dynamic_handler);
72
    ff_register_dynamic_payload_handler(&ff_h264_dynamic_handler);
73
    ff_register_dynamic_payload_handler(&ff_ilbc_dynamic_handler);
74
    ff_register_dynamic_payload_handler(&ff_jpeg_dynamic_handler);
75
    ff_register_dynamic_payload_handler(&ff_mp4a_latm_dynamic_handler);
76
    ff_register_dynamic_payload_handler(&ff_mp4v_es_dynamic_handler);
77 78
    ff_register_dynamic_payload_handler(&ff_mpeg_audio_dynamic_handler);
    ff_register_dynamic_payload_handler(&ff_mpeg_video_dynamic_handler);
79
    ff_register_dynamic_payload_handler(&ff_mpeg4_generic_dynamic_handler);
80
    ff_register_dynamic_payload_handler(&ff_mpegts_dynamic_handler);
81 82
    ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfv_handler);
    ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfa_handler);
83 84
    ff_register_dynamic_payload_handler(&ff_qcelp_dynamic_handler);
    ff_register_dynamic_payload_handler(&ff_qdm2_dynamic_handler);
85 86 87 88
    ff_register_dynamic_payload_handler(&ff_qt_rtp_aud_handler);
    ff_register_dynamic_payload_handler(&ff_qt_rtp_vid_handler);
    ff_register_dynamic_payload_handler(&ff_quicktime_rtp_aud_handler);
    ff_register_dynamic_payload_handler(&ff_quicktime_rtp_vid_handler);
89 90 91 92 93 94 95
    ff_register_dynamic_payload_handler(&ff_svq3_dynamic_handler);
    ff_register_dynamic_payload_handler(&ff_theora_dynamic_handler);
    ff_register_dynamic_payload_handler(&ff_vorbis_dynamic_handler);
    ff_register_dynamic_payload_handler(&ff_vp8_dynamic_handler);
    ff_register_dynamic_payload_handler(&opus_dynamic_handler);
    ff_register_dynamic_payload_handler(&realmedia_mp3_dynamic_handler);
    ff_register_dynamic_payload_handler(&speex_dynamic_handler);
96 97
}

98
RTPDynamicProtocolHandler *ff_rtp_handler_find_by_name(const char *name,
99
                                                       enum AVMediaType codec_type)
100 101
{
    RTPDynamicProtocolHandler *handler;
102
    for (handler = rtp_first_dynamic_payload_handler;
103
         handler; handler = handler->next)
104
        if (!av_strcasecmp(name, handler->enc_name) &&
105 106 107 108 109 110
            codec_type == handler->codec_type)
            return handler;
    return NULL;
}

RTPDynamicProtocolHandler *ff_rtp_handler_find_by_id(int id,
111
                                                     enum AVMediaType codec_type)
112 113
{
    RTPDynamicProtocolHandler *handler;
114
    for (handler = rtp_first_dynamic_payload_handler;
115 116 117 118 119 120 121
         handler; handler = handler->next)
        if (handler->static_payload_id && handler->static_payload_id == id &&
            codec_type == handler->codec_type)
            return handler;
    return NULL;
}

122 123
static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf,
                             int len)
124
{
125
    int payload_len;
126 127 128
    while (len >= 4) {
        payload_len = FFMIN(len, (AV_RB16(buf + 2) + 1) * 4);

129 130
        switch (buf[1]) {
        case RTCP_SR:
131
            if (payload_len < 20) {
132 133
                av_log(NULL, AV_LOG_ERROR,
                       "Invalid length for RTCP SR packet\n");
134 135 136
                return AVERROR_INVALIDDATA;
            }

137
            s->last_rtcp_reception_time = av_gettime();
138
            s->last_rtcp_ntp_time  = AV_RB64(buf + 8);
Josh Allmann's avatar
Josh Allmann committed
139
            s->last_rtcp_timestamp = AV_RB32(buf + 16);
140 141 142 143 144 145
            if (s->first_rtcp_ntp_time == AV_NOPTS_VALUE) {
                s->first_rtcp_ntp_time = s->last_rtcp_ntp_time;
                if (!s->base_timestamp)
                    s->base_timestamp = s->last_rtcp_timestamp;
                s->rtcp_ts_offset = s->last_rtcp_timestamp - s->base_timestamp;
            }
146 147

            break;
148 149
        case RTCP_BYE:
            return -RTCP_BYE;
150
        }
151 152 153

        buf += payload_len;
        len -= payload_len;
154
    }
155
    return -1;
156 157
}

158
#define RTP_SEQ_MOD (1 << 16)
159

160
static void rtp_init_statistics(RTPStatistics *s, uint16_t base_sequence)
161 162
{
    memset(s, 0, sizeof(RTPStatistics));
163 164
    s->max_seq   = base_sequence;
    s->probation = 1;
165 166
}

167
/*
168 169 170
 * Called whenever there is a large jump in sequence numbers,
 * or when they get out of probation...
 */
171 172
static void rtp_init_sequence(RTPStatistics *s, uint16_t seq)
{
173 174 175 176 177 178 179 180 181
    s->max_seq        = seq;
    s->cycles         = 0;
    s->base_seq       = seq - 1;
    s->bad_seq        = RTP_SEQ_MOD + 1;
    s->received       = 0;
    s->expected_prior = 0;
    s->received_prior = 0;
    s->jitter         = 0;
    s->transit        = 0;
182 183
}

184
/* Returns 1 if we should handle this packet. */
185 186
static int rtp_valid_packet_in_sequence(RTPStatistics *s, uint16_t seq)
{
187 188 189
    uint16_t udelta = seq - s->max_seq;
    const int MAX_DROPOUT    = 3000;
    const int MAX_MISORDER   = 100;
190 191
    const int MIN_SEQUENTIAL = 2;

192 193
    /* source not valid until MIN_SEQUENTIAL packets with sequence
     * seq. numbers have been received */
194 195
    if (s->probation) {
        if (seq == s->max_seq + 1) {
196
            s->probation--;
197 198
            s->max_seq = seq;
            if (s->probation == 0) {
199 200 201 202 203
                rtp_init_sequence(s, seq);
                s->received++;
                return 1;
            }
        } else {
204
            s->probation = MIN_SEQUENTIAL - 1;
205
            s->max_seq   = seq;
206 207 208
        }
    } else if (udelta < MAX_DROPOUT) {
        // in order, with permissible gap
209 210
        if (seq < s->max_seq) {
            // sequence number wrapped; count another 64k cycles
211 212
            s->cycles += RTP_SEQ_MOD;
        }
213
        s->max_seq = seq;
214 215
    } else if (udelta <= RTP_SEQ_MOD - MAX_MISORDER) {
        // sequence made a large jump...
216
        if (seq == s->bad_seq) {
217 218
            /* two sequential packets -- assume that the other side
             * restarted without telling us; just resync. */
219 220
            rtp_init_sequence(s, seq);
        } else {
221
            s->bad_seq = (seq + 1) & (RTP_SEQ_MOD - 1);
222 223 224 225 226 227 228 229 230
            return 0;
        }
    } else {
        // duplicate or reordered packet...
    }
    s->received++;
    return 1;
}

231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248
static void rtcp_update_jitter(RTPStatistics *s, uint32_t sent_timestamp,
                               uint32_t arrival_timestamp)
{
    // Most of this is pretty straight from RFC 3550 appendix A.8
    uint32_t transit = arrival_timestamp - sent_timestamp;
    uint32_t prev_transit = s->transit;
    int32_t d = transit - prev_transit;
    // Doing the FFABS() call directly on the "transit - prev_transit"
    // expression doesn't work, since it's an unsigned expression. Doing the
    // transit calculation in unsigned is desired though, since it most
    // probably will need to wrap around.
    d = FFABS(d);
    s->transit = transit;
    if (!prev_transit)
        return;
    s->jitter += d - (int32_t) ((s->jitter + 8) >> 4);
}

249 250
int ff_rtp_check_and_send_back_rr(RTPDemuxContext *s, URLContext *fd,
                                  AVIOContext *avio, int count)
251
{
252
    AVIOContext *pb;
253 254 255
    uint8_t *buf;
    int len;
    int rtcp_bytes;
256
    RTPStatistics *stats = &s->statistics;
257 258 259 260
    uint32_t lost;
    uint32_t extended_max;
    uint32_t expected_interval;
    uint32_t received_interval;
261
    int32_t  lost_interval;
262 263 264
    uint32_t expected;
    uint32_t fraction;

265
    if ((!fd && !avio) || (count < 1))
266 267 268
        return -1;

    /* TODO: I think this is way too often; RFC 1889 has algorithm for this */
269
    /* XXX: MPEG pts hardcoded. RTCP send every 0.5 seconds */
270 271 272 273 274 275 276 277
    s->octet_count += count;
    rtcp_bytes = ((s->octet_count - s->last_octet_count) * RTCP_TX_RATIO_NUM) /
        RTCP_TX_RATIO_DEN;
    rtcp_bytes /= 50; // mmu_man: that's enough for me... VLC sends much less btw !?
    if (rtcp_bytes < 28)
        return -1;
    s->last_octet_count = s->octet_count;

278 279 280
    if (!fd)
        pb = avio;
    else if (avio_open_dyn_buf(&pb) < 0)
281 282 283
        return -1;

    // Receiver Report
284 285 286
    avio_w8(pb, (RTP_VERSION << 6) + 1); /* 1 report block */
    avio_w8(pb, RTCP_RR);
    avio_wb16(pb, 7); /* length in words - 1 */
287
    // our own SSRC: we use the server's SSRC + 1 to avoid conflicts
288 289
    avio_wb32(pb, s->ssrc + 1);
    avio_wb32(pb, s->ssrc); // server SSRC
290 291
    // some placeholders we should really fill...
    // RFC 1889/p64
292
    extended_max          = stats->cycles + stats->max_seq;
293
    expected              = extended_max - stats->base_seq;
294 295 296
    lost                  = expected - stats->received;
    lost                  = FFMIN(lost, 0xffffff); // clamp it since it's only 24 bits...
    expected_interval     = expected - stats->expected_prior;
297
    stats->expected_prior = expected;
298
    received_interval     = stats->received - stats->received_prior;
299
    stats->received_prior = stats->received;
300
    lost_interval         = expected_interval - received_interval;
301 302 303 304 305 306
    if (expected_interval == 0 || lost_interval <= 0)
        fraction = 0;
    else
        fraction = (lost_interval << 8) / expected_interval;

    fraction = (fraction << 24) | lost;
307

308 309
    avio_wb32(pb, fraction); /* 8 bits of fraction, 24 bits of total packets lost */
    avio_wb32(pb, extended_max); /* max sequence received */
310
    avio_wb32(pb, stats->jitter >> 4); /* jitter */
311

312
    if (s->last_rtcp_ntp_time == AV_NOPTS_VALUE) {
313 314
        avio_wb32(pb, 0); /* last SR timestamp */
        avio_wb32(pb, 0); /* delay since last SR */
315
    } else {
316
        uint32_t middle_32_bits   = s->last_rtcp_ntp_time >> 16; // this is valid, right? do we need to handle 64 bit values special?
317 318
        uint32_t delay_since_last = av_rescale(av_gettime() - s->last_rtcp_reception_time,
                                               65536, AV_TIME_BASE);
319

320 321
        avio_wb32(pb, middle_32_bits); /* last SR timestamp */
        avio_wb32(pb, delay_since_last); /* delay since last SR */
322 323 324
    }

    // CNAME
325 326
    avio_w8(pb, (RTP_VERSION << 6) + 1); /* 1 report block */
    avio_w8(pb, RTCP_SDES);
327
    len = strlen(s->hostname);
328
    avio_wb16(pb, (7 + len + 3) / 4); /* length in words - 1 */
329
    avio_wb32(pb, s->ssrc + 1);
330 331 332
    avio_w8(pb, 0x01);
    avio_w8(pb, len);
    avio_write(pb, s->hostname, len);
333
    avio_w8(pb, 0); /* END */
334
    // padding
335
    for (len = (7 + len) % 4; len % 4; len++)
336
        avio_w8(pb, 0);
337

338
    avio_flush(pb);
339 340
    if (!fd)
        return 0;
341
    len = avio_close_dyn_buf(pb, &buf);
342
    if ((len > 0) && buf) {
343
        int av_unused result;
344
        av_dlog(s->ic, "sending %d bytes of RR\n", len);
345
        result = ffurl_write(fd, buf, len);
346
        av_dlog(s->ic, "result from ffurl_write: %d\n", result);
347 348 349 350 351
        av_free(buf);
    }
    return 0;
}

352
void ff_rtp_send_punch_packets(URLContext *rtp_handle)
353
{
354
    AVIOContext *pb;
355 356 357 358
    uint8_t *buf;
    int len;

    /* Send a small RTP packet */
359
    if (avio_open_dyn_buf(&pb) < 0)
360 361
        return;

362 363 364 365 366
    avio_w8(pb, (RTP_VERSION << 6));
    avio_w8(pb, 0); /* Payload type */
    avio_wb16(pb, 0); /* Seq */
    avio_wb32(pb, 0); /* Timestamp */
    avio_wb32(pb, 0); /* SSRC */
367

368
    avio_flush(pb);
369
    len = avio_close_dyn_buf(pb, &buf);
370
    if ((len > 0) && buf)
371
        ffurl_write(rtp_handle, buf, len);
372 373 374
    av_free(buf);

    /* Send a minimal RTCP RR */
375
    if (avio_open_dyn_buf(&pb) < 0)
376 377
        return;

378 379 380 381
    avio_w8(pb, (RTP_VERSION << 6));
    avio_w8(pb, RTCP_RR); /* receiver report */
    avio_wb16(pb, 1); /* length in words - 1 */
    avio_wb32(pb, 0); /* our own SSRC */
382

383
    avio_flush(pb);
384
    len = avio_close_dyn_buf(pb, &buf);
385
    if ((len > 0) && buf)
386
        ffurl_write(rtp_handle, buf, len);
387 388 389
    av_free(buf);
}

390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426
static int find_missing_packets(RTPDemuxContext *s, uint16_t *first_missing,
                                uint16_t *missing_mask)
{
    int i;
    uint16_t next_seq = s->seq + 1;
    RTPPacket *pkt = s->queue;

    if (!pkt || pkt->seq == next_seq)
        return 0;

    *missing_mask = 0;
    for (i = 1; i <= 16; i++) {
        uint16_t missing_seq = next_seq + i;
        while (pkt) {
            int16_t diff = pkt->seq - missing_seq;
            if (diff >= 0)
                break;
            pkt = pkt->next;
        }
        if (!pkt)
            break;
        if (pkt->seq == missing_seq)
            continue;
        *missing_mask |= 1 << (i - 1);
    }

    *first_missing = next_seq;
    return 1;
}

int ff_rtp_send_rtcp_feedback(RTPDemuxContext *s, URLContext *fd,
                              AVIOContext *avio)
{
    int len, need_keyframe, missing_packets;
    AVIOContext *pb;
    uint8_t *buf;
    int64_t now;
427
    uint16_t first_missing = 0, missing_mask = 0;
428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483

    if (!fd && !avio)
        return -1;

    need_keyframe = s->handler && s->handler->need_keyframe &&
                    s->handler->need_keyframe(s->dynamic_protocol_context);
    missing_packets = find_missing_packets(s, &first_missing, &missing_mask);

    if (!need_keyframe && !missing_packets)
        return 0;

    /* Send new feedback if enough time has elapsed since the last
     * feedback packet. */

    now = av_gettime();
    if (s->last_feedback_time &&
        (now - s->last_feedback_time) < MIN_FEEDBACK_INTERVAL)
        return 0;
    s->last_feedback_time = now;

    if (!fd)
        pb = avio;
    else if (avio_open_dyn_buf(&pb) < 0)
        return -1;

    if (need_keyframe) {
        avio_w8(pb, (RTP_VERSION << 6) | 1); /* PLI */
        avio_w8(pb, RTCP_PSFB);
        avio_wb16(pb, 2); /* length in words - 1 */
        // our own SSRC: we use the server's SSRC + 1 to avoid conflicts
        avio_wb32(pb, s->ssrc + 1);
        avio_wb32(pb, s->ssrc); // server SSRC
    }

    if (missing_packets) {
        avio_w8(pb, (RTP_VERSION << 6) | 1); /* NACK */
        avio_w8(pb, RTCP_RTPFB);
        avio_wb16(pb, 3); /* length in words - 1 */
        avio_wb32(pb, s->ssrc + 1);
        avio_wb32(pb, s->ssrc); // server SSRC

        avio_wb16(pb, first_missing);
        avio_wb16(pb, missing_mask);
    }

    avio_flush(pb);
    if (!fd)
        return 0;
    len = avio_close_dyn_buf(pb, &buf);
    if (len > 0 && buf) {
        ffurl_write(fd, buf, len);
        av_free(buf);
    }
    return 0;
}

484 485
/**
 * open a new RTP parse context for stream 'st'. 'st' can be NULL for
486
 * MPEG2-TS streams.
487
 */
488
RTPDemuxContext *ff_rtp_parse_open(AVFormatContext *s1, AVStream *st,
489
                                   int payload_type, int queue_size)
490 491 492 493 494 495
{
    RTPDemuxContext *s;

    s = av_mallocz(sizeof(RTPDemuxContext));
    if (!s)
        return NULL;
496 497
    s->payload_type        = payload_type;
    s->last_rtcp_ntp_time  = AV_NOPTS_VALUE;
498
    s->first_rtcp_ntp_time = AV_NOPTS_VALUE;
499 500 501
    s->ic                  = s1;
    s->st                  = st;
    s->queue_size          = queue_size;
502
    rtp_init_statistics(&s->statistics, 0);
503
    if (st) {
504
        switch (st->codec->codec_id) {
505
        case AV_CODEC_ID_ADPCM_G722:
506 507 508 509 510
            /* According to RFC 3551, the stream clock rate is 8000
             * even if the sample rate is 16000. */
            if (st->codec->sample_rate == 8000)
                st->codec->sample_rate = 16000;
            break;
511 512 513 514 515 516 517 518 519
        default:
            break;
        }
    }
    // needed to send back RTCP RR in RTSP sessions
    gethostname(s->hostname, sizeof(s->hostname));
    return s;
}

520 521
void ff_rtp_parse_set_dynamic_protocol(RTPDemuxContext *s, PayloadContext *ctx,
                                       RTPDynamicProtocolHandler *handler)
522 523
{
    s->dynamic_protocol_context = ctx;
524
    s->handler                  = handler;
525 526
}

527 528 529 530 531 532 533
void ff_rtp_parse_set_crypto(RTPDemuxContext *s, const char *suite,
                             const char *params)
{
    if (!ff_srtp_set_crypto(&s->srtp, suite, params))
        s->srtp_enabled = 1;
}

534
/**
535 536
 * This was the second switch in rtp_parse packet.
 * Normalizes time, if required, sets stream_index, etc.
537 538 539
 */
static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp)
{
540 541
    if (pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE)
        return; /* Timestamp already set by depacketizer */
542 543 544
    if (timestamp == RTP_NOTS_VALUE)
        return;

545
    if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE && s->ic->nb_streams > 1) {
Luca Abeni's avatar
Luca Abeni committed
546 547 548 549 550 551
        int64_t addend;
        int delta_timestamp;

        /* compute pts from timestamp with received ntp_time */
        delta_timestamp = timestamp - s->last_rtcp_timestamp;
        /* convert to the PTS timebase */
552 553 554
        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);
555 556 557
        pkt->pts = s->range_start_offset + s->rtcp_ts_offset + addend +
                   delta_timestamp;
        return;
Luca Abeni's avatar
Luca Abeni committed
558
    }
559

560 561
    if (!s->base_timestamp)
        s->base_timestamp = timestamp;
562 563
    /* assume that the difference is INT32_MIN < x < INT32_MAX,
     * but allow the first timestamp to exceed INT32_MAX */
564 565 566 567 568
    if (!s->timestamp)
        s->unwrapped_timestamp += timestamp;
    else
        s->unwrapped_timestamp += (int32_t)(timestamp - s->timestamp);
    s->timestamp = timestamp;
569 570
    pkt->pts     = s->unwrapped_timestamp + s->range_start_offset -
                   s->base_timestamp;
571 572
}

573 574
static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt,
                                     const uint8_t *buf, int len)
575
{
576
    unsigned int ssrc;
577
    int payload_type, seq, flags = 0;
578
    int ext, csrc;
579 580
    AVStream *st;
    uint32_t timestamp;
581
    int rv = 0;
582

583
    csrc         = buf[0] & 0x0f;
584
    ext          = buf[0] & 0x10;
585
    payload_type = buf[1] & 0x7f;
586 587
    if (buf[1] & 0x80)
        flags |= RTP_FLAG_MARKER;
588
    seq       = AV_RB16(buf + 2);
589
    timestamp = AV_RB32(buf + 4);
590
    ssrc      = AV_RB32(buf + 8);
591 592 593 594 595 596 597 598 599
    /* store the ssrc in the RTPDemuxContext */
    s->ssrc = ssrc;

    /* NOTE: we can handle only one payload type */
    if (s->payload_type != payload_type)
        return -1;

    st = s->st;
    // only do something with this if all the rtp checks pass...
600 601 602
    if (!rtp_valid_packet_in_sequence(&s->statistics, seq)) {
        av_log(st ? st->codec : NULL, AV_LOG_ERROR,
               "RTP: PT=%02x: bad cseq %04x expected=%04x\n",
603 604 605 606
               payload_type, seq, ((s->seq + 1) & 0xffff));
        return -1;
    }

607 608 609 610 611 612
    if (buf[0] & 0x20) {
        int padding = buf[len - 1];
        if (len >= 12 + padding)
            len -= padding;
    }

613
    s->seq = seq;
614 615
    len   -= 12;
    buf   += 12;
616

617 618 619 620 621
    len   -= 4 * csrc;
    buf   += 4 * csrc;
    if (len < 0)
        return AVERROR_INVALIDDATA;

622 623 624 625 626 627 628 629 630 631 632 633 634 635 636
    /* RFC 3550 Section 5.3.1 RTP Header Extension handling */
    if (ext) {
        if (len < 4)
            return -1;
        /* calculate the header extension length (stored as number
         * of 32-bit words) */
        ext = (AV_RB16(buf + 2) + 1) << 2;

        if (len < ext)
            return -1;
        // skip past RTP header extension
        len -= ext;
        buf += ext;
    }

637
    if (s->handler && s->handler->parse_packet) {
638 639 640
        rv = s->handler->parse_packet(s->ic, s->dynamic_protocol_context,
                                      s->st, pkt, &timestamp, buf, len, seq,
                                      flags);
641
    } else if (st) {
642 643
        if ((rv = av_new_packet(pkt, len)) < 0)
            return rv;
644
        memcpy(pkt->data, buf, len);
645
        pkt->stream_index = st->index;
646 647
    } else {
        return AVERROR(EINVAL);
648
    }
649

650 651
    // now perform timestamp things....
    finalize_packet(s, pkt, timestamp);
652

653 654 655
    return rv;
}

656 657 658 659 660 661 662 663 664 665 666 667 668 669 670
void ff_rtp_reset_packet_queue(RTPDemuxContext *s)
{
    while (s->queue) {
        RTPPacket *next = s->queue->next;
        av_free(s->queue->buf);
        av_free(s->queue);
        s->queue = next;
    }
    s->seq       = 0;
    s->queue_len = 0;
    s->prev_ret  = 0;
}

static void enqueue_packet(RTPDemuxContext *s, uint8_t *buf, int len)
{
671
    uint16_t seq   = AV_RB16(buf + 2);
672
    RTPPacket **cur = &s->queue, *packet;
673 674

    /* Find the correct place in the queue to insert the packet */
675 676
    while (*cur) {
        int16_t diff = seq - (*cur)->seq;
677 678
        if (diff < 0)
            break;
679
        cur = &(*cur)->next;
680 681 682 683 684 685
    }

    packet = av_mallocz(sizeof(*packet));
    if (!packet)
        return;
    packet->recvtime = av_gettime();
686 687 688
    packet->seq      = seq;
    packet->len      = len;
    packet->buf      = buf;
689 690
    packet->next     = *cur;
    *cur = packet;
691 692 693 694 695
    s->queue_len++;
}

static int has_next_packet(RTPDemuxContext *s)
{
696
    return s->queue && s->queue->seq == (uint16_t) (s->seq + 1);
697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716
}

int64_t ff_rtp_queued_packet_time(RTPDemuxContext *s)
{
    return s->queue ? s->queue->recvtime : 0;
}

static int rtp_parse_queued_packet(RTPDemuxContext *s, AVPacket *pkt)
{
    int rv;
    RTPPacket *next;

    if (s->queue_len <= 0)
        return -1;

    if (!has_next_packet(s))
        av_log(s->st ? s->st->codec : NULL, AV_LOG_WARNING,
               "RTP: missed %d packets\n", s->queue->seq - s->seq - 1);

    /* Parse the first packet in the queue, and dequeue it */
717
    rv   = rtp_parse_packet_internal(s, pkt, s->queue->buf, s->queue->len);
718 719 720 721 722
    next = s->queue->next;
    av_free(s->queue->buf);
    av_free(s->queue);
    s->queue = next;
    s->queue_len--;
723
    return rv;
724 725
}

726
static int rtp_parse_one_packet(RTPDemuxContext *s, AVPacket *pkt,
727
                                uint8_t **bufptr, int len)
728
{
729
    uint8_t *buf = bufptr ? *bufptr : NULL;
730
    int flags = 0;
731
    uint32_t timestamp;
732
    int rv = 0;
733 734

    if (!buf) {
735 736
        /* If parsing of the previous packet actually returned 0 or an error,
         * there's nothing more to be parsed from that packet, but we may have
737
         * indicated that we can return the next enqueued packet. */
738
        if (s->prev_ret <= 0)
739
            return rtp_parse_queued_packet(s, pkt);
740
        /* return the next packets, if any */
741
        if (s->handler && s->handler->parse_packet) {
742 743 744
            /* timestamp should be overwritten by parse_packet, if not,
             * the packet is left with pts == AV_NOPTS_VALUE */
            timestamp = RTP_NOTS_VALUE;
745 746 747
            rv        = s->handler->parse_packet(s->ic, s->dynamic_protocol_context,
                                                 s->st, pkt, &timestamp, NULL, 0, 0,
                                                 flags);
748
            finalize_packet(s, pkt, timestamp);
749
            return rv;
750 751 752 753 754 755 756 757
        }
    }

    if (len < 12)
        return -1;

    if ((buf[0] & 0xc0) != (RTP_VERSION << 6))
        return -1;
758
    if (RTP_PT_IS_RTCP(buf[1])) {
759 760 761
        return rtcp_parse_packet(s, buf, len);
    }

762 763 764 765 766 767 768 769 770 771
    if (s->st) {
        int64_t received = av_gettime();
        uint32_t arrival_ts = av_rescale_q(received, AV_TIME_BASE_Q,
                                           s->st->time_base);
        timestamp = AV_RB32(buf + 4);
        // Calculate the jitter immediately, before queueing the packet
        // into the reordering queue.
        rtcp_update_jitter(&s->statistics, timestamp, arrival_ts);
    }

772
    if ((s->seq == 0 && !s->queue) || s->queue_size <= 1) {
773 774 775 776 777 778 779 780 781 782 783 784 785
        /* First packet, or no reordering */
        return rtp_parse_packet_internal(s, pkt, buf, len);
    } else {
        uint16_t seq = AV_RB16(buf + 2);
        int16_t diff = seq - s->seq;
        if (diff < 0) {
            /* Packet older than the previously emitted one, drop */
            av_log(s->st ? s->st->codec : NULL, AV_LOG_WARNING,
                   "RTP: dropping old packet received too late\n");
            return -1;
        } else if (diff <= 1) {
            /* Correct packet */
            rv = rtp_parse_packet_internal(s, pkt, buf, len);
786
            return rv;
787 788 789 790 791 792 793 794 795 796 797
        } else {
            /* Still missing some packet, enqueue this one. */
            enqueue_packet(s, buf, len);
            *bufptr = NULL;
            /* Return the first enqueued packet if the queue is full,
             * even if we're missing something */
            if (s->queue_len >= s->queue_size)
                return rtp_parse_queued_packet(s, pkt);
            return -1;
        }
    }
798 799
}

800 801 802 803 804 805 806 807 808
/**
 * Parse an RTP or RTCP packet directly sent as a buffer.
 * @param s RTP parse context.
 * @param pkt returned packet
 * @param bufptr pointer to the input buffer or NULL to read the next packets
 * @param len buffer len
 * @return 0 if a packet is returned, 1 if a packet is returned and more can follow
 * (use buf as NULL to read the next). -1 if no packet (error or no more packet).
 */
809 810
int ff_rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt,
                        uint8_t **bufptr, int len)
811
{
812 813 814 815
    int rv;
    if (s->srtp_enabled && bufptr && ff_srtp_decrypt(&s->srtp, *bufptr, &len) < 0)
        return -1;
    rv = rtp_parse_one_packet(s, pkt, bufptr, len);
816
    s->prev_ret = rv;
817 818
    while (rv == AVERROR(EAGAIN) && has_next_packet(s))
        rv = rtp_parse_queued_packet(s, pkt);
819 820 821
    return rv ? rv : has_next_packet(s);
}

822
void ff_rtp_parse_close(RTPDemuxContext *s)
823
{
824
    ff_rtp_reset_packet_queue(s);
825
    ff_srtp_free(&s->srtp);
826 827
    av_free(s);
}
828 829 830 831 832 833 834

int ff_parse_fmtp(AVStream *stream, PayloadContext *data, const char *p,
                  int (*parse_fmtp)(AVStream *stream,
                                    PayloadContext *data,
                                    char *attr, char *value))
{
    char attr[256];
835
    char *value;
836
    int res;
837 838 839
    int value_size = strlen(p) + 1;

    if (!(value = av_malloc(value_size))) {
840
        av_log(NULL, AV_LOG_ERROR, "Failed to allocate data for FMTP.\n");
841 842
        return AVERROR(ENOMEM);
    }
843 844

    // remove protocol identifier
845 846 847 848 849 850
    while (*p && *p == ' ')
        p++;                     // strip spaces
    while (*p && *p != ' ')
        p++;                     // eat protocol identifier
    while (*p && *p == ' ')
        p++;                     // strip trailing spaces
851 852 853

    while (ff_rtsp_next_attr_and_value(&p,
                                       attr, sizeof(attr),
854
                                       value, value_size)) {
855
        res = parse_fmtp(stream, data, attr, value);
856 857
        if (res < 0 && res != AVERROR_PATCHWELCOME) {
            av_free(value);
858
            return res;
859
        }
860
    }
861
    av_free(value);
862 863
    return 0;
}
864 865 866

int ff_rtp_finalize_packet(AVPacket *pkt, AVIOContext **dyn_buf, int stream_idx)
{
867
    int ret;
868 869
    av_init_packet(pkt);

870
    pkt->size         = avio_close_dyn_buf(*dyn_buf, &pkt->data);
871
    pkt->stream_index = stream_idx;
872 873 874 875 876
    *dyn_buf = NULL;
    if ((ret = av_packet_from_data(pkt, pkt->data, pkt->size)) < 0) {
        av_freep(&pkt->data);
        return ret;
    }
877 878
    return pkt->size;
}