Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4349 Serge 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 "libavutil/mathematics.h"
23
#include "libavutil/avstring.h"
24
#include "libavutil/time.h"
25
#include "libavcodec/get_bits.h"
26
#include "avformat.h"
27
#include "network.h"
28
#include "srtp.h"
29
#include "url.h"
30
#include "rtpdec.h"
31
#include "rtpdec_formats.h"
32
 
33
#define MIN_FEEDBACK_INTERVAL 200000 /* 200 ms in us */
34
 
35
static RTPDynamicProtocolHandler realmedia_mp3_dynamic_handler = {
36
    .enc_name   = "X-MP3-draft-00",
37
    .codec_type = AVMEDIA_TYPE_AUDIO,
38
    .codec_id   = AV_CODEC_ID_MP3ADU,
39
};
40
 
41
static RTPDynamicProtocolHandler speex_dynamic_handler = {
42
    .enc_name   = "speex",
43
    .codec_type = AVMEDIA_TYPE_AUDIO,
44
    .codec_id   = AV_CODEC_ID_SPEEX,
45
};
46
 
47
static RTPDynamicProtocolHandler opus_dynamic_handler = {
48
    .enc_name   = "opus",
49
    .codec_type = AVMEDIA_TYPE_AUDIO,
50
    .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
    handler->next = rtp_first_dynamic_payload_handler;
58
    rtp_first_dynamic_payload_handler = handler;
59
}
60
 
61
void av_register_rtp_dynamic_payload_handlers(void)
62
{
63
    ff_register_dynamic_payload_handler(&ff_amr_nb_dynamic_handler);
64
    ff_register_dynamic_payload_handler(&ff_amr_wb_dynamic_handler);
65
    ff_register_dynamic_payload_handler(&ff_g726_16_dynamic_handler);
66
    ff_register_dynamic_payload_handler(&ff_g726_24_dynamic_handler);
67
    ff_register_dynamic_payload_handler(&ff_g726_32_dynamic_handler);
68
    ff_register_dynamic_payload_handler(&ff_g726_40_dynamic_handler);
69
    ff_register_dynamic_payload_handler(&ff_h263_1998_dynamic_handler);
70
    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
    ff_register_dynamic_payload_handler(&ff_mpeg_audio_dynamic_handler);
78
    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
    ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfa_handler);
82
    ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfv_handler);
83
    ff_register_dynamic_payload_handler(&ff_qcelp_dynamic_handler);
84
    ff_register_dynamic_payload_handler(&ff_qdm2_dynamic_handler);
85
    ff_register_dynamic_payload_handler(&ff_qt_rtp_aud_handler);
86
    ff_register_dynamic_payload_handler(&ff_qt_rtp_vid_handler);
87
    ff_register_dynamic_payload_handler(&ff_quicktime_rtp_aud_handler);
88
    ff_register_dynamic_payload_handler(&ff_quicktime_rtp_vid_handler);
89
    ff_register_dynamic_payload_handler(&ff_svq3_dynamic_handler);
90
    ff_register_dynamic_payload_handler(&ff_theora_dynamic_handler);
91
    ff_register_dynamic_payload_handler(&ff_vorbis_dynamic_handler);
92
    ff_register_dynamic_payload_handler(&ff_vp8_dynamic_handler);
93
    ff_register_dynamic_payload_handler(&opus_dynamic_handler);
94
    ff_register_dynamic_payload_handler(&realmedia_mp3_dynamic_handler);
95
    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
            codec_type == handler->codec_type)
106
            return handler;
107
    return NULL;
108
}
109
 
110
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
         handler; handler = handler->next)
116
        if (handler->static_payload_id && handler->static_payload_id == id &&
117
            codec_type == handler->codec_type)
118
            return handler;
119
    return NULL;
120
}
121
 
122
static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf,
123
                             int len)
124
{
125
    int payload_len;
126
    while (len >= 4) {
127
        payload_len = FFMIN(len, (AV_RB16(buf + 2) + 1) * 4);
128
 
129
        switch (buf[1]) {
130
        case RTCP_SR:
131
            if (payload_len < 20) {
132
                av_log(NULL, AV_LOG_ERROR,
133
                       "Invalid length for RTCP SR packet\n");
134
                return AVERROR_INVALIDDATA;
135
            }
136
 
137
            s->last_rtcp_reception_time = av_gettime();
138
            s->last_rtcp_ntp_time  = AV_RB64(buf + 8);
139
            s->last_rtcp_timestamp = AV_RB32(buf + 16);
140
            if (s->first_rtcp_ntp_time == AV_NOPTS_VALUE) {
141
                s->first_rtcp_ntp_time = s->last_rtcp_ntp_time;
142
                if (!s->base_timestamp)
143
                    s->base_timestamp = s->last_rtcp_timestamp;
144
                s->rtcp_ts_offset = s->last_rtcp_timestamp - s->base_timestamp;
145
            }
146
 
147
            break;
148
        case RTCP_BYE:
149
            return -RTCP_BYE;
150
        }
151
 
152
        buf += payload_len;
153
        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
    s->max_seq   = base_sequence;
164
    s->probation = 1;
165
}
166
 
167
/*
168
 * Called whenever there is a large jump in sequence numbers,
169
 * or when they get out of probation...
170
 */
171
static void rtp_init_sequence(RTPStatistics *s, uint16_t seq)
172
{
173
    s->max_seq        = seq;
174
    s->cycles         = 0;
175
    s->base_seq       = seq - 1;
176
    s->bad_seq        = RTP_SEQ_MOD + 1;
177
    s->received       = 0;
178
    s->expected_prior = 0;
179
    s->received_prior = 0;
180
    s->jitter         = 0;
181
    s->transit        = 0;
182
}
183
 
184
/* Returns 1 if we should handle this packet. */
185
static int rtp_valid_packet_in_sequence(RTPStatistics *s, uint16_t seq)
186
{
187
    uint16_t udelta = seq - s->max_seq;
188
    const int MAX_DROPOUT    = 3000;
189
    const int MAX_MISORDER   = 100;
190
    const int MIN_SEQUENTIAL = 2;
191
 
192
    /* source not valid until MIN_SEQUENTIAL packets with sequence
193
     * seq. numbers have been received */
194
    if (s->probation) {
195
        if (seq == s->max_seq + 1) {
196
            s->probation--;
197
            s->max_seq = seq;
198
            if (s->probation == 0) {
199
                rtp_init_sequence(s, seq);
200
                s->received++;
201
                return 1;
202
            }
203
        } else {
204
            s->probation = MIN_SEQUENTIAL - 1;
205
            s->max_seq   = seq;
206
        }
207
    } else if (udelta < MAX_DROPOUT) {
208
        // in order, with permissible gap
209
        if (seq < s->max_seq) {
210
            // sequence number wrapped; count another 64k cycles
211
            s->cycles += RTP_SEQ_MOD;
212
        }
213
        s->max_seq = seq;
214
    } else if (udelta <= RTP_SEQ_MOD - MAX_MISORDER) {
215
        // sequence made a large jump...
216
        if (seq == s->bad_seq) {
217
            /* two sequential packets -- assume that the other side
218
             * restarted without telling us; just resync. */
219
            rtp_init_sequence(s, seq);
220
        } else {
221
            s->bad_seq = (seq + 1) & (RTP_SEQ_MOD - 1);
222
            return 0;
223
        }
224
    } else {
225
        // duplicate or reordered packet...
226
    }
227
    s->received++;
228
    return 1;
229
}
230
 
231
static void rtcp_update_jitter(RTPStatistics *s, uint32_t sent_timestamp,
232
                               uint32_t arrival_timestamp)
233
{
234
    // Most of this is pretty straight from RFC 3550 appendix A.8
235
    uint32_t transit = arrival_timestamp - sent_timestamp;
236
    uint32_t prev_transit = s->transit;
237
    int32_t d = transit - prev_transit;
238
    // Doing the FFABS() call directly on the "transit - prev_transit"
239
    // expression doesn't work, since it's an unsigned expression. Doing the
240
    // transit calculation in unsigned is desired though, since it most
241
    // probably will need to wrap around.
242
    d = FFABS(d);
243
    s->transit = transit;
244
    if (!prev_transit)
245
        return;
246
    s->jitter += d - (int32_t) ((s->jitter + 8) >> 4);
247
}
248
 
249
int ff_rtp_check_and_send_back_rr(RTPDemuxContext *s, URLContext *fd,
250
                                  AVIOContext *avio, int count)
251
{
252
    AVIOContext *pb;
253
    uint8_t *buf;
254
    int len;
255
    int rtcp_bytes;
256
    RTPStatistics *stats = &s->statistics;
257
    uint32_t lost;
258
    uint32_t extended_max;
259
    uint32_t expected_interval;
260
    uint32_t received_interval;
261
    int32_t  lost_interval;
262
    uint32_t expected;
263
    uint32_t fraction;
264
 
265
    if ((!fd && !avio) || (count < 1))
266
        return -1;
267
 
268
    /* 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
    s->octet_count += count;
271
    rtcp_bytes = ((s->octet_count - s->last_octet_count) * RTCP_TX_RATIO_NUM) /
272
        RTCP_TX_RATIO_DEN;
273
    rtcp_bytes /= 50; // mmu_man: that's enough for me... VLC sends much less btw !?
274
    if (rtcp_bytes < 28)
275
        return -1;
276
    s->last_octet_count = s->octet_count;
277
 
278
    if (!fd)
279
        pb = avio;
280
    else if (avio_open_dyn_buf(&pb) < 0)
281
        return -1;
282
 
283
    // Receiver Report
284
    avio_w8(pb, (RTP_VERSION << 6) + 1); /* 1 report block */
285
    avio_w8(pb, RTCP_RR);
286
    avio_wb16(pb, 7); /* length in words - 1 */
287
    // our own SSRC: we use the server's SSRC + 1 to avoid conflicts
288
    avio_wb32(pb, s->ssrc + 1);
289
    avio_wb32(pb, s->ssrc); // server SSRC
290
    // some placeholders we should really fill...
291
    // RFC 1889/p64
292
    extended_max          = stats->cycles + stats->max_seq;
293
    expected              = extended_max - stats->base_seq;
294
    lost                  = expected - stats->received;
295
    lost                  = FFMIN(lost, 0xffffff); // clamp it since it's only 24 bits...
296
    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
    if (expected_interval == 0 || lost_interval <= 0)
302
        fraction = 0;
303
    else
304
        fraction = (lost_interval << 8) / expected_interval;
305
 
306
    fraction = (fraction << 24) | lost;
307
 
308
    avio_wb32(pb, fraction); /* 8 bits of fraction, 24 bits of total packets lost */
309
    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
        avio_wb32(pb, 0); /* last SR timestamp */
314
        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
        uint32_t delay_since_last = av_rescale(av_gettime() - s->last_rtcp_reception_time,
318
                                               65536, AV_TIME_BASE);
319
 
320
        avio_wb32(pb, middle_32_bits); /* last SR timestamp */
321
        avio_wb32(pb, delay_since_last); /* delay since last SR */
322
    }
323
 
324
    // CNAME
325
    avio_w8(pb, (RTP_VERSION << 6) + 1); /* 1 report block */
326
    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
    avio_w8(pb, 0x01);
331
    avio_w8(pb, len);
332
    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
    if (!fd)
340
        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
        av_free(buf);
348
    }
349
    return 0;
350
}
351
 
352
void ff_rtp_send_punch_packets(URLContext *rtp_handle)
353
{
354
    AVIOContext *pb;
355
    uint8_t *buf;
356
    int len;
357
 
358
    /* Send a small RTP packet */
359
    if (avio_open_dyn_buf(&pb) < 0)
360
        return;
361
 
362
    avio_w8(pb, (RTP_VERSION << 6));
363
    avio_w8(pb, 0); /* Payload type */
364
    avio_wb16(pb, 0); /* Seq */
365
    avio_wb32(pb, 0); /* Timestamp */
366
    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
    av_free(buf);
373
 
374
    /* Send a minimal RTCP RR */
375
    if (avio_open_dyn_buf(&pb) < 0)
376
        return;
377
 
378
    avio_w8(pb, (RTP_VERSION << 6));
379
    avio_w8(pb, RTCP_RR); /* receiver report */
380
    avio_wb16(pb, 1); /* length in words - 1 */
381
    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
    av_free(buf);
388
}
389
 
390
static int find_missing_packets(RTPDemuxContext *s, uint16_t *first_missing,
391
                                uint16_t *missing_mask)
392
{
393
    int i;
394
    uint16_t next_seq = s->seq + 1;
395
    RTPPacket *pkt = s->queue;
396
 
397
    if (!pkt || pkt->seq == next_seq)
398
        return 0;
399
 
400
    *missing_mask = 0;
401
    for (i = 1; i <= 16; i++) {
402
        uint16_t missing_seq = next_seq + i;
403
        while (pkt) {
404
            int16_t diff = pkt->seq - missing_seq;
405
            if (diff >= 0)
406
                break;
407
            pkt = pkt->next;
408
        }
409
        if (!pkt)
410
            break;
411
        if (pkt->seq == missing_seq)
412
            continue;
413
        *missing_mask |= 1 << (i - 1);
414
    }
415
 
416
    *first_missing = next_seq;
417
    return 1;
418
}
419
 
420
int ff_rtp_send_rtcp_feedback(RTPDemuxContext *s, URLContext *fd,
421
                              AVIOContext *avio)
422
{
423
    int len, need_keyframe, missing_packets;
424
    AVIOContext *pb;
425
    uint8_t *buf;
426
    int64_t now;
427
    uint16_t first_missing = 0, missing_mask = 0;
428
 
429
    if (!fd && !avio)
430
        return -1;
431
 
432
    need_keyframe = s->handler && s->handler->need_keyframe &&
433
                    s->handler->need_keyframe(s->dynamic_protocol_context);
434
    missing_packets = find_missing_packets(s, &first_missing, &missing_mask);
435
 
436
    if (!need_keyframe && !missing_packets)
437
        return 0;
438
 
439
    /* Send new feedback if enough time has elapsed since the last
440
     * feedback packet. */
441
 
442
    now = av_gettime();
443
    if (s->last_feedback_time &&
444
        (now - s->last_feedback_time) < MIN_FEEDBACK_INTERVAL)
445
        return 0;
446
    s->last_feedback_time = now;
447
 
448
    if (!fd)
449
        pb = avio;
450
    else if (avio_open_dyn_buf(&pb) < 0)
451
        return -1;
452
 
453
    if (need_keyframe) {
454
        avio_w8(pb, (RTP_VERSION << 6) | 1); /* PLI */
455
        avio_w8(pb, RTCP_PSFB);
456
        avio_wb16(pb, 2); /* length in words - 1 */
457
        // our own SSRC: we use the server's SSRC + 1 to avoid conflicts
458
        avio_wb32(pb, s->ssrc + 1);
459
        avio_wb32(pb, s->ssrc); // server SSRC
460
    }
461
 
462
    if (missing_packets) {
463
        avio_w8(pb, (RTP_VERSION << 6) | 1); /* NACK */
464
        avio_w8(pb, RTCP_RTPFB);
465
        avio_wb16(pb, 3); /* length in words - 1 */
466
        avio_wb32(pb, s->ssrc + 1);
467
        avio_wb32(pb, s->ssrc); // server SSRC
468
 
469
        avio_wb16(pb, first_missing);
470
        avio_wb16(pb, missing_mask);
471
    }
472
 
473
    avio_flush(pb);
474
    if (!fd)
475
        return 0;
476
    len = avio_close_dyn_buf(pb, &buf);
477
    if (len > 0 && buf) {
478
        ffurl_write(fd, buf, len);
479
        av_free(buf);
480
    }
481
    return 0;
482
}
483
 
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
    RTPDemuxContext *s;
492
 
493
    s = av_mallocz(sizeof(RTPDemuxContext));
494
    if (!s)
495
        return NULL;
496
    s->payload_type        = payload_type;
497
    s->last_rtcp_ntp_time  = AV_NOPTS_VALUE;
498
    s->first_rtcp_ntp_time = AV_NOPTS_VALUE;
499
    s->ic                  = s1;
500
    s->st                  = st;
501
    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
            /* According to RFC 3551, the stream clock rate is 8000
507
             * even if the sample rate is 16000. */
508
            if (st->codec->sample_rate == 8000)
509
                st->codec->sample_rate = 16000;
510
            break;
511
        default:
512
            break;
513
        }
514
    }
515
    // needed to send back RTCP RR in RTSP sessions
516
    gethostname(s->hostname, sizeof(s->hostname));
517
    return s;
518
}
519
 
520
void ff_rtp_parse_set_dynamic_protocol(RTPDemuxContext *s, PayloadContext *ctx,
521
                                       RTPDynamicProtocolHandler *handler)
522
{
523
    s->dynamic_protocol_context = ctx;
524
    s->handler                  = handler;
525
}
526
 
527
void ff_rtp_parse_set_crypto(RTPDemuxContext *s, const char *suite,
528
                             const char *params)
529
{
530
    if (!ff_srtp_set_crypto(&s->srtp, suite, params))
531
        s->srtp_enabled = 1;
532
}
533
 
534
/**
535
 * This was the second switch in rtp_parse packet.
536
 * Normalizes time, if required, sets stream_index, etc.
537
 */
538
static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp)
539
{
540
    if (pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE)
541
        return; /* Timestamp already set by depacketizer */
542
    if (timestamp == RTP_NOTS_VALUE)
543
        return;
544
 
545
    if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE && s->ic->nb_streams > 1) {
546
        int64_t addend;
547
        int delta_timestamp;
548
 
549
        /* compute pts from timestamp with received ntp_time */
550
        delta_timestamp = timestamp - s->last_rtcp_timestamp;
551
        /* convert to the PTS timebase */
552
        addend = av_rescale(s->last_rtcp_ntp_time - s->first_rtcp_ntp_time,
553
                            s->st->time_base.den,
554
                            (uint64_t) s->st->time_base.num << 32);
555
        pkt->pts = s->range_start_offset + s->rtcp_ts_offset + addend +
556
                   delta_timestamp;
557
        return;
558
    }
559
 
560
    if (!s->base_timestamp)
561
        s->base_timestamp = timestamp;
562
    /* assume that the difference is INT32_MIN < x < INT32_MAX,
563
     * but allow the first timestamp to exceed INT32_MAX */
564
    if (!s->timestamp)
565
        s->unwrapped_timestamp += timestamp;
566
    else
567
        s->unwrapped_timestamp += (int32_t)(timestamp - s->timestamp);
568
    s->timestamp = timestamp;
569
    pkt->pts     = s->unwrapped_timestamp + s->range_start_offset -
570
                   s->base_timestamp;
571
}
572
 
573
static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt,
574
                                     const uint8_t *buf, int len)
575
{
576
    unsigned int ssrc;
577
    int payload_type, seq, flags = 0;
578
    int ext, csrc;
579
    AVStream *st;
580
    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
    if (buf[1] & 0x80)
587
        flags |= RTP_FLAG_MARKER;
588
    seq       = AV_RB16(buf + 2);
589
    timestamp = AV_RB32(buf + 4);
590
    ssrc      = AV_RB32(buf + 8);
591
    /* store the ssrc in the RTPDemuxContext */
592
    s->ssrc = ssrc;
593
 
594
    /* NOTE: we can handle only one payload type */
595
    if (s->payload_type != payload_type)
596
        return -1;
597
 
598
    st = s->st;
599
    // only do something with this if all the rtp checks pass...
600
    if (!rtp_valid_packet_in_sequence(&s->statistics, seq)) {
601
        av_log(st ? st->codec : NULL, AV_LOG_ERROR,
602
               "RTP: PT=%02x: bad cseq %04x expected=%04x\n",
603
               payload_type, seq, ((s->seq + 1) & 0xffff));
604
        return -1;
605
    }
606
 
607
    if (buf[0] & 0x20) {
608
        int padding = buf[len - 1];
609
        if (len >= 12 + padding)
610
            len -= padding;
611
    }
612
 
613
    s->seq = seq;
614
    len   -= 12;
615
    buf   += 12;
616
 
617
    len   -= 4 * csrc;
618
    buf   += 4 * csrc;
619
    if (len < 0)
620
        return AVERROR_INVALIDDATA;
621
 
622
    /* RFC 3550 Section 5.3.1 RTP Header Extension handling */
623
    if (ext) {
624
        if (len < 4)
625
            return -1;
626
        /* calculate the header extension length (stored as number
627
         * of 32-bit words) */
628
        ext = (AV_RB16(buf + 2) + 1) << 2;
629
 
630
        if (len < ext)
631
            return -1;
632
        // skip past RTP header extension
633
        len -= ext;
634
        buf += ext;
635
    }
636
 
637
    if (s->handler && s->handler->parse_packet) {
638
        rv = s->handler->parse_packet(s->ic, s->dynamic_protocol_context,
639
                                      s->st, pkt, ×tamp, buf, len, seq,
640
                                      flags);
641
    } else if (st) {
642
        if ((rv = av_new_packet(pkt, len)) < 0)
643
            return rv;
644
        memcpy(pkt->data, buf, len);
645
        pkt->stream_index = st->index;
646
    } else {
647
        return AVERROR(EINVAL);
648
    }
649
 
650
    // now perform timestamp things....
651
    finalize_packet(s, pkt, timestamp);
652
 
653
    return rv;
654
}
655
 
656
void ff_rtp_reset_packet_queue(RTPDemuxContext *s)
657
{
658
    while (s->queue) {
659
        RTPPacket *next = s->queue->next;
660
        av_free(s->queue->buf);
661
        av_free(s->queue);
662
        s->queue = next;
663
    }
664
    s->seq       = 0;
665
    s->queue_len = 0;
666
    s->prev_ret  = 0;
667
}
668
 
669
static void enqueue_packet(RTPDemuxContext *s, uint8_t *buf, int len)
670
{
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
    while (*cur) {
676
        int16_t diff = seq - (*cur)->seq;
677
        if (diff < 0)
678
            break;
679
        cur = &(*cur)->next;
680
    }
681
 
682
    packet = av_mallocz(sizeof(*packet));
683
    if (!packet)
684
        return;
685
    packet->recvtime = av_gettime();
686
    packet->seq      = seq;
687
    packet->len      = len;
688
    packet->buf      = buf;
689
    packet->next     = *cur;
690
    *cur = packet;
691
    s->queue_len++;
692
}
693
 
694
static int has_next_packet(RTPDemuxContext *s)
695
{
696
    return s->queue && s->queue->seq == (uint16_t) (s->seq + 1);
697
}
698
 
699
int64_t ff_rtp_queued_packet_time(RTPDemuxContext *s)
700
{
701
    return s->queue ? s->queue->recvtime : 0;
702
}
703
 
704
static int rtp_parse_queued_packet(RTPDemuxContext *s, AVPacket *pkt)
705
{
706
    int rv;
707
    RTPPacket *next;
708
 
709
    if (s->queue_len <= 0)
710
        return -1;
711
 
712
    if (!has_next_packet(s))
713
        av_log(s->st ? s->st->codec : NULL, AV_LOG_WARNING,
714
               "RTP: missed %d packets\n", s->queue->seq - s->seq - 1);
715
 
716
    /* 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
    next = s->queue->next;
719
    av_free(s->queue->buf);
720
    av_free(s->queue);
721
    s->queue = next;
722
    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
        /* If parsing of the previous packet actually returned 0 or an error,
736
         * 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
            /* timestamp should be overwritten by parse_packet, if not,
743
             * the packet is left with pts == AV_NOPTS_VALUE */
744
            timestamp = RTP_NOTS_VALUE;
745
            rv        = s->handler->parse_packet(s->ic, s->dynamic_protocol_context,
746
                                                 s->st, pkt, ×tamp, NULL, 0, 0,
747
                                                 flags);
748
            finalize_packet(s, pkt, timestamp);
749
            return rv;
750
        }
751
    }
752
 
753
    if (len < 12)
754
        return -1;
755
 
756
    if ((buf[0] & 0xc0) != (RTP_VERSION << 6))
757
        return -1;
758
    if (RTP_PT_IS_RTCP(buf[1])) {
759
        return rtcp_parse_packet(s, buf, len);
760
    }
761
 
762
    if (s->st) {
763
        int64_t received = av_gettime();
764
        uint32_t arrival_ts = av_rescale_q(received, AV_TIME_BASE_Q,
765
                                           s->st->time_base);
766
        timestamp = AV_RB32(buf + 4);
767
        // Calculate the jitter immediately, before queueing the packet
768
        // into the reordering queue.
769
        rtcp_update_jitter(&s->statistics, timestamp, arrival_ts);
770
    }
771
 
772
    if ((s->seq == 0 && !s->queue) || s->queue_size <= 1) {
773
        /* First packet, or no reordering */
774
        return rtp_parse_packet_internal(s, pkt, buf, len);
775
    } else {
776
        uint16_t seq = AV_RB16(buf + 2);
777
        int16_t diff = seq - s->seq;
778
        if (diff < 0) {
779
            /* Packet older than the previously emitted one, drop */
780
            av_log(s->st ? s->st->codec : NULL, AV_LOG_WARNING,
781
                   "RTP: dropping old packet received too late\n");
782
            return -1;
783
        } else if (diff <= 1) {
784
            /* Correct packet */
785
            rv = rtp_parse_packet_internal(s, pkt, buf, len);
786
            return rv;
787
        } else {
788
            /* Still missing some packet, enqueue this one. */
789
            enqueue_packet(s, buf, len);
790
            *bufptr = NULL;
791
            /* Return the first enqueued packet if the queue is full,
792
             * even if we're missing something */
793
            if (s->queue_len >= s->queue_size)
794
                return rtp_parse_queued_packet(s, pkt);
795
            return -1;
796
        }
797
    }
798
}
799
 
800
/**
801
 * Parse an RTP or RTCP packet directly sent as a buffer.
802
 * @param s RTP parse context.
803
 * @param pkt returned packet
804
 * @param bufptr pointer to the input buffer or NULL to read the next packets
805
 * @param len buffer len
806
 * @return 0 if a packet is returned, 1 if a packet is returned and more can follow
807
 * (use buf as NULL to read the next). -1 if no packet (error or no more packet).
808
 */
809
int ff_rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt,
810
                        uint8_t **bufptr, int len)
811
{
812
    int rv;
813
    if (s->srtp_enabled && bufptr && ff_srtp_decrypt(&s->srtp, *bufptr, &len) < 0)
814
        return -1;
815
    rv = rtp_parse_one_packet(s, pkt, bufptr, len);
816
    s->prev_ret = rv;
817
    while (rv == AVERROR(EAGAIN) && has_next_packet(s))
818
        rv = rtp_parse_queued_packet(s, pkt);
819
    return rv ? rv : has_next_packet(s);
820
}
821
 
822
void ff_rtp_parse_close(RTPDemuxContext *s)
823
{
824
    ff_rtp_reset_packet_queue(s);
825
    ff_srtp_free(&s->srtp);
826
    av_free(s);
827
}
828
 
829
int ff_parse_fmtp(AVStream *stream, PayloadContext *data, const char *p,
830
                  int (*parse_fmtp)(AVStream *stream,
831
                                    PayloadContext *data,
832
                                    char *attr, char *value))
833
{
834
    char attr[256];
835
    char *value;
836
    int res;
837
    int value_size = strlen(p) + 1;
838
 
839
    if (!(value = av_malloc(value_size))) {
840
        av_log(NULL, AV_LOG_ERROR, "Failed to allocate data for FMTP.\n");
841
        return AVERROR(ENOMEM);
842
    }
843
 
844
    // remove protocol identifier
845
    while (*p && *p == ' ')
846
        p++;                     // strip spaces
847
    while (*p && *p != ' ')
848
        p++;                     // eat protocol identifier
849
    while (*p && *p == ' ')
850
        p++;                     // strip trailing spaces
851
 
852
    while (ff_rtsp_next_attr_and_value(&p,
853
                                       attr, sizeof(attr),
854
                                       value, value_size)) {
855
        res = parse_fmtp(stream, data, attr, value);
856
        if (res < 0 && res != AVERROR_PATCHWELCOME) {
857
            av_free(value);
858
            return res;
859
        }
860
    }
861
    av_free(value);
862
    return 0;
863
}
864
 
865
int ff_rtp_finalize_packet(AVPacket *pkt, AVIOContext **dyn_buf, int stream_idx)
866
{
867
    int ret;
868
    av_init_packet(pkt);
869
 
870
    pkt->size         = avio_close_dyn_buf(*dyn_buf, &pkt->data);
871
    pkt->stream_index = stream_idx;
872
    *dyn_buf = NULL;
873
    if ((ret = av_packet_from_data(pkt, pkt->data, pkt->size)) < 0) {
874
        av_freep(&pkt->data);
875
        return ret;
876
    }
877
    return pkt->size;
878
}