mpeg.c 29.6 KB
Newer Older
F
Fabrice Bellard 已提交
1
/*
2
 * MPEG1/2 demuxer
3
 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
F
Fabrice Bellard 已提交
4
 *
5 6 7
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
F
Fabrice Bellard 已提交
8 9
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
10
 * version 2.1 of the License, or (at your option) any later version.
F
Fabrice Bellard 已提交
11
 *
12
 * FFmpeg is distributed in the hope that it will be useful,
F
Fabrice Bellard 已提交
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
F
Fabrice Bellard 已提交
14 15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
F
Fabrice Bellard 已提交
16
 *
F
Fabrice Bellard 已提交
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
F
Fabrice Bellard 已提交
20
 */
21

F
Fabrice Bellard 已提交
22
#include "avformat.h"
23
#include "internal.h"
24
#include "mpeg.h"
F
Fabrice Bellard 已提交
25

C
Clément Bœsch 已提交
26 27 28 29 30
#if CONFIG_VOBSUB_DEMUXER
# include "subtitles.h"
# include "libavutil/bprint.h"
#endif

31 32
#undef NDEBUG
#include <assert.h>
33
#include "libavutil/avassert.h"
34

F
Fabrice Bellard 已提交
35 36 37 38 39
/*********************************************/
/* demux code */

#define MAX_SYNC_SIZE 100000

40
static int check_pes(const uint8_t *p, const uint8_t *end){
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
    int pes1;
    int pes2=      (p[3] & 0xC0) == 0x80
                && (p[4] & 0xC0) != 0x40
                &&((p[4] & 0xC0) == 0x00 || (p[4]&0xC0)>>2 == (p[6]&0xF0));

    for(p+=3; p<end && *p == 0xFF; p++);
    if((*p&0xC0) == 0x40) p+=2;
    if((*p&0xF0) == 0x20){
        pes1= p[0]&p[2]&p[4]&1;
    }else if((*p&0xF0) == 0x30){
        pes1= p[0]&p[2]&p[4]&p[5]&p[7]&p[9]&1;
    }else
        pes1 = *p == 0x0F;

    return pes1||pes2;
}

58 59 60 61
static int check_pack_header(const uint8_t *buf) {
    return (buf[1] & 0xC0) == 0x40 || (buf[1] & 0xF0) == 0x20;
}

62 63
static int mpegps_probe(AVProbeData *p)
{
64
    uint32_t code= -1;
65
    int sys=0, pspack=0, priv1=0, vid=0, audio=0, invalid=0;
66
    int i;
67
    int score=0;
68

69 70
    for(i=0; i<p->buf_size; i++){
        code = (code<<8) + p->buf[i];
71
        if ((code & 0xffffff00) == 0x100) {
72
            int len= p->buf[i+1] << 8 | p->buf[i+2];
M
typo  
Michael Niedermayer 已提交
73
            int pes= check_pes(p->buf+i, p->buf+p->buf_size);
74
            int pack = check_pack_header(p->buf+i);
75

76
            if(code == SYSTEM_HEADER_START_CODE) sys++;
77
            else if(code == PACK_START_CODE && pack) pspack++;
M
Michael Niedermayer 已提交
78
            else if((code & 0xf0) == VIDEO_ID &&  pes) vid++;
79 80 81 82
            // skip pes payload to avoid start code emulation for private
            // and audio streams
            else if((code & 0xe0) == AUDIO_ID &&  pes) {audio++; i+=len;}
            else if(code == PRIVATE_STREAM_1  &&  pes) {priv1++; i+=len;}
83
            else if(code == 0x1fd             &&  pes) vid++; //VC1
84 85 86

            else if((code & 0xf0) == VIDEO_ID && !pes) invalid++;
            else if((code & 0xe0) == AUDIO_ID && !pes) invalid++;
87
            else if(code == PRIVATE_STREAM_1  && !pes) invalid++;
88
        }
89
    }
90

91
    if(vid+audio > invalid+1)     /* invalid VDR files nd short PES streams */
92 93
        score= AVPROBE_SCORE_MAX/4;

94
    if(sys>invalid && sys*9 <= pspack*10)
95
        return (audio > 12 || vid > 3 || pspack > 2) ? AVPROBE_SCORE_MAX/2+2 : AVPROBE_SCORE_MAX/4; // +1 for .mpg
96
    if(pspack > invalid && (priv1+vid+audio)*10 >= pspack*9)
97 98
        return pspack > 2 ? AVPROBE_SCORE_MAX/2+2 : AVPROBE_SCORE_MAX/4; // +1 for .mpg
    if((!!vid ^ !!audio) && (audio > 4 || vid > 1) && !sys && !pspack && p->buf_size>2048 && vid + audio > invalid) /* PES stream */
99
        return (audio > 12 || vid > 3 + 2*invalid) ? AVPROBE_SCORE_MAX/2+2 : AVPROBE_SCORE_MAX/4;
100 101

    //02-Penguin.flac has sys:0 priv1:0 pspack:0 vid:0 audio:1
102
    //mp3_misidentified_2.mp3 has sys:0 priv1:0 pspack:0 vid:0 audio:6
103
    //Have\ Yourself\ a\ Merry\ Little\ Christmas.mp3 0 0 0 5 0 1 len:21618
104
    return score;
105 106 107
}


F
Fabrice Bellard 已提交
108
typedef struct MpegDemuxContext {
M
Måns Rullgård 已提交
109
    int32_t header_state;
110
    unsigned char psm_es_type[256];
111
    int sofdec;
112
    int dvd;
113
    int imkh_cctv;
C
Clément Bœsch 已提交
114 115 116 117
#if CONFIG_VOBSUB_DEMUXER
    AVFormatContext *sub_ctx;
    FFDemuxSubtitlesQueue q;
#endif
F
Fabrice Bellard 已提交
118 119
} MpegDemuxContext;

120
static int mpegps_read_header(AVFormatContext *s)
F
Fabrice Bellard 已提交
121 122
{
    MpegDemuxContext *m = s->priv_data;
123
    char buffer[7];
124
    int64_t last_pos = avio_tell(s->pb);
125

F
Fabrice Bellard 已提交
126 127 128
    m->header_state = 0xff;
    s->ctx_flags |= AVFMTCTX_NOHEADER;

129 130 131 132 133 134
    avio_get_str(s->pb, 6, buffer, sizeof(buffer));
    if (!memcmp("IMKH", buffer, 4)) {
        m->imkh_cctv = 1;
    } else if (!memcmp("Sofdec", buffer, 6)) {
        m->sofdec = 1;
    } else
135 136
       avio_seek(s->pb, last_pos, SEEK_SET);

F
Fabrice Bellard 已提交
137 138 139 140
    /* no need to do more */
    return 0;
}

141
static int64_t get_pts(AVIOContext *pb, int c)
F
Fabrice Bellard 已提交
142
{
143 144
    uint8_t buf[5];

145 146
    buf[0] = c<0 ? avio_r8(pb) : c;
    avio_read(pb, buf+1, 4);
147 148

    return ff_parse_pes_pts(buf);
F
Fabrice Bellard 已提交
149 150
}

151
static int find_next_start_code(AVIOContext *pb, int *size_ptr,
M
Måns Rullgård 已提交
152
                                int32_t *header_state)
F
Fabrice Bellard 已提交
153 154 155 156 157 158 159 160 161
{
    unsigned int state, v;
    int val, n;

    state = *header_state;
    n = *size_ptr;
    while (n > 0) {
        if (url_feof(pb))
            break;
162
        v = avio_r8(pb);
F
Fabrice Bellard 已提交
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
        n--;
        if (state == 0x000001) {
            state = ((state << 8) | v) & 0xffffff;
            val = state;
            goto found;
        }
        state = ((state << 8) | v) & 0xffffff;
    }
    val = -1;
 found:
    *header_state = state;
    *size_ptr = n;
    return val;
}

178
/**
179
 * Extract stream types from a program stream map
180
 * According to ISO/IEC 13818-1 ('MPEG-2 Systems') table 2-35
181
 *
182 183
 * @return number of bytes occupied by PSM in the bitstream
 */
184
static long mpegps_psm_parse(MpegDemuxContext *m, AVIOContext *pb)
185 186 187
{
    int psm_length, ps_info_length, es_map_length;

188 189 190 191
    psm_length = avio_rb16(pb);
    avio_r8(pb);
    avio_r8(pb);
    ps_info_length = avio_rb16(pb);
192 193

    /* skip program_stream_info */
194
    avio_skip(pb, ps_info_length);
195
    es_map_length = avio_rb16(pb);
196 197 198

    /* at least one es available? */
    while (es_map_length >= 4){
199 200 201
        unsigned char type      = avio_r8(pb);
        unsigned char es_id     = avio_r8(pb);
        uint16_t es_info_length = avio_rb16(pb);
202 203 204
        /* remember mapping from stream id to stream type */
        m->psm_es_type[es_id] = type;
        /* skip program_stream_info */
205
        avio_skip(pb, es_info_length);
206 207
        es_map_length -= 4 + es_info_length;
    }
208
    avio_rb32(pb); /* crc32 */
209 210 211
    return 2 + psm_length;
}

212
/* read the next PES header. Return its position in ppos
F
Fabrice Bellard 已提交
213 214 215
   (if not NULL), and its start code, pts and dts.
 */
static int mpegps_read_pes_header(AVFormatContext *s,
216
                                  int64_t *ppos, int *pstart_code,
217
                                  int64_t *ppts, int64_t *pdts)
F
Fabrice Bellard 已提交
218 219
{
    MpegDemuxContext *m = s->priv_data;
F
Fabrice Bellard 已提交
220
    int len, size, startcode, c, flags, header_len;
221
    int pes_ext, ext2_len, id_ext, skip;
222
    int64_t pts, dts;
223
    int64_t last_sync= avio_tell(s->pb);
F
Fabrice Bellard 已提交
224

225
 error_redo:
A
Anton Khirnov 已提交
226
        avio_seek(s->pb, last_sync, SEEK_SET);
F
Fabrice Bellard 已提交
227
 redo:
F
Fabrice Bellard 已提交
228 229 230
        /* next start code (should be immediately after) */
        m->header_state = 0xff;
        size = MAX_SYNC_SIZE;
231
        startcode = find_next_start_code(s->pb, &size, &m->header_state);
232
        last_sync = avio_tell(s->pb);
233 234 235 236 237 238 239
    if (startcode < 0){
        if(url_feof(s->pb))
            return AVERROR_EOF;
        //FIXME we should remember header_state
        return AVERROR(EAGAIN);
    }

F
Fabrice Bellard 已提交
240 241 242 243
    if (startcode == PACK_START_CODE)
        goto redo;
    if (startcode == SYSTEM_HEADER_START_CODE)
        goto redo;
M
Måns Rullgård 已提交
244
    if (startcode == PADDING_STREAM) {
245
        avio_skip(s->pb, avio_rb16(s->pb));
M
Måns Rullgård 已提交
246 247 248 249
        goto redo;
    }
    if (startcode == PRIVATE_STREAM_2) {
        if (!m->sofdec) {
250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299
            /* Need to detect whether this from a DVD or a 'Sofdec' stream */
            int len = avio_rb16(s->pb);
            int bytesread = 0;
            uint8_t *ps2buf = av_malloc(len);

            if (ps2buf) {
                bytesread = avio_read(s->pb, ps2buf, len);

                if (bytesread != len) {
                    avio_skip(s->pb, len - bytesread);
                } else {
                    uint8_t *p = 0;
                    if (len >= 6)
                        p = memchr(ps2buf, 'S', len - 5);

                    if (p)
                        m->sofdec = !memcmp(p+1, "ofdec", 5);

                    m->sofdec -= !m->sofdec;

                    if (m->sofdec < 0) {
                        if (len == 980  && ps2buf[0] == 0) {
                            /* PCI structure? */
                            uint32_t startpts = AV_RB32(ps2buf + 0x0d);
                            uint32_t endpts = AV_RB32(ps2buf + 0x11);
                            uint8_t hours = ((ps2buf[0x19] >> 4) * 10) + (ps2buf[0x19] & 0x0f);
                            uint8_t mins  = ((ps2buf[0x1a] >> 4) * 10) + (ps2buf[0x1a] & 0x0f);
                            uint8_t secs  = ((ps2buf[0x1b] >> 4) * 10) + (ps2buf[0x1b] & 0x0f);

                            m->dvd = (hours <= 23 &&
                                      mins  <= 59 &&
                                      secs  <= 59 &&
                                      (ps2buf[0x19] & 0x0f) < 10 &&
                                      (ps2buf[0x1a] & 0x0f) < 10 &&
                                      (ps2buf[0x1b] & 0x0f) < 10 &&
                                      endpts >= startpts);
                        } else if (len == 1018 && ps2buf[0] == 1) {
                            /* DSI structure? */
                            uint8_t hours = ((ps2buf[0x1d] >> 4) * 10) + (ps2buf[0x1d] & 0x0f);
                            uint8_t mins  = ((ps2buf[0x1e] >> 4) * 10) + (ps2buf[0x1e] & 0x0f);
                            uint8_t secs  = ((ps2buf[0x1f] >> 4) * 10) + (ps2buf[0x1f] & 0x0f);

                            m->dvd = (hours <= 23 &&
                                      mins  <= 59 &&
                                      secs  <= 59 &&
                                      (ps2buf[0x1d] & 0x0f) < 10 &&
                                      (ps2buf[0x1e] & 0x0f) < 10 &&
                                      (ps2buf[0x1f] & 0x0f) < 10);
                        }
                    }
M
Måns Rullgård 已提交
300
                }
301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318

                av_free(ps2buf);

                /* If this isn't a DVD packet or no memory
                 * could be allocated, just ignore it.
                 * If we did, move back to the start of the
                 * packet (plus 'length' field) */
                if (!m->dvd || avio_skip(s->pb, -(len + 2)) < 0) {
                    /* Skip back failed.
                     * This packet will be lost but that can't be helped
                     * if we can't skip back
                     */
                    goto redo;
                }
            } else {
                /* No memory */
                avio_skip(s->pb, len);
                goto redo;
M
Måns Rullgård 已提交
319
            }
320 321 322 323
        } else if (!m->dvd) {
            int len = avio_rb16(s->pb);
            avio_skip(s->pb, len);
            goto redo;
M
Måns Rullgård 已提交
324
        }
F
Fabrice Bellard 已提交
325
    }
326
    if (startcode == PROGRAM_STREAM_MAP) {
327
        mpegps_psm_parse(m, s->pb);
328 329
        goto redo;
    }
330

F
Fabrice Bellard 已提交
331 332 333
    /* find matching stream */
    if (!((startcode >= 0x1c0 && startcode <= 0x1df) ||
          (startcode >= 0x1e0 && startcode <= 0x1ef) ||
334 335 336
          (startcode == 0x1bd) ||
          (startcode == PRIVATE_STREAM_2) ||
          (startcode == 0x1fd)))
F
Fabrice Bellard 已提交
337
        goto redo;
F
Fabrice Bellard 已提交
338
    if (ppos) {
339
        *ppos = avio_tell(s->pb) - 4;
F
Fabrice Bellard 已提交
340
    }
341
    len = avio_rb16(s->pb);
M
Michael Niedermayer 已提交
342
    pts =
343
    dts = AV_NOPTS_VALUE;
344 345
    if (startcode != PRIVATE_STREAM_2)
    {
F
Fabrice Bellard 已提交
346 347
    /* stuffing */
    for(;;) {
F
Fabrice Bellard 已提交
348
        if (len < 1)
349
            goto error_redo;
350
        c = avio_r8(s->pb);
F
Fabrice Bellard 已提交
351 352
        len--;
        /* XXX: for mpeg1, should test only bit 7 */
353
        if (c != 0xff)
F
Fabrice Bellard 已提交
354 355 356 357
            break;
    }
    if ((c & 0xc0) == 0x40) {
        /* buffer scale & size */
358 359
        avio_r8(s->pb);
        c = avio_r8(s->pb);
F
Fabrice Bellard 已提交
360 361
        len -= 2;
    }
M
Michael Niedermayer 已提交
362
    if ((c & 0xe0) == 0x20) {
363
        dts = pts = get_pts(s->pb, c);
F
Fabrice Bellard 已提交
364
        len -= 4;
M
Michael Niedermayer 已提交
365
        if (c & 0x10){
366
            dts = get_pts(s->pb, -1);
M
Michael Niedermayer 已提交
367 368
            len -= 5;
        }
F
Fabrice Bellard 已提交
369 370
    } else if ((c & 0xc0) == 0x80) {
        /* mpeg 2 PES */
371 372
        flags = avio_r8(s->pb);
        header_len = avio_r8(s->pb);
F
Fabrice Bellard 已提交
373 374
        len -= 2;
        if (header_len > len)
375
            goto error_redo;
M
Michael Niedermayer 已提交
376
        len -= header_len;
M
Michael Niedermayer 已提交
377
        if (flags & 0x80) {
378
            dts = pts = get_pts(s->pb, -1);
F
Fabrice Bellard 已提交
379
            header_len -= 5;
M
Michael Niedermayer 已提交
380
            if (flags & 0x40) {
381
                dts = get_pts(s->pb, -1);
M
Michael Niedermayer 已提交
382 383
                header_len -= 5;
            }
F
Fabrice Bellard 已提交
384
        }
385 386 387 388
        if (flags & 0x3f && header_len == 0){
            flags &= 0xC0;
            av_log(s, AV_LOG_WARNING, "Further flags set but no bytes left\n");
        }
389
        if (flags & 0x01) { /* PES extension */
390
            pes_ext = avio_r8(s->pb);
391 392 393 394
            header_len--;
            /* Skip PES private data, program packet sequence counter and P-STD buffer */
            skip = (pes_ext >> 4) & 0xb;
            skip += skip & 0x9;
395 396 397 398
            if (pes_ext & 0x40 || skip > header_len){
                av_log(s, AV_LOG_WARNING, "pes_ext %X is invalid\n", pes_ext);
                pes_ext=skip=0;
            }
399
            avio_skip(s->pb, skip);
400 401 402
            header_len -= skip;

            if (pes_ext & 0x01) { /* PES extension 2 */
403
                ext2_len = avio_r8(s->pb);
404 405
                header_len--;
                if ((ext2_len & 0x7f) > 0) {
406
                    id_ext = avio_r8(s->pb);
407 408 409 410 411 412
                    if ((id_ext & 0x80) == 0)
                        startcode = ((startcode & 0xff) << 8) | id_ext;
                    header_len--;
                }
            }
        }
M
Michael Niedermayer 已提交
413 414
        if(header_len < 0)
            goto error_redo;
415
        avio_skip(s->pb, header_len);
F
Fabrice Bellard 已提交
416
    }
417 418
    else if( c!= 0xf )
        goto redo;
419
    }
420

421
    if (startcode == PRIVATE_STREAM_1) {
422
        startcode = avio_r8(s->pb);
F
Fabrice Bellard 已提交
423 424
        len--;
    }
425 426
    if(len<0)
        goto error_redo;
427 428 429
    if(dts != AV_NOPTS_VALUE && ppos){
        int i;
        for(i=0; i<s->nb_streams; i++){
430
            if(startcode == s->streams[i]->id &&
431
               s->pb->seekable /* index useless on streams anyway */) {
432
                ff_reduce_index(s, i);
M
Michael Niedermayer 已提交
433
                av_add_index_entry(s->streams[i], *ppos, dts, 0, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */);
434 435 436
            }
        }
    }
437

F
Fabrice Bellard 已提交
438 439 440 441 442 443 444 445 446
    *pstart_code = startcode;
    *ppts = pts;
    *pdts = dts;
    return len;
}

static int mpegps_read_packet(AVFormatContext *s,
                              AVPacket *pkt)
{
447
    MpegDemuxContext *m = s->priv_data;
F
Fabrice Bellard 已提交
448
    AVStream *st;
449
    int len, startcode, i, es_type, ret;
450
    int lpcm_header_len = -1; //Init to supress warning
451
    int request_probe= 0;
452
    enum AVCodecID codec_id = AV_CODEC_ID_NONE;
453
    enum AVMediaType type;
454
    int64_t pts, dts, dummy_pos; //dummy_pos is needed for the index building to work
F
Fabrice Bellard 已提交
455 456

 redo:
457
    len = mpegps_read_pes_header(s, &dummy_pos, &startcode, &pts, &dts);
F
Fabrice Bellard 已提交
458 459
    if (len < 0)
        return len;
460

461 462 463 464 465 466
    if (startcode >= 0x80 && startcode <= 0xcf) {
        if(len < 4)
            goto skip;

        /* audio: skip header */
        avio_r8(s->pb);
M
Michael Niedermayer 已提交
467
        lpcm_header_len = avio_rb16(s->pb);
468 469 470 471 472 473 474 475
        len -= 3;
        if (startcode >= 0xb0 && startcode <= 0xbf) {
            /* MLP/TrueHD audio has a 4-byte header */
            avio_r8(s->pb);
            len--;
        }
    }

F
Fabrice Bellard 已提交
476 477 478 479 480 481
    /* now find stream */
    for(i=0;i<s->nb_streams;i++) {
        st = s->streams[i];
        if (st->id == startcode)
            goto found;
    }
482 483 484

    es_type = m->psm_es_type[startcode & 0xff];
        if(es_type == STREAM_TYPE_VIDEO_MPEG1){
485
            codec_id = AV_CODEC_ID_MPEG2VIDEO;
486
            type = AVMEDIA_TYPE_VIDEO;
487
        } else if(es_type == STREAM_TYPE_VIDEO_MPEG2){
488
            codec_id = AV_CODEC_ID_MPEG2VIDEO;
489
            type = AVMEDIA_TYPE_VIDEO;
490 491
        } else if(es_type == STREAM_TYPE_AUDIO_MPEG1 ||
                  es_type == STREAM_TYPE_AUDIO_MPEG2){
492
            codec_id = AV_CODEC_ID_MP3;
493
            type = AVMEDIA_TYPE_AUDIO;
494
        } else if(es_type == STREAM_TYPE_AUDIO_AAC){
495
            codec_id = AV_CODEC_ID_AAC;
496
            type = AVMEDIA_TYPE_AUDIO;
497
        } else if(es_type == STREAM_TYPE_VIDEO_MPEG4){
498
            codec_id = AV_CODEC_ID_MPEG4;
499
            type = AVMEDIA_TYPE_VIDEO;
500
        } else if(es_type == STREAM_TYPE_VIDEO_H264){
501
            codec_id = AV_CODEC_ID_H264;
502
            type = AVMEDIA_TYPE_VIDEO;
503
        } else if(es_type == STREAM_TYPE_AUDIO_AC3){
504
            codec_id = AV_CODEC_ID_AC3;
505
            type = AVMEDIA_TYPE_AUDIO;
506 507 508
        } else if(m->imkh_cctv && es_type == 0x91){
            codec_id = AV_CODEC_ID_PCM_MULAW;
            type = AVMEDIA_TYPE_AUDIO;
509
    } else if (startcode >= 0x1e0 && startcode <= 0x1ef) {
510 511
        static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 };
        unsigned char buf[8];
512
        avio_read(s->pb, buf, 8);
A
Anton Khirnov 已提交
513
        avio_seek(s->pb, -8, SEEK_CUR);
514
        if(!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1))
515
            codec_id = AV_CODEC_ID_CAVS;
516
        else
517
            request_probe= 1;
518
        type = AVMEDIA_TYPE_VIDEO;
519 520 521
    } else if (startcode == PRIVATE_STREAM_2) {
        type = AVMEDIA_TYPE_DATA;
        codec_id = AV_CODEC_ID_DVD_NAV;
522
    } else if (startcode >= 0x1c0 && startcode <= 0x1df) {
523
        type = AVMEDIA_TYPE_AUDIO;
524
        codec_id = m->sofdec > 0 ? AV_CODEC_ID_ADPCM_ADX : AV_CODEC_ID_MP2;
525
    } else if (startcode >= 0x80 && startcode <= 0x87) {
526
        type = AVMEDIA_TYPE_AUDIO;
527
        codec_id = AV_CODEC_ID_AC3;
M
Michael Niedermayer 已提交
528
    } else if (  ( startcode >= 0x88 && startcode <= 0x8f)
529 530
               ||( startcode >= 0x98 && startcode <= 0x9f)) {
        /* 0x90 - 0x97 is reserved for SDDS in DVD specs */
531
        type = AVMEDIA_TYPE_AUDIO;
532
        codec_id = AV_CODEC_ID_DTS;
533
    } else if (startcode >= 0xa0 && startcode <= 0xaf) {
534
        type = AVMEDIA_TYPE_AUDIO;
M
Michael Niedermayer 已提交
535
        if(lpcm_header_len == 6) {
536
            codec_id = AV_CODEC_ID_MLP;
M
Michael Niedermayer 已提交
537
        } else {
538 539
            /* 16 bit form will be handled as AV_CODEC_ID_PCM_S16BE */
            codec_id = AV_CODEC_ID_PCM_DVD;
M
Michael Niedermayer 已提交
540
        }
541
    } else if (startcode >= 0xb0 && startcode <= 0xbf) {
542
        type = AVMEDIA_TYPE_AUDIO;
543
        codec_id = AV_CODEC_ID_TRUEHD;
544 545
    } else if (startcode >= 0xc0 && startcode <= 0xcf) {
        /* Used for both AC-3 and E-AC-3 in EVOB files */
546
        type = AVMEDIA_TYPE_AUDIO;
547
        codec_id = AV_CODEC_ID_AC3;
548
    } else if (startcode >= 0x20 && startcode <= 0x3f) {
549
        type = AVMEDIA_TYPE_SUBTITLE;
550
        codec_id = AV_CODEC_ID_DVD_SUBTITLE;
551
    } else if (startcode >= 0xfd55 && startcode <= 0xfd5f) {
552
        type = AVMEDIA_TYPE_VIDEO;
553
        codec_id = AV_CODEC_ID_VC1;
554 555 556
    } else {
    skip:
        /* skip packet */
557
        avio_skip(s->pb, len);
558 559
        goto redo;
    }
560
    /* no stream found: add a new stream */
561
    st = avformat_new_stream(s, NULL);
562
    if (!st)
563
        goto skip;
564
    st->id = startcode;
565 566
    st->codec->codec_type = type;
    st->codec->codec_id = codec_id;
567 568 569 570 571
    if (st->codec->codec_id == AV_CODEC_ID_PCM_MULAW) {
        st->codec->channels = 1;
        st->codec->channel_layout = AV_CH_LAYOUT_MONO;
        st->codec->sample_rate = 8000;
    }
572
    st->request_probe     = request_probe;
573
    if (codec_id != AV_CODEC_ID_PCM_S16BE)
A
Aurelien Jacobs 已提交
574
        st->need_parsing = AVSTREAM_PARSE_FULL;
F
Fabrice Bellard 已提交
575
 found:
576
    if(st->discard >= AVDISCARD_ALL)
577
        goto skip;
578
    if (startcode >= 0xa0 && startcode <= 0xaf) {
579
      if (lpcm_header_len == 6 && st->codec->codec_id == AV_CODEC_ID_MLP) {
M
Michael Niedermayer 已提交
580 581 582 583 584
            if (len < 6)
                goto skip;
            avio_skip(s->pb, 6);
            len -=6;
      } else {
585 586 587 588 589 590
        int b1, freq;

        /* for LPCM, we just skip the header and consider it is raw
           audio data */
        if (len <= 3)
            goto skip;
591 592 593
        avio_r8(s->pb); /* emphasis (1), muse(1), reserved(1), frame number(5) */
        b1 = avio_r8(s->pb); /* quant (2), freq(2), reserved(1), channels(3) */
        avio_r8(s->pb); /* dynamic range control (0x80 = off) */
594 595
        len -= 3;
        freq = (b1 >> 4) & 3;
596 597
        st->codec->sample_rate = lpcm_freq_tab[freq];
        st->codec->channels = 1 + (b1 & 7);
598
        st->codec->bits_per_coded_sample = 16 + ((b1 >> 6) & 3) * 4;
599 600
        st->codec->bit_rate = st->codec->channels *
                              st->codec->sample_rate *
601 602
                              st->codec->bits_per_coded_sample;
        if (st->codec->bits_per_coded_sample == 16)
603
            st->codec->codec_id = AV_CODEC_ID_PCM_S16BE;
604
        else if (st->codec->bits_per_coded_sample == 28)
605
            return AVERROR(EINVAL);
M
Michael Niedermayer 已提交
606
      }
607
    }
608
    ret = av_get_packet(s->pb, pkt, len);
F
Fabrice Bellard 已提交
609
    pkt->pts = pts;
F
Fabrice Bellard 已提交
610
    pkt->dts = dts;
611
    pkt->pos = dummy_pos;
612
    pkt->stream_index = st->index;
613
    av_dlog(s, "%d: pts=%0.3f dts=%0.3f size=%d\n",
614 615
            pkt->stream_index, pkt->pts / 90000.0, pkt->dts / 90000.0,
            pkt->size);
616

617
    return (ret < 0) ? ret : 0;
F
Fabrice Bellard 已提交
618 619
}

620
static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index,
621
                               int64_t *ppos, int64_t pos_limit)
F
Fabrice Bellard 已提交
622 623 624 625 626
{
    int len, startcode;
    int64_t pos, pts, dts;

    pos = *ppos;
A
Anton Khirnov 已提交
627
    if (avio_seek(s->pb, pos, SEEK_SET) < 0)
628 629
        return AV_NOPTS_VALUE;

F
Fabrice Bellard 已提交
630
    for(;;) {
631
        len = mpegps_read_pes_header(s, &pos, &startcode, &pts, &dts);
F
Fabrice Bellard 已提交
632
        if (len < 0) {
633
            av_dlog(s, "none (ret=%d)\n", len);
F
Fabrice Bellard 已提交
634 635
            return AV_NOPTS_VALUE;
        }
636
        if (startcode == s->streams[stream_index]->id &&
F
Fabrice Bellard 已提交
637 638 639
            dts != AV_NOPTS_VALUE) {
            break;
        }
640
        avio_skip(s->pb, len);
F
Fabrice Bellard 已提交
641
    }
642 643
    av_dlog(s, "pos=0x%"PRIx64" dts=0x%"PRIx64" %0.3f\n",
            pos, dts, dts / 90000.0);
F
Fabrice Bellard 已提交
644
    *ppos = pos;
645
    return dts;
F
Fabrice Bellard 已提交
646 647
}

648
AVInputFormat ff_mpegps_demuxer = {
649
    .name           = "mpeg",
650
    .long_name      = NULL_IF_CONFIG_SMALL("MPEG-PS (MPEG-2 Program Stream)"),
651 652 653 654 655
    .priv_data_size = sizeof(MpegDemuxContext),
    .read_probe     = mpegps_probe,
    .read_header    = mpegps_read_header,
    .read_packet    = mpegps_read_packet,
    .read_timestamp = mpegps_read_dts,
656
    .flags          = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT,
F
Fabrice Bellard 已提交
657
};
C
Clément Bœsch 已提交
658 659 660 661 662 663 664 665 666 667 668 669 670 671

#if CONFIG_VOBSUB_DEMUXER

#define REF_STRING "# VobSub index file,"

static int vobsub_probe(AVProbeData *p)
{
    if (!strncmp(p->buf, REF_STRING, sizeof(REF_STRING) - 1))
        return AVPROBE_SCORE_MAX;
    return 0;
}

static int vobsub_read_header(AVFormatContext *s)
{
672
    int i, ret = 0, header_parsed = 0, langidx = 0;
C
Clément Bœsch 已提交
673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737
    MpegDemuxContext *vobsub = s->priv_data;
    char *sub_name = NULL;
    size_t fname_len;
    char *ext, *header_str;
    AVBPrint header;
    int64_t delay = 0;
    AVStream *st = NULL;

    sub_name = av_strdup(s->filename);
    fname_len = strlen(sub_name);
    ext = sub_name - 3 + fname_len;
    if (fname_len < 4 || *(ext - 1) != '.') {
        av_log(s, AV_LOG_ERROR, "The input index filename is too short "
               "to guess the associated .SUB file\n");
        ret = AVERROR_INVALIDDATA;
        goto end;
    }
    memcpy(ext, !strncmp(ext, "IDX", 3) ? "SUB" : "sub", 3);
    av_log(s, AV_LOG_VERBOSE, "IDX/SUB: %s -> %s\n", s->filename, sub_name);
    ret = avformat_open_input(&vobsub->sub_ctx, sub_name, &ff_mpegps_demuxer, NULL);
    if (ret < 0) {
        av_log(s, AV_LOG_ERROR, "Unable to open %s as MPEG subtitles\n", sub_name);
        goto end;
    }

    av_bprint_init(&header, 0, AV_BPRINT_SIZE_UNLIMITED);
    while (!url_feof(s->pb)) {
        char line[2048];
        int len = ff_get_line(s->pb, line, sizeof(line));

        if (!len)
            break;

        line[strcspn(line, "\r\n")] = 0;

        if (!strncmp(line, "id:", 3)) {
            int n, stream_id = 0;
            char id[64] = {0};

            n = sscanf(line, "id: %63[^,], index: %u", id, &stream_id);
            if (n != 2) {
                av_log(s, AV_LOG_WARNING, "Unable to parse index line '%s', "
                       "assuming 'id: und, index: 0'\n", line);
                strcpy(id, "und");
                stream_id = 0;
            }

            st = avformat_new_stream(s, NULL);
            if (!st) {
                ret = AVERROR(ENOMEM);
                goto end;
            }
            st->id = stream_id;
            st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
            st->codec->codec_id   = AV_CODEC_ID_DVD_SUBTITLE;
            av_dict_set(&st->metadata, "language", id, 0);
            av_log(s, AV_LOG_DEBUG, "IDX stream[%d] id=%s\n", stream_id, id);
            header_parsed = 1;

        } else if (st && !strncmp(line, "timestamp:", 10)) {
            AVPacket *sub;
            int hh, mm, ss, ms;
            int64_t pos, timestamp;
            const char *p = line + 10;

738
            if (sscanf(p, "%02d:%02d:%02d:%03d, filepos: %"SCNx64,
C
Clément Bœsch 已提交
739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803
                       &hh, &mm, &ss, &ms, &pos) != 5) {
                av_log(s, AV_LOG_ERROR, "Unable to parse timestamp line '%s', "
                       "abort parsing\n", line);
                break;
            }
            timestamp = (hh*3600LL + mm*60LL + ss) * 1000LL + ms + delay;
            timestamp = av_rescale_q(timestamp, (AVRational){1,1000}, st->time_base);

            sub = ff_subtitles_queue_insert(&vobsub->q, "", 0, 0);
            if (!sub) {
                ret = AVERROR(ENOMEM);
                goto end;
            }
            sub->pos = pos;
            sub->pts = timestamp;
            sub->stream_index = s->nb_streams - 1;

        } else if (st && !strncmp(line, "alt:", 4)) {
            const char *p = line + 4;

            while (*p == ' ')
                p++;
            av_dict_set(&st->metadata, "title", p, 0);
            av_log(s, AV_LOG_DEBUG, "IDX stream[%d] name=%s\n", st->id, p);
            header_parsed = 1;

        } else if (!strncmp(line, "delay:", 6)) {
            int sign = 1, hh = 0, mm = 0, ss = 0, ms = 0;
            const char *p = line + 6;

            while (*p == ' ')
                p++;
            if (*p == '-' || *p == '+') {
                sign = *p == '-' ? -1 : 1;
                p++;
            }
            sscanf(p, "%d:%d:%d:%d", &hh, &mm, &ss, &ms);
            delay = ((hh*3600LL + mm*60LL + ss) * 1000LL + ms) * sign;

        } else if (!strncmp(line, "langidx:", 8)) {
            const char *p = line + 8;

            if (sscanf(p, "%d", &langidx) != 1)
                av_log(s, AV_LOG_ERROR, "Invalid langidx specified\n");

        } else if (!header_parsed) {
            if (line[0] && line[0] != '#')
                av_bprintf(&header, "%s\n", line);
        }
    }

    if (langidx < s->nb_streams)
        s->streams[langidx]->disposition |= AV_DISPOSITION_DEFAULT;

    ff_subtitles_queue_finalize(&vobsub->q);

    if (!av_bprint_is_complete(&header)) {
        av_bprint_finalize(&header, NULL);
        ret = AVERROR(ENOMEM);
        goto end;
    }
    av_bprint_finalize(&header, &header_str);
    for (i = 0; i < s->nb_streams; i++) {
        AVStream *sub_st = s->streams[i];
        sub_st->codec->extradata      = av_strdup(header_str);
804
        sub_st->codec->extradata_size = header.len;
C
Clément Bœsch 已提交
805 806 807 808 809 810 811 812
    }
    av_free(header_str);

end:
    av_free(sub_name);
    return ret;
}

813 814
#define FAIL(r) do { ret = r; goto fail; } while (0)

C
Clément Bœsch 已提交
815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847
static int vobsub_read_packet(AVFormatContext *s, AVPacket *pkt)
{
    MpegDemuxContext *vobsub = s->priv_data;
    FFDemuxSubtitlesQueue *q = &vobsub->q;
    AVIOContext *pb = vobsub->sub_ctx->pb;
    int ret, psize, len16 = -1;
    AVPacket idx_pkt;

    ret = ff_subtitles_queue_read_packet(q, &idx_pkt);
    if (ret < 0)
        return ret;

    /* compute maximum packet size using the next packet position. This is
     * useful when the len in the header is non-sense */
    if (q->current_sub_idx < q->nb_subs) {
        psize = q->subs[q->current_sub_idx].pos - idx_pkt.pos;
    } else {
        int64_t fsize = avio_size(pb);
        psize = fsize < 0 ? 0xffff : fsize - idx_pkt.pos;
    }

    avio_seek(pb, idx_pkt.pos, SEEK_SET);

    av_init_packet(pkt);
    pkt->size = 0;
    pkt->data = NULL;

    do {
        int n, to_read, startcode;
        int64_t pts, dts;

        ret = mpegps_read_pes_header(vobsub->sub_ctx, NULL, &startcode, &pts, &dts);
        if (ret < 0)
848
            FAIL(ret);
C
Clément Bœsch 已提交
849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864
        to_read = ret & 0xffff;

        /* this prevents reads above the current packet */
        if (pkt->size + to_read > psize)
            break;

        /* if the len is computed, we check for overread */
        if (len16 != -1 && pkt->size + to_read > len16)
            break;

        /* the current chunk doesn't match the stream index (unlikely) */
        if ((startcode & 0x1f) != idx_pkt.stream_index)
            break;

        ret = av_grow_packet(pkt, to_read);
        if (ret < 0)
865
            FAIL(ret);
C
Clément Bœsch 已提交
866 867 868 869 870 871 872 873 874 875 876 877 878 879

        n = avio_read(pb, pkt->data + (pkt->size - to_read), to_read);
        if (n < to_read)
            pkt->size -= to_read - n;

        /* first chunk contains the total len of the packet to raise */
        if (len16 == -1 && n > 2)
            len16 = AV_RB16(pkt->data);
    } while (len16 != -1 && pkt->size != len16);

    pkt->pts = pkt->dts = idx_pkt.pts;
    pkt->pos = idx_pkt.pos;
    pkt->stream_index = idx_pkt.stream_index;

880
    av_free_packet(&idx_pkt);
C
Clément Bœsch 已提交
881
    return 0;
882 883 884 885

fail:
    av_free_packet(&idx_pkt);
    return ret;
C
Clément Bœsch 已提交
886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917
}

static int vobsub_read_seek(AVFormatContext *s, int stream_index,
                            int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
{
    MpegDemuxContext *vobsub = s->priv_data;
    return ff_subtitles_queue_seek(&vobsub->q, s, stream_index,
                                   min_ts, ts, max_ts, flags);
}

static int vobsub_read_close(AVFormatContext *s)
{
    MpegDemuxContext *vobsub = s->priv_data;
    ff_subtitles_queue_clean(&vobsub->q);
    if (vobsub->sub_ctx)
        avformat_close_input(&vobsub->sub_ctx);
    return 0;
}

AVInputFormat ff_vobsub_demuxer = {
    .name           = "vobsub",
    .long_name      = NULL_IF_CONFIG_SMALL("VobSub subtitle format"),
    .priv_data_size = sizeof(MpegDemuxContext),
    .read_probe     = vobsub_probe,
    .read_header    = vobsub_read_header,
    .read_packet    = vobsub_read_packet,
    .read_seek2     = vobsub_read_seek,
    .read_close     = vobsub_read_close,
    .flags          = AVFMT_SHOW_IDS,
    .extensions     = "idx",
};
#endif