Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6148 serge 1
/*
2
 * MPEG2 transport stream (aka DVB) demuxer
3
 * Copyright (c) 2002-2003 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/buffer.h"
23
#include "libavutil/crc.h"
24
#include "libavutil/intreadwrite.h"
25
#include "libavutil/log.h"
26
#include "libavutil/dict.h"
27
#include "libavutil/mathematics.h"
28
#include "libavutil/opt.h"
29
#include "libavutil/avassert.h"
30
#include "libavcodec/bytestream.h"
31
#include "libavcodec/get_bits.h"
32
#include "libavcodec/mathops.h"
33
#include "avformat.h"
34
#include "mpegts.h"
35
#include "internal.h"
36
#include "avio_internal.h"
37
#include "seek.h"
38
#include "mpeg.h"
39
#include "isom.h"
40
 
41
/* maximum size in which we look for synchronisation if
42
   synchronisation is lost */
43
#define MAX_RESYNC_SIZE 65536
44
 
45
#define MAX_PES_PAYLOAD 200*1024
46
 
47
#define MAX_MP4_DESCR_COUNT 16
48
 
49
enum MpegTSFilterType {
50
    MPEGTS_PES,
51
    MPEGTS_SECTION,
52
};
53
 
54
typedef struct MpegTSFilter MpegTSFilter;
55
 
56
typedef int PESCallback(MpegTSFilter *f, const uint8_t *buf, int len, int is_start, int64_t pos, int64_t cur_pcr);
57
 
58
typedef struct MpegTSPESFilter {
59
    PESCallback *pes_cb;
60
    void *opaque;
61
} MpegTSPESFilter;
62
 
63
typedef void SectionCallback(MpegTSFilter *f, const uint8_t *buf, int len);
64
 
65
typedef void SetServiceCallback(void *opaque, int ret);
66
 
67
typedef struct MpegTSSectionFilter {
68
    int section_index;
69
    int section_h_size;
70
    uint8_t *section_buf;
71
    unsigned int check_crc:1;
72
    unsigned int end_of_section_reached:1;
73
    SectionCallback *section_cb;
74
    void *opaque;
75
} MpegTSSectionFilter;
76
 
77
struct MpegTSFilter {
78
    int pid;
79
    int es_id;
80
    int last_cc; /* last cc code (-1 if first packet) */
81
    enum MpegTSFilterType type;
82
    union {
83
        MpegTSPESFilter pes_filter;
84
        MpegTSSectionFilter section_filter;
85
    } u;
86
};
87
 
88
#define MAX_PIDS_PER_PROGRAM 64
89
struct Program {
90
    unsigned int id; //program id/service id
91
    unsigned int nb_pids;
92
    unsigned int pids[MAX_PIDS_PER_PROGRAM];
93
};
94
 
95
struct MpegTSContext {
96
    const AVClass *class;
97
    /* user data */
98
    AVFormatContext *stream;
99
    /** raw packet size, including FEC if present            */
100
    int raw_packet_size;
101
 
102
    int size_stat[3];
103
    int size_stat_count;
104
#define SIZE_STAT_THRESHOLD 10
105
 
106
    int64_t pos47_full;
107
 
108
    /** if true, all pids are analyzed to find streams       */
109
    int auto_guess;
110
 
111
    /** compute exact PCR for each transport stream packet   */
112
    int mpeg2ts_compute_pcr;
113
 
114
    /** fix dvb teletext pts                                 */
115
    int fix_teletext_pts;
116
 
117
    int64_t cur_pcr;    /**< used to estimate the exact PCR  */
118
    int pcr_incr;       /**< used to estimate the exact PCR  */
119
 
120
    /* data needed to handle file based ts */
121
    /** stop parsing loop                                    */
122
    int stop_parse;
123
    /** packet containing Audio/Video data                   */
124
    AVPacket *pkt;
125
    /** to detect seek                                       */
126
    int64_t last_pos;
127
 
128
    /******************************************/
129
    /* private mpegts data */
130
    /* scan context */
131
    /** structure to keep track of Program->pids mapping     */
132
    unsigned int nb_prg;
133
    struct Program *prg;
134
 
135
    int8_t crc_validity[NB_PID_MAX];
136
 
137
    /** filters for various streams specified by PMT + for the PAT and PMT */
138
    MpegTSFilter *pids[NB_PID_MAX];
139
    int current_pid;
140
};
141
 
142
static const AVOption mpegtsraw_options[] = {
143
    {"compute_pcr", "Compute exact PCR for each transport stream packet.", offsetof(MpegTSContext, mpeg2ts_compute_pcr), AV_OPT_TYPE_INT,
144
     {.i64 = 0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
145
    { NULL },
146
};
147
 
148
static const AVClass mpegtsraw_class = {
149
    .class_name = "mpegtsraw demuxer",
150
    .item_name  = av_default_item_name,
151
    .option     = mpegtsraw_options,
152
    .version    = LIBAVUTIL_VERSION_INT,
153
};
154
 
155
static const AVOption mpegts_options[] = {
156
    {"fix_teletext_pts", "Try to fix pts values of dvb teletext streams.", offsetof(MpegTSContext, fix_teletext_pts), AV_OPT_TYPE_INT,
157
     {.i64 = 1}, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
158
    { NULL },
159
};
160
 
161
static const AVClass mpegts_class = {
162
    .class_name = "mpegts demuxer",
163
    .item_name  = av_default_item_name,
164
    .option     = mpegts_options,
165
    .version    = LIBAVUTIL_VERSION_INT,
166
};
167
 
168
/* TS stream handling */
169
 
170
enum MpegTSState {
171
    MPEGTS_HEADER = 0,
172
    MPEGTS_PESHEADER,
173
    MPEGTS_PESHEADER_FILL,
174
    MPEGTS_PAYLOAD,
175
    MPEGTS_SKIP,
176
};
177
 
178
/* enough for PES header + length */
179
#define PES_START_SIZE  6
180
#define PES_HEADER_SIZE 9
181
#define MAX_PES_HEADER_SIZE (9 + 255)
182
 
183
typedef struct PESContext {
184
    int pid;
185
    int pcr_pid; /**< if -1 then all packets containing PCR are considered */
186
    int stream_type;
187
    MpegTSContext *ts;
188
    AVFormatContext *stream;
189
    AVStream *st;
190
    AVStream *sub_st; /**< stream for the embedded AC3 stream in HDMV TrueHD */
191
    enum MpegTSState state;
192
    /* used to get the format */
193
    int data_index;
194
    int flags; /**< copied to the AVPacket flags */
195
    int total_size;
196
    int pes_header_size;
197
    int extended_stream_id;
198
    int64_t pts, dts;
199
    int64_t ts_packet_pos; /**< position of first TS packet of this PES packet */
200
    uint8_t header[MAX_PES_HEADER_SIZE];
201
    AVBufferRef *buffer;
202
    SLConfigDescr sl;
203
    int64_t last_pcr;
204
} PESContext;
205
 
206
extern AVInputFormat ff_mpegts_demuxer;
207
 
208
static void clear_avprogram(MpegTSContext *ts, unsigned int programid)
209
{
210
    AVProgram *prg = NULL;
211
    int i;
212
    for(i=0; istream->nb_programs; i++)
213
        if(ts->stream->programs[i]->id == programid){
214
            prg = ts->stream->programs[i];
215
            break;
216
        }
217
    if (!prg)
218
        return;
219
    prg->nb_stream_indexes = 0;
220
}
221
 
222
static void clear_program(MpegTSContext *ts, unsigned int programid)
223
{
224
    int i;
225
 
226
    clear_avprogram(ts, programid);
227
    for(i=0; inb_prg; i++)
228
        if(ts->prg[i].id == programid)
229
            ts->prg[i].nb_pids = 0;
230
}
231
 
232
static void clear_programs(MpegTSContext *ts)
233
{
234
    av_freep(&ts->prg);
235
    ts->nb_prg=0;
236
}
237
 
238
static void add_pat_entry(MpegTSContext *ts, unsigned int programid)
239
{
240
    struct Program *p;
241
    if (av_reallocp_array(&ts->prg, ts->nb_prg + 1, sizeof(*ts->prg)) < 0) {
242
        ts->nb_prg = 0;
243
        return;
244
    }
245
    p = &ts->prg[ts->nb_prg];
246
    p->id = programid;
247
    p->nb_pids = 0;
248
    ts->nb_prg++;
249
}
250
 
251
static void add_pid_to_pmt(MpegTSContext *ts, unsigned int programid, unsigned int pid)
252
{
253
    int i;
254
    struct Program *p = NULL;
255
    for(i=0; inb_prg; i++) {
256
        if(ts->prg[i].id == programid) {
257
            p = &ts->prg[i];
258
            break;
259
        }
260
    }
261
    if(!p)
262
        return;
263
 
264
    if(p->nb_pids >= MAX_PIDS_PER_PROGRAM)
265
        return;
266
    p->pids[p->nb_pids++] = pid;
267
}
268
 
269
static void set_pcr_pid(AVFormatContext *s, unsigned int programid, unsigned int pid)
270
{
271
    int i;
272
    for(i=0; inb_programs; i++) {
273
        if(s->programs[i]->id == programid) {
274
            s->programs[i]->pcr_pid = pid;
275
            break;
276
        }
277
    }
278
}
279
 
280
/**
281
 * @brief discard_pid() decides if the pid is to be discarded according
282
 *                      to caller's programs selection
283
 * @param ts    : - TS context
284
 * @param pid   : - pid
285
 * @return 1 if the pid is only comprised in programs that have .discard=AVDISCARD_ALL
286
 *         0 otherwise
287
 */
288
static int discard_pid(MpegTSContext *ts, unsigned int pid)
289
{
290
    int i, j, k;
291
    int used = 0, discarded = 0;
292
    struct Program *p;
293
 
294
    /* If none of the programs have .discard=AVDISCARD_ALL then there's
295
     * no way we have to discard this packet
296
     */
297
    for (k = 0; k < ts->stream->nb_programs; k++) {
298
        if (ts->stream->programs[k]->discard == AVDISCARD_ALL)
299
            break;
300
    }
301
    if (k == ts->stream->nb_programs)
302
        return 0;
303
 
304
    for(i=0; inb_prg; i++) {
305
        p = &ts->prg[i];
306
        for(j=0; jnb_pids; j++) {
307
            if(p->pids[j] != pid)
308
                continue;
309
            //is program with id p->id set to be discarded?
310
            for(k=0; kstream->nb_programs; k++) {
311
                if(ts->stream->programs[k]->id == p->id) {
312
                    if(ts->stream->programs[k]->discard == AVDISCARD_ALL)
313
                        discarded++;
314
                    else
315
                        used++;
316
                }
317
            }
318
        }
319
    }
320
 
321
    return !used && discarded;
322
}
323
 
324
/**
325
 *  Assemble PES packets out of TS packets, and then call the "section_cb"
326
 *  function when they are complete.
327
 */
328
static void write_section_data(AVFormatContext *s, MpegTSFilter *tss1,
329
                               const uint8_t *buf, int buf_size, int is_start)
330
{
331
    MpegTSContext *ts = s->priv_data;
332
    MpegTSSectionFilter *tss = &tss1->u.section_filter;
333
    int len;
334
 
335
    if (is_start) {
336
        memcpy(tss->section_buf, buf, buf_size);
337
        tss->section_index = buf_size;
338
        tss->section_h_size = -1;
339
        tss->end_of_section_reached = 0;
340
    } else {
341
        if (tss->end_of_section_reached)
342
            return;
343
        len = 4096 - tss->section_index;
344
        if (buf_size < len)
345
            len = buf_size;
346
        memcpy(tss->section_buf + tss->section_index, buf, len);
347
        tss->section_index += len;
348
    }
349
 
350
    /* compute section length if possible */
351
    if (tss->section_h_size == -1 && tss->section_index >= 3) {
352
        len = (AV_RB16(tss->section_buf + 1) & 0xfff) + 3;
353
        if (len > 4096)
354
            return;
355
        tss->section_h_size = len;
356
    }
357
 
358
    if (tss->section_h_size != -1 && tss->section_index >= tss->section_h_size) {
359
        int crc_valid = 1;
360
        tss->end_of_section_reached = 1;
361
 
362
        if (tss->check_crc){
363
            crc_valid = !av_crc(av_crc_get_table(AV_CRC_32_IEEE), -1, tss->section_buf, tss->section_h_size);
364
            if (crc_valid){
365
                ts->crc_validity[ tss1->pid ] = 100;
366
            }else if(ts->crc_validity[ tss1->pid ] > -10){
367
                ts->crc_validity[ tss1->pid ]--;
368
            }else
369
                crc_valid = 2;
370
        }
371
        if (crc_valid)
372
            tss->section_cb(tss1, tss->section_buf, tss->section_h_size);
373
    }
374
}
375
 
376
static MpegTSFilter *mpegts_open_section_filter(MpegTSContext *ts, unsigned int pid,
377
                                         SectionCallback *section_cb, void *opaque,
378
                                         int check_crc)
379
 
380
{
381
    MpegTSFilter *filter;
382
    MpegTSSectionFilter *sec;
383
 
384
    av_dlog(ts->stream, "Filter: pid=0x%x\n", pid);
385
 
386
    if (pid >= NB_PID_MAX || ts->pids[pid])
387
        return NULL;
388
    filter = av_mallocz(sizeof(MpegTSFilter));
389
    if (!filter)
390
        return NULL;
391
    ts->pids[pid] = filter;
392
    filter->type = MPEGTS_SECTION;
393
    filter->pid = pid;
394
    filter->es_id = -1;
395
    filter->last_cc = -1;
396
    sec = &filter->u.section_filter;
397
    sec->section_cb = section_cb;
398
    sec->opaque = opaque;
399
    sec->section_buf = av_malloc(MAX_SECTION_SIZE);
400
    sec->check_crc = check_crc;
401
    if (!sec->section_buf) {
402
        av_free(filter);
403
        return NULL;
404
    }
405
    return filter;
406
}
407
 
408
static MpegTSFilter *mpegts_open_pes_filter(MpegTSContext *ts, unsigned int pid,
409
                                     PESCallback *pes_cb,
410
                                     void *opaque)
411
{
412
    MpegTSFilter *filter;
413
    MpegTSPESFilter *pes;
414
 
415
    if (pid >= NB_PID_MAX || ts->pids[pid])
416
        return NULL;
417
    filter = av_mallocz(sizeof(MpegTSFilter));
418
    if (!filter)
419
        return NULL;
420
    ts->pids[pid] = filter;
421
    filter->type = MPEGTS_PES;
422
    filter->pid = pid;
423
    filter->es_id = -1;
424
    filter->last_cc = -1;
425
    pes = &filter->u.pes_filter;
426
    pes->pes_cb = pes_cb;
427
    pes->opaque = opaque;
428
    return filter;
429
}
430
 
431
static void mpegts_close_filter(MpegTSContext *ts, MpegTSFilter *filter)
432
{
433
    int pid;
434
 
435
    pid = filter->pid;
436
    if (filter->type == MPEGTS_SECTION)
437
        av_freep(&filter->u.section_filter.section_buf);
438
    else if (filter->type == MPEGTS_PES) {
439
        PESContext *pes = filter->u.pes_filter.opaque;
440
        av_buffer_unref(&pes->buffer);
441
        /* referenced private data will be freed later in
442
         * avformat_close_input */
443
        if (!((PESContext *)filter->u.pes_filter.opaque)->st) {
444
            av_freep(&filter->u.pes_filter.opaque);
445
        }
446
    }
447
 
448
    av_free(filter);
449
    ts->pids[pid] = NULL;
450
}
451
 
452
static int analyze(const uint8_t *buf, int size, int packet_size, int *index){
453
    int stat[TS_MAX_PACKET_SIZE];
454
    int i;
455
    int x=0;
456
    int best_score=0;
457
 
458
    memset(stat, 0, packet_size*sizeof(int));
459
 
460
    for(x=i=0; i
461
        if(buf[i] == 0x47 && !(buf[i+1] & 0x80) && buf[i+3] != 0x47){
462
            stat[x]++;
463
            if(stat[x] > best_score){
464
                best_score= stat[x];
465
                if(index) *index= x;
466
            }
467
        }
468
 
469
        x++;
470
        if(x == packet_size) x= 0;
471
    }
472
 
473
    return best_score;
474
}
475
 
476
/* autodetect fec presence. Must have at least 1024 bytes  */
477
static int get_packet_size(const uint8_t *buf, int size)
478
{
479
    int score, fec_score, dvhs_score;
480
 
481
    if (size < (TS_FEC_PACKET_SIZE * 5 + 1))
482
        return -1;
483
 
484
    score    = analyze(buf, size, TS_PACKET_SIZE, NULL);
485
    dvhs_score    = analyze(buf, size, TS_DVHS_PACKET_SIZE, NULL);
486
    fec_score= analyze(buf, size, TS_FEC_PACKET_SIZE, NULL);
487
    av_dlog(NULL, "score: %d, dvhs_score: %d, fec_score: %d \n",
488
            score, dvhs_score, fec_score);
489
 
490
    if     (score > fec_score && score > dvhs_score) return TS_PACKET_SIZE;
491
    else if(dvhs_score > score && dvhs_score > fec_score) return TS_DVHS_PACKET_SIZE;
492
    else if(score < fec_score && dvhs_score < fec_score) return TS_FEC_PACKET_SIZE;
493
    else                       return -1;
494
}
495
 
496
typedef struct SectionHeader {
497
    uint8_t tid;
498
    uint16_t id;
499
    uint8_t version;
500
    uint8_t sec_num;
501
    uint8_t last_sec_num;
502
} SectionHeader;
503
 
504
static inline int get8(const uint8_t **pp, const uint8_t *p_end)
505
{
506
    const uint8_t *p;
507
    int c;
508
 
509
    p = *pp;
510
    if (p >= p_end)
511
        return -1;
512
    c = *p++;
513
    *pp = p;
514
    return c;
515
}
516
 
517
static inline int get16(const uint8_t **pp, const uint8_t *p_end)
518
{
519
    const uint8_t *p;
520
    int c;
521
 
522
    p = *pp;
523
    if ((p + 1) >= p_end)
524
        return -1;
525
    c = AV_RB16(p);
526
    p += 2;
527
    *pp = p;
528
    return c;
529
}
530
 
531
/* read and allocate a DVB string preceded by its length */
532
static char *getstr8(const uint8_t **pp, const uint8_t *p_end)
533
{
534
    int len;
535
    const uint8_t *p;
536
    char *str;
537
 
538
    p = *pp;
539
    len = get8(&p, p_end);
540
    if (len < 0)
541
        return NULL;
542
    if ((p + len) > p_end)
543
        return NULL;
544
    str = av_malloc(len + 1);
545
    if (!str)
546
        return NULL;
547
    memcpy(str, p, len);
548
    str[len] = '\0';
549
    p += len;
550
    *pp = p;
551
    return str;
552
}
553
 
554
static int parse_section_header(SectionHeader *h,
555
                                const uint8_t **pp, const uint8_t *p_end)
556
{
557
    int val;
558
 
559
    val = get8(pp, p_end);
560
    if (val < 0)
561
        return -1;
562
    h->tid = val;
563
    *pp += 2;
564
    val = get16(pp, p_end);
565
    if (val < 0)
566
        return -1;
567
    h->id = val;
568
    val = get8(pp, p_end);
569
    if (val < 0)
570
        return -1;
571
    h->version = (val >> 1) & 0x1f;
572
    val = get8(pp, p_end);
573
    if (val < 0)
574
        return -1;
575
    h->sec_num = val;
576
    val = get8(pp, p_end);
577
    if (val < 0)
578
        return -1;
579
    h->last_sec_num = val;
580
    return 0;
581
}
582
 
583
typedef struct {
584
    uint32_t stream_type;
585
    enum AVMediaType codec_type;
586
    enum AVCodecID codec_id;
587
} StreamType;
588
 
589
static const StreamType ISO_types[] = {
590
    { 0x01, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_MPEG2VIDEO },
591
    { 0x02, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_MPEG2VIDEO },
592
    { 0x03, AVMEDIA_TYPE_AUDIO,        AV_CODEC_ID_MP3 },
593
    { 0x04, AVMEDIA_TYPE_AUDIO,        AV_CODEC_ID_MP3 },
594
    { 0x0f, AVMEDIA_TYPE_AUDIO,        AV_CODEC_ID_AAC },
595
    { 0x10, AVMEDIA_TYPE_VIDEO,      AV_CODEC_ID_MPEG4 },
596
    /* Makito encoder sets stream type 0x11 for AAC,
597
     * so auto-detect LOAS/LATM instead of hardcoding it. */
598
#if !CONFIG_LOAS_DEMUXER
599
    { 0x11, AVMEDIA_TYPE_AUDIO,   AV_CODEC_ID_AAC_LATM }, /* LATM syntax */
600
#endif
601
    { 0x1b, AVMEDIA_TYPE_VIDEO,       AV_CODEC_ID_H264 },
602
    { 0x24, AVMEDIA_TYPE_VIDEO,       AV_CODEC_ID_HEVC },
603
    { 0x42, AVMEDIA_TYPE_VIDEO,       AV_CODEC_ID_CAVS },
604
    { 0xd1, AVMEDIA_TYPE_VIDEO,      AV_CODEC_ID_DIRAC },
605
    { 0xea, AVMEDIA_TYPE_VIDEO,        AV_CODEC_ID_VC1 },
606
    { 0 },
607
};
608
 
609
static const StreamType HDMV_types[] = {
610
    { 0x80, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_PCM_BLURAY },
611
    { 0x81, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC3 },
612
    { 0x82, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
613
    { 0x83, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_TRUEHD },
614
    { 0x84, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_EAC3 },
615
    { 0x85, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS }, /* DTS HD */
616
    { 0x86, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS }, /* DTS HD MASTER*/
617
    { 0xa1, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_EAC3 }, /* E-AC3 Secondary Audio */
618
    { 0xa2, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },  /* DTS Express Secondary Audio */
619
    { 0x90, AVMEDIA_TYPE_SUBTITLE, AV_CODEC_ID_HDMV_PGS_SUBTITLE },
620
    { 0 },
621
};
622
 
623
/* ATSC ? */
624
static const StreamType MISC_types[] = {
625
    { 0x81, AVMEDIA_TYPE_AUDIO,   AV_CODEC_ID_AC3 },
626
    { 0x8a, AVMEDIA_TYPE_AUDIO,   AV_CODEC_ID_DTS },
627
    { 0 },
628
};
629
 
630
static const StreamType REGD_types[] = {
631
    { MKTAG('d','r','a','c'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_DIRAC },
632
    { MKTAG('A','C','-','3'), AVMEDIA_TYPE_AUDIO,   AV_CODEC_ID_AC3 },
633
    { MKTAG('B','S','S','D'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_S302M },
634
    { MKTAG('D','T','S','1'), AVMEDIA_TYPE_AUDIO,   AV_CODEC_ID_DTS },
635
    { MKTAG('D','T','S','2'), AVMEDIA_TYPE_AUDIO,   AV_CODEC_ID_DTS },
636
    { MKTAG('D','T','S','3'), AVMEDIA_TYPE_AUDIO,   AV_CODEC_ID_DTS },
637
    { MKTAG('H','E','V','C'), AVMEDIA_TYPE_VIDEO,  AV_CODEC_ID_HEVC },
638
    { MKTAG('K','L','V','A'), AVMEDIA_TYPE_DATA,    AV_CODEC_ID_SMPTE_KLV },
639
    { MKTAG('V','C','-','1'), AVMEDIA_TYPE_VIDEO,   AV_CODEC_ID_VC1 },
640
    { 0 },
641
};
642
 
643
/* descriptor present */
644
static const StreamType DESC_types[] = {
645
    { 0x6a, AVMEDIA_TYPE_AUDIO,             AV_CODEC_ID_AC3 }, /* AC-3 descriptor */
646
    { 0x7a, AVMEDIA_TYPE_AUDIO,            AV_CODEC_ID_EAC3 }, /* E-AC-3 descriptor */
647
    { 0x7b, AVMEDIA_TYPE_AUDIO,             AV_CODEC_ID_DTS },
648
    { 0x56, AVMEDIA_TYPE_SUBTITLE, AV_CODEC_ID_DVB_TELETEXT },
649
    { 0x59, AVMEDIA_TYPE_SUBTITLE, AV_CODEC_ID_DVB_SUBTITLE }, /* subtitling descriptor */
650
    { 0 },
651
};
652
 
653
static void mpegts_find_stream_type(AVStream *st,
654
                                    uint32_t stream_type, const StreamType *types)
655
{
656
    if (avcodec_is_open(st->codec)) {
657
        av_log(NULL, AV_LOG_DEBUG, "cannot set stream info, codec is open\n");
658
        return;
659
    }
660
 
661
    for (; types->stream_type; types++) {
662
        if (stream_type == types->stream_type) {
663
            st->codec->codec_type = types->codec_type;
664
            st->codec->codec_id   = types->codec_id;
665
            st->request_probe     = 0;
666
            return;
667
        }
668
    }
669
}
670
 
671
static int mpegts_set_stream_info(AVStream *st, PESContext *pes,
672
                                  uint32_t stream_type, uint32_t prog_reg_desc)
673
{
674
    int old_codec_type= st->codec->codec_type;
675
    int old_codec_id  = st->codec->codec_id;
676
 
677
    if (avcodec_is_open(st->codec)) {
678
        av_log(pes->stream, AV_LOG_DEBUG, "cannot set stream info, codec is open\n");
679
        return 0;
680
    }
681
 
682
    avpriv_set_pts_info(st, 33, 1, 90000);
683
    st->priv_data = pes;
684
    st->codec->codec_type = AVMEDIA_TYPE_DATA;
685
    st->codec->codec_id   = AV_CODEC_ID_NONE;
686
    st->need_parsing = AVSTREAM_PARSE_FULL;
687
    pes->st = st;
688
    pes->stream_type = stream_type;
689
 
690
    av_log(pes->stream, AV_LOG_DEBUG,
691
           "stream=%d stream_type=%x pid=%x prog_reg_desc=%.4s\n",
692
           st->index, pes->stream_type, pes->pid, (char*)&prog_reg_desc);
693
 
694
    st->codec->codec_tag = pes->stream_type;
695
 
696
    mpegts_find_stream_type(st, pes->stream_type, ISO_types);
697
    if ((prog_reg_desc == AV_RL32("HDMV") ||
698
         prog_reg_desc == AV_RL32("HDPR")) &&
699
        st->codec->codec_id == AV_CODEC_ID_NONE) {
700
        mpegts_find_stream_type(st, pes->stream_type, HDMV_types);
701
        if (pes->stream_type == 0x83) {
702
            // HDMV TrueHD streams also contain an AC3 coded version of the
703
            // audio track - add a second stream for this
704
            AVStream *sub_st;
705
            // priv_data cannot be shared between streams
706
            PESContext *sub_pes = av_malloc(sizeof(*sub_pes));
707
            if (!sub_pes)
708
                return AVERROR(ENOMEM);
709
            memcpy(sub_pes, pes, sizeof(*sub_pes));
710
 
711
            sub_st = avformat_new_stream(pes->stream, NULL);
712
            if (!sub_st) {
713
                av_free(sub_pes);
714
                return AVERROR(ENOMEM);
715
            }
716
 
717
            sub_st->id = pes->pid;
718
            avpriv_set_pts_info(sub_st, 33, 1, 90000);
719
            sub_st->priv_data = sub_pes;
720
            sub_st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
721
            sub_st->codec->codec_id   = AV_CODEC_ID_AC3;
722
            sub_st->need_parsing = AVSTREAM_PARSE_FULL;
723
            sub_pes->sub_st = pes->sub_st = sub_st;
724
        }
725
    }
726
    if (st->codec->codec_id == AV_CODEC_ID_NONE)
727
        mpegts_find_stream_type(st, pes->stream_type, MISC_types);
728
    if (st->codec->codec_id == AV_CODEC_ID_NONE){
729
        st->codec->codec_id  = old_codec_id;
730
        st->codec->codec_type= old_codec_type;
731
    }
732
 
733
    return 0;
734
}
735
 
736
static void new_pes_packet(PESContext *pes, AVPacket *pkt)
737
{
738
    av_init_packet(pkt);
739
 
740
    pkt->buf  = pes->buffer;
741
    pkt->data = pes->buffer->data;
742
    pkt->size = pes->data_index;
743
 
744
    if(pes->total_size != MAX_PES_PAYLOAD &&
745
       pes->pes_header_size + pes->data_index != pes->total_size + PES_START_SIZE) {
746
        av_log(pes->stream, AV_LOG_WARNING, "PES packet size mismatch\n");
747
        pes->flags |= AV_PKT_FLAG_CORRUPT;
748
    }
749
    memset(pkt->data+pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
750
 
751
    // Separate out the AC3 substream from an HDMV combined TrueHD/AC3 PID
752
    if (pes->sub_st && pes->stream_type == 0x83 && pes->extended_stream_id == 0x76)
753
        pkt->stream_index = pes->sub_st->index;
754
    else
755
        pkt->stream_index = pes->st->index;
756
    pkt->pts = pes->pts;
757
    pkt->dts = pes->dts;
758
    /* store position of first TS packet of this PES packet */
759
    pkt->pos = pes->ts_packet_pos;
760
    pkt->flags = pes->flags;
761
 
762
    /* reset pts values */
763
    pes->pts = AV_NOPTS_VALUE;
764
    pes->dts = AV_NOPTS_VALUE;
765
    pes->buffer = NULL;
766
    pes->data_index = 0;
767
    pes->flags = 0;
768
}
769
 
770
static uint64_t get_ts64(GetBitContext *gb, int bits)
771
{
772
    if (get_bits_left(gb) < bits)
773
        return AV_NOPTS_VALUE;
774
    return get_bits64(gb, bits);
775
}
776
 
777
static int read_sl_header(PESContext *pes, SLConfigDescr *sl, const uint8_t *buf, int buf_size)
778
{
779
    GetBitContext gb;
780
    int au_start_flag = 0, au_end_flag = 0, ocr_flag = 0, idle_flag = 0;
781
    int padding_flag = 0, padding_bits = 0, inst_bitrate_flag = 0;
782
    int dts_flag = -1, cts_flag = -1;
783
    int64_t dts = AV_NOPTS_VALUE, cts = AV_NOPTS_VALUE;
784
 
785
    init_get_bits(&gb, buf, buf_size*8);
786
 
787
    if (sl->use_au_start)
788
        au_start_flag = get_bits1(&gb);
789
    if (sl->use_au_end)
790
        au_end_flag = get_bits1(&gb);
791
    if (!sl->use_au_start && !sl->use_au_end)
792
        au_start_flag = au_end_flag = 1;
793
    if (sl->ocr_len > 0)
794
        ocr_flag = get_bits1(&gb);
795
    if (sl->use_idle)
796
        idle_flag = get_bits1(&gb);
797
    if (sl->use_padding)
798
        padding_flag = get_bits1(&gb);
799
    if (padding_flag)
800
        padding_bits = get_bits(&gb, 3);
801
 
802
    if (!idle_flag && (!padding_flag || padding_bits != 0)) {
803
        if (sl->packet_seq_num_len)
804
            skip_bits_long(&gb, sl->packet_seq_num_len);
805
        if (sl->degr_prior_len)
806
            if (get_bits1(&gb))
807
                skip_bits(&gb, sl->degr_prior_len);
808
        if (ocr_flag)
809
            skip_bits_long(&gb, sl->ocr_len);
810
        if (au_start_flag) {
811
            if (sl->use_rand_acc_pt)
812
                get_bits1(&gb);
813
            if (sl->au_seq_num_len > 0)
814
                skip_bits_long(&gb, sl->au_seq_num_len);
815
            if (sl->use_timestamps) {
816
                dts_flag = get_bits1(&gb);
817
                cts_flag = get_bits1(&gb);
818
            }
819
        }
820
        if (sl->inst_bitrate_len)
821
            inst_bitrate_flag = get_bits1(&gb);
822
        if (dts_flag == 1)
823
            dts = get_ts64(&gb, sl->timestamp_len);
824
        if (cts_flag == 1)
825
            cts = get_ts64(&gb, sl->timestamp_len);
826
        if (sl->au_len > 0)
827
            skip_bits_long(&gb, sl->au_len);
828
        if (inst_bitrate_flag)
829
            skip_bits_long(&gb, sl->inst_bitrate_len);
830
    }
831
 
832
    if (dts != AV_NOPTS_VALUE)
833
        pes->dts = dts;
834
    if (cts != AV_NOPTS_VALUE)
835
        pes->pts = cts;
836
 
837
    if (sl->timestamp_len && sl->timestamp_res)
838
        avpriv_set_pts_info(pes->st, sl->timestamp_len, 1, sl->timestamp_res);
839
 
840
    return (get_bits_count(&gb) + 7) >> 3;
841
}
842
 
843
/* return non zero if a packet could be constructed */
844
static int mpegts_push_data(MpegTSFilter *filter,
845
                            const uint8_t *buf, int buf_size, int is_start,
846
                            int64_t pos, int64_t pcr)
847
{
848
    PESContext *pes = filter->u.pes_filter.opaque;
849
    MpegTSContext *ts = pes->ts;
850
    const uint8_t *p;
851
    int len, code;
852
 
853
    if(!ts->pkt)
854
        return 0;
855
 
856
    if (pcr != -1)
857
        pes->last_pcr = pcr;
858
 
859
    if (is_start) {
860
        if (pes->state == MPEGTS_PAYLOAD && pes->data_index > 0) {
861
            new_pes_packet(pes, ts->pkt);
862
            ts->stop_parse = 1;
863
        }
864
        pes->state = MPEGTS_HEADER;
865
        pes->data_index = 0;
866
        pes->ts_packet_pos = pos;
867
    }
868
    p = buf;
869
    while (buf_size > 0) {
870
        switch(pes->state) {
871
        case MPEGTS_HEADER:
872
            len = PES_START_SIZE - pes->data_index;
873
            if (len > buf_size)
874
                len = buf_size;
875
            memcpy(pes->header + pes->data_index, p, len);
876
            pes->data_index += len;
877
            p += len;
878
            buf_size -= len;
879
            if (pes->data_index == PES_START_SIZE) {
880
                /* we got all the PES or section header. We can now
881
                   decide */
882
                if (pes->header[0] == 0x00 && pes->header[1] == 0x00 &&
883
                    pes->header[2] == 0x01) {
884
                    /* it must be an mpeg2 PES stream */
885
                    code = pes->header[3] | 0x100;
886
                    av_dlog(pes->stream, "pid=%x pes_code=%#x\n", pes->pid, code);
887
 
888
                    if ((pes->st && pes->st->discard == AVDISCARD_ALL &&
889
                         (!pes->sub_st || pes->sub_st->discard == AVDISCARD_ALL)) ||
890
                        code == 0x1be) /* padding_stream */
891
                        goto skip;
892
 
893
                    /* stream not present in PMT */
894
                    if (!pes->st) {
895
                        pes->st = avformat_new_stream(ts->stream, NULL);
896
                        if (!pes->st)
897
                            return AVERROR(ENOMEM);
898
                        pes->st->id = pes->pid;
899
                        mpegts_set_stream_info(pes->st, pes, 0, 0);
900
                    }
901
 
902
                    pes->total_size = AV_RB16(pes->header + 4);
903
                    /* NOTE: a zero total size means the PES size is
904
                       unbounded */
905
                    if (!pes->total_size)
906
                        pes->total_size = MAX_PES_PAYLOAD;
907
 
908
                    /* allocate pes buffer */
909
                    pes->buffer = av_buffer_alloc(pes->total_size +
910
                                                  FF_INPUT_BUFFER_PADDING_SIZE);
911
                    if (!pes->buffer)
912
                        return AVERROR(ENOMEM);
913
 
914
                    if (code != 0x1bc && code != 0x1bf && /* program_stream_map, private_stream_2 */
915
                        code != 0x1f0 && code != 0x1f1 && /* ECM, EMM */
916
                        code != 0x1ff && code != 0x1f2 && /* program_stream_directory, DSMCC_stream */
917
                        code != 0x1f8) {                  /* ITU-T Rec. H.222.1 type E stream */
918
                        pes->state = MPEGTS_PESHEADER;
919
                        if (pes->st->codec->codec_id == AV_CODEC_ID_NONE && !pes->st->request_probe) {
920
                            av_dlog(pes->stream, "pid=%x stream_type=%x probing\n",
921
                                    pes->pid, pes->stream_type);
922
                            pes->st->request_probe= 1;
923
                        }
924
                    } else {
925
                        pes->state = MPEGTS_PAYLOAD;
926
                        pes->data_index = 0;
927
                    }
928
                } else {
929
                    /* otherwise, it should be a table */
930
                    /* skip packet */
931
                skip:
932
                    pes->state = MPEGTS_SKIP;
933
                    continue;
934
                }
935
            }
936
            break;
937
            /**********************************************/
938
            /* PES packing parsing */
939
        case MPEGTS_PESHEADER:
940
            len = PES_HEADER_SIZE - pes->data_index;
941
            if (len < 0)
942
                return -1;
943
            if (len > buf_size)
944
                len = buf_size;
945
            memcpy(pes->header + pes->data_index, p, len);
946
            pes->data_index += len;
947
            p += len;
948
            buf_size -= len;
949
            if (pes->data_index == PES_HEADER_SIZE) {
950
                pes->pes_header_size = pes->header[8] + 9;
951
                pes->state = MPEGTS_PESHEADER_FILL;
952
            }
953
            break;
954
        case MPEGTS_PESHEADER_FILL:
955
            len = pes->pes_header_size - pes->data_index;
956
            if (len < 0)
957
                return -1;
958
            if (len > buf_size)
959
                len = buf_size;
960
            memcpy(pes->header + pes->data_index, p, len);
961
            pes->data_index += len;
962
            p += len;
963
            buf_size -= len;
964
            if (pes->data_index == pes->pes_header_size) {
965
                const uint8_t *r;
966
                unsigned int flags, pes_ext, skip;
967
 
968
                flags = pes->header[7];
969
                r = pes->header + 9;
970
                pes->pts = AV_NOPTS_VALUE;
971
                pes->dts = AV_NOPTS_VALUE;
972
                if ((flags & 0xc0) == 0x80) {
973
                    pes->dts = pes->pts = ff_parse_pes_pts(r);
974
                    r += 5;
975
                } else if ((flags & 0xc0) == 0xc0) {
976
                    pes->pts = ff_parse_pes_pts(r);
977
                    r += 5;
978
                    pes->dts = ff_parse_pes_pts(r);
979
                    r += 5;
980
                }
981
                pes->extended_stream_id = -1;
982
                if (flags & 0x01) { /* PES extension */
983
                    pes_ext = *r++;
984
                    /* Skip PES private data, program packet sequence counter and P-STD buffer */
985
                    skip = (pes_ext >> 4) & 0xb;
986
                    skip += skip & 0x9;
987
                    r += skip;
988
                    if ((pes_ext & 0x41) == 0x01 &&
989
                        (r + 2) <= (pes->header + pes->pes_header_size)) {
990
                        /* PES extension 2 */
991
                        if ((r[0] & 0x7f) > 0 && (r[1] & 0x80) == 0)
992
                            pes->extended_stream_id = r[1];
993
                    }
994
                }
995
 
996
                /* we got the full header. We parse it and get the payload */
997
                pes->state = MPEGTS_PAYLOAD;
998
                pes->data_index = 0;
999
                if (pes->stream_type == 0x12 && buf_size > 0) {
1000
                    int sl_header_bytes = read_sl_header(pes, &pes->sl, p, buf_size);
1001
                    pes->pes_header_size += sl_header_bytes;
1002
                    p += sl_header_bytes;
1003
                    buf_size -= sl_header_bytes;
1004
                }
1005
                if (pes->ts->fix_teletext_pts && pes->st->codec->codec_id == AV_CODEC_ID_DVB_TELETEXT) {
1006
                    AVProgram *p = NULL;
1007
                    while ((p = av_find_program_from_stream(pes->stream, p, pes->st->index))) {
1008
                        if (p->pcr_pid != -1 && p->discard != AVDISCARD_ALL) {
1009
                            MpegTSFilter *f = pes->ts->pids[p->pcr_pid];
1010
                            if (f && f->type == MPEGTS_PES) {
1011
                                PESContext *pcrpes = f->u.pes_filter.opaque;
1012
                                if (pcrpes && pcrpes->last_pcr != -1 && pcrpes->st && pcrpes->st->discard != AVDISCARD_ALL) {
1013
                                    // teletext packets do not always have correct timestamps,
1014
                                    // the standard says they should be handled after 40.6 ms at most,
1015
                                    // and the pcr error to this packet should be no more than 100 ms.
1016
                                    // TODO: we should interpolate the PCR, not just use the last one
1017
                                    int64_t pcr = pcrpes->last_pcr / 300;
1018
                                    pes->st->pts_wrap_reference = pcrpes->st->pts_wrap_reference;
1019
                                    pes->st->pts_wrap_behavior = pcrpes->st->pts_wrap_behavior;
1020
                                    if (pes->dts == AV_NOPTS_VALUE || pes->dts < pcr) {
1021
                                        pes->pts = pes->dts = pcr;
1022
                                    } else if (pes->dts > pcr + 3654 + 9000) {
1023
                                        pes->pts = pes->dts = pcr + 3654 + 9000;
1024
                                    }
1025
                                    break;
1026
                                }
1027
                            }
1028
                        }
1029
                    }
1030
                }
1031
            }
1032
            break;
1033
        case MPEGTS_PAYLOAD:
1034
            if (buf_size > 0 && pes->buffer) {
1035
                if (pes->data_index > 0 && pes->data_index+buf_size > pes->total_size) {
1036
                    new_pes_packet(pes, ts->pkt);
1037
                    pes->total_size = MAX_PES_PAYLOAD;
1038
                    pes->buffer = av_buffer_alloc(pes->total_size + FF_INPUT_BUFFER_PADDING_SIZE);
1039
                    if (!pes->buffer)
1040
                        return AVERROR(ENOMEM);
1041
                    ts->stop_parse = 1;
1042
                } else if (pes->data_index == 0 && buf_size > pes->total_size) {
1043
                    // pes packet size is < ts size packet and pes data is padded with 0xff
1044
                    // not sure if this is legal in ts but see issue #2392
1045
                    buf_size = pes->total_size;
1046
                }
1047
                memcpy(pes->buffer->data + pes->data_index, p, buf_size);
1048
                pes->data_index += buf_size;
1049
            }
1050
            buf_size = 0;
1051
            /* emit complete packets with known packet size
1052
             * decreases demuxer delay for infrequent packets like subtitles from
1053
             * a couple of seconds to milliseconds for properly muxed files.
1054
             * total_size is the number of bytes following pes_packet_length
1055
             * in the pes header, i.e. not counting the first PES_START_SIZE bytes */
1056
            if (!ts->stop_parse && pes->total_size < MAX_PES_PAYLOAD &&
1057
                pes->pes_header_size + pes->data_index == pes->total_size + PES_START_SIZE) {
1058
                ts->stop_parse = 1;
1059
                new_pes_packet(pes, ts->pkt);
1060
            }
1061
            break;
1062
        case MPEGTS_SKIP:
1063
            buf_size = 0;
1064
            break;
1065
        }
1066
    }
1067
 
1068
    return 0;
1069
}
1070
 
1071
static PESContext *add_pes_stream(MpegTSContext *ts, int pid, int pcr_pid)
1072
{
1073
    MpegTSFilter *tss;
1074
    PESContext *pes;
1075
 
1076
    /* if no pid found, then add a pid context */
1077
    pes = av_mallocz(sizeof(PESContext));
1078
    if (!pes)
1079
        return 0;
1080
    pes->ts = ts;
1081
    pes->stream = ts->stream;
1082
    pes->pid = pid;
1083
    pes->pcr_pid = pcr_pid;
1084
    pes->state = MPEGTS_SKIP;
1085
    pes->pts = AV_NOPTS_VALUE;
1086
    pes->dts = AV_NOPTS_VALUE;
1087
    pes->last_pcr = -1;
1088
    tss = mpegts_open_pes_filter(ts, pid, mpegts_push_data, pes);
1089
    if (!tss) {
1090
        av_free(pes);
1091
        return 0;
1092
    }
1093
    return pes;
1094
}
1095
 
1096
#define MAX_LEVEL 4
1097
typedef struct {
1098
    AVFormatContext *s;
1099
    AVIOContext pb;
1100
    Mp4Descr *descr;
1101
    Mp4Descr *active_descr;
1102
    int descr_count;
1103
    int max_descr_count;
1104
    int level;
1105
} MP4DescrParseContext;
1106
 
1107
static int init_MP4DescrParseContext(
1108
    MP4DescrParseContext *d, AVFormatContext *s, const uint8_t *buf,
1109
    unsigned size, Mp4Descr *descr, int max_descr_count)
1110
{
1111
    int ret;
1112
    if (size > (1<<30))
1113
        return AVERROR_INVALIDDATA;
1114
 
1115
    if ((ret = ffio_init_context(&d->pb, (unsigned char*)buf, size, 0,
1116
                          NULL, NULL, NULL, NULL)) < 0)
1117
        return ret;
1118
 
1119
    d->s = s;
1120
    d->level = 0;
1121
    d->descr_count = 0;
1122
    d->descr = descr;
1123
    d->active_descr = NULL;
1124
    d->max_descr_count = max_descr_count;
1125
 
1126
    return 0;
1127
}
1128
 
1129
static void update_offsets(AVIOContext *pb, int64_t *off, int *len) {
1130
    int64_t new_off = avio_tell(pb);
1131
    (*len) -= new_off - *off;
1132
    *off = new_off;
1133
}
1134
 
1135
static int parse_mp4_descr(MP4DescrParseContext *d, int64_t off, int len,
1136
                           int target_tag);
1137
 
1138
static int parse_mp4_descr_arr(MP4DescrParseContext *d, int64_t off, int len)
1139
{
1140
    while (len > 0) {
1141
        if (parse_mp4_descr(d, off, len, 0) < 0)
1142
            return -1;
1143
        update_offsets(&d->pb, &off, &len);
1144
    }
1145
    return 0;
1146
}
1147
 
1148
static int parse_MP4IODescrTag(MP4DescrParseContext *d, int64_t off, int len)
1149
{
1150
    avio_rb16(&d->pb); // ID
1151
    avio_r8(&d->pb);
1152
    avio_r8(&d->pb);
1153
    avio_r8(&d->pb);
1154
    avio_r8(&d->pb);
1155
    avio_r8(&d->pb);
1156
    update_offsets(&d->pb, &off, &len);
1157
    return parse_mp4_descr_arr(d, off, len);
1158
}
1159
 
1160
static int parse_MP4ODescrTag(MP4DescrParseContext *d, int64_t off, int len)
1161
{
1162
    int id_flags;
1163
    if (len < 2)
1164
        return 0;
1165
    id_flags = avio_rb16(&d->pb);
1166
    if (!(id_flags & 0x0020)) { //URL_Flag
1167
        update_offsets(&d->pb, &off, &len);
1168
        return parse_mp4_descr_arr(d, off, len); //ES_Descriptor[]
1169
    } else {
1170
        return 0;
1171
    }
1172
}
1173
 
1174
static int parse_MP4ESDescrTag(MP4DescrParseContext *d, int64_t off, int len)
1175
{
1176
    int es_id = 0;
1177
    if (d->descr_count >= d->max_descr_count)
1178
        return -1;
1179
    ff_mp4_parse_es_descr(&d->pb, &es_id);
1180
    d->active_descr = d->descr + (d->descr_count++);
1181
 
1182
    d->active_descr->es_id = es_id;
1183
    update_offsets(&d->pb, &off, &len);
1184
    parse_mp4_descr(d, off, len, MP4DecConfigDescrTag);
1185
    update_offsets(&d->pb, &off, &len);
1186
    if (len > 0)
1187
        parse_mp4_descr(d, off, len, MP4SLDescrTag);
1188
    d->active_descr = NULL;
1189
    return 0;
1190
}
1191
 
1192
static int parse_MP4DecConfigDescrTag(MP4DescrParseContext *d, int64_t off, int len)
1193
{
1194
    Mp4Descr *descr = d->active_descr;
1195
    if (!descr)
1196
        return -1;
1197
    d->active_descr->dec_config_descr = av_malloc(len);
1198
    if (!descr->dec_config_descr)
1199
        return AVERROR(ENOMEM);
1200
    descr->dec_config_descr_len = len;
1201
    avio_read(&d->pb, descr->dec_config_descr, len);
1202
    return 0;
1203
}
1204
 
1205
static int parse_MP4SLDescrTag(MP4DescrParseContext *d, int64_t off, int len)
1206
{
1207
    Mp4Descr *descr = d->active_descr;
1208
    int predefined;
1209
    if (!descr)
1210
        return -1;
1211
 
1212
    predefined = avio_r8(&d->pb);
1213
    if (!predefined) {
1214
        int lengths;
1215
        int flags = avio_r8(&d->pb);
1216
        descr->sl.use_au_start       = !!(flags & 0x80);
1217
        descr->sl.use_au_end         = !!(flags & 0x40);
1218
        descr->sl.use_rand_acc_pt    = !!(flags & 0x20);
1219
        descr->sl.use_padding        = !!(flags & 0x08);
1220
        descr->sl.use_timestamps     = !!(flags & 0x04);
1221
        descr->sl.use_idle           = !!(flags & 0x02);
1222
        descr->sl.timestamp_res      = avio_rb32(&d->pb);
1223
                                       avio_rb32(&d->pb);
1224
        descr->sl.timestamp_len      = avio_r8(&d->pb);
1225
        descr->sl.ocr_len            = avio_r8(&d->pb);
1226
        descr->sl.au_len             = avio_r8(&d->pb);
1227
        descr->sl.inst_bitrate_len   = avio_r8(&d->pb);
1228
        lengths                      = avio_rb16(&d->pb);
1229
        descr->sl.degr_prior_len     = lengths >> 12;
1230
        descr->sl.au_seq_num_len     = (lengths >> 7) & 0x1f;
1231
        descr->sl.packet_seq_num_len = (lengths >> 2) & 0x1f;
1232
    } else {
1233
        avpriv_report_missing_feature(d->s, "Predefined SLConfigDescriptor");
1234
    }
1235
    return 0;
1236
}
1237
 
1238
static int parse_mp4_descr(MP4DescrParseContext *d, int64_t off, int len,
1239
                           int target_tag) {
1240
    int tag;
1241
    int len1 = ff_mp4_read_descr(d->s, &d->pb, &tag);
1242
    update_offsets(&d->pb, &off, &len);
1243
    if (len < 0 || len1 > len || len1 <= 0) {
1244
        av_log(d->s, AV_LOG_ERROR, "Tag %x length violation new length %d bytes remaining %d\n", tag, len1, len);
1245
        return -1;
1246
    }
1247
 
1248
    if (d->level++ >= MAX_LEVEL) {
1249
        av_log(d->s, AV_LOG_ERROR, "Maximum MP4 descriptor level exceeded\n");
1250
        goto done;
1251
    }
1252
 
1253
    if (target_tag && tag != target_tag) {
1254
        av_log(d->s, AV_LOG_ERROR, "Found tag %x expected %x\n", tag, target_tag);
1255
        goto done;
1256
    }
1257
 
1258
    switch (tag) {
1259
    case MP4IODescrTag:
1260
        parse_MP4IODescrTag(d, off, len1);
1261
        break;
1262
    case MP4ODescrTag:
1263
        parse_MP4ODescrTag(d, off, len1);
1264
        break;
1265
    case MP4ESDescrTag:
1266
        parse_MP4ESDescrTag(d, off, len1);
1267
        break;
1268
    case MP4DecConfigDescrTag:
1269
        parse_MP4DecConfigDescrTag(d, off, len1);
1270
        break;
1271
    case MP4SLDescrTag:
1272
        parse_MP4SLDescrTag(d, off, len1);
1273
        break;
1274
    }
1275
 
1276
done:
1277
    d->level--;
1278
    avio_seek(&d->pb, off + len1, SEEK_SET);
1279
    return 0;
1280
}
1281
 
1282
static int mp4_read_iods(AVFormatContext *s, const uint8_t *buf, unsigned size,
1283
                         Mp4Descr *descr, int *descr_count, int max_descr_count)
1284
{
1285
    MP4DescrParseContext d;
1286
    if (init_MP4DescrParseContext(&d, s, buf, size, descr, max_descr_count) < 0)
1287
        return -1;
1288
 
1289
    parse_mp4_descr(&d, avio_tell(&d.pb), size, MP4IODescrTag);
1290
 
1291
    *descr_count = d.descr_count;
1292
    return 0;
1293
}
1294
 
1295
static int mp4_read_od(AVFormatContext *s, const uint8_t *buf, unsigned size,
1296
                       Mp4Descr *descr, int *descr_count, int max_descr_count)
1297
{
1298
    MP4DescrParseContext d;
1299
    if (init_MP4DescrParseContext(&d, s, buf, size, descr, max_descr_count) < 0)
1300
        return -1;
1301
 
1302
    parse_mp4_descr_arr(&d, avio_tell(&d.pb), size);
1303
 
1304
    *descr_count = d.descr_count;
1305
    return 0;
1306
}
1307
 
1308
static void m4sl_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
1309
{
1310
    MpegTSContext *ts = filter->u.section_filter.opaque;
1311
    SectionHeader h;
1312
    const uint8_t *p, *p_end;
1313
    AVIOContext pb;
1314
    Mp4Descr mp4_descr[MAX_MP4_DESCR_COUNT] = {{ 0 }};
1315
    int mp4_descr_count = 0;
1316
    int i, pid;
1317
    AVFormatContext *s = ts->stream;
1318
 
1319
    p_end = section + section_len - 4;
1320
    p = section;
1321
    if (parse_section_header(&h, &p, p_end) < 0)
1322
        return;
1323
    if (h.tid != M4OD_TID)
1324
        return;
1325
 
1326
    mp4_read_od(s, p, (unsigned)(p_end - p), mp4_descr, &mp4_descr_count, MAX_MP4_DESCR_COUNT);
1327
 
1328
    for (pid = 0; pid < NB_PID_MAX; pid++) {
1329
        if (!ts->pids[pid])
1330
             continue;
1331
        for (i = 0; i < mp4_descr_count; i++) {
1332
            PESContext *pes;
1333
            AVStream *st;
1334
            if (ts->pids[pid]->es_id != mp4_descr[i].es_id)
1335
                continue;
1336
            if (!(ts->pids[pid] && ts->pids[pid]->type == MPEGTS_PES)) {
1337
                av_log(s, AV_LOG_ERROR, "pid %x is not PES\n", pid);
1338
                continue;
1339
            }
1340
            pes = ts->pids[pid]->u.pes_filter.opaque;
1341
            st = pes->st;
1342
            if (!st) {
1343
                continue;
1344
            }
1345
 
1346
            pes->sl = mp4_descr[i].sl;
1347
 
1348
            ffio_init_context(&pb, mp4_descr[i].dec_config_descr,
1349
                              mp4_descr[i].dec_config_descr_len, 0, NULL, NULL, NULL, NULL);
1350
            ff_mp4_read_dec_config_descr(s, st, &pb);
1351
            if (st->codec->codec_id == AV_CODEC_ID_AAC &&
1352
                st->codec->extradata_size > 0)
1353
                st->need_parsing = 0;
1354
            if (st->codec->codec_id == AV_CODEC_ID_H264 &&
1355
                st->codec->extradata_size > 0)
1356
                st->need_parsing = 0;
1357
 
1358
            if (st->codec->codec_id <= AV_CODEC_ID_NONE) {
1359
            } else if (st->codec->codec_id < AV_CODEC_ID_FIRST_AUDIO) {
1360
                st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
1361
            } else if (st->codec->codec_id < AV_CODEC_ID_FIRST_SUBTITLE) {
1362
                st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
1363
            } else if (st->codec->codec_id < AV_CODEC_ID_FIRST_UNKNOWN) {
1364
                st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
1365
            }
1366
        }
1367
    }
1368
    for (i = 0; i < mp4_descr_count; i++)
1369
        av_free(mp4_descr[i].dec_config_descr);
1370
}
1371
 
1372
int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type,
1373
                              const uint8_t **pp, const uint8_t *desc_list_end,
1374
                              Mp4Descr *mp4_descr, int mp4_descr_count, int pid,
1375
                              MpegTSContext *ts)
1376
{
1377
    const uint8_t *desc_end;
1378
    int desc_len, desc_tag, desc_es_id;
1379
    char language[252];
1380
    int i;
1381
 
1382
    desc_tag = get8(pp, desc_list_end);
1383
    if (desc_tag < 0)
1384
        return -1;
1385
    desc_len = get8(pp, desc_list_end);
1386
    if (desc_len < 0)
1387
        return -1;
1388
    desc_end = *pp + desc_len;
1389
    if (desc_end > desc_list_end)
1390
        return -1;
1391
 
1392
    av_dlog(fc, "tag: 0x%02x len=%d\n", desc_tag, desc_len);
1393
 
1394
    if (st->codec->codec_id == AV_CODEC_ID_NONE &&
1395
        stream_type == STREAM_TYPE_PRIVATE_DATA)
1396
        mpegts_find_stream_type(st, desc_tag, DESC_types);
1397
 
1398
    switch(desc_tag) {
1399
    case 0x1E: /* SL descriptor */
1400
        desc_es_id = get16(pp, desc_end);
1401
        if (ts && ts->pids[pid])
1402
            ts->pids[pid]->es_id = desc_es_id;
1403
        for (i = 0; i < mp4_descr_count; i++)
1404
        if (mp4_descr[i].dec_config_descr_len &&
1405
            mp4_descr[i].es_id == desc_es_id) {
1406
            AVIOContext pb;
1407
            ffio_init_context(&pb, mp4_descr[i].dec_config_descr,
1408
                          mp4_descr[i].dec_config_descr_len, 0, NULL, NULL, NULL, NULL);
1409
            ff_mp4_read_dec_config_descr(fc, st, &pb);
1410
            if (st->codec->codec_id == AV_CODEC_ID_AAC &&
1411
                st->codec->extradata_size > 0)
1412
                st->need_parsing = 0;
1413
            if (st->codec->codec_id == AV_CODEC_ID_MPEG4SYSTEMS)
1414
                mpegts_open_section_filter(ts, pid, m4sl_cb, ts, 1);
1415
        }
1416
        break;
1417
    case 0x1F: /* FMC descriptor */
1418
        get16(pp, desc_end);
1419
        if (mp4_descr_count > 0 && (st->codec->codec_id == AV_CODEC_ID_AAC_LATM || st->request_probe>0) &&
1420
            mp4_descr->dec_config_descr_len && mp4_descr->es_id == pid) {
1421
            AVIOContext pb;
1422
            ffio_init_context(&pb, mp4_descr->dec_config_descr,
1423
                          mp4_descr->dec_config_descr_len, 0, NULL, NULL, NULL, NULL);
1424
            ff_mp4_read_dec_config_descr(fc, st, &pb);
1425
            if (st->codec->codec_id == AV_CODEC_ID_AAC &&
1426
                st->codec->extradata_size > 0){
1427
                st->request_probe= st->need_parsing = 0;
1428
                st->codec->codec_type= AVMEDIA_TYPE_AUDIO;
1429
            }
1430
        }
1431
        break;
1432
    case 0x56: /* DVB teletext descriptor */
1433
        language[0] = get8(pp, desc_end);
1434
        language[1] = get8(pp, desc_end);
1435
        language[2] = get8(pp, desc_end);
1436
        language[3] = 0;
1437
        av_dict_set(&st->metadata, "language", language, 0);
1438
        break;
1439
    case 0x59: /* subtitling descriptor */
1440
        language[0] = get8(pp, desc_end);
1441
        language[1] = get8(pp, desc_end);
1442
        language[2] = get8(pp, desc_end);
1443
        language[3] = 0;
1444
        /* hearing impaired subtitles detection */
1445
        switch(get8(pp, desc_end)) {
1446
        case 0x20: /* DVB subtitles (for the hard of hearing) with no monitor aspect ratio criticality */
1447
        case 0x21: /* DVB subtitles (for the hard of hearing) for display on 4:3 aspect ratio monitor */
1448
        case 0x22: /* DVB subtitles (for the hard of hearing) for display on 16:9 aspect ratio monitor */
1449
        case 0x23: /* DVB subtitles (for the hard of hearing) for display on 2.21:1 aspect ratio monitor */
1450
        case 0x24: /* DVB subtitles (for the hard of hearing) for display on a high definition monitor */
1451
        case 0x25: /* DVB subtitles (for the hard of hearing) with plano-stereoscopic disparity for display on a high definition monitor */
1452
            st->disposition |= AV_DISPOSITION_HEARING_IMPAIRED;
1453
            break;
1454
        }
1455
        if (st->codec->extradata) {
1456
            if (st->codec->extradata_size == 4 && memcmp(st->codec->extradata, *pp, 4))
1457
                avpriv_request_sample(fc, "DVB sub with multiple IDs");
1458
        } else {
1459
            if (!ff_alloc_extradata(st->codec, 4)) {
1460
                memcpy(st->codec->extradata, *pp, 4);
1461
            }
1462
        }
1463
        *pp += 4;
1464
        av_dict_set(&st->metadata, "language", language, 0);
1465
        break;
1466
    case 0x0a: /* ISO 639 language descriptor */
1467
        for (i = 0; i + 4 <= desc_len; i += 4) {
1468
            language[i + 0] = get8(pp, desc_end);
1469
            language[i + 1] = get8(pp, desc_end);
1470
            language[i + 2] = get8(pp, desc_end);
1471
            language[i + 3] = ',';
1472
        switch (get8(pp, desc_end)) {
1473
            case 0x01: st->disposition |= AV_DISPOSITION_CLEAN_EFFECTS; break;
1474
            case 0x02: st->disposition |= AV_DISPOSITION_HEARING_IMPAIRED; break;
1475
            case 0x03: st->disposition |= AV_DISPOSITION_VISUAL_IMPAIRED; break;
1476
        }
1477
        }
1478
        if (i) {
1479
            language[i - 1] = 0;
1480
            av_dict_set(&st->metadata, "language", language, 0);
1481
        }
1482
        break;
1483
    case 0x05: /* registration descriptor */
1484
        st->codec->codec_tag = bytestream_get_le32(pp);
1485
        av_dlog(fc, "reg_desc=%.4s\n", (char*)&st->codec->codec_tag);
1486
        if (st->codec->codec_id == AV_CODEC_ID_NONE)
1487
            mpegts_find_stream_type(st, st->codec->codec_tag, REGD_types);
1488
        break;
1489
    case 0x52: /* stream identifier descriptor */
1490
        st->stream_identifier = 1 + get8(pp, desc_end);
1491
        break;
1492
    default:
1493
        break;
1494
    }
1495
    *pp = desc_end;
1496
    return 0;
1497
}
1498
 
1499
static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
1500
{
1501
    MpegTSContext *ts = filter->u.section_filter.opaque;
1502
    SectionHeader h1, *h = &h1;
1503
    PESContext *pes;
1504
    AVStream *st;
1505
    const uint8_t *p, *p_end, *desc_list_end;
1506
    int program_info_length, pcr_pid, pid, stream_type;
1507
    int desc_list_len;
1508
    uint32_t prog_reg_desc = 0; /* registration descriptor */
1509
 
1510
    Mp4Descr mp4_descr[MAX_MP4_DESCR_COUNT] = {{ 0 }};
1511
    int mp4_descr_count = 0;
1512
    int i;
1513
 
1514
    av_dlog(ts->stream, "PMT: len %i\n", section_len);
1515
    hex_dump_debug(ts->stream, section, section_len);
1516
 
1517
    p_end = section + section_len - 4;
1518
    p = section;
1519
    if (parse_section_header(h, &p, p_end) < 0)
1520
        return;
1521
 
1522
    av_dlog(ts->stream, "sid=0x%x sec_num=%d/%d\n",
1523
           h->id, h->sec_num, h->last_sec_num);
1524
 
1525
    if (h->tid != PMT_TID)
1526
        return;
1527
 
1528
    clear_program(ts, h->id);
1529
    pcr_pid = get16(&p, p_end);
1530
    if (pcr_pid < 0)
1531
        return;
1532
    pcr_pid &= 0x1fff;
1533
    add_pid_to_pmt(ts, h->id, pcr_pid);
1534
    set_pcr_pid(ts->stream, h->id, pcr_pid);
1535
 
1536
    av_dlog(ts->stream, "pcr_pid=0x%x\n", pcr_pid);
1537
 
1538
    program_info_length = get16(&p, p_end);
1539
    if (program_info_length < 0)
1540
        return;
1541
    program_info_length &= 0xfff;
1542
    while(program_info_length >= 2) {
1543
        uint8_t tag, len;
1544
        tag = get8(&p, p_end);
1545
        len = get8(&p, p_end);
1546
 
1547
        av_dlog(ts->stream, "program tag: 0x%02x len=%d\n", tag, len);
1548
 
1549
        if(len > program_info_length - 2)
1550
            //something else is broken, exit the program_descriptors_loop
1551
            break;
1552
        program_info_length -= len + 2;
1553
        if (tag == 0x1d) { // IOD descriptor
1554
            get8(&p, p_end); // scope
1555
            get8(&p, p_end); // label
1556
            len -= 2;
1557
            mp4_read_iods(ts->stream, p, len, mp4_descr + mp4_descr_count,
1558
                          &mp4_descr_count, MAX_MP4_DESCR_COUNT);
1559
        } else if (tag == 0x05 && len >= 4) { // registration descriptor
1560
            prog_reg_desc = bytestream_get_le32(&p);
1561
            len -= 4;
1562
        }
1563
        p += len;
1564
    }
1565
    p += program_info_length;
1566
    if (p >= p_end)
1567
        goto out;
1568
 
1569
    // stop parsing after pmt, we found header
1570
    if (!ts->stream->nb_streams)
1571
        ts->stop_parse = 2;
1572
 
1573
    for(;;) {
1574
        st = 0;
1575
        pes = NULL;
1576
        stream_type = get8(&p, p_end);
1577
        if (stream_type < 0)
1578
            break;
1579
        pid = get16(&p, p_end);
1580
        if (pid < 0)
1581
            break;
1582
        pid &= 0x1fff;
1583
        if (pid == ts->current_pid)
1584
            break;
1585
 
1586
        /* now create stream */
1587
        if (ts->pids[pid] && ts->pids[pid]->type == MPEGTS_PES) {
1588
            pes = ts->pids[pid]->u.pes_filter.opaque;
1589
            if (!pes->st) {
1590
                pes->st = avformat_new_stream(pes->stream, NULL);
1591
                if (!pes->st)
1592
                    goto out;
1593
                pes->st->id = pes->pid;
1594
            }
1595
            st = pes->st;
1596
        } else if (stream_type != 0x13) {
1597
            if (ts->pids[pid]) mpegts_close_filter(ts, ts->pids[pid]); //wrongly added sdt filter probably
1598
            pes = add_pes_stream(ts, pid, pcr_pid);
1599
            if (pes) {
1600
                st = avformat_new_stream(pes->stream, NULL);
1601
                if (!st)
1602
                    goto out;
1603
                st->id = pes->pid;
1604
            }
1605
        } else {
1606
            int idx = ff_find_stream_index(ts->stream, pid);
1607
            if (idx >= 0) {
1608
                st = ts->stream->streams[idx];
1609
            } else {
1610
                st = avformat_new_stream(ts->stream, NULL);
1611
                if (!st)
1612
                    goto out;
1613
                st->id = pid;
1614
                st->codec->codec_type = AVMEDIA_TYPE_DATA;
1615
            }
1616
        }
1617
 
1618
        if (!st)
1619
            goto out;
1620
 
1621
        if (pes && !pes->stream_type)
1622
            mpegts_set_stream_info(st, pes, stream_type, prog_reg_desc);
1623
 
1624
        add_pid_to_pmt(ts, h->id, pid);
1625
 
1626
        ff_program_add_stream_index(ts->stream, h->id, st->index);
1627
 
1628
        desc_list_len = get16(&p, p_end);
1629
        if (desc_list_len < 0)
1630
            break;
1631
        desc_list_len &= 0xfff;
1632
        desc_list_end = p + desc_list_len;
1633
        if (desc_list_end > p_end)
1634
            break;
1635
        for(;;) {
1636
            if (ff_parse_mpeg2_descriptor(ts->stream, st, stream_type, &p, desc_list_end,
1637
                mp4_descr, mp4_descr_count, pid, ts) < 0)
1638
                break;
1639
 
1640
            if (pes && prog_reg_desc == AV_RL32("HDMV") && stream_type == 0x83 && pes->sub_st) {
1641
                ff_program_add_stream_index(ts->stream, h->id, pes->sub_st->index);
1642
                pes->sub_st->codec->codec_tag = st->codec->codec_tag;
1643
            }
1644
        }
1645
        p = desc_list_end;
1646
    }
1647
 
1648
 out:
1649
    for (i = 0; i < mp4_descr_count; i++)
1650
        av_free(mp4_descr[i].dec_config_descr);
1651
}
1652
 
1653
static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
1654
{
1655
    MpegTSContext *ts = filter->u.section_filter.opaque;
1656
    SectionHeader h1, *h = &h1;
1657
    const uint8_t *p, *p_end;
1658
    int sid, pmt_pid;
1659
    AVProgram *program;
1660
 
1661
    av_dlog(ts->stream, "PAT:\n");
1662
    hex_dump_debug(ts->stream, section, section_len);
1663
 
1664
    p_end = section + section_len - 4;
1665
    p = section;
1666
    if (parse_section_header(h, &p, p_end) < 0)
1667
        return;
1668
    if (h->tid != PAT_TID)
1669
        return;
1670
 
1671
    ts->stream->ts_id = h->id;
1672
 
1673
    clear_programs(ts);
1674
    for(;;) {
1675
        sid = get16(&p, p_end);
1676
        if (sid < 0)
1677
            break;
1678
        pmt_pid = get16(&p, p_end);
1679
        if (pmt_pid < 0)
1680
            break;
1681
        pmt_pid &= 0x1fff;
1682
 
1683
        if (pmt_pid == ts->current_pid)
1684
            break;
1685
 
1686
        av_dlog(ts->stream, "sid=0x%x pid=0x%x\n", sid, pmt_pid);
1687
 
1688
        if (sid == 0x0000) {
1689
            /* NIT info */
1690
        } else {
1691
            MpegTSFilter *fil = ts->pids[pmt_pid];
1692
            program = av_new_program(ts->stream, sid);
1693
            program->program_num = sid;
1694
            program->pmt_pid = pmt_pid;
1695
            if (fil)
1696
                if (   fil->type != MPEGTS_SECTION
1697
                    || fil->pid != pmt_pid
1698
                    || fil->u.section_filter.section_cb != pmt_cb)
1699
                    mpegts_close_filter(ts, ts->pids[pmt_pid]);
1700
 
1701
            if (!ts->pids[pmt_pid])
1702
                mpegts_open_section_filter(ts, pmt_pid, pmt_cb, ts, 1);
1703
            add_pat_entry(ts, sid);
1704
            add_pid_to_pmt(ts, sid, 0); //add pat pid to program
1705
            add_pid_to_pmt(ts, sid, pmt_pid);
1706
        }
1707
    }
1708
 
1709
    if (sid < 0) {
1710
        int i,j;
1711
        for (j=0; jstream->nb_programs; j++) {
1712
            for (i=0; inb_prg; i++)
1713
                if (ts->prg[i].id == ts->stream->programs[j]->id)
1714
                    break;
1715
            if (i==ts->nb_prg)
1716
                clear_avprogram(ts, ts->stream->programs[j]->id);
1717
        }
1718
    }
1719
}
1720
 
1721
static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
1722
{
1723
    MpegTSContext *ts = filter->u.section_filter.opaque;
1724
    SectionHeader h1, *h = &h1;
1725
    const uint8_t *p, *p_end, *desc_list_end, *desc_end;
1726
    int onid, val, sid, desc_list_len, desc_tag, desc_len, service_type;
1727
    char *name, *provider_name;
1728
 
1729
    av_dlog(ts->stream, "SDT:\n");
1730
    hex_dump_debug(ts->stream, section, section_len);
1731
 
1732
    p_end = section + section_len - 4;
1733
    p = section;
1734
    if (parse_section_header(h, &p, p_end) < 0)
1735
        return;
1736
    if (h->tid != SDT_TID)
1737
        return;
1738
    onid = get16(&p, p_end);
1739
    if (onid < 0)
1740
        return;
1741
    val = get8(&p, p_end);
1742
    if (val < 0)
1743
        return;
1744
    for(;;) {
1745
        sid = get16(&p, p_end);
1746
        if (sid < 0)
1747
            break;
1748
        val = get8(&p, p_end);
1749
        if (val < 0)
1750
            break;
1751
        desc_list_len = get16(&p, p_end);
1752
        if (desc_list_len < 0)
1753
            break;
1754
        desc_list_len &= 0xfff;
1755
        desc_list_end = p + desc_list_len;
1756
        if (desc_list_end > p_end)
1757
            break;
1758
        for(;;) {
1759
            desc_tag = get8(&p, desc_list_end);
1760
            if (desc_tag < 0)
1761
                break;
1762
            desc_len = get8(&p, desc_list_end);
1763
            desc_end = p + desc_len;
1764
            if (desc_end > desc_list_end)
1765
                break;
1766
 
1767
            av_dlog(ts->stream, "tag: 0x%02x len=%d\n",
1768
                   desc_tag, desc_len);
1769
 
1770
            switch(desc_tag) {
1771
            case 0x48:
1772
                service_type = get8(&p, p_end);
1773
                if (service_type < 0)
1774
                    break;
1775
                provider_name = getstr8(&p, p_end);
1776
                if (!provider_name)
1777
                    break;
1778
                name = getstr8(&p, p_end);
1779
                if (name) {
1780
                    AVProgram *program = av_new_program(ts->stream, sid);
1781
                    if(program) {
1782
                        av_dict_set(&program->metadata, "service_name", name, 0);
1783
                        av_dict_set(&program->metadata, "service_provider", provider_name, 0);
1784
                    }
1785
                }
1786
                av_free(name);
1787
                av_free(provider_name);
1788
                break;
1789
            default:
1790
                break;
1791
            }
1792
            p = desc_end;
1793
        }
1794
        p = desc_list_end;
1795
    }
1796
}
1797
 
1798
static int parse_pcr(int64_t *ppcr_high, int *ppcr_low,
1799
                     const uint8_t *packet);
1800
 
1801
/* handle one TS packet */
1802
static int handle_packet(MpegTSContext *ts, const uint8_t *packet)
1803
{
1804
    AVFormatContext *s = ts->stream;
1805
    MpegTSFilter *tss;
1806
    int len, pid, cc, expected_cc, cc_ok, afc, is_start, is_discontinuity,
1807
        has_adaptation, has_payload;
1808
    const uint8_t *p, *p_end;
1809
    int64_t pos;
1810
 
1811
    pid = AV_RB16(packet + 1) & 0x1fff;
1812
    if(pid && discard_pid(ts, pid))
1813
        return 0;
1814
    is_start = packet[1] & 0x40;
1815
    tss = ts->pids[pid];
1816
    if (ts->auto_guess && tss == NULL && is_start) {
1817
        add_pes_stream(ts, pid, -1);
1818
        tss = ts->pids[pid];
1819
    }
1820
    if (!tss)
1821
        return 0;
1822
    ts->current_pid = pid;
1823
 
1824
    afc = (packet[3] >> 4) & 3;
1825
    if (afc == 0) /* reserved value */
1826
        return 0;
1827
    has_adaptation = afc & 2;
1828
    has_payload = afc & 1;
1829
    is_discontinuity = has_adaptation
1830
                && packet[4] != 0 /* with length > 0 */
1831
                && (packet[5] & 0x80); /* and discontinuity indicated */
1832
 
1833
    /* continuity check (currently not used) */
1834
    cc = (packet[3] & 0xf);
1835
    expected_cc = has_payload ? (tss->last_cc + 1) & 0x0f : tss->last_cc;
1836
    cc_ok = pid == 0x1FFF // null packet PID
1837
            || is_discontinuity
1838
            || tss->last_cc < 0
1839
            || expected_cc == cc;
1840
 
1841
    tss->last_cc = cc;
1842
    if (!cc_ok) {
1843
        av_log(ts->stream, AV_LOG_DEBUG,
1844
               "Continuity check failed for pid %d expected %d got %d\n",
1845
               pid, expected_cc, cc);
1846
        if(tss->type == MPEGTS_PES) {
1847
            PESContext *pc = tss->u.pes_filter.opaque;
1848
            pc->flags |= AV_PKT_FLAG_CORRUPT;
1849
        }
1850
    }
1851
 
1852
    if (!has_payload)
1853
        return 0;
1854
    p = packet + 4;
1855
    if (has_adaptation) {
1856
        /* skip adaptation field */
1857
        p += p[0] + 1;
1858
    }
1859
    /* if past the end of packet, ignore */
1860
    p_end = packet + TS_PACKET_SIZE;
1861
    if (p >= p_end)
1862
        return 0;
1863
 
1864
    pos = avio_tell(ts->stream->pb);
1865
    if (pos >= 0) {
1866
        av_assert0(pos >= TS_PACKET_SIZE);
1867
        ts->pos47_full = pos - TS_PACKET_SIZE;
1868
    }
1869
 
1870
    if (tss->type == MPEGTS_SECTION) {
1871
        if (is_start) {
1872
            /* pointer field present */
1873
            len = *p++;
1874
            if (p + len > p_end)
1875
                return 0;
1876
            if (len && cc_ok) {
1877
                /* write remaining section bytes */
1878
                write_section_data(s, tss,
1879
                                   p, len, 0);
1880
                /* check whether filter has been closed */
1881
                if (!ts->pids[pid])
1882
                    return 0;
1883
            }
1884
            p += len;
1885
            if (p < p_end) {
1886
                write_section_data(s, tss,
1887
                                   p, p_end - p, 1);
1888
            }
1889
        } else {
1890
            if (cc_ok) {
1891
                write_section_data(s, tss,
1892
                                   p, p_end - p, 0);
1893
            }
1894
        }
1895
    } else {
1896
        int ret;
1897
        int64_t pcr = -1;
1898
        int64_t pcr_h;
1899
        int pcr_l;
1900
        if (parse_pcr(&pcr_h, &pcr_l, packet) == 0)
1901
            pcr = pcr_h * 300 + pcr_l;
1902
        // Note: The position here points actually behind the current packet.
1903
        if ((ret = tss->u.pes_filter.pes_cb(tss, p, p_end - p, is_start,
1904
                                            pos - ts->raw_packet_size, pcr)) < 0)
1905
            return ret;
1906
    }
1907
 
1908
    return 0;
1909
}
1910
 
1911
static void reanalyze(MpegTSContext *ts) {
1912
    AVIOContext *pb = ts->stream->pb;
1913
    int64_t pos = avio_tell(pb);
1914
    if(pos < 0)
1915
        return;
1916
    pos -= ts->pos47_full;
1917
    if (pos == TS_PACKET_SIZE) {
1918
        ts->size_stat[0] ++;
1919
    } else if (pos == TS_DVHS_PACKET_SIZE) {
1920
        ts->size_stat[1] ++;
1921
    } else if (pos == TS_FEC_PACKET_SIZE) {
1922
        ts->size_stat[2] ++;
1923
    }
1924
 
1925
    ts->size_stat_count ++;
1926
    if(ts->size_stat_count > SIZE_STAT_THRESHOLD) {
1927
        int newsize = 0;
1928
        if (ts->size_stat[0] > SIZE_STAT_THRESHOLD) {
1929
            newsize = TS_PACKET_SIZE;
1930
        } else if (ts->size_stat[1] > SIZE_STAT_THRESHOLD) {
1931
            newsize = TS_DVHS_PACKET_SIZE;
1932
        } else if (ts->size_stat[2] > SIZE_STAT_THRESHOLD) {
1933
            newsize = TS_FEC_PACKET_SIZE;
1934
        }
1935
        if (newsize && newsize != ts->raw_packet_size) {
1936
            av_log(ts->stream, AV_LOG_WARNING, "changing packet size to %d\n", newsize);
1937
            ts->raw_packet_size = newsize;
1938
        }
1939
        ts->size_stat_count = 0;
1940
        memset(ts->size_stat, 0, sizeof(ts->size_stat));
1941
    }
1942
}
1943
 
1944
/* XXX: try to find a better synchro over several packets (use
1945
   get_packet_size() ?) */
1946
static int mpegts_resync(AVFormatContext *s)
1947
{
1948
    AVIOContext *pb = s->pb;
1949
    int c, i;
1950
 
1951
    for(i = 0;i < MAX_RESYNC_SIZE; i++) {
1952
        c = avio_r8(pb);
1953
        if (url_feof(pb))
1954
            return -1;
1955
        if (c == 0x47) {
1956
            avio_seek(pb, -1, SEEK_CUR);
1957
            reanalyze(s->priv_data);
1958
            return 0;
1959
        }
1960
    }
1961
    av_log(s, AV_LOG_ERROR, "max resync size reached, could not find sync byte\n");
1962
    /* no sync found */
1963
    return -1;
1964
}
1965
 
1966
/* return -1 if error or EOF. Return 0 if OK. */
1967
static int read_packet(AVFormatContext *s, uint8_t *buf, int raw_packet_size, const uint8_t **data)
1968
{
1969
    AVIOContext *pb = s->pb;
1970
    int len;
1971
 
1972
    for(;;) {
1973
        len = ffio_read_indirect(pb, buf, TS_PACKET_SIZE, data);
1974
        if (len != TS_PACKET_SIZE)
1975
            return len < 0 ? len : AVERROR_EOF;
1976
        /* check packet sync byte */
1977
        if ((*data)[0] != 0x47) {
1978
            /* find a new packet start */
1979
            uint64_t pos = avio_tell(pb);
1980
            avio_seek(pb, -FFMIN(raw_packet_size, pos), SEEK_CUR);
1981
 
1982
            if (mpegts_resync(s) < 0)
1983
                return AVERROR(EAGAIN);
1984
            else
1985
                continue;
1986
        } else {
1987
            break;
1988
        }
1989
    }
1990
    return 0;
1991
}
1992
 
1993
static void finished_reading_packet(AVFormatContext *s, int raw_packet_size)
1994
{
1995
    AVIOContext *pb = s->pb;
1996
    int skip = raw_packet_size - TS_PACKET_SIZE;
1997
    if (skip > 0)
1998
        avio_skip(pb, skip);
1999
}
2000
 
2001
static int handle_packets(MpegTSContext *ts, int nb_packets)
2002
{
2003
    AVFormatContext *s = ts->stream;
2004
    uint8_t packet[TS_PACKET_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];
2005
    const uint8_t *data;
2006
    int packet_num, ret = 0;
2007
 
2008
    if (avio_tell(s->pb) != ts->last_pos) {
2009
        int i;
2010
        av_dlog(ts->stream, "Skipping after seek\n");
2011
        /* seek detected, flush pes buffer */
2012
        for (i = 0; i < NB_PID_MAX; i++) {
2013
            if (ts->pids[i]) {
2014
                if (ts->pids[i]->type == MPEGTS_PES) {
2015
                   PESContext *pes = ts->pids[i]->u.pes_filter.opaque;
2016
                   av_buffer_unref(&pes->buffer);
2017
                   pes->data_index = 0;
2018
                   pes->state = MPEGTS_SKIP; /* skip until pes header */
2019
                   pes->last_pcr = -1;
2020
                }
2021
                ts->pids[i]->last_cc = -1;
2022
            }
2023
        }
2024
    }
2025
 
2026
    ts->stop_parse = 0;
2027
    packet_num = 0;
2028
    memset(packet + TS_PACKET_SIZE, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2029
    for(;;) {
2030
        packet_num++;
2031
        if (nb_packets != 0 && packet_num >= nb_packets ||
2032
            ts->stop_parse > 1) {
2033
            ret = AVERROR(EAGAIN);
2034
            break;
2035
        }
2036
        if (ts->stop_parse > 0)
2037
            break;
2038
 
2039
        ret = read_packet(s, packet, ts->raw_packet_size, &data);
2040
        if (ret != 0)
2041
            break;
2042
        ret = handle_packet(ts, data);
2043
        finished_reading_packet(s, ts->raw_packet_size);
2044
        if (ret != 0)
2045
            break;
2046
    }
2047
    ts->last_pos = avio_tell(s->pb);
2048
    return ret;
2049
}
2050
 
2051
static int mpegts_probe(AVProbeData *p)
2052
{
2053
    const int size= p->buf_size;
2054
    int maxscore=0;
2055
    int sumscore=0;
2056
    int i;
2057
    int check_count= size / TS_FEC_PACKET_SIZE;
2058
#define CHECK_COUNT 10
2059
#define CHECK_BLOCK 100
2060
 
2061
    if (check_count < CHECK_COUNT)
2062
        return -1;
2063
 
2064
    for (i=0; i
2065
        int left = FFMIN(check_count - i, CHECK_BLOCK);
2066
        int score     = analyze(p->buf + TS_PACKET_SIZE     *i, TS_PACKET_SIZE     *left, TS_PACKET_SIZE     , NULL);
2067
        int dvhs_score= analyze(p->buf + TS_DVHS_PACKET_SIZE*i, TS_DVHS_PACKET_SIZE*left, TS_DVHS_PACKET_SIZE, NULL);
2068
        int fec_score = analyze(p->buf + TS_FEC_PACKET_SIZE *i, TS_FEC_PACKET_SIZE *left, TS_FEC_PACKET_SIZE , NULL);
2069
        score = FFMAX3(score, dvhs_score, fec_score);
2070
        sumscore += score;
2071
        maxscore = FFMAX(maxscore, score);
2072
    }
2073
 
2074
    sumscore = sumscore*CHECK_COUNT/check_count;
2075
    maxscore = maxscore*CHECK_COUNT/CHECK_BLOCK;
2076
 
2077
    av_dlog(0, "TS score: %d %d\n", sumscore, maxscore);
2078
 
2079
    if (sumscore > 6)           return AVPROBE_SCORE_MAX + sumscore - CHECK_COUNT;
2080
    else if (maxscore > 6)      return AVPROBE_SCORE_MAX/2 + sumscore - CHECK_COUNT;
2081
    else                        return -1;
2082
}
2083
 
2084
/* return the 90kHz PCR and the extension for the 27MHz PCR. return
2085
   (-1) if not available */
2086
static int parse_pcr(int64_t *ppcr_high, int *ppcr_low,
2087
                     const uint8_t *packet)
2088
{
2089
    int afc, len, flags;
2090
    const uint8_t *p;
2091
    unsigned int v;
2092
 
2093
    afc = (packet[3] >> 4) & 3;
2094
    if (afc <= 1)
2095
        return -1;
2096
    p = packet + 4;
2097
    len = p[0];
2098
    p++;
2099
    if (len == 0)
2100
        return -1;
2101
    flags = *p++;
2102
    len--;
2103
    if (!(flags & 0x10))
2104
        return -1;
2105
    if (len < 6)
2106
        return -1;
2107
    v = AV_RB32(p);
2108
    *ppcr_high = ((int64_t)v << 1) | (p[4] >> 7);
2109
    *ppcr_low = ((p[4] & 1) << 8) | p[5];
2110
    return 0;
2111
}
2112
 
2113
static void seek_back(AVFormatContext *s, AVIOContext *pb, int64_t pos) {
2114
 
2115
    /* NOTE: We attempt to seek on non-seekable files as well, as the
2116
     * probe buffer usually is big enough. Only warn if the seek failed
2117
     * on files where the seek should work. */
2118
    if (avio_seek(pb, pos, SEEK_SET) < 0)
2119
        av_log(s, pb->seekable ? AV_LOG_ERROR : AV_LOG_INFO, "Unable to seek back to the start\n");
2120
}
2121
 
2122
static int mpegts_read_header(AVFormatContext *s)
2123
{
2124
    MpegTSContext *ts = s->priv_data;
2125
    AVIOContext *pb = s->pb;
2126
    uint8_t buf[8*1024]={0};
2127
    int len;
2128
    int64_t pos;
2129
 
2130
    ffio_ensure_seekback(pb, s->probesize);
2131
 
2132
    /* read the first 8192 bytes to get packet size */
2133
    pos = avio_tell(pb);
2134
    len = avio_read(pb, buf, sizeof(buf));
2135
    ts->raw_packet_size = get_packet_size(buf, len);
2136
    if (ts->raw_packet_size <= 0) {
2137
        av_log(s, AV_LOG_WARNING, "Could not detect TS packet size, defaulting to non-FEC/DVHS\n");
2138
        ts->raw_packet_size = TS_PACKET_SIZE;
2139
    }
2140
    ts->stream = s;
2141
    ts->auto_guess = 0;
2142
 
2143
    if (s->iformat == &ff_mpegts_demuxer) {
2144
        /* normal demux */
2145
 
2146
        /* first do a scan to get all the services */
2147
        seek_back(s, pb, pos);
2148
 
2149
        mpegts_open_section_filter(ts, SDT_PID, sdt_cb, ts, 1);
2150
 
2151
        mpegts_open_section_filter(ts, PAT_PID, pat_cb, ts, 1);
2152
 
2153
        handle_packets(ts, s->probesize / ts->raw_packet_size);
2154
        /* if could not find service, enable auto_guess */
2155
 
2156
        ts->auto_guess = 1;
2157
 
2158
        av_dlog(ts->stream, "tuning done\n");
2159
 
2160
        s->ctx_flags |= AVFMTCTX_NOHEADER;
2161
    } else {
2162
        AVStream *st;
2163
        int pcr_pid, pid, nb_packets, nb_pcrs, ret, pcr_l;
2164
        int64_t pcrs[2], pcr_h;
2165
        int packet_count[2];
2166
        uint8_t packet[TS_PACKET_SIZE];
2167
        const uint8_t *data;
2168
 
2169
        /* only read packets */
2170
 
2171
        st = avformat_new_stream(s, NULL);
2172
        if (!st)
2173
            goto fail;
2174
        avpriv_set_pts_info(st, 60, 1, 27000000);
2175
        st->codec->codec_type = AVMEDIA_TYPE_DATA;
2176
        st->codec->codec_id = AV_CODEC_ID_MPEG2TS;
2177
 
2178
        /* we iterate until we find two PCRs to estimate the bitrate */
2179
        pcr_pid = -1;
2180
        nb_pcrs = 0;
2181
        nb_packets = 0;
2182
        for(;;) {
2183
            ret = read_packet(s, packet, ts->raw_packet_size, &data);
2184
            if (ret < 0)
2185
                goto fail;
2186
            pid = AV_RB16(data + 1) & 0x1fff;
2187
            if ((pcr_pid == -1 || pcr_pid == pid) &&
2188
                parse_pcr(&pcr_h, &pcr_l, data) == 0) {
2189
                finished_reading_packet(s, ts->raw_packet_size);
2190
                pcr_pid = pid;
2191
                packet_count[nb_pcrs] = nb_packets;
2192
                pcrs[nb_pcrs] = pcr_h * 300 + pcr_l;
2193
                nb_pcrs++;
2194
                if (nb_pcrs >= 2)
2195
                    break;
2196
            } else {
2197
                finished_reading_packet(s, ts->raw_packet_size);
2198
            }
2199
            nb_packets++;
2200
        }
2201
 
2202
        /* NOTE1: the bitrate is computed without the FEC */
2203
        /* NOTE2: it is only the bitrate of the start of the stream */
2204
        ts->pcr_incr = (pcrs[1] - pcrs[0]) / (packet_count[1] - packet_count[0]);
2205
        ts->cur_pcr = pcrs[0] - ts->pcr_incr * packet_count[0];
2206
        s->bit_rate = (TS_PACKET_SIZE * 8) * 27e6 / ts->pcr_incr;
2207
        st->codec->bit_rate = s->bit_rate;
2208
        st->start_time = ts->cur_pcr;
2209
        av_dlog(ts->stream, "start=%0.3f pcr=%0.3f incr=%d\n",
2210
                st->start_time / 1000000.0, pcrs[0] / 27e6, ts->pcr_incr);
2211
    }
2212
 
2213
    seek_back(s, pb, pos);
2214
    return 0;
2215
 fail:
2216
    return -1;
2217
}
2218
 
2219
#define MAX_PACKET_READAHEAD ((128 * 1024) / 188)
2220
 
2221
static int mpegts_raw_read_packet(AVFormatContext *s,
2222
                                  AVPacket *pkt)
2223
{
2224
    MpegTSContext *ts = s->priv_data;
2225
    int ret, i;
2226
    int64_t pcr_h, next_pcr_h, pos;
2227
    int pcr_l, next_pcr_l;
2228
    uint8_t pcr_buf[12];
2229
    const uint8_t *data;
2230
 
2231
    if (av_new_packet(pkt, TS_PACKET_SIZE) < 0)
2232
        return AVERROR(ENOMEM);
2233
    pkt->pos= avio_tell(s->pb);
2234
    ret = read_packet(s, pkt->data, ts->raw_packet_size, &data);
2235
    if (ret < 0) {
2236
        av_free_packet(pkt);
2237
        return ret;
2238
    }
2239
    if (data != pkt->data)
2240
        memcpy(pkt->data, data, ts->raw_packet_size);
2241
    finished_reading_packet(s, ts->raw_packet_size);
2242
    if (ts->mpeg2ts_compute_pcr) {
2243
        /* compute exact PCR for each packet */
2244
        if (parse_pcr(&pcr_h, &pcr_l, pkt->data) == 0) {
2245
            /* we read the next PCR (XXX: optimize it by using a bigger buffer */
2246
            pos = avio_tell(s->pb);
2247
            for(i = 0; i < MAX_PACKET_READAHEAD; i++) {
2248
                avio_seek(s->pb, pos + i * ts->raw_packet_size, SEEK_SET);
2249
                avio_read(s->pb, pcr_buf, 12);
2250
                if (parse_pcr(&next_pcr_h, &next_pcr_l, pcr_buf) == 0) {
2251
                    /* XXX: not precise enough */
2252
                    ts->pcr_incr = ((next_pcr_h - pcr_h) * 300 + (next_pcr_l - pcr_l)) /
2253
                        (i + 1);
2254
                    break;
2255
                }
2256
            }
2257
            avio_seek(s->pb, pos, SEEK_SET);
2258
            /* no next PCR found: we use previous increment */
2259
            ts->cur_pcr = pcr_h * 300 + pcr_l;
2260
        }
2261
        pkt->pts = ts->cur_pcr;
2262
        pkt->duration = ts->pcr_incr;
2263
        ts->cur_pcr += ts->pcr_incr;
2264
    }
2265
    pkt->stream_index = 0;
2266
    return 0;
2267
}
2268
 
2269
static int mpegts_read_packet(AVFormatContext *s,
2270
                              AVPacket *pkt)
2271
{
2272
    MpegTSContext *ts = s->priv_data;
2273
    int ret, i;
2274
 
2275
    pkt->size = -1;
2276
    ts->pkt = pkt;
2277
    ret = handle_packets(ts, 0);
2278
    if (ret < 0) {
2279
        av_free_packet(ts->pkt);
2280
        /* flush pes data left */
2281
        for (i = 0; i < NB_PID_MAX; i++) {
2282
            if (ts->pids[i] && ts->pids[i]->type == MPEGTS_PES) {
2283
                PESContext *pes = ts->pids[i]->u.pes_filter.opaque;
2284
                if (pes->state == MPEGTS_PAYLOAD && pes->data_index > 0) {
2285
                    new_pes_packet(pes, pkt);
2286
                    pes->state = MPEGTS_SKIP;
2287
                    ret = 0;
2288
                    break;
2289
                }
2290
            }
2291
        }
2292
    }
2293
 
2294
    if (!ret && pkt->size < 0)
2295
        ret = AVERROR(EINTR);
2296
    return ret;
2297
}
2298
 
2299
static void mpegts_free(MpegTSContext *ts)
2300
{
2301
    int i;
2302
 
2303
    clear_programs(ts);
2304
 
2305
    for(i=0;i
2306
        if (ts->pids[i]) mpegts_close_filter(ts, ts->pids[i]);
2307
}
2308
 
2309
static int mpegts_read_close(AVFormatContext *s)
2310
{
2311
    MpegTSContext *ts = s->priv_data;
2312
    mpegts_free(ts);
2313
    return 0;
2314
}
2315
 
2316
static av_unused int64_t mpegts_get_pcr(AVFormatContext *s, int stream_index,
2317
                              int64_t *ppos, int64_t pos_limit)
2318
{
2319
    MpegTSContext *ts = s->priv_data;
2320
    int64_t pos, timestamp;
2321
    uint8_t buf[TS_PACKET_SIZE];
2322
    int pcr_l, pcr_pid = ((PESContext*)s->streams[stream_index]->priv_data)->pcr_pid;
2323
    int pos47 = ts->pos47_full % ts->raw_packet_size;
2324
    pos = ((*ppos  + ts->raw_packet_size - 1 - pos47) / ts->raw_packet_size) * ts->raw_packet_size + pos47;
2325
    while(pos < pos_limit) {
2326
        if (avio_seek(s->pb, pos, SEEK_SET) < 0)
2327
            return AV_NOPTS_VALUE;
2328
        if (avio_read(s->pb, buf, TS_PACKET_SIZE) != TS_PACKET_SIZE)
2329
            return AV_NOPTS_VALUE;
2330
        if (buf[0] != 0x47) {
2331
            avio_seek(s->pb, -TS_PACKET_SIZE, SEEK_CUR);
2332
            if (mpegts_resync(s) < 0)
2333
                return AV_NOPTS_VALUE;
2334
            pos = avio_tell(s->pb);
2335
            continue;
2336
        }
2337
        if ((pcr_pid < 0 || (AV_RB16(buf + 1) & 0x1fff) == pcr_pid) &&
2338
            parse_pcr(×tamp, &pcr_l, buf) == 0) {
2339
            *ppos = pos;
2340
            return timestamp;
2341
        }
2342
        pos += ts->raw_packet_size;
2343
    }
2344
 
2345
    return AV_NOPTS_VALUE;
2346
}
2347
 
2348
static int64_t mpegts_get_dts(AVFormatContext *s, int stream_index,
2349
                              int64_t *ppos, int64_t pos_limit)
2350
{
2351
    MpegTSContext *ts = s->priv_data;
2352
    int64_t pos;
2353
    int pos47 = ts->pos47_full % ts->raw_packet_size;
2354
    pos = ((*ppos  + ts->raw_packet_size - 1 - pos47) / ts->raw_packet_size) * ts->raw_packet_size + pos47;
2355
    ff_read_frame_flush(s);
2356
    if (avio_seek(s->pb, pos, SEEK_SET) < 0)
2357
        return AV_NOPTS_VALUE;
2358
    while(pos < pos_limit) {
2359
        int ret;
2360
        AVPacket pkt;
2361
        av_init_packet(&pkt);
2362
        ret= av_read_frame(s, &pkt);
2363
        if(ret < 0)
2364
            return AV_NOPTS_VALUE;
2365
        av_free_packet(&pkt);
2366
        if(pkt.dts != AV_NOPTS_VALUE && pkt.pos >= 0){
2367
            ff_reduce_index(s, pkt.stream_index);
2368
            av_add_index_entry(s->streams[pkt.stream_index], pkt.pos, pkt.dts, 0, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */);
2369
            if(pkt.stream_index == stream_index && pkt.pos >= *ppos){
2370
                *ppos= pkt.pos;
2371
                return pkt.dts;
2372
            }
2373
        }
2374
        pos = pkt.pos;
2375
    }
2376
 
2377
    return AV_NOPTS_VALUE;
2378
}
2379
 
2380
/**************************************************************/
2381
/* parsing functions - called from other demuxers such as RTP */
2382
 
2383
MpegTSContext *ff_mpegts_parse_open(AVFormatContext *s)
2384
{
2385
    MpegTSContext *ts;
2386
 
2387
    ts = av_mallocz(sizeof(MpegTSContext));
2388
    if (!ts)
2389
        return NULL;
2390
    /* no stream case, currently used by RTP */
2391
    ts->raw_packet_size = TS_PACKET_SIZE;
2392
    ts->stream = s;
2393
    ts->auto_guess = 1;
2394
    mpegts_open_section_filter(ts, SDT_PID, sdt_cb, ts, 1);
2395
    mpegts_open_section_filter(ts, PAT_PID, pat_cb, ts, 1);
2396
 
2397
    return ts;
2398
}
2399
 
2400
/* return the consumed length if a packet was output, or -1 if no
2401
   packet is output */
2402
int ff_mpegts_parse_packet(MpegTSContext *ts, AVPacket *pkt,
2403
                        const uint8_t *buf, int len)
2404
{
2405
    int len1;
2406
 
2407
    len1 = len;
2408
    ts->pkt = pkt;
2409
    for(;;) {
2410
        ts->stop_parse = 0;
2411
        if (len < TS_PACKET_SIZE)
2412
            return -1;
2413
        if (buf[0] != 0x47) {
2414
            buf++;
2415
            len--;
2416
        } else {
2417
            handle_packet(ts, buf);
2418
            buf += TS_PACKET_SIZE;
2419
            len -= TS_PACKET_SIZE;
2420
            if (ts->stop_parse == 1)
2421
                break;
2422
        }
2423
    }
2424
    return len1 - len;
2425
}
2426
 
2427
void ff_mpegts_parse_close(MpegTSContext *ts)
2428
{
2429
    mpegts_free(ts);
2430
    av_free(ts);
2431
}
2432
 
2433
AVInputFormat ff_mpegts_demuxer = {
2434
    .name           = "mpegts",
2435
    .long_name      = NULL_IF_CONFIG_SMALL("MPEG-TS (MPEG-2 Transport Stream)"),
2436
    .priv_data_size = sizeof(MpegTSContext),
2437
    .read_probe     = mpegts_probe,
2438
    .read_header    = mpegts_read_header,
2439
    .read_packet    = mpegts_read_packet,
2440
    .read_close     = mpegts_read_close,
2441
    .read_timestamp = mpegts_get_dts,
2442
    .flags          = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT,
2443
    .priv_class     = &mpegts_class,
2444
};
2445
 
2446
AVInputFormat ff_mpegtsraw_demuxer = {
2447
    .name           = "mpegtsraw",
2448
    .long_name      = NULL_IF_CONFIG_SMALL("raw MPEG-TS (MPEG-2 Transport Stream)"),
2449
    .priv_data_size = sizeof(MpegTSContext),
2450
    .read_header    = mpegts_read_header,
2451
    .read_packet    = mpegts_raw_read_packet,
2452
    .read_close     = mpegts_read_close,
2453
    .read_timestamp = mpegts_get_dts,
2454
    .flags          = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT,
2455
    .priv_class     = &mpegtsraw_class,
2456
};