mpeg.c 57.6 KB
Newer Older
F
Fabrice Bellard 已提交
1
/*
2
 * MPEG1/2 muxer and demuxer
F
Fabrice Bellard 已提交
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
 */
#include "avformat.h"
22
#include "bitstream.h"
23
#include "fifo.h"
F
Fabrice Bellard 已提交
24 25

#define MAX_PAYLOAD_SIZE 4096
F
Fabrice Bellard 已提交
26
//#define DEBUG_SEEK
F
Fabrice Bellard 已提交
27

28 29 30
#undef NDEBUG
#include <assert.h>

M
Michael Niedermayer 已提交
31 32 33 34 35 36 37 38 39
typedef struct PacketDesc {
    int64_t pts;
    int64_t dts;
    int size;
    int unwritten_size;
    int flags;
    struct PacketDesc *next;
} PacketDesc;

F
Fabrice Bellard 已提交
40
typedef struct {
41
    AVFifoBuffer fifo;
42
    uint8_t id;
F
Fabrice Bellard 已提交
43
    int max_buffer_size; /* in bytes */
M
Michael Niedermayer 已提交
44 45 46 47
    int buffer_index;
    PacketDesc *predecode_packet;
    PacketDesc *premux_packet;
    PacketDesc **next_packet;
F
Fabrice Bellard 已提交
48
    int packet_number;
F
Fabrice Bellard 已提交
49 50
    uint8_t lpcm_header[3];
    int lpcm_align;
51
    int bytes_to_iframe;
52
    int align_iframe;
53
    int64_t vobu_start_pts;
F
Fabrice Bellard 已提交
54 55 56 57 58 59 60
} StreamInfo;

typedef struct {
    int packet_size; /* required packet size */
    int packet_number;
    int pack_header_freq;     /* frequency (in packets^-1) at which we send pack headers */
    int system_header_freq;
61
    int system_header_size;
F
Fabrice Bellard 已提交
62 63 64 65
    int mux_rate; /* bitrate in units of 50 bytes/s */
    /* stream info */
    int audio_bound;
    int video_bound;
66 67
    int is_mpeg2;
    int is_vcd;
68
    int is_svcd;
69
    int is_dvd;
70
    int64_t last_scr; /* current system clock */
71

72
    double vcd_padding_bitrate; //FIXME floats
73 74
    int64_t vcd_padding_bytes_written;

F
Fabrice Bellard 已提交
75 76 77 78
} MpegMuxContext;

#define PACK_START_CODE             ((unsigned int)0x000001ba)
#define SYSTEM_HEADER_START_CODE    ((unsigned int)0x000001bb)
79
#define SEQUENCE_END_CODE           ((unsigned int)0x000001b7)
F
Fabrice Bellard 已提交
80 81 82
#define PACKET_START_CODE_MASK      ((unsigned int)0xffffff00)
#define PACKET_START_CODE_PREFIX    ((unsigned int)0x00000100)
#define ISO_11172_END_CODE          ((unsigned int)0x000001b9)
83

F
Fabrice Bellard 已提交
84 85 86 87 88 89 90 91 92
/* mpeg2 */
#define PROGRAM_STREAM_MAP 0x1bc
#define PRIVATE_STREAM_1   0x1bd
#define PADDING_STREAM     0x1be
#define PRIVATE_STREAM_2   0x1bf


#define AUDIO_ID 0xc0
#define VIDEO_ID 0xe0
F
Fabrice Bellard 已提交
93
#define AC3_ID   0x80
94
#define DTS_ID   0x8a
F
Fabrice Bellard 已提交
95
#define LPCM_ID  0xa0
96
#define SUB_ID   0x20
F
Fabrice Bellard 已提交
97

98 99 100 101 102 103 104 105 106 107 108 109 110
#define STREAM_TYPE_VIDEO_MPEG1     0x01
#define STREAM_TYPE_VIDEO_MPEG2     0x02
#define STREAM_TYPE_AUDIO_MPEG1     0x03
#define STREAM_TYPE_AUDIO_MPEG2     0x04
#define STREAM_TYPE_PRIVATE_SECTION 0x05
#define STREAM_TYPE_PRIVATE_DATA    0x06
#define STREAM_TYPE_AUDIO_AAC       0x0f
#define STREAM_TYPE_VIDEO_MPEG4     0x10
#define STREAM_TYPE_VIDEO_H264      0x1b

#define STREAM_TYPE_AUDIO_AC3       0x81
#define STREAM_TYPE_AUDIO_DTS       0x8a

111 112
static const int lpcm_freq_tab[4] = { 48000, 96000, 44100, 32000 };

113
#ifdef CONFIG_MUXERS
114 115 116 117 118
AVOutputFormat mpeg1system_muxer;
AVOutputFormat mpeg1vcd_muxer;
AVOutputFormat mpeg2vob_muxer;
AVOutputFormat mpeg2svcd_muxer;
AVOutputFormat mpeg2dvd_muxer;
119

120
static int put_pack_header(AVFormatContext *ctx,
121
                           uint8_t *buf, int64_t timestamp)
F
Fabrice Bellard 已提交
122 123 124
{
    MpegMuxContext *s = ctx->priv_data;
    PutBitContext pb;
125

A
Alex Beregszaszi 已提交
126
    init_put_bits(&pb, buf, 128);
F
Fabrice Bellard 已提交
127 128

    put_bits(&pb, 32, PACK_START_CODE);
129
    if (s->is_mpeg2) {
130
        put_bits(&pb, 2, 0x1);
131 132 133
    } else {
        put_bits(&pb, 4, 0x2);
    }
134
    put_bits(&pb, 3, (uint32_t)((timestamp >> 30) & 0x07));
F
Fabrice Bellard 已提交
135
    put_bits(&pb, 1, 1);
136
    put_bits(&pb, 15, (uint32_t)((timestamp >> 15) & 0x7fff));
F
Fabrice Bellard 已提交
137
    put_bits(&pb, 1, 1);
138
    put_bits(&pb, 15, (uint32_t)((timestamp) & 0x7fff));
F
Fabrice Bellard 已提交
139
    put_bits(&pb, 1, 1);
140 141 142 143
    if (s->is_mpeg2) {
        /* clock extension */
        put_bits(&pb, 9, 0);
    }
F
Fabrice Bellard 已提交
144 145 146
    put_bits(&pb, 1, 1);
    put_bits(&pb, 22, s->mux_rate);
    put_bits(&pb, 1, 1);
147
    if (s->is_mpeg2) {
148
        put_bits(&pb, 1, 1);
149 150 151
        put_bits(&pb, 5, 0x1f); /* reserved */
        put_bits(&pb, 3, 0); /* stuffing length */
    }
F
Fabrice Bellard 已提交
152
    flush_put_bits(&pb);
153
    return pbBufPtr(&pb) - pb.buf;
F
Fabrice Bellard 已提交
154 155
}

156
static int put_system_header(AVFormatContext *ctx, uint8_t *buf,int only_for_stream_id)
F
Fabrice Bellard 已提交
157 158
{
    MpegMuxContext *s = ctx->priv_data;
M
Michael Niedermayer 已提交
159
    int size, i, private_stream_coded, id;
F
Fabrice Bellard 已提交
160 161
    PutBitContext pb;

A
Alex Beregszaszi 已提交
162
    init_put_bits(&pb, buf, 128);
F
Fabrice Bellard 已提交
163 164 165 166

    put_bits(&pb, 32, SYSTEM_HEADER_START_CODE);
    put_bits(&pb, 16, 0);
    put_bits(&pb, 1, 1);
167

M
Michael Niedermayer 已提交
168
    put_bits(&pb, 22, s->mux_rate); /* maximum bit rate of the multiplexed stream */
F
Fabrice Bellard 已提交
169
    put_bits(&pb, 1, 1); /* marker */
170 171 172 173 174
    if (s->is_vcd && only_for_stream_id==VIDEO_ID) {
        /* This header applies only to the video stream (see VCD standard p. IV-7)*/
        put_bits(&pb, 6, 0);
    } else
        put_bits(&pb, 6, s->audio_bound);
F
Fabrice Bellard 已提交
175

176 177
    if (s->is_vcd) {
        /* see VCD standard, p. IV-7*/
178
        put_bits(&pb, 1, 0);
179 180 181 182 183
        put_bits(&pb, 1, 1);
    } else {
        put_bits(&pb, 1, 0); /* variable bitrate*/
        put_bits(&pb, 1, 0); /* non constrainted bit stream */
    }
184

185
    if (s->is_vcd || s->is_dvd) {
186 187 188 189 190 191 192 193
        /* see VCD standard p IV-7 */
        put_bits(&pb, 1, 1); /* audio locked */
        put_bits(&pb, 1, 1); /* video locked */
    } else {
        put_bits(&pb, 1, 0); /* audio locked */
        put_bits(&pb, 1, 0); /* video locked */
    }

F
Fabrice Bellard 已提交
194 195
    put_bits(&pb, 1, 1); /* marker */

196 197 198 199 200
    if (s->is_vcd && only_for_stream_id==AUDIO_ID) {
        /* This header applies only to the audio stream (see VCD standard p. IV-7)*/
        put_bits(&pb, 5, 0);
    } else
        put_bits(&pb, 5, s->video_bound);
201

202 203 204 205 206
    if (s->is_dvd) {
        put_bits(&pb, 1, 0);    /* packet_rate_restriction_flag */
        put_bits(&pb, 7, 0x7f); /* reserved byte */
    } else
        put_bits(&pb, 8, 0xff); /* reserved byte */
207

208
    /* DVD-Video Stream_bound entries
209 210 211
    id (0xB9) video, maximum P-STD for stream 0xE0. (P-STD_buffer_bound_scale = 1)
    id (0xB8) audio, maximum P-STD for any MPEG audio (0xC0 to 0xC7) streams. If there are none set to 4096 (32x128). (P-STD_buffer_bound_scale = 0)
    id (0xBD) private stream 1 (audio other than MPEG and subpictures). (P-STD_buffer_bound_scale = 1)
212 213
    id (0xBF) private stream 2, NAV packs, set to 2x1024. */
    if (s->is_dvd) {
214

215 216 217
        int P_STD_max_video = 0;
        int P_STD_max_mpeg_audio = 0;
        int P_STD_max_mpeg_PS1 = 0;
218

219 220
        for(i=0;i<ctx->nb_streams;i++) {
            StreamInfo *stream = ctx->streams[i]->priv_data;
221 222

            id = stream->id;
223 224 225 226 227 228
            if (id == 0xbd && stream->max_buffer_size > P_STD_max_mpeg_PS1) {
                P_STD_max_mpeg_PS1 = stream->max_buffer_size;
            } else if (id >= 0xc0 && id <= 0xc7 && stream->max_buffer_size > P_STD_max_mpeg_audio) {
                P_STD_max_mpeg_audio = stream->max_buffer_size;
            } else if (id == 0xe0 && stream->max_buffer_size > P_STD_max_video) {
                P_STD_max_video = stream->max_buffer_size;
229
            }
230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262
        }

        /* video */
        put_bits(&pb, 8, 0xb9); /* stream ID */
        put_bits(&pb, 2, 3);
        put_bits(&pb, 1, 1);
        put_bits(&pb, 13, P_STD_max_video / 1024);

        /* audio */
        if (P_STD_max_mpeg_audio == 0)
            P_STD_max_mpeg_audio = 4096;
        put_bits(&pb, 8, 0xb8); /* stream ID */
        put_bits(&pb, 2, 3);
        put_bits(&pb, 1, 0);
        put_bits(&pb, 13, P_STD_max_mpeg_audio / 128);

        /* private stream 1 */
        put_bits(&pb, 8, 0xbd); /* stream ID */
        put_bits(&pb, 2, 3);
        put_bits(&pb, 1, 0);
        put_bits(&pb, 13, P_STD_max_mpeg_PS1 / 128);

        /* private stream 2 */
        put_bits(&pb, 8, 0xbf); /* stream ID */
        put_bits(&pb, 2, 3);
        put_bits(&pb, 1, 1);
        put_bits(&pb, 13, 2);
    }
    else {
        /* audio stream info */
        private_stream_coded = 0;
        for(i=0;i<ctx->nb_streams;i++) {
            StreamInfo *stream = ctx->streams[i]->priv_data;
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

            /* For VCDs, only include the stream info for the stream
            that the pack which contains this system belongs to.
            (see VCD standard p. IV-7) */
            if ( !s->is_vcd || stream->id==only_for_stream_id
                || only_for_stream_id==0) {

                id = stream->id;
                if (id < 0xc0) {
                    /* special case for private streams (AC3 use that) */
                    if (private_stream_coded)
                        continue;
                    private_stream_coded = 1;
                    id = 0xbd;
                }
                put_bits(&pb, 8, id); /* stream ID */
                put_bits(&pb, 2, 3);
                if (id < 0xe0) {
                    /* audio */
                    put_bits(&pb, 1, 0);
                    put_bits(&pb, 13, stream->max_buffer_size / 128);
                } else {
                    /* video */
                    put_bits(&pb, 1, 1);
                    put_bits(&pb, 13, stream->max_buffer_size / 1024);
                }
290
            }
F
Fabrice Bellard 已提交
291 292
        }
    }
293

F
Fabrice Bellard 已提交
294
    flush_put_bits(&pb);
295
    size = pbBufPtr(&pb) - pb.buf;
F
Fabrice Bellard 已提交
296 297 298 299 300 301 302
    /* patch packet size */
    buf[4] = (size - 6) >> 8;
    buf[5] = (size - 6) & 0xff;

    return size;
}

303 304 305 306
static int get_system_header_size(AVFormatContext *ctx)
{
    int buf_index, i, private_stream_coded;
    StreamInfo *stream;
307 308 309 310
    MpegMuxContext *s = ctx->priv_data;

    if (s->is_dvd)
       return 18; // DVD-Video system headers are 18 bytes fixed length.
311 312 313 314 315 316 317 318 319 320 321 322 323 324 325

    buf_index = 12;
    private_stream_coded = 0;
    for(i=0;i<ctx->nb_streams;i++) {
        stream = ctx->streams[i]->priv_data;
        if (stream->id < 0xc0) {
            if (private_stream_coded)
                continue;
            private_stream_coded = 1;
        }
        buf_index += 3;
    }
    return buf_index;
}

F
Fabrice Bellard 已提交
326 327
static int mpeg_mux_init(AVFormatContext *ctx)
{
328
    MpegMuxContext *s = ctx->priv_data;
329
    int bitrate, i, mpa_id, mpv_id, mps_id, ac3_id, dts_id, lpcm_id, j;
F
Fabrice Bellard 已提交
330 331
    AVStream *st;
    StreamInfo *stream;
332 333
    int audio_bitrate;
    int video_bitrate;
F
Fabrice Bellard 已提交
334 335

    s->packet_number = 0;
336 337 338 339
    s->is_vcd = (ctx->oformat == &mpeg1vcd_muxer);
    s->is_svcd = (ctx->oformat == &mpeg2svcd_muxer);
    s->is_mpeg2 = (ctx->oformat == &mpeg2vob_muxer || ctx->oformat == &mpeg2svcd_muxer || ctx->oformat == &mpeg2dvd_muxer);
    s->is_dvd = (ctx->oformat == &mpeg2dvd_muxer);
340

341 342
    if(ctx->packet_size)
        s->packet_size = ctx->packet_size;
343 344
    else
        s->packet_size = 2048;
345

346 347
    s->vcd_padding_bytes_written = 0;
    s->vcd_padding_bitrate=0;
348

F
Fabrice Bellard 已提交
349 350 351
    s->audio_bound = 0;
    s->video_bound = 0;
    mpa_id = AUDIO_ID;
F
Fabrice Bellard 已提交
352
    ac3_id = AC3_ID;
353
    dts_id = DTS_ID;
F
Fabrice Bellard 已提交
354
    mpv_id = VIDEO_ID;
355
    mps_id = SUB_ID;
F
Fabrice Bellard 已提交
356
    lpcm_id = LPCM_ID;
F
Fabrice Bellard 已提交
357 358 359 360 361 362 363
    for(i=0;i<ctx->nb_streams;i++) {
        st = ctx->streams[i];
        stream = av_mallocz(sizeof(StreamInfo));
        if (!stream)
            goto fail;
        st->priv_data = stream;

364 365
        av_set_pts_info(st, 64, 1, 90000);

366
        switch(st->codec->codec_type) {
F
Fabrice Bellard 已提交
367
        case CODEC_TYPE_AUDIO:
368
            if (st->codec->codec_id == CODEC_ID_AC3) {
F
Fabrice Bellard 已提交
369
                stream->id = ac3_id++;
370
            } else if (st->codec->codec_id == CODEC_ID_DTS) {
371
                stream->id = dts_id++;
372
            } else if (st->codec->codec_id == CODEC_ID_PCM_S16BE) {
F
Fabrice Bellard 已提交
373 374
                stream->id = lpcm_id++;
                for(j = 0; j < 4; j++) {
375
                    if (lpcm_freq_tab[j] == st->codec->sample_rate)
F
Fabrice Bellard 已提交
376 377 378 379
                        break;
                }
                if (j == 4)
                    goto fail;
380
                if (st->codec->channels > 8)
F
Fabrice Bellard 已提交
381 382
                    return -1;
                stream->lpcm_header[0] = 0x0c;
383
                stream->lpcm_header[1] = (st->codec->channels - 1) | (j << 4);
F
Fabrice Bellard 已提交
384
                stream->lpcm_header[2] = 0x80;
385
                stream->lpcm_align = st->codec->channels * 2;
F
Fabrice Bellard 已提交
386
            } else {
F
Fabrice Bellard 已提交
387
                stream->id = mpa_id++;
F
Fabrice Bellard 已提交
388
            }
389 390 391

            /* This value HAS to be used for VCD (see VCD standard, p. IV-7).
               Right now it is also used for everything else.*/
392
            stream->max_buffer_size = 4 * 1024;
F
Fabrice Bellard 已提交
393 394 395 396
            s->audio_bound++;
            break;
        case CODEC_TYPE_VIDEO:
            stream->id = mpv_id++;
397 398
            if (st->codec->rc_buffer_size)
                stream->max_buffer_size = 6*1024 + st->codec->rc_buffer_size/8;
M
Michael Niedermayer 已提交
399 400 401
            else
                stream->max_buffer_size = 230*1024; //FIXME this is probably too small as default
#if 0
402
                /* see VCD standard, p. IV-7*/
403
                stream->max_buffer_size = 46 * 1024;
404 405 406
            else
                /* This value HAS to be used for SVCD (see SVCD standard, p. 26 V.2.3.2).
                   Right now it is also used for everything else.*/
407
                stream->max_buffer_size = 230 * 1024;
M
Michael Niedermayer 已提交
408
#endif
F
Fabrice Bellard 已提交
409 410
            s->video_bound++;
            break;
411 412 413 414
        case CODEC_TYPE_SUBTITLE:
            stream->id = mps_id++;
            stream->max_buffer_size = 16 * 1024;
            break;
415
        default:
M
Michael Niedermayer 已提交
416
            return -1;
F
Fabrice Bellard 已提交
417
        }
418
        av_fifo_init(&stream->fifo, 16);
F
Fabrice Bellard 已提交
419
    }
420 421 422
    bitrate = 0;
    audio_bitrate = 0;
    video_bitrate = 0;
F
Fabrice Bellard 已提交
423
    for(i=0;i<ctx->nb_streams;i++) {
M
Michael Niedermayer 已提交
424
        int codec_rate;
F
Fabrice Bellard 已提交
425
        st = ctx->streams[i];
426
        stream = (StreamInfo*) st->priv_data;
M
Michael Niedermayer 已提交
427

428 429
        if(st->codec->rc_max_rate || stream->id==VIDEO_ID)
            codec_rate= st->codec->rc_max_rate;
M
Michael Niedermayer 已提交
430
        else
431
            codec_rate= st->codec->bit_rate;
432

M
Michael Niedermayer 已提交
433 434
        if(!codec_rate)
            codec_rate= (1<<21)*8*50/ctx->nb_streams;
435

M
Michael Niedermayer 已提交
436
        bitrate += codec_rate;
437 438

        if (stream->id==AUDIO_ID)
M
Michael Niedermayer 已提交
439
            audio_bitrate += codec_rate;
440
        else if (stream->id==VIDEO_ID)
M
Michael Niedermayer 已提交
441
            video_bitrate += codec_rate;
442
    }
443

444 445 446 447 448 449 450 451 452
    if(ctx->mux_rate){
        s->mux_rate= (ctx->mux_rate + (8 * 50) - 1) / (8 * 50);
    } else {
        /* we increase slightly the bitrate to take into account the
           headers. XXX: compute it exactly */
        bitrate += bitrate*5/100;
        bitrate += 10000;
        s->mux_rate = (bitrate + (8 * 50) - 1) / (8 * 50);
    }
453 454 455 456 457 458 459 460 461 462 463

    if (s->is_vcd) {
        double overhead_rate;

        /* The VCD standard mandates that the mux_rate field is 3528
           (see standard p. IV-6).
           The value is actually "wrong", i.e. if you calculate
           it using the normal formula and the 75 sectors per second transfer
           rate you get a different value because the real pack size is 2324,
           not 2352. But the standard explicitly specifies that the mux_rate
           field in the header must have this value.*/
464
//        s->mux_rate=2352 * 75 / 50;    /* = 3528*/
465 466 467 468 469 470 471 472 473 474 475 476 477

        /* The VCD standard states that the muxed stream must be
           exactly 75 packs / second (the data rate of a single speed cdrom).
           Since the video bitrate (probably 1150000 bits/sec) will be below
           the theoretical maximum we have to add some padding packets
           to make up for the lower data rate.
           (cf. VCD standard p. IV-6 )*/

        /* Add the header overhead to the data rate.
           2279 data bytes per audio pack, 2294 data bytes per video pack*/
        overhead_rate = ((audio_bitrate / 8.0) / 2279) * (2324 - 2279);
        overhead_rate += ((video_bitrate / 8.0) / 2294) * (2324 - 2294);
        overhead_rate *= 8;
478

479 480
        /* Add padding so that the full bitrate is 2324*75 bytes/sec */
        s->vcd_padding_bitrate = 2324 * 75 * 8 - (bitrate + overhead_rate);
F
Fabrice Bellard 已提交
481
    }
482

483
    if (s->is_vcd || s->is_mpeg2)
484 485 486 487 488
        /* every packet */
        s->pack_header_freq = 1;
    else
        /* every 2 seconds */
        s->pack_header_freq = 2 * bitrate / s->packet_size / 8;
489 490 491 492

    /* the above seems to make pack_header_freq zero sometimes */
    if (s->pack_header_freq == 0)
       s->pack_header_freq = 1;
493

494 495 496 497
    if (s->is_mpeg2)
        /* every 200 packets. Need to look at the spec.  */
        s->system_header_freq = s->pack_header_freq * 40;
    else if (s->is_vcd)
498 499 500 501
        /* the standard mandates that there are only two system headers
           in the whole file: one in the first packet of each stream.
           (see standard p. IV-7 and IV-8) */
        s->system_header_freq = 0x7fffffff;
502 503
    else
        s->system_header_freq = s->pack_header_freq * 5;
504

F
Fabrice Bellard 已提交
505 506 507 508
    for(i=0;i<ctx->nb_streams;i++) {
        stream = ctx->streams[i]->priv_data;
        stream->packet_number = 0;
    }
509
    s->system_header_size = get_system_header_size(ctx);
510
    s->last_scr = 0;
F
Fabrice Bellard 已提交
511 512 513
    return 0;
 fail:
    for(i=0;i<ctx->nb_streams;i++) {
514
        av_free(ctx->streams[i]->priv_data);
F
Fabrice Bellard 已提交
515
    }
516
    return AVERROR(ENOMEM);
F
Fabrice Bellard 已提交
517 518
}

519 520
static inline void put_timestamp(ByteIOContext *pb, int id, int64_t timestamp)
{
521 522 523
    put_byte(pb,
             (id << 4) |
             (((timestamp >> 30) & 0x07) << 1) |
524 525 526 527 528
             1);
    put_be16(pb, (uint16_t)((((timestamp >> 15) & 0x7fff) << 1) | 1));
    put_be16(pb, (uint16_t)((((timestamp) & 0x7fff) << 1) | 1));
}

529

530 531 532 533 534 535 536 537 538 539
/* return the number of padding bytes that should be inserted into
   the multiplexed stream.*/
static int get_vcd_padding_size(AVFormatContext *ctx, int64_t pts)
{
    MpegMuxContext *s = ctx->priv_data;
    int pad_bytes = 0;

    if (s->vcd_padding_bitrate > 0 && pts!=AV_NOPTS_VALUE)
    {
        int64_t full_pad_bytes;
540

M
Michael Niedermayer 已提交
541
        full_pad_bytes = (int64_t)((s->vcd_padding_bitrate * (pts / 90000.0)) / 8.0); //FIXME this is wrong
542 543 544 545 546 547 548 549 550 551 552 553
        pad_bytes = (int) (full_pad_bytes - s->vcd_padding_bytes_written);

        if (pad_bytes<0)
            /* might happen if we have already padded to a later timestamp. This
               can occur if another stream has already advanced further.*/
            pad_bytes=0;
    }

    return pad_bytes;
}


554
#if 0 /* unused, remove? */
555 556 557 558 559 560 561 562 563 564
/* return the exact available payload size for the next packet for
   stream 'stream_index'. 'pts' and 'dts' are only used to know if
   timestamps are needed in the packet header. */
static int get_packet_payload_size(AVFormatContext *ctx, int stream_index,
                                   int64_t pts, int64_t dts)
{
    MpegMuxContext *s = ctx->priv_data;
    int buf_index;
    StreamInfo *stream;

565 566
    stream = ctx->streams[stream_index]->priv_data;

567 568 569
    buf_index = 0;
    if (((s->packet_number % s->pack_header_freq) == 0)) {
        /* pack header size */
570
        if (s->is_mpeg2)
571 572 573
            buf_index += 14;
        else
            buf_index += 12;
574

575 576 577 578
        if (s->is_vcd) {
            /* there is exactly one system header for each stream in a VCD MPEG,
               One in the very first video packet and one in the very first
               audio packet (see VCD standard p. IV-7 and IV-8).*/
579

580 581 582 583 584
            if (stream->packet_number==0)
                /* The system headers refer only to the stream they occur in,
                   so they have a constant size.*/
                buf_index += 15;

585
        } else {
586 587 588
            if ((s->packet_number % s->system_header_freq) == 0)
                buf_index += s->system_header_size;
        }
589 590
    }

591 592
    if ((s->is_vcd && stream->packet_number==0)
        || (s->is_svcd && s->packet_number==0))
593
        /* the first pack of each stream contains only the pack header,
594
           the system header and some padding (see VCD standard p. IV-6)
595 596 597 598 599
           Add the padding size, so that the actual payload becomes 0.*/
        buf_index += s->packet_size - buf_index;
    else {
        /* packet header size */
        buf_index += 6;
600
        if (s->is_mpeg2) {
F
Fabrice Bellard 已提交
601
            buf_index += 3;
602 603 604 605
            if (stream->packet_number==0)
                buf_index += 3; /* PES extension */
            buf_index += 1;    /* obligatory stuffing byte */
        }
606 607 608 609 610 611 612 613 614 615
        if (pts != AV_NOPTS_VALUE) {
            if (dts != pts)
                buf_index += 5 + 5;
            else
                buf_index += 5;

        } else {
            if (!s->is_mpeg2)
                buf_index++;
        }
616

617 618 619 620 621 622 623 624 625 626 627 628
        if (stream->id < 0xc0) {
            /* AC3/LPCM private data header */
            buf_index += 4;
            if (stream->id >= 0xa0) {
                int n;
                buf_index += 3;
                /* NOTE: we round the payload size to an integer number of
                   LPCM samples */
                n = (s->packet_size - buf_index) % stream->lpcm_align;
                if (n)
                    buf_index += (stream->lpcm_align - n);
            }
F
Fabrice Bellard 已提交
629
        }
630 631 632 633 634

        if (s->is_vcd && stream->id == AUDIO_ID)
            /* The VCD standard demands that 20 zero bytes follow
               each audio packet (see standard p. IV-8).*/
            buf_index+=20;
635
    }
636
    return s->packet_size - buf_index;
637
}
638
#endif
639

640
/* Write an MPEG padding packet header. */
641
static void put_padding_packet(AVFormatContext *ctx, ByteIOContext *pb,int packet_bytes)
642 643
{
    MpegMuxContext *s = ctx->priv_data;
644
    int i;
645

646 647
    put_be32(pb, PADDING_STREAM);
    put_be16(pb, packet_bytes - 6);
648
    if (!s->is_mpeg2) {
649 650
        put_byte(pb, 0x0f);
        packet_bytes -= 7;
651
    } else
652
        packet_bytes -= 6;
653 654 655 656 657

    for(i=0;i<packet_bytes;i++)
        put_byte(pb, 0xff);
}

M
Michael Niedermayer 已提交
658 659 660 661
static int get_nb_frames(AVFormatContext *ctx, StreamInfo *stream, int len){
    int nb_frames=0;
    PacketDesc *pkt_desc= stream->premux_packet;

662
    while(len>0){
M
Michael Niedermayer 已提交
663 664 665 666 667 668 669 670
        if(pkt_desc->size == pkt_desc->unwritten_size)
            nb_frames++;
        len -= pkt_desc->unwritten_size;
        pkt_desc= pkt_desc->next;
    }

    return nb_frames;
}
671

F
Fabrice Bellard 已提交
672
/* flush the packet on stream stream_index */
673
static int flush_packet(AVFormatContext *ctx, int stream_index,
M
Michael Niedermayer 已提交
674
                         int64_t pts, int64_t dts, int64_t scr, int trailer_size)
F
Fabrice Bellard 已提交
675 676 677
{
    MpegMuxContext *s = ctx->priv_data;
    StreamInfo *stream = ctx->streams[stream_index]->priv_data;
678
    uint8_t *buf_ptr;
679 680
    int size, payload_size, startcode, id, stuffing_size, i, header_len;
    int packet_size;
681
    uint8_t buffer[128];
682 683
    int zero_trail_bytes = 0;
    int pad_packet_bytes = 0;
684 685
    int pes_flags;
    int general_pack = 0;  /*"general" pack without data specific to one stream?*/
M
Michael Niedermayer 已提交
686
    int nb_frames;
687

F
Fabrice Bellard 已提交
688
    id = stream->id;
689

F
Fabrice Bellard 已提交
690
#if 0
691
    printf("packet ID=%2x PTS=%0.3f\n",
692
           id, pts / 90000.0);
F
Fabrice Bellard 已提交
693 694 695
#endif

    buf_ptr = buffer;
696

M
Michael Niedermayer 已提交
697
    if ((s->packet_number % s->pack_header_freq) == 0 || s->last_scr != scr) {
F
Fabrice Bellard 已提交
698
        /* output pack and systems header if needed */
699
        size = put_pack_header(ctx, buf_ptr, scr);
F
Fabrice Bellard 已提交
700
        buf_ptr += size;
M
Michael Niedermayer 已提交
701
        s->last_scr= scr;
702 703 704 705 706

        if (s->is_vcd) {
            /* there is exactly one system header for each stream in a VCD MPEG,
               One in the very first video packet and one in the very first
               audio packet (see VCD standard p. IV-7 and IV-8).*/
707

708 709 710 711
            if (stream->packet_number==0) {
                size = put_system_header(ctx, buf_ptr, id);
                buf_ptr += size;
            }
712 713
        } else if (s->is_dvd) {
            if (stream->align_iframe || s->packet_number == 0){
714
                int PES_bytes_to_fill = s->packet_size - size - 10;
715 716 717 718 719 720 721 722

                if (pts != AV_NOPTS_VALUE) {
                    if (dts != pts)
                        PES_bytes_to_fill -= 5 + 5;
                    else
                        PES_bytes_to_fill -= 5;
                }

723
                if (stream->bytes_to_iframe == 0 || s->packet_number == 0) {
724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749
                    size = put_system_header(ctx, buf_ptr, 0);
                    buf_ptr += size;
                    size = buf_ptr - buffer;
                    put_buffer(&ctx->pb, buffer, size);

                    put_be32(&ctx->pb, PRIVATE_STREAM_2);
                    put_be16(&ctx->pb, 0x03d4);         // length
                    put_byte(&ctx->pb, 0x00);           // substream ID, 00=PCI
                    for (i = 0; i < 979; i++)
                        put_byte(&ctx->pb, 0x00);

                    put_be32(&ctx->pb, PRIVATE_STREAM_2);
                    put_be16(&ctx->pb, 0x03fa);         // length
                    put_byte(&ctx->pb, 0x01);           // substream ID, 01=DSI
                    for (i = 0; i < 1017; i++)
                        put_byte(&ctx->pb, 0x00);

                    memset(buffer, 0, 128);
                    buf_ptr = buffer;
                    s->packet_number++;
                    stream->align_iframe = 0;
                    scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
                    size = put_pack_header(ctx, buf_ptr, scr);
                    s->last_scr= scr;
                    buf_ptr += size;
                    /* GOP Start */
750 751
                } else if (stream->bytes_to_iframe < PES_bytes_to_fill) {
                    pad_packet_bytes = PES_bytes_to_fill - stream->bytes_to_iframe;
752 753
                }
            }
754 755 756 757 758
        } else {
            if ((s->packet_number % s->system_header_freq) == 0) {
                size = put_system_header(ctx, buf_ptr, 0);
                buf_ptr += size;
            }
F
Fabrice Bellard 已提交
759 760 761 762 763
        }
    }
    size = buf_ptr - buffer;
    put_buffer(&ctx->pb, buffer, size);

764 765 766 767 768 769
    packet_size = s->packet_size - size;

    if (s->is_vcd && id == AUDIO_ID)
        /* The VCD standard demands that 20 zero bytes follow
           each audio pack (see standard p. IV-8).*/
        zero_trail_bytes += 20;
770

771 772 773
    if ((s->is_vcd && stream->packet_number==0)
        || (s->is_svcd && s->packet_number==0)) {
        /* for VCD the first pack of each stream contains only the pack header,
774 775 776
           the system header and lots of padding (see VCD standard p. IV-6).
           In the case of an audio pack, 20 zero bytes are also added at
           the end.*/
777 778 779 780
        /* For SVCD we fill the very first pack to increase compatibility with
           some DVD players. Not mandated by the standard.*/
        if (s->is_svcd)
            general_pack = 1;    /* the system header refers to both streams and no stream data*/
781
        pad_packet_bytes = packet_size - zero_trail_bytes;
782 783
    }

784
    packet_size -= pad_packet_bytes + zero_trail_bytes;
785

786
    if (packet_size > 0) {
F
Fabrice Bellard 已提交
787

788 789
        /* packet header size */
        packet_size -= 6;
790

791 792 793
        /* packet header */
        if (s->is_mpeg2) {
            header_len = 3;
794 795 796
            if (stream->packet_number==0)
                header_len += 3; /* PES extension */
            header_len += 1; /* obligatory stuffing byte */
797 798 799 800 801 802 803 804 805 806 807 808
        } else {
            header_len = 0;
        }
        if (pts != AV_NOPTS_VALUE) {
            if (dts != pts)
                header_len += 5 + 5;
            else
                header_len += 5;
        } else {
            if (!s->is_mpeg2)
                header_len++;
        }
809

810 811 812
        payload_size = packet_size - header_len;
        if (id < 0xc0) {
            startcode = PRIVATE_STREAM_1;
813 814
            payload_size -= 1;
            if (id >= 0x40) {
815
                payload_size -= 3;
816 817 818
                if (id >= 0xa0)
                    payload_size -= 3;
            }
819 820 821
        } else {
            startcode = 0x100 + id;
        }
822

823
        stuffing_size = payload_size - av_fifo_size(&stream->fifo);
M
Michael Niedermayer 已提交
824 825 826 827

        // first byte doesnt fit -> reset pts/dts + stuffing
        if(payload_size <= trailer_size && pts != AV_NOPTS_VALUE){
            int timestamp_len=0;
828
            if(dts != pts)
M
Michael Niedermayer 已提交
829 830 831 832 833
                timestamp_len += 5;
            if(pts != AV_NOPTS_VALUE)
                timestamp_len += s->is_mpeg2 ? 5 : 4;
            pts=dts= AV_NOPTS_VALUE;
            header_len -= timestamp_len;
834 835 836 837 838 839
            if (s->is_dvd && stream->align_iframe) {
                pad_packet_bytes += timestamp_len;
                packet_size -= timestamp_len;
            } else {
                payload_size += timestamp_len;
            }
M
Michael Niedermayer 已提交
840 841 842 843 844
            stuffing_size += timestamp_len;
            if(payload_size > trailer_size)
                stuffing_size += payload_size - trailer_size;
        }

845 846 847 848 849 850 851 852 853 854 855
        if (pad_packet_bytes > 0 && pad_packet_bytes <= 7) { // can't use padding, so use stuffing
            packet_size += pad_packet_bytes;
            payload_size += pad_packet_bytes; // undo the previous adjustment
            if (stuffing_size < 0) {
                stuffing_size = pad_packet_bytes;
            } else {
                stuffing_size += pad_packet_bytes;
            }
            pad_packet_bytes = 0;
        }

856 857
        if (stuffing_size < 0)
            stuffing_size = 0;
858 859 860 861 862 863
        if (stuffing_size > 16) {    /*<=16 for MPEG-1, <=32 for MPEG-2*/
            pad_packet_bytes += stuffing_size;
            packet_size -= stuffing_size;
            payload_size -= stuffing_size;
            stuffing_size = 0;
        }
864

M
Michael Niedermayer 已提交
865
        nb_frames= get_nb_frames(ctx, stream, payload_size - stuffing_size);
866

867
        put_be32(&ctx->pb, startcode);
868

869
        put_be16(&ctx->pb, packet_size);
870

871 872 873 874 875 876 877
        if (!s->is_mpeg2)
            for(i=0;i<stuffing_size;i++)
                put_byte(&ctx->pb, 0xff);

        if (s->is_mpeg2) {
            put_byte(&ctx->pb, 0x80); /* mpeg2 id */

878 879
            pes_flags=0;

880
            if (pts != AV_NOPTS_VALUE) {
881 882 883
                pes_flags |= 0x80;
                if (dts != pts)
                    pes_flags |= 0x40;
884
            }
885 886 887 888 889 890 891 892 893 894 895 896 897 898 899

            /* Both the MPEG-2 and the SVCD standards demand that the
               P-STD_buffer_size field be included in the first packet of
               every stream. (see SVCD standard p. 26 V.2.3.1 and V.2.3.2
               and MPEG-2 standard 2.7.7) */
            if (stream->packet_number == 0)
                pes_flags |= 0x01;

            put_byte(&ctx->pb, pes_flags); /* flags */
            put_byte(&ctx->pb, header_len - 3 + stuffing_size);

            if (pes_flags & 0x80)  /*write pts*/
                put_timestamp(&ctx->pb, (pes_flags & 0x40) ? 0x03 : 0x02, pts);
            if (pes_flags & 0x40)  /*write dts*/
                put_timestamp(&ctx->pb, 0x01, dts);
900

901 902 903
            if (pes_flags & 0x01) {  /*write pes extension*/
                put_byte(&ctx->pb, 0x10); /* flags */

904
                /* P-STD buffer info */
905 906 907 908 909 910
                if (id == AUDIO_ID)
                    put_be16(&ctx->pb, 0x4000 | stream->max_buffer_size/128);
                else
                    put_be16(&ctx->pb, 0x6000 | stream->max_buffer_size/1024);
            }

911
        } else {
912 913 914 915 916 917 918
            if (pts != AV_NOPTS_VALUE) {
                if (dts != pts) {
                    put_timestamp(&ctx->pb, 0x03, pts);
                    put_timestamp(&ctx->pb, 0x01, dts);
                } else {
                    put_timestamp(&ctx->pb, 0x02, pts);
                }
919
            } else {
920
                put_byte(&ctx->pb, 0x0f);
921 922
            }
        }
F
Fabrice Bellard 已提交
923

924 925 926 927 928 929 930 931 932
        if (s->is_mpeg2) {
            /* special stuffing byte that is always written
               to prevent accidental generation of start codes. */
            put_byte(&ctx->pb, 0xff);

            for(i=0;i<stuffing_size;i++)
                put_byte(&ctx->pb, 0xff);
        }

933 934 935 936 937 938 939 940 941
        if (startcode == PRIVATE_STREAM_1) {
            put_byte(&ctx->pb, id);
            if (id >= 0xa0) {
                /* LPCM (XXX: check nb_frames) */
                put_byte(&ctx->pb, 7);
                put_be16(&ctx->pb, 4); /* skip 3 header bytes */
                put_byte(&ctx->pb, stream->lpcm_header[0]);
                put_byte(&ctx->pb, stream->lpcm_header[1]);
                put_byte(&ctx->pb, stream->lpcm_header[2]);
942
            } else if (id >= 0x40) {
943
                /* AC3 */
M
Michael Niedermayer 已提交
944 945
                put_byte(&ctx->pb, nb_frames);
                put_be16(&ctx->pb, trailer_size+1);
946
            }
F
Fabrice Bellard 已提交
947
        }
948 949

        /* output data */
950
        if(av_fifo_generic_read(&stream->fifo, payload_size - stuffing_size, &put_buffer, &ctx->pb) < 0)
M
Michael Niedermayer 已提交
951
            return -1;
952
        stream->bytes_to_iframe -= payload_size - stuffing_size;
M
Michael Niedermayer 已提交
953 954 955
    }else{
        payload_size=
        stuffing_size= 0;
F
Fabrice Bellard 已提交
956 957
    }

958
    if (pad_packet_bytes > 0)
959
        put_padding_packet(ctx,&ctx->pb, pad_packet_bytes);
960

961 962
    for(i=0;i<zero_trail_bytes;i++)
        put_byte(&ctx->pb, 0x00);
963

F
Fabrice Bellard 已提交
964
    put_flush_packet(&ctx->pb);
965

F
Fabrice Bellard 已提交
966
    s->packet_number++;
967 968 969 970 971 972

    /* only increase the stream packet number if this pack actually contains
       something that is specific to this stream! I.e. a dedicated header
       or some data.*/
    if (!general_pack)
        stream->packet_number++;
973

M
Michael Niedermayer 已提交
974
    return payload_size - stuffing_size;
F
Fabrice Bellard 已提交
975 976
}

977 978 979 980 981 982 983 984 985 986 987 988 989 990 991
static void put_vcd_padding_sector(AVFormatContext *ctx)
{
    /* There are two ways to do this padding: writing a sector/pack
       of 0 values, or writing an MPEG padding pack. Both seem to
       work with most decoders, BUT the VCD standard only allows a 0-sector
       (see standard p. IV-4, IV-5).
       So a 0-sector it is...*/

    MpegMuxContext *s = ctx->priv_data;
    int i;

    for(i=0;i<s->packet_size;i++)
        put_byte(&ctx->pb, 0);

    s->vcd_padding_bytes_written += s->packet_size;
992

993
    put_flush_packet(&ctx->pb);
994

995 996 997 998 999 1000 1001
    /* increasing the packet number is correct. The SCR of the following packs
       is calculated from the packet_number and it has to include the padding
       sector (it represents the sector index, not the MPEG pack index)
       (see VCD standard p. IV-6)*/
    s->packet_number++;
}

1002
#if 0 /* unused, remove? */
M
cleanup  
Michael Niedermayer 已提交
1003
static int64_t get_vcd_scr(AVFormatContext *ctx,int stream_index,int64_t pts)
1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018
{
    MpegMuxContext *s = ctx->priv_data;
    int64_t scr;

        /* Since the data delivery rate is constant, SCR is computed
           using the formula C + i * 1200 where C is the start constant
           and i is the pack index.
           It is recommended that SCR 0 is at the beginning of the VCD front
           margin (a sequence of empty Form 2 sectors on the CD).
           It is recommended that the front margin is 30 sectors long, so
           we use C = 30*1200 = 36000
           (Note that even if the front margin is not 30 sectors the file
           will still be correct according to the standard. It just won't have
           the "recommended" value).*/
        scr = 36000 + s->packet_number * 1200;
1019

1020
    return scr;
1021
}
1022
#endif
1023

M
Michael Niedermayer 已提交
1024 1025 1026 1027 1028 1029 1030 1031
static int remove_decoded_packets(AVFormatContext *ctx, int64_t scr){
//    MpegMuxContext *s = ctx->priv_data;
    int i;

    for(i=0; i<ctx->nb_streams; i++){
        AVStream *st = ctx->streams[i];
        StreamInfo *stream = st->priv_data;
        PacketDesc *pkt_desc= stream->predecode_packet;
1032

M
Michael Niedermayer 已提交
1033
        while(pkt_desc && scr > pkt_desc->dts){ //FIXME > vs >=
1034
            if(stream->buffer_index < pkt_desc->size ||
M
Michael Niedermayer 已提交
1035 1036 1037 1038 1039 1040 1041 1042 1043 1044
               stream->predecode_packet == stream->premux_packet){
                av_log(ctx, AV_LOG_ERROR, "buffer underflow\n");
                break;
            }
            stream->buffer_index -= pkt_desc->size;

            stream->predecode_packet= pkt_desc->next;
            av_freep(&pkt_desc);
        }
    }
1045

M
Michael Niedermayer 已提交
1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057
    return 0;
}

static int output_packet(AVFormatContext *ctx, int flush){
    MpegMuxContext *s = ctx->priv_data;
    AVStream *st;
    StreamInfo *stream;
    int i, avail_space, es_size, trailer_size;
    int best_i= -1;
    int best_score= INT_MIN;
    int ignore_constraints=0;
    int64_t scr= s->last_scr;
M
Michael Niedermayer 已提交
1058
    PacketDesc *timestamp_packet;
1059
    const int64_t max_delay= av_rescale(ctx->max_delay, 90000, AV_TIME_BASE);
M
Michael Niedermayer 已提交
1060 1061 1062 1063 1064

retry:
    for(i=0; i<ctx->nb_streams; i++){
        AVStream *st = ctx->streams[i];
        StreamInfo *stream = st->priv_data;
1065
        const int avail_data=  av_fifo_size(&stream->fifo);
M
Michael Niedermayer 已提交
1066 1067
        const int space= stream->max_buffer_size - stream->buffer_index;
        int rel_space= 1024*space / stream->max_buffer_size;
1068
        PacketDesc *next_pkt= stream->premux_packet;
M
Michael Niedermayer 已提交
1069

1070 1071 1072
        /* for subtitle, a single PES packet must be generated,
           so we flush after every single subtitle packet */
        if(s->packet_size > avail_data && !flush
1073
           && st->codec->codec_type != CODEC_TYPE_SUBTITLE)
M
Michael Niedermayer 已提交
1074 1075 1076 1077 1078 1079 1080
            return 0;
        if(avail_data==0)
            continue;
        assert(avail_data>0);

        if(space < s->packet_size && !ignore_constraints)
            continue;
1081

1082 1083
        if(next_pkt && next_pkt->dts - scr > max_delay)
            continue;
1084

M
Michael Niedermayer 已提交
1085 1086 1087 1088 1089 1090
        if(rel_space > best_score){
            best_score= rel_space;
            best_i = i;
            avail_space= space;
        }
    }
1091

M
Michael Niedermayer 已提交
1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103
    if(best_i < 0){
        int64_t best_dts= INT64_MAX;

        for(i=0; i<ctx->nb_streams; i++){
            AVStream *st = ctx->streams[i];
            StreamInfo *stream = st->priv_data;
            PacketDesc *pkt_desc= stream->predecode_packet;
            if(pkt_desc && pkt_desc->dts < best_dts)
                best_dts= pkt_desc->dts;
        }

#if 0
1104
        av_log(ctx, AV_LOG_DEBUG, "bumping scr, scr:%f, dts:%f\n",
M
Michael Niedermayer 已提交
1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120
               scr/90000.0, best_dts/90000.0);
#endif
        if(best_dts == INT64_MAX)
            return 0;

        if(scr >= best_dts+1 && !ignore_constraints){
            av_log(ctx, AV_LOG_ERROR, "packet too large, ignoring buffer limits to mux it\n");
            ignore_constraints= 1;
        }
        scr= FFMAX(best_dts+1, scr);
        if(remove_decoded_packets(ctx, scr) < 0)
            return -1;
        goto retry;
    }

    assert(best_i >= 0);
1121

M
Michael Niedermayer 已提交
1122 1123
    st = ctx->streams[best_i];
    stream = st->priv_data;
1124

1125
    assert(av_fifo_size(&stream->fifo) > 0);
M
Michael Niedermayer 已提交
1126 1127

    assert(avail_space >= s->packet_size || ignore_constraints);
1128

M
Michael Niedermayer 已提交
1129 1130
    timestamp_packet= stream->premux_packet;
    if(timestamp_packet->unwritten_size == timestamp_packet->size){
M
Michael Niedermayer 已提交
1131
        trailer_size= 0;
M
Michael Niedermayer 已提交
1132 1133 1134 1135
    }else{
        trailer_size= timestamp_packet->unwritten_size;
        timestamp_packet= timestamp_packet->next;
    }
M
Michael Niedermayer 已提交
1136

M
Michael Niedermayer 已提交
1137
    if(timestamp_packet){
1138
//av_log(ctx, AV_LOG_DEBUG, "dts:%f pts:%f scr:%f stream:%d\n", timestamp_packet->dts/90000.0, timestamp_packet->pts/90000.0, scr/90000.0, best_i);
M
Michael Niedermayer 已提交
1139 1140
        es_size= flush_packet(ctx, best_i, timestamp_packet->pts, timestamp_packet->dts, scr, trailer_size);
    }else{
1141
        assert(av_fifo_size(&stream->fifo) == trailer_size);
M
Michael Niedermayer 已提交
1142 1143
        es_size= flush_packet(ctx, best_i, AV_NOPTS_VALUE, AV_NOPTS_VALUE, scr, trailer_size);
    }
M
Michael Niedermayer 已提交
1144 1145 1146 1147 1148 1149

    if (s->is_vcd) {
        /* Write one or more padding sectors, if necessary, to reach
           the constant overall bitrate.*/
        int vcd_pad_bytes;

M
cleanup  
Michael Niedermayer 已提交
1150
        while((vcd_pad_bytes = get_vcd_padding_size(ctx,stream->premux_packet->pts) ) >= s->packet_size){ //FIXME pts cannot be correct here
M
Michael Niedermayer 已提交
1151 1152 1153 1154
            put_vcd_padding_sector(ctx);
            s->last_scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
        }
    }
1155

M
Michael Niedermayer 已提交
1156 1157
    stream->buffer_index += es_size;
    s->last_scr += s->packet_size*90000LL / (s->mux_rate*50LL); //FIXME rounding and first few bytes of each packet
1158

M
Michael Niedermayer 已提交
1159 1160 1161 1162 1163 1164
    while(stream->premux_packet && stream->premux_packet->unwritten_size <= es_size){
        es_size -= stream->premux_packet->unwritten_size;
        stream->premux_packet= stream->premux_packet->next;
    }
    if(es_size)
        stream->premux_packet->unwritten_size -= es_size;
1165

M
Michael Niedermayer 已提交
1166 1167 1168 1169 1170
    if(remove_decoded_packets(ctx, s->last_scr) < 0)
        return -1;

    return 1;
}
1171

1172
static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt)
F
Fabrice Bellard 已提交
1173 1174
{
    MpegMuxContext *s = ctx->priv_data;
1175 1176 1177
    int stream_index= pkt->stream_index;
    int size= pkt->size;
    uint8_t *buf= pkt->data;
F
Fabrice Bellard 已提交
1178 1179
    AVStream *st = ctx->streams[stream_index];
    StreamInfo *stream = st->priv_data;
M
cleanup  
Michael Niedermayer 已提交
1180
    int64_t pts, dts;
M
Michael Niedermayer 已提交
1181
    PacketDesc *pkt_desc;
1182
    const int preload= av_rescale(ctx->preload, 90000, AV_TIME_BASE);
1183
    const int is_iframe = st->codec->codec_type == CODEC_TYPE_VIDEO && (pkt->flags & PKT_FLAG_KEY);
1184

1185 1186
    pts= pkt->pts;
    dts= pkt->dts;
1187

1188 1189 1190
    if(pts != AV_NOPTS_VALUE) pts += preload;
    if(dts != AV_NOPTS_VALUE) dts += preload;

1191
//av_log(ctx, AV_LOG_DEBUG, "dts:%f pts:%f flags:%d stream:%d nopts:%d\n", dts/90000.0, pts/90000.0, pkt->flags, pkt->stream_index, pts != AV_NOPTS_VALUE);
1192 1193
    if (!stream->premux_packet)
        stream->next_packet = &stream->premux_packet;
M
Michael Niedermayer 已提交
1194 1195 1196 1197 1198 1199 1200 1201 1202 1203
    *stream->next_packet=
    pkt_desc= av_mallocz(sizeof(PacketDesc));
    pkt_desc->pts= pts;
    pkt_desc->dts= dts;
    pkt_desc->unwritten_size=
    pkt_desc->size= size;
    if(!stream->predecode_packet)
        stream->predecode_packet= pkt_desc;
    stream->next_packet= &pkt_desc->next;

1204
    av_fifo_realloc(&stream->fifo, av_fifo_size(&stream->fifo) + size + 1);
1205

1206
    if (s->is_dvd){
1207
        if (is_iframe && (s->packet_number == 0 || (pts - stream->vobu_start_pts >= 36000))) { // min VOBU length 0.4 seconds (mpucoder)
1208
            stream->bytes_to_iframe = av_fifo_size(&stream->fifo);
1209
            stream->align_iframe = 1;
1210
            stream->vobu_start_pts = pts;
1211 1212 1213 1214 1215
        } else {
            stream->align_iframe = 0;
        }
    }

1216
    av_fifo_write(&stream->fifo, buf, size);
1217

M
Michael Niedermayer 已提交
1218 1219
    for(;;){
        int ret= output_packet(ctx, 0);
1220
        if(ret<=0)
M
Michael Niedermayer 已提交
1221
            return ret;
1222
    }
F
Fabrice Bellard 已提交
1223 1224 1225 1226
}

static int mpeg_mux_end(AVFormatContext *ctx)
{
M
Michael Niedermayer 已提交
1227
//    MpegMuxContext *s = ctx->priv_data;
F
Fabrice Bellard 已提交
1228 1229
    StreamInfo *stream;
    int i;
1230

M
Michael Niedermayer 已提交
1231 1232
    for(;;){
        int ret= output_packet(ctx, 1);
1233
        if(ret<0)
M
Michael Niedermayer 已提交
1234 1235 1236
            return ret;
        else if(ret==0)
            break;
F
Fabrice Bellard 已提交
1237 1238
    }

1239 1240 1241
    /* End header according to MPEG1 systems standard. We do not write
       it as it is usually not needed by decoders and because it
       complicates MPEG stream concatenation. */
1242 1243
    //put_be32(&ctx->pb, ISO_11172_END_CODE);
    //put_flush_packet(&ctx->pb);
1244

M
Michael Niedermayer 已提交
1245 1246 1247
    for(i=0;i<ctx->nb_streams;i++) {
        stream = ctx->streams[i]->priv_data;

1248 1249
        assert(av_fifo_size(&stream->fifo) == 0);
        av_fifo_free(&stream->fifo);
M
Michael Niedermayer 已提交
1250
    }
F
Fabrice Bellard 已提交
1251 1252
    return 0;
}
1253
#endif //CONFIG_MUXERS
F
Fabrice Bellard 已提交
1254 1255 1256 1257 1258 1259

/*********************************************/
/* demux code */

#define MAX_SYNC_SIZE 100000

1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271
static int cdxa_probe(AVProbeData *p)
{
    /* check file header */
    if (p->buf[0] == 'R' && p->buf[1] == 'I' &&
        p->buf[2] == 'F' && p->buf[3] == 'F' &&
        p->buf[8] == 'C' && p->buf[9] == 'D' &&
        p->buf[10] == 'X' && p->buf[11] == 'A')
        return AVPROBE_SCORE_MAX;
    else
        return 0;
}

1272 1273
static int mpegps_probe(AVProbeData *p)
{
1274
    uint32_t code= -1;
1275
    int sys=0, pspack=0, priv1=0, vid=0, audio=0;
1276
    int i;
1277
    int score=0;
1278

1279 1280 1281 1282
    score = cdxa_probe(p);
    if (score > 0) return score;

    /* Search for MPEG stream */
1283 1284
    for(i=0; i<p->buf_size; i++){
        code = (code<<8) + p->buf[i];
1285
        if ((code & 0xffffff00) == 0x100) {
1286 1287 1288 1289 1290
            if(code == SYSTEM_HEADER_START_CODE) sys++;
            else if(code == PRIVATE_STREAM_1)    priv1++;
            else if(code == PACK_START_CODE)     pspack++;
            else if((code & 0xf0) == VIDEO_ID)   vid++;
            else if((code & 0xe0) == AUDIO_ID)   audio++;
1291
        }
1292
    }
1293 1294 1295 1296 1297

    if(vid || audio)            /* invalid VDR files nd short PES streams */
        score= AVPROBE_SCORE_MAX/4;

//av_log(NULL, AV_LOG_ERROR, "%d %d %d %d %d\n", sys, priv1, pspack,vid, audio);
1298 1299
    if(sys && sys*9 <= pspack*10)
        return AVPROBE_SCORE_MAX/2+2; // +1 for .mpg
1300
    if((priv1 || vid || audio) && (priv1+vid+audio)*9 <= pspack*10)
M
Michael Niedermayer 已提交
1301
        return AVPROBE_SCORE_MAX/2+2; // +1 for .mpg
1302
    if((!!vid ^ !!audio) && (audio+vid > 1) && !sys && !pspack) /* PES stream */
1303
        return AVPROBE_SCORE_MAX/2+2;
1304 1305 1306

    //02-Penguin.flac has sys:0 priv1:0 pspack:0 vid:0 audio:1
    return score;
1307 1308 1309
}


F
Fabrice Bellard 已提交
1310
typedef struct MpegDemuxContext {
M
Måns Rullgård 已提交
1311
    int32_t header_state;
1312
    unsigned char psm_es_type[256];
F
Fabrice Bellard 已提交
1313 1314
} MpegDemuxContext;

F
Fabrice Bellard 已提交
1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340
static int mpegps_read_header(AVFormatContext *s,
                              AVFormatParameters *ap)
{
    MpegDemuxContext *m = s->priv_data;
    m->header_state = 0xff;
    s->ctx_flags |= AVFMTCTX_NOHEADER;

    /* no need to do more */
    return 0;
}

static int64_t get_pts(ByteIOContext *pb, int c)
{
    int64_t pts;
    int val;

    if (c < 0)
        c = get_byte(pb);
    pts = (int64_t)((c >> 1) & 0x07) << 30;
    val = get_be16(pb);
    pts |= (int64_t)(val >> 1) << 15;
    val = get_be16(pb);
    pts |= (int64_t)(val >> 1);
    return pts;
}

1341
static int find_next_start_code(ByteIOContext *pb, int *size_ptr,
M
Måns Rullgård 已提交
1342
                                int32_t *header_state)
F
Fabrice Bellard 已提交
1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367
{
    unsigned int state, v;
    int val, n;

    state = *header_state;
    n = *size_ptr;
    while (n > 0) {
        if (url_feof(pb))
            break;
        v = get_byte(pb);
        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;
}

1368
#if 0 /* unused, remove? */
F
Fabrice Bellard 已提交
1369 1370
/* XXX: optimize */
static int find_prev_start_code(ByteIOContext *pb, int *size_ptr)
F
Fabrice Bellard 已提交
1371
{
F
Fabrice Bellard 已提交
1372 1373
    int64_t pos, pos_start;
    int max_size, start_code;
1374

F
Fabrice Bellard 已提交
1375 1376
    max_size = *size_ptr;
    pos_start = url_ftell(pb);
F
Fabrice Bellard 已提交
1377

F
Fabrice Bellard 已提交
1378 1379 1380 1381 1382 1383
    /* in order to go faster, we fill the buffer */
    pos = pos_start - 16386;
    if (pos < 0)
        pos = 0;
    url_fseek(pb, pos, SEEK_SET);
    get_byte(pb);
F
Fabrice Bellard 已提交
1384

F
Fabrice Bellard 已提交
1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399
    pos = pos_start;
    for(;;) {
        pos--;
        if (pos < 0 || (pos_start - pos) >= max_size) {
            start_code = -1;
            goto the_end;
        }
        url_fseek(pb, pos, SEEK_SET);
        start_code = get_be32(pb);
        if ((start_code & 0xffffff00) == 0x100)
            break;
    }
 the_end:
    *size_ptr = pos_start - pos;
    return start_code;
F
Fabrice Bellard 已提交
1400
}
1401
#endif
F
Fabrice Bellard 已提交
1402

1403 1404 1405
/**
 * Extracts stream types from a program stream map
 * According to ISO/IEC 13818-1 ('MPEG-2 Systems') table 2-35
1406
 *
1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436
 * @return number of bytes occupied by PSM in the bitstream
 */
static long mpegps_psm_parse(MpegDemuxContext *m, ByteIOContext *pb)
{
    int psm_length, ps_info_length, es_map_length;

    psm_length = get_be16(pb);
    get_byte(pb);
    get_byte(pb);
    ps_info_length = get_be16(pb);

    /* skip program_stream_info */
    url_fskip(pb, ps_info_length);
    es_map_length = get_be16(pb);

    /* at least one es available? */
    while (es_map_length >= 4){
        unsigned char type = get_byte(pb);
        unsigned char es_id = get_byte(pb);
        uint16_t es_info_length = get_be16(pb);
        /* remember mapping from stream id to stream type */
        m->psm_es_type[es_id] = type;
        /* skip program_stream_info */
        url_fskip(pb, es_info_length);
        es_map_length -= 4 + es_info_length;
    }
    get_be32(pb); /* crc32 */
    return 2 + psm_length;
}

1437
/* read the next PES header. Return its position in ppos
F
Fabrice Bellard 已提交
1438 1439 1440
   (if not NULL), and its start code, pts and dts.
 */
static int mpegps_read_pes_header(AVFormatContext *s,
1441
                                  int64_t *ppos, int *pstart_code,
1442
                                  int64_t *ppts, int64_t *pdts)
F
Fabrice Bellard 已提交
1443 1444
{
    MpegDemuxContext *m = s->priv_data;
F
Fabrice Bellard 已提交
1445
    int len, size, startcode, c, flags, header_len;
1446
    int pes_ext, ext2_len, id_ext, skip;
1447 1448
    int64_t pts, dts;
    int64_t last_sync= url_ftell(&s->pb);
F
Fabrice Bellard 已提交
1449

1450 1451
 error_redo:
        url_fseek(&s->pb, last_sync, SEEK_SET);
F
Fabrice Bellard 已提交
1452
 redo:
F
Fabrice Bellard 已提交
1453 1454 1455 1456
        /* next start code (should be immediately after) */
        m->header_state = 0xff;
        size = MAX_SYNC_SIZE;
        startcode = find_next_start_code(&s->pb, &size, &m->header_state);
1457
        last_sync = url_ftell(&s->pb);
1458
    //printf("startcode=%x pos=0x%"PRIx64"\n", startcode, url_ftell(&s->pb));
F
Fabrice Bellard 已提交
1459
    if (startcode < 0)
1460
        return AVERROR_IO;
F
Fabrice Bellard 已提交
1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471
    if (startcode == PACK_START_CODE)
        goto redo;
    if (startcode == SYSTEM_HEADER_START_CODE)
        goto redo;
    if (startcode == PADDING_STREAM ||
        startcode == PRIVATE_STREAM_2) {
        /* skip them */
        len = get_be16(&s->pb);
        url_fskip(&s->pb, len);
        goto redo;
    }
1472 1473 1474 1475
    if (startcode == PROGRAM_STREAM_MAP) {
        mpegps_psm_parse(m, &s->pb);
        goto redo;
    }
1476

F
Fabrice Bellard 已提交
1477 1478 1479
    /* find matching stream */
    if (!((startcode >= 0x1c0 && startcode <= 0x1df) ||
          (startcode >= 0x1e0 && startcode <= 0x1ef) ||
1480
          (startcode == 0x1bd) || (startcode == 0x1fd)))
F
Fabrice Bellard 已提交
1481
        goto redo;
F
Fabrice Bellard 已提交
1482 1483 1484
    if (ppos) {
        *ppos = url_ftell(&s->pb) - 4;
    }
F
Fabrice Bellard 已提交
1485
    len = get_be16(&s->pb);
M
Michael Niedermayer 已提交
1486
    pts =
1487
    dts = AV_NOPTS_VALUE;
F
Fabrice Bellard 已提交
1488 1489
    /* stuffing */
    for(;;) {
F
Fabrice Bellard 已提交
1490
        if (len < 1)
1491
            goto error_redo;
F
Fabrice Bellard 已提交
1492 1493 1494
        c = get_byte(&s->pb);
        len--;
        /* XXX: for mpeg1, should test only bit 7 */
1495
        if (c != 0xff)
F
Fabrice Bellard 已提交
1496 1497 1498 1499 1500 1501 1502 1503
            break;
    }
    if ((c & 0xc0) == 0x40) {
        /* buffer scale & size */
        get_byte(&s->pb);
        c = get_byte(&s->pb);
        len -= 2;
    }
M
Michael Niedermayer 已提交
1504
    if ((c & 0xe0) == 0x20) {
F
Fabrice Bellard 已提交
1505
        dts = pts = get_pts(&s->pb, c);
F
Fabrice Bellard 已提交
1506
        len -= 4;
M
Michael Niedermayer 已提交
1507 1508 1509 1510
        if (c & 0x10){
            dts = get_pts(&s->pb, -1);
            len -= 5;
        }
F
Fabrice Bellard 已提交
1511 1512
    } else if ((c & 0xc0) == 0x80) {
        /* mpeg 2 PES */
1513
#if 0 /* some streams have this field set for no apparent reason */
F
Fabrice Bellard 已提交
1514
        if ((c & 0x30) != 0) {
F
Fabrice Bellard 已提交
1515 1516
            /* Encrypted multiplex not handled */
            goto redo;
F
Fabrice Bellard 已提交
1517
        }
1518
#endif
F
Fabrice Bellard 已提交
1519 1520 1521 1522
        flags = get_byte(&s->pb);
        header_len = get_byte(&s->pb);
        len -= 2;
        if (header_len > len)
1523
            goto error_redo;
M
Michael Niedermayer 已提交
1524
        len -= header_len;
M
Michael Niedermayer 已提交
1525
        if (flags & 0x80) {
F
Fabrice Bellard 已提交
1526
            dts = pts = get_pts(&s->pb, -1);
F
Fabrice Bellard 已提交
1527
            header_len -= 5;
M
Michael Niedermayer 已提交
1528 1529 1530 1531
            if (flags & 0x40) {
                dts = get_pts(&s->pb, -1);
                header_len -= 5;
            }
F
Fabrice Bellard 已提交
1532
        }
1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555
        if (flags & 0x01) { /* PES extension */
            pes_ext = get_byte(&s->pb);
            header_len--;
            if (pes_ext & 0x40) { /* pack header - should be zero in PS */
                goto error_redo;
            }
            /* Skip PES private data, program packet sequence counter and P-STD buffer */
            skip = (pes_ext >> 4) & 0xb;
            skip += skip & 0x9;
            url_fskip(&s->pb, skip);
            header_len -= skip;

            if (pes_ext & 0x01) { /* PES extension 2 */
                ext2_len = get_byte(&s->pb);
                header_len--;
                if ((ext2_len & 0x7f) > 0) {
                    id_ext = get_byte(&s->pb);
                    if ((id_ext & 0x80) == 0)
                        startcode = ((startcode & 0xff) << 8) | id_ext;
                    header_len--;
                }
            }
        }
M
Michael Niedermayer 已提交
1556 1557 1558
        if(header_len < 0)
            goto error_redo;
        url_fskip(&s->pb, header_len);
F
Fabrice Bellard 已提交
1559
    }
1560 1561 1562
    else if( c!= 0xf )
        goto redo;

1563
    if (startcode == PRIVATE_STREAM_1 && !m->psm_es_type[startcode & 0xff]) {
F
Fabrice Bellard 已提交
1564 1565
        startcode = get_byte(&s->pb);
        len--;
1566
        if (startcode >= 0x80 && startcode <= 0xcf) {
F
Fabrice Bellard 已提交
1567 1568 1569 1570 1571
            /* audio: skip header */
            get_byte(&s->pb);
            get_byte(&s->pb);
            get_byte(&s->pb);
            len -= 3;
1572 1573 1574 1575 1576
            if (startcode >= 0xb0 && startcode <= 0xbf) {
                /* MLP/TrueHD audio has a 4-byte header */
                get_byte(&s->pb);
                len--;
            }
F
Fabrice Bellard 已提交
1577 1578
        }
    }
1579 1580
    if(len<0)
        goto error_redo;
1581 1582 1583 1584
    if(dts != AV_NOPTS_VALUE && ppos){
        int i;
        for(i=0; i<s->nb_streams; i++){
            if(startcode == s->streams[i]->id) {
M
Michael Niedermayer 已提交
1585
                av_add_index_entry(s->streams[i], *ppos, dts, 0, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */);
1586 1587 1588
            }
        }
    }
1589

F
Fabrice Bellard 已提交
1590 1591 1592 1593 1594 1595 1596 1597 1598
    *pstart_code = startcode;
    *ppts = pts;
    *pdts = dts;
    return len;
}

static int mpegps_read_packet(AVFormatContext *s,
                              AVPacket *pkt)
{
1599
    MpegDemuxContext *m = s->priv_data;
F
Fabrice Bellard 已提交
1600
    AVStream *st;
1601
    int len, startcode, i, type, codec_id = 0, es_type;
1602
    int64_t pts, dts, dummy_pos; //dummy_pos is needed for the index building to work
F
Fabrice Bellard 已提交
1603 1604

 redo:
1605
    len = mpegps_read_pes_header(s, &dummy_pos, &startcode, &pts, &dts);
F
Fabrice Bellard 已提交
1606 1607
    if (len < 0)
        return len;
1608

F
Fabrice Bellard 已提交
1609 1610 1611 1612 1613 1614
    /* now find stream */
    for(i=0;i<s->nb_streams;i++) {
        st = s->streams[i];
        if (st->id == startcode)
            goto found;
    }
1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643

    es_type = m->psm_es_type[startcode & 0xff];
    if(es_type > 0){
        if(es_type == STREAM_TYPE_VIDEO_MPEG1){
            codec_id = CODEC_ID_MPEG2VIDEO;
            type = CODEC_TYPE_VIDEO;
        } else if(es_type == STREAM_TYPE_VIDEO_MPEG2){
            codec_id = CODEC_ID_MPEG2VIDEO;
            type = CODEC_TYPE_VIDEO;
        } else if(es_type == STREAM_TYPE_AUDIO_MPEG1 ||
                  es_type == STREAM_TYPE_AUDIO_MPEG2){
            codec_id = CODEC_ID_MP3;
            type = CODEC_TYPE_AUDIO;
        } else if(es_type == STREAM_TYPE_AUDIO_AAC){
            codec_id = CODEC_ID_AAC;
            type = CODEC_TYPE_AUDIO;
        } else if(es_type == STREAM_TYPE_VIDEO_MPEG4){
            codec_id = CODEC_ID_MPEG4;
            type = CODEC_TYPE_VIDEO;
        } else if(es_type == STREAM_TYPE_VIDEO_H264){
            codec_id = CODEC_ID_H264;
            type = CODEC_TYPE_VIDEO;
        } else if(es_type == STREAM_TYPE_AUDIO_AC3){
            codec_id = CODEC_ID_AC3;
            type = CODEC_TYPE_AUDIO;
        } else {
            goto skip;
        }
    } else if (startcode >= 0x1e0 && startcode <= 0x1ef) {
1644 1645 1646 1647 1648 1649 1650 1651
        static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 };
        unsigned char buf[8];
        get_buffer(&s->pb, buf, 8);
        url_fseek(&s->pb, -8, SEEK_CUR);
        if(!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1))
            codec_id = CODEC_ID_CAVS;
        else
            codec_id = CODEC_ID_MPEG2VIDEO;
1652 1653 1654 1655
        type = CODEC_TYPE_VIDEO;
    } else if (startcode >= 0x1c0 && startcode <= 0x1df) {
        type = CODEC_TYPE_AUDIO;
        codec_id = CODEC_ID_MP2;
1656
    } else if (startcode >= 0x80 && startcode <= 0x87) {
1657 1658
        type = CODEC_TYPE_AUDIO;
        codec_id = CODEC_ID_AC3;
1659 1660 1661
    } else if ((startcode >= 0x88 && startcode <= 0x8f)
               ||( startcode >= 0x98 && startcode <= 0x9f)) {
        /* 0x90 - 0x97 is reserved for SDDS in DVD specs */
1662 1663
        type = CODEC_TYPE_AUDIO;
        codec_id = CODEC_ID_DTS;
1664
    } else if (startcode >= 0xa0 && startcode <= 0xaf) {
1665 1666
        type = CODEC_TYPE_AUDIO;
        codec_id = CODEC_ID_PCM_S16BE;
1667 1668 1669 1670 1671 1672 1673
    } else if (startcode >= 0xb0 && startcode <= 0xbf) {
        type = CODEC_TYPE_AUDIO;
        codec_id = CODEC_ID_MLP;
    } else if (startcode >= 0xc0 && startcode <= 0xcf) {
        /* Used for both AC-3 and E-AC-3 in EVOB files */
        type = CODEC_TYPE_AUDIO;
        codec_id = CODEC_ID_AC3;
1674 1675 1676
    } else if (startcode >= 0x20 && startcode <= 0x3f) {
        type = CODEC_TYPE_SUBTITLE;
        codec_id = CODEC_ID_DVD_SUBTITLE;
1677 1678 1679
    } else if (startcode >= 0xfd55 && startcode <= 0xfd5f) {
        type = CODEC_TYPE_VIDEO;
        codec_id = CODEC_ID_VC1;
1680 1681 1682 1683 1684 1685
    } else {
    skip:
        /* skip packet */
        url_fskip(&s->pb, len);
        goto redo;
    }
1686 1687
    /* no stream found: add a new stream */
    st = av_new_stream(s, startcode);
1688
    if (!st)
1689
        goto skip;
1690 1691
    st->codec->codec_type = type;
    st->codec->codec_id = codec_id;
F
Fabrice Bellard 已提交
1692 1693
    if (codec_id != CODEC_ID_PCM_S16BE)
        st->need_parsing = 1;
F
Fabrice Bellard 已提交
1694
 found:
1695
    if(st->discard >= AVDISCARD_ALL)
1696
        goto skip;
1697
    if (startcode >= 0xa0 && startcode <= 0xaf) {
1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708
        int b1, freq;

        /* for LPCM, we just skip the header and consider it is raw
           audio data */
        if (len <= 3)
            goto skip;
        get_byte(&s->pb); /* emphasis (1), muse(1), reserved(1), frame number(5) */
        b1 = get_byte(&s->pb); /* quant (2), freq(2), reserved(1), channels(3) */
        get_byte(&s->pb); /* dynamic range control (0x80 = off) */
        len -= 3;
        freq = (b1 >> 4) & 3;
1709 1710 1711
        st->codec->sample_rate = lpcm_freq_tab[freq];
        st->codec->channels = 1 + (b1 & 7);
        st->codec->bit_rate = st->codec->channels * st->codec->sample_rate * 2;
1712
    }
F
Fabrice Bellard 已提交
1713 1714 1715
    av_new_packet(pkt, len);
    get_buffer(&s->pb, pkt->data, pkt->size);
    pkt->pts = pts;
F
Fabrice Bellard 已提交
1716
    pkt->dts = dts;
1717
    pkt->stream_index = st->index;
1718
#if 0
1719 1720
    av_log(s, AV_LOG_DEBUG, "%d: pts=%0.3f dts=%0.3f size=%d\n",
           pkt->stream_index, pkt->pts / 90000.0, pkt->dts / 90000.0, pkt->size);
1721
#endif
1722

F
Fabrice Bellard 已提交
1723 1724 1725
    return 0;
}

1726
static int mpegps_read_close(AVFormatContext *s)
F
Fabrice Bellard 已提交
1727 1728 1729 1730
{
    return 0;
}

1731
static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index,
1732
                               int64_t *ppos, int64_t pos_limit)
F
Fabrice Bellard 已提交
1733 1734 1735 1736 1737 1738
{
    int len, startcode;
    int64_t pos, pts, dts;

    pos = *ppos;
#ifdef DEBUG_SEEK
1739
    printf("read_dts: pos=0x%"PRIx64" next=%d -> ", pos, find_next);
F
Fabrice Bellard 已提交
1740 1741 1742
#endif
    url_fseek(&s->pb, pos, SEEK_SET);
    for(;;) {
1743
        len = mpegps_read_pes_header(s, &pos, &startcode, &pts, &dts);
F
Fabrice Bellard 已提交
1744 1745 1746 1747 1748 1749
        if (len < 0) {
#ifdef DEBUG_SEEK
            printf("none (ret=%d)\n", len);
#endif
            return AV_NOPTS_VALUE;
        }
1750
        if (startcode == s->streams[stream_index]->id &&
F
Fabrice Bellard 已提交
1751 1752 1753
            dts != AV_NOPTS_VALUE) {
            break;
        }
1754
        url_fskip(&s->pb, len);
F
Fabrice Bellard 已提交
1755 1756
    }
#ifdef DEBUG_SEEK
1757
    printf("pos=0x%"PRIx64" dts=0x%"PRIx64" %0.3f\n", pos, dts, dts / 90000.0);
F
Fabrice Bellard 已提交
1758 1759
#endif
    *ppos = pos;
1760
    return dts;
F
Fabrice Bellard 已提交
1761 1762
}

1763 1764
#ifdef CONFIG_MPEG1SYSTEM_MUXER
AVOutputFormat mpeg1system_muxer = {
F
Fabrice Bellard 已提交
1765
    "mpeg",
1766
    "MPEG1 System format",
1767
    "video/mpeg",
1768 1769 1770 1771 1772 1773 1774 1775
    "mpg,mpeg",
    sizeof(MpegMuxContext),
    CODEC_ID_MP2,
    CODEC_ID_MPEG1VIDEO,
    mpeg_mux_init,
    mpeg_mux_write_packet,
    mpeg_mux_end,
};
1776 1777 1778
#endif
#ifdef CONFIG_MPEG1VCD_MUXER
AVOutputFormat mpeg1vcd_muxer = {
1779 1780
    "vcd",
    "MPEG1 System format (VCD)",
1781
    "video/mpeg",
1782 1783 1784 1785 1786 1787 1788 1789
    NULL,
    sizeof(MpegMuxContext),
    CODEC_ID_MP2,
    CODEC_ID_MPEG1VIDEO,
    mpeg_mux_init,
    mpeg_mux_write_packet,
    mpeg_mux_end,
};
1790 1791 1792
#endif
#ifdef CONFIG_MPEG2VOB_MUXER
AVOutputFormat mpeg2vob_muxer = {
1793 1794
    "vob",
    "MPEG2 PS format (VOB)",
1795
    "video/mpeg",
1796
    "vob",
1797
    sizeof(MpegMuxContext),
F
Fabrice Bellard 已提交
1798
    CODEC_ID_MP2,
1799
    CODEC_ID_MPEG2VIDEO,
F
Fabrice Bellard 已提交
1800 1801 1802
    mpeg_mux_init,
    mpeg_mux_write_packet,
    mpeg_mux_end,
1803
};
1804
#endif
1805

1806 1807 1808
/* Same as mpeg2vob_mux except that the pack size is 2324 */
#ifdef CONFIG_MPEG2SVCD_MUXER
AVOutputFormat mpeg2svcd_muxer = {
1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819
    "svcd",
    "MPEG2 PS format (VOB)",
    "video/mpeg",
    "vob",
    sizeof(MpegMuxContext),
    CODEC_ID_MP2,
    CODEC_ID_MPEG2VIDEO,
    mpeg_mux_init,
    mpeg_mux_write_packet,
    mpeg_mux_end,
};
1820
#endif
1821

1822 1823 1824
/*  Same as mpeg2vob_mux except the 'is_dvd' flag is set to produce NAV pkts */
#ifdef CONFIG_MPEG2DVD_MUXER
AVOutputFormat mpeg2dvd_muxer = {
1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835
    "dvd",
    "MPEG2 PS format (DVD VOB)",
    "video/mpeg",
    "dvd",
    sizeof(MpegMuxContext),
    CODEC_ID_MP2,
    CODEC_ID_MPEG2VIDEO,
    mpeg_mux_init,
    mpeg_mux_write_packet,
    mpeg_mux_end,
};
1836
#endif
1837

1838
#ifdef CONFIG_MPEGPS_DEMUXER
1839
AVInputFormat mpegps_demuxer = {
1840 1841 1842 1843 1844 1845 1846
    "mpeg",
    "MPEG PS format",
    sizeof(MpegDemuxContext),
    mpegps_probe,
    mpegps_read_header,
    mpegps_read_packet,
    mpegps_read_close,
1847 1848
    NULL, //mpegps_read_seek,
    mpegps_read_dts,
1849
    .flags = AVFMT_SHOW_IDS,
F
Fabrice Bellard 已提交
1850
};
1851
#endif