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

#include "libavutil/crc.h"
#include "libavcodec/ac3_parser.h"
#include "libavcodec/bitstream.h"
#include "libavcodec/bytestream.h"
F
Fabrice Bellard 已提交
27
#include "avformat.h"
28
#include "raw.h"
F
Fabrice Bellard 已提交
29

30
#ifdef CONFIG_MUXERS
F
Fabrice Bellard 已提交
31
/* simple formats */
32 33 34 35 36 37 38 39
static int flac_write_header(struct AVFormatContext *s)
{
    static const uint8_t header[8] = {
        0x66, 0x4C, 0x61, 0x43, 0x80, 0x00, 0x00, 0x22
    };
    uint8_t *streaminfo = s->streams[0]->codec->extradata;
    int len = s->streams[0]->codec->extradata_size;
    if(streaminfo != NULL && len > 0) {
40 41
        put_buffer(s->pb, header, 8);
        put_buffer(s->pb, streaminfo, len);
42 43 44 45
    }
    return 0;
}

46 47 48 49 50 51 52

static int roq_write_header(struct AVFormatContext *s)
{
    static const uint8_t header[] = {
        0x84, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x1E, 0x00
    };

53 54
    put_buffer(s->pb, header, 8);
    put_flush_packet(s->pb);
55 56 57 58

    return 0;
}

59 60 61 62 63
static int null_write_packet(struct AVFormatContext *s, AVPacket *pkt)
{
    return 0;
}

64
static int raw_write_packet(struct AVFormatContext *s, AVPacket *pkt)
F
Fabrice Bellard 已提交
65
{
66 67
    put_buffer(s->pb, pkt->data, pkt->size);
    put_flush_packet(s->pb);
F
Fabrice Bellard 已提交
68 69
    return 0;
}
70
#endif //CONFIG_MUXERS
F
Fabrice Bellard 已提交
71 72

/* raw input */
73
static int raw_read_header(AVFormatContext *s, AVFormatParameters *ap)
F
Fabrice Bellard 已提交
74 75
{
    AVStream *st;
F
Fabrice Bellard 已提交
76
    int id;
F
Fabrice Bellard 已提交
77

F
Fabrice Bellard 已提交
78
    st = av_new_stream(s, 0);
F
Fabrice Bellard 已提交
79
    if (!st)
80
        return AVERROR(ENOMEM);
81

F
Fabrice Bellard 已提交
82 83
        id = s->iformat->value;
        if (id == CODEC_ID_RAWVIDEO) {
84
            st->codec->codec_type = CODEC_TYPE_VIDEO;
F
Fabrice Bellard 已提交
85
        } else {
86
            st->codec->codec_type = CODEC_TYPE_AUDIO;
F
Fabrice Bellard 已提交
87
        }
88
        st->codec->codec_id = id;
F
Fabrice Bellard 已提交
89

90
        switch(st->codec->codec_type) {
F
Fabrice Bellard 已提交
91
        case CODEC_TYPE_AUDIO:
92 93 94
            st->codec->sample_rate = ap->sample_rate;
            st->codec->channels = ap->channels;
            av_set_pts_info(st, 64, 1, st->codec->sample_rate);
F
Fabrice Bellard 已提交
95 96
            break;
        case CODEC_TYPE_VIDEO:
97 98 99 100
            if(ap->time_base.num)
                av_set_pts_info(st, 64, ap->time_base.num, ap->time_base.den);
            else
                av_set_pts_info(st, 64, 1, 25);
101 102 103 104 105
            st->codec->width = ap->width;
            st->codec->height = ap->height;
            st->codec->pix_fmt = ap->pix_fmt;
            if(st->codec->pix_fmt == PIX_FMT_NONE)
                st->codec->pix_fmt= PIX_FMT_YUV420P;
F
Fabrice Bellard 已提交
106 107
            break;
        default:
F
Fabrice Bellard 已提交
108
            return -1;
F
Fabrice Bellard 已提交
109 110 111 112
        }
    return 0;
}

F
Fabrice Bellard 已提交
113
#define RAW_PACKET_SIZE 1024
F
Fabrice Bellard 已提交
114

115
static int raw_read_packet(AVFormatContext *s, AVPacket *pkt)
F
Fabrice Bellard 已提交
116
{
117
    int ret, size, bps;
F
Fabrice Bellard 已提交
118
    //    AVStream *st = s->streams[0];
119

120
    size= RAW_PACKET_SIZE;
F
Fabrice Bellard 已提交
121

122
    ret= av_get_packet(s->pb, pkt, size);
F
Fabrice Bellard 已提交
123 124

    pkt->stream_index = 0;
F
Fabrice Bellard 已提交
125
    if (ret <= 0) {
126
        return AVERROR(EIO);
F
Fabrice Bellard 已提交
127 128 129 130
    }
    /* note: we need to modify the packet size here to handle the last
       packet */
    pkt->size = ret;
131 132 133 134 135 136

    bps= av_get_bits_per_sample(s->streams[0]->codec->codec_id);
    assert(bps); // if false there IS a bug elsewhere (NOT in this function)
    pkt->dts=
    pkt->pts= pkt->pos*8 / (bps * s->streams[0]->codec->channels);

F
Fabrice Bellard 已提交
137 138 139
    return ret;
}

140 141 142 143 144 145 146
static int raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt)
{
    int ret, size;

    size = RAW_PACKET_SIZE;

    if (av_new_packet(pkt, size) < 0)
147
        return AVERROR(EIO);
148

149
    pkt->pos= url_ftell(s->pb);
150
    pkt->stream_index = 0;
151
    ret = get_partial_buffer(s->pb, pkt->data, size);
152 153
    if (ret <= 0) {
        av_free_packet(pkt);
154
        return AVERROR(EIO);
155 156 157 158 159
    }
    pkt->size = ret;
    return ret;
}

160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt)
{
    int packet_size, ret, width, height;
    AVStream *st = s->streams[0];

    width = st->codec->width;
    height = st->codec->height;

    packet_size = avpicture_get_size(st->codec->pix_fmt, width, height);
    if (packet_size < 0)
        return -1;

    ret= av_get_packet(s->pb, pkt, packet_size);
    pkt->pts=
    pkt->dts= pkt->pos / packet_size;

    pkt->stream_index = 0;
    if (ret != packet_size) {
        return AVERROR(EIO);
    } else {
        return 0;
    }
}

184 185 186 187
// http://www.artificis.hu/files/texts/ingenient.txt
static int ingenient_read_packet(AVFormatContext *s, AVPacket *pkt)
{
    int ret, size, w, h, unk1, unk2;
188

189
    if (get_le32(s->pb) != MKTAG('M', 'J', 'P', 'G'))
190
        return AVERROR(EIO); // FIXME
191

192
    size = get_le32(s->pb);
193

194 195
    w = get_le16(s->pb);
    h = get_le16(s->pb);
196

197 198 199 200
    url_fskip(s->pb, 8); // zero + size (padded?)
    url_fskip(s->pb, 2);
    unk1 = get_le16(s->pb);
    unk2 = get_le16(s->pb);
D
Diego Biurrun 已提交
201
    url_fskip(s->pb, 22); // ASCII timestamp
202

203
    av_log(NULL, AV_LOG_DEBUG, "Ingenient packet: size=%d, width=%d, height=%d, unk1=%d unk2=%d\n",
204
        size, w, h, unk1, unk2);
205 206

    if (av_new_packet(pkt, size) < 0)
207
        return AVERROR(EIO);
208

209
    pkt->pos = url_ftell(s->pb);
210
    pkt->stream_index = 0;
211
    ret = get_buffer(s->pb, pkt->data, size);
212 213
    if (ret <= 0) {
        av_free_packet(pkt);
214
        return AVERROR(EIO);
215 216 217 218 219
    }
    pkt->size = ret;
    return ret;
}

220
int pcm_read_seek(AVFormatContext *s,
221
                  int stream_index, int64_t timestamp, int flags)
F
Fabrice Bellard 已提交
222 223
{
    AVStream *st;
224
    int block_align, byte_rate, ret;
F
Fabrice Bellard 已提交
225 226 227
    int64_t pos;

    st = s->streams[0];
228 229 230 231 232

    block_align = st->codec->block_align ? st->codec->block_align :
        (av_get_bits_per_sample(st->codec->codec_id) * st->codec->channels) >> 3;
    byte_rate = st->codec->bit_rate ? st->codec->bit_rate >> 3 :
        block_align * st->codec->sample_rate;
233

F
Fabrice Bellard 已提交
234 235 236 237
    if (block_align <= 0 || byte_rate <= 0)
        return -1;

    /* compute the position by aligning it to block_align */
238 239
    pos = av_rescale_rnd(timestamp * byte_rate,
                         st->time_base.num,
240 241 242
                         st->time_base.den * (int64_t)block_align,
                         (flags & AVSEEK_FLAG_BACKWARD) ? AV_ROUND_DOWN : AV_ROUND_UP);
    pos *= block_align;
F
Fabrice Bellard 已提交
243 244

    /* recompute exact position */
M
Michael Niedermayer 已提交
245
    st->cur_dts = av_rescale(pos, st->time_base.den, byte_rate * (int64_t)st->time_base.num);
246 247
    if ((ret = url_fseek(s->pb, pos + s->data_offset, SEEK_SET)) < 0)
        return ret;
F
Fabrice Bellard 已提交
248 249 250
    return 0;
}

251 252
static int audio_read_header(AVFormatContext *s,
                             AVFormatParameters *ap)
M
Måns Rullgård 已提交
253
{
254
    AVStream *st = av_new_stream(s, 0);
M
Måns Rullgård 已提交
255
    if (!st)
256
        return AVERROR(ENOMEM);
M
Måns Rullgård 已提交
257
    st->codec->codec_type = CODEC_TYPE_AUDIO;
258
    st->codec->codec_id = s->iformat->value;
A
Aurelien Jacobs 已提交
259
    st->need_parsing = AVSTREAM_PARSE_FULL;
M
Måns Rullgård 已提交
260 261 262 263
    /* the parameters will be extracted from the compressed bitstream */
    return 0;
}

D
Diego Biurrun 已提交
264
/* MPEG-1/H.263 input */
F
Fabrice Bellard 已提交
265 266 267 268 269
static int video_read_header(AVFormatContext *s,
                             AVFormatParameters *ap)
{
    AVStream *st;

F
Fabrice Bellard 已提交
270
    st = av_new_stream(s, 0);
F
Fabrice Bellard 已提交
271
    if (!st)
272
        return AVERROR(ENOMEM);
F
Fabrice Bellard 已提交
273

274 275
    st->codec->codec_type = CODEC_TYPE_VIDEO;
    st->codec->codec_id = s->iformat->value;
A
Aurelien Jacobs 已提交
276
    st->need_parsing = AVSTREAM_PARSE_FULL;
F
Fabrice Bellard 已提交
277

D
Diego Biurrun 已提交
278 279
    /* for MJPEG, specify frame rate */
    /* for MPEG-4 specify it, too (most MPEG-4 streams do not have the fixed_vop_rate set ...)*/
280
    if (ap->time_base.num) {
281
        av_set_pts_info(st, 64, ap->time_base.num, ap->time_base.den);
282
    } else if ( st->codec->codec_id == CODEC_ID_MJPEG ||
283
                st->codec->codec_id == CODEC_ID_MPEG4 ||
284
                st->codec->codec_id == CODEC_ID_DIRAC ||
285
                st->codec->codec_id == CODEC_ID_H264) {
286
        av_set_pts_info(st, 64, 1, 25);
F
Fabrice Bellard 已提交
287
    }
288

F
Fabrice Bellard 已提交
289 290 291
    return 0;
}

292 293 294
#define SEQ_START_CODE          0x000001b3
#define GOP_START_CODE          0x000001b8
#define PICTURE_START_CODE      0x00000100
295 296
#define SLICE_START_CODE        0x00000101
#define PACK_START_CODE         0x000001ba
297 298
#define VIDEO_ID                0x000001e0
#define AUDIO_ID                0x000001c0
F
Fabrice Bellard 已提交
299 300 301

static int mpegvideo_probe(AVProbeData *p)
{
302
    uint32_t code= -1;
303
    int pic=0, seq=0, slice=0, pspack=0, pes=0;
304 305 306 307 308 309 310 311 312 313 314
    int i;

    for(i=0; i<p->buf_size; i++){
        code = (code<<8) + p->buf[i];
        if ((code & 0xffffff00) == 0x100) {
            switch(code){
            case     SEQ_START_CODE:   seq++; break;
            case PICTURE_START_CODE:   pic++; break;
            case   SLICE_START_CODE: slice++; break;
            case    PACK_START_CODE: pspack++; break;
            }
315 316
            if     ((code & 0x1f0) == VIDEO_ID)   pes++;
            else if((code & 0x1e0) == AUDIO_ID)   pes++;
317
        }
F
Fabrice Bellard 已提交
318
    }
319
    if(seq && seq*9<=pic*10 && pic*9<=slice*10 && !pspack && !pes)
320
        return AVPROBE_SCORE_MAX/2+1; // +1 for .mpg
F
Fabrice Bellard 已提交
321 322 323
    return 0;
}

324 325 326 327 328 329
#define VISUAL_OBJECT_START_CODE       0x000001b5
#define VOP_START_CODE                 0x000001b6

static int mpeg4video_probe(AVProbeData *probe_packet)
{
    uint32_t temp_buffer= -1;
330
    int VO=0, VOL=0, VOP = 0, VISO = 0, res=0;
331 332 333 334
    int i;

    for(i=0; i<probe_packet->buf_size; i++){
        temp_buffer = (temp_buffer<<8) + probe_packet->buf[i];
335 336 337 338 339 340 341 342 343
        if ((temp_buffer & 0xffffff00) != 0x100)
            continue;

        if (temp_buffer == VOP_START_CODE)                         VOP++;
        else if (temp_buffer == VISUAL_OBJECT_START_CODE)          VISO++;
        else if (temp_buffer < 0x120)                              VO++;
        else if (temp_buffer < 0x130)                              VOL++;
        else if (   !(0x1AF < temp_buffer && temp_buffer < 0x1B7)
                 && !(0x1B9 < temp_buffer && temp_buffer < 0x1C4)) res++;
344 345
    }

346
    if ( VOP >= VISO && VOP >= VOL && VO >= VOL && VOL > 0 && res==0)
347 348 349 350
        return AVPROBE_SCORE_MAX/2;
    return 0;
}

M
Michael Niedermayer 已提交
351 352 353
static int h264_probe(AVProbeData *p)
{
    uint32_t code= -1;
354
    int sps=0, pps=0, idr=0, res=0, sli=0;
M
Michael Niedermayer 已提交
355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379
    int i;

    for(i=0; i<p->buf_size; i++){
        code = (code<<8) + p->buf[i];
        if ((code & 0xffffff00) == 0x100) {
            int ref_idc= (code>>5)&3;
            int type   = code & 0x1F;
            static const int8_t ref_zero[32]={
                2, 0, 0, 0, 0,-1, 1,-1,
               -1, 1, 1, 1, 1,-1, 2, 2,
                2, 2, 2, 0, 2, 2, 2, 2,
                2, 2, 2, 2, 2, 2, 2, 2
            };

            if(code & 0x80) //forbidden bit
                return 0;

            if(ref_zero[type] == 1 && ref_idc)
                return 0;
            if(ref_zero[type] ==-1 && !ref_idc)
                return 0;
            if(ref_zero[type] == 2)
                res++;

            switch(type){
380
            case     1:   sli++; break;
M
Michael Niedermayer 已提交
381 382 383 384 385 386 387 388 389 390
            case     5:   idr++; break;
            case     7:
                if(p->buf[i+2]&0x0F)
                    return 0;
                sps++;
                break;
            case     8:   pps++; break;
            }
        }
    }
391
    if(sps && pps && (idr||sli>3) && res<(sps+pps+idr))
M
Michael Niedermayer 已提交
392 393 394 395
        return AVPROBE_SCORE_MAX/2+1; // +1 for .mpg
    return 0;
}

396 397 398 399 400 401 402 403 404 405 406 407 408
static int h263_probe(AVProbeData *p)
{
    int code;
    const uint8_t *d;

    d = p->buf;
    code = (d[0] << 14) | (d[1] << 6) | (d[2] >> 2);
    if (code == 0x20) {
        return 50;
    }
    return 0;
}

409 410 411 412 413 414 415 416 417 418 419 420 421
static int h261_probe(AVProbeData *p)
{
    int code;
    const uint8_t *d;

    d = p->buf;
    code = (d[0] << 12) | (d[1] << 4) | (d[2] >> 4);
    if (code == 0x10) {
        return 50;
    }
    return 0;
}

B
Benjamin Larsson 已提交
422 423 424 425 426 427 428 429 430 431 432 433 434 435 436
#define DCA_MARKER_14B_BE 0x1FFFE800
#define DCA_MARKER_14B_LE 0xFF1F00E8
#define DCA_MARKER_RAW_BE 0x7FFE8001
#define DCA_MARKER_RAW_LE 0xFE7F0180
static int dts_probe(AVProbeData *p)
{
    const uint8_t *buf, *bufp;
    uint32_t state = -1;

    buf = p->buf;

    for(; buf < (p->buf+p->buf_size)-2; buf+=2) {
        bufp = buf;
        state = (state << 16) | bytestream_get_be16(&bufp);

D
Diego Biurrun 已提交
437
        /* regular bitstream */
B
Benjamin Larsson 已提交
438 439 440
        if (state == DCA_MARKER_RAW_BE || state == DCA_MARKER_RAW_LE)
            return AVPROBE_SCORE_MAX/2+1;

D
Diego Biurrun 已提交
441
        /* 14 bits big-endian bitstream */
B
Benjamin Larsson 已提交
442 443 444 445
        if (state == DCA_MARKER_14B_BE)
            if ((bytestream_get_be16(&bufp) & 0xFFF0) == 0x07F0)
                return AVPROBE_SCORE_MAX/2+1;

D
Diego Biurrun 已提交
446
        /* 14 bits little-endian bitstream */
B
Benjamin Larsson 已提交
447 448 449 450 451 452 453 454
        if (state == DCA_MARKER_14B_LE)
            if ((bytestream_get_be16(&bufp) & 0xF0FF) == 0xF007)
                return AVPROBE_SCORE_MAX/2+1;
    }

    return 0;
}

455 456 457 458 459 460 461 462
static int dirac_probe(AVProbeData *p)
{
    if (AV_RL32(p->buf) == MKTAG('B', 'B', 'C', 'D'))
        return AVPROBE_SCORE_MAX;
    else
        return 0;
}

463 464
static int ac3_probe(AVProbeData *p)
{
465
    int max_frames, first_frames = 0, frames;
466 467
    uint8_t *buf, *buf2, *end;
    AC3HeaderInfo hdr;
468
    GetBitContext gbc;
469

470 471
    max_frames = 0;
    buf = p->buf;
472
    end = buf + p->buf_size;
473 474 475

    for(; buf < end; buf++) {
        buf2 = buf;
476

477
        for(frames = 0; buf2 < end; frames++) {
478 479
            init_get_bits(&gbc, buf2, 54);
            if(ff_ac3_parse_header(&gbc, &hdr) < 0)
480
                break;
481 482 483
            if(buf2 + hdr.frame_size > end ||
               av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, buf2 + 2, hdr.frame_size - 2))
                break;
484 485 486 487 488 489 490
            buf2 += hdr.frame_size;
        }
        max_frames = FFMAX(max_frames, frames);
        if(buf == p->buf)
            first_frames = frames;
    }
    if   (first_frames>=3) return AVPROBE_SCORE_MAX * 3 / 4;
491
    else if(max_frames>=3) return AVPROBE_SCORE_MAX / 2;
492 493
    else if(max_frames>=1) return 1;
    else                   return 0;
494 495
}

M
Michael Niedermayer 已提交
496 497 498
static int flac_probe(AVProbeData *p)
{
    if(memcmp(p->buf, "fLaC", 4)) return 0;
M
Michael Niedermayer 已提交
499
    else                          return AVPROBE_SCORE_MAX / 2;
M
Michael Niedermayer 已提交
500 501
}

502 503 504

/* Note: Do not forget to add new entries to the Makefile as well. */

505 506 507
AVInputFormat aac_demuxer = {
    "aac",
    NULL_IF_CONFIG_SMALL("ADTS AAC"),
R
Ramiro Polla 已提交
508 509 510 511 512
    0,
    NULL,
    audio_read_header,
    raw_read_partial_packet,
    .flags= AVFMT_GENERIC_INDEX,
513 514
    .extensions = "aac",
    .value = CODEC_ID_AAC,
515 516
};

517
#ifdef CONFIG_AC3_DEMUXER
518
AVInputFormat ac3_demuxer = {
F
Fabrice Bellard 已提交
519
    "ac3",
520
    NULL_IF_CONFIG_SMALL("raw AC-3"),
F
Fabrice Bellard 已提交
521
    0,
522
    ac3_probe,
523
    audio_read_header,
524
    raw_read_partial_packet,
525
    .flags= AVFMT_GENERIC_INDEX,
526
    .extensions = "ac3",
527
    .value = CODEC_ID_AC3,
F
Fabrice Bellard 已提交
528
};
529
#endif
F
Fabrice Bellard 已提交
530

531
#ifdef CONFIG_MUXERS
532
AVOutputFormat ac3_muxer = {
F
Fabrice Bellard 已提交
533
    "ac3",
534
    NULL_IF_CONFIG_SMALL("raw AC-3"),
535
    "audio/x-ac3",
F
Fabrice Bellard 已提交
536
    "ac3",
F
Fabrice Bellard 已提交
537
    0,
F
Fabrice Bellard 已提交
538
    CODEC_ID_AC3,
539
    CODEC_ID_NONE,
540
    NULL,
F
Fabrice Bellard 已提交
541
    raw_write_packet,
542
    .flags= AVFMT_NOTIMESTAMPS,
F
Fabrice Bellard 已提交
543
};
544
#endif //CONFIG_MUXERS
F
Fabrice Bellard 已提交
545

546 547
AVInputFormat dirac_demuxer = {
    "dirac",
548
    NULL_IF_CONFIG_SMALL("raw Dirac"),
549 550 551 552 553 554 555 556 557 558 559
    0,
    dirac_probe,
    video_read_header,
    raw_read_partial_packet,
    .flags= AVFMT_GENERIC_INDEX,
    .value = CODEC_ID_DIRAC,
};

#ifdef CONFIG_MUXERS
AVOutputFormat dirac_muxer = {
    "dirac",
560
    NULL_IF_CONFIG_SMALL("raw Dirac"),
561 562 563
    NULL,
    "drc",
    0,
564
    CODEC_ID_NONE,
565 566 567 568 569 570 571
    CODEC_ID_DIRAC,
    NULL,
    raw_write_packet,
    .flags= AVFMT_NOTIMESTAMPS,
};
#endif

572
AVInputFormat dts_demuxer = {
573
    "dts",
574
    NULL_IF_CONFIG_SMALL("raw DTS"),
575
    0,
B
Benjamin Larsson 已提交
576
    dts_probe,
577
    audio_read_header,
578
    raw_read_partial_packet,
579
    .flags= AVFMT_GENERIC_INDEX,
580
    .extensions = "dts",
581
    .value = CODEC_ID_DTS,
582 583
};

584 585 586 587 588 589
#ifdef CONFIG_MUXERS
AVOutputFormat dts_muxer = {
    "dts",
    NULL_IF_CONFIG_SMALL("raw DTS"),
    "audio/x-dca",
    "dts",
M
Måns Rullgård 已提交
590
    0,
591 592
    CODEC_ID_DTS,
    CODEC_ID_NONE,
M
Måns Rullgård 已提交
593
    NULL,
594 595 596 597 598 599 600 601 602 603
    raw_write_packet,
    .flags= AVFMT_NOTIMESTAMPS,
};
#endif

AVInputFormat flac_demuxer = {
    "flac",
    NULL_IF_CONFIG_SMALL("raw FLAC"),
    0,
    flac_probe,
604
    audio_read_header,
M
Måns Rullgård 已提交
605
    raw_read_partial_packet,
606
    .flags= AVFMT_GENERIC_INDEX,
607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622
    .extensions = "flac",
    .value = CODEC_ID_FLAC,
};

#ifdef CONFIG_MUXERS
AVOutputFormat flac_muxer = {
    "flac",
    NULL_IF_CONFIG_SMALL("raw FLAC"),
    "audio/x-flac",
    "flac",
    0,
    CODEC_ID_FLAC,
    CODEC_ID_NONE,
    flac_write_header,
    raw_write_packet,
    .flags= AVFMT_NOTIMESTAMPS,
M
Måns Rullgård 已提交
623
};
624
#endif //CONFIG_MUXERS
M
Måns Rullgård 已提交
625

626 627
AVInputFormat gsm_demuxer = {
    "gsm",
628
    NULL_IF_CONFIG_SMALL("GSM"),
629 630 631 632 633 634 635 636 637
    0,
    NULL,
    audio_read_header,
    raw_read_partial_packet,
    .flags= AVFMT_GENERIC_INDEX,
    .extensions = "gsm",
    .value = CODEC_ID_GSM,
};

638
AVInputFormat h261_demuxer = {
639
    "h261",
640
    NULL_IF_CONFIG_SMALL("raw H.261"),
641 642 643 644
    0,
    h261_probe,
    video_read_header,
    raw_read_partial_packet,
645
    .flags= AVFMT_GENERIC_INDEX,
646 647 648 649
    .extensions = "h261",
    .value = CODEC_ID_H261,
};

650
#ifdef CONFIG_MUXERS
651
AVOutputFormat h261_muxer = {
652
    "h261",
653
    NULL_IF_CONFIG_SMALL("raw H.261"),
654 655 656
    "video/x-h261",
    "h261",
    0,
657
    CODEC_ID_NONE,
658
    CODEC_ID_H261,
659
    NULL,
660
    raw_write_packet,
661
    .flags= AVFMT_NOTIMESTAMPS,
662
};
663
#endif //CONFIG_MUXERS
664

665
AVInputFormat h263_demuxer = {
666
    "h263",
667
    NULL_IF_CONFIG_SMALL("raw H.263"),
668 669 670
    0,
    h263_probe,
    video_read_header,
671
    raw_read_partial_packet,
672
    .flags= AVFMT_GENERIC_INDEX,
673 674 675 676
//    .extensions = "h263", //FIXME remove after writing mpeg4_probe
    .value = CODEC_ID_H263,
};

677
#ifdef CONFIG_MUXERS
678
AVOutputFormat h263_muxer = {
F
Fabrice Bellard 已提交
679
    "h263",
680
    NULL_IF_CONFIG_SMALL("raw H.263"),
F
Fabrice Bellard 已提交
681 682 683
    "video/x-h263",
    "h263",
    0,
684
    CODEC_ID_NONE,
F
Fabrice Bellard 已提交
685
    CODEC_ID_H263,
686
    NULL,
F
Fabrice Bellard 已提交
687
    raw_write_packet,
688
    .flags= AVFMT_NOTIMESTAMPS,
F
Fabrice Bellard 已提交
689
};
690
#endif //CONFIG_MUXERS
F
Fabrice Bellard 已提交
691

692 693 694 695
AVInputFormat h264_demuxer = {
    "h264",
    NULL_IF_CONFIG_SMALL("raw H.264 video format"),
    0,
M
Michael Niedermayer 已提交
696
    h264_probe,
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
    video_read_header,
    raw_read_partial_packet,
    .flags= AVFMT_GENERIC_INDEX,
    .extensions = "h26l,h264,264", //FIXME remove after writing mpeg4_probe
    .value = CODEC_ID_H264,
};

#ifdef CONFIG_MUXERS
AVOutputFormat h264_muxer = {
    "h264",
    NULL_IF_CONFIG_SMALL("raw H.264 video format"),
    NULL,
    "h264",
    0,
    CODEC_ID_NONE,
    CODEC_ID_H264,
    NULL,
    raw_write_packet,
    .flags= AVFMT_NOTIMESTAMPS,
};
#endif //CONFIG_MUXERS

AVInputFormat ingenient_demuxer = {
    "ingenient",
    NULL_IF_CONFIG_SMALL("Ingenient MJPEG"),
    0,
    NULL,
    video_read_header,
    ingenient_read_packet,
    .flags= AVFMT_GENERIC_INDEX,
    .extensions = "cgi", // FIXME
    .value = CODEC_ID_MJPEG,
};

731
AVInputFormat m4v_demuxer = {
M
Michael Niedermayer 已提交
732
    "m4v",
733
    NULL_IF_CONFIG_SMALL("raw MPEG-4 video format"),
M
Michael Niedermayer 已提交
734
    0,
D
Diego Biurrun 已提交
735
    mpeg4video_probe, /** probing for MPEG-4 data */
M
Michael Niedermayer 已提交
736
    video_read_header,
737
    raw_read_partial_packet,
738
    .flags= AVFMT_GENERIC_INDEX,
739 740
    .extensions = "m4v", //FIXME remove after writing mpeg4_probe
    .value = CODEC_ID_MPEG4,
M
Michael Niedermayer 已提交
741 742
};

743
#ifdef CONFIG_MUXERS
744
AVOutputFormat m4v_muxer = {
745
    "m4v",
746
    NULL_IF_CONFIG_SMALL("raw MPEG-4 video format"),
747 748 749 750 751
    NULL,
    "m4v",
    0,
    CODEC_ID_NONE,
    CODEC_ID_MPEG4,
752
    NULL,
753
    raw_write_packet,
754
    .flags= AVFMT_NOTIMESTAMPS,
755
};
756
#endif //CONFIG_MUXERS
757

758 759 760
AVInputFormat mjpeg_demuxer = {
    "mjpeg",
    NULL_IF_CONFIG_SMALL("MJPEG video"),
M
Michael Niedermayer 已提交
761
    0,
762
    NULL,
M
Michael Niedermayer 已提交
763
    video_read_header,
764
    raw_read_partial_packet,
765
    .flags= AVFMT_GENERIC_INDEX,
766 767
    .extensions = "mjpg,mjpeg",
    .value = CODEC_ID_MJPEG,
M
Michael Niedermayer 已提交
768 769
};

770
#ifdef CONFIG_MUXERS
771 772 773 774 775
AVOutputFormat mjpeg_muxer = {
    "mjpeg",
    NULL_IF_CONFIG_SMALL("MJPEG video"),
    "video/x-mjpeg",
    "mjpg,mjpeg",
M
Michael Niedermayer 已提交
776 777
    0,
    CODEC_ID_NONE,
778
    CODEC_ID_MJPEG,
779
    NULL,
M
Michael Niedermayer 已提交
780
    raw_write_packet,
781
    .flags= AVFMT_NOTIMESTAMPS,
M
Michael Niedermayer 已提交
782
};
783
#endif //CONFIG_MUXERS
M
Michael Niedermayer 已提交
784

785 786 787
AVInputFormat mlp_demuxer = {
    "mlp",
    NULL_IF_CONFIG_SMALL("raw MLP"),
F
Fabrice Bellard 已提交
788
    0,
789 790
    NULL,
    audio_read_header,
791
    raw_read_partial_packet,
792
    .flags= AVFMT_GENERIC_INDEX,
793 794
    .extensions = "mlp",
    .value = CODEC_ID_MLP,
F
Fabrice Bellard 已提交
795 796
};

797
#ifdef CONFIG_MUXERS
798
AVOutputFormat mpeg1video_muxer = {
F
Fabrice Bellard 已提交
799
    "mpeg1video",
800
    NULL_IF_CONFIG_SMALL("MPEG video"),
F
Fabrice Bellard 已提交
801
    "video/x-mpeg",
802
    "mpg,mpeg,m1v",
F
Fabrice Bellard 已提交
803
    0,
804
    CODEC_ID_NONE,
F
Fabrice Bellard 已提交
805
    CODEC_ID_MPEG1VIDEO,
806
    NULL,
F
Fabrice Bellard 已提交
807
    raw_write_packet,
808
    .flags= AVFMT_NOTIMESTAMPS,
F
Fabrice Bellard 已提交
809
};
810
#endif //CONFIG_MUXERS
F
Fabrice Bellard 已提交
811

812
#ifdef CONFIG_MUXERS
813
AVOutputFormat mpeg2video_muxer = {
814
    "mpeg2video",
815
    NULL_IF_CONFIG_SMALL("MPEG-2 video"),
816 817 818
    NULL,
    "m2v",
    0,
819
    CODEC_ID_NONE,
820
    CODEC_ID_MPEG2VIDEO,
821
    NULL,
822
    raw_write_packet,
823
    .flags= AVFMT_NOTIMESTAMPS,
824
};
825
#endif //CONFIG_MUXERS
826

827 828 829
AVInputFormat mpegvideo_demuxer = {
    "mpegvideo",
    NULL_IF_CONFIG_SMALL("MPEG video"),
F
Fabrice Bellard 已提交
830
    0,
831
    mpegvideo_probe,
F
Fabrice Bellard 已提交
832
    video_read_header,
833
    raw_read_partial_packet,
834
    .flags= AVFMT_GENERIC_INDEX,
835
    .value = CODEC_ID_MPEG1VIDEO,
F
Fabrice Bellard 已提交
836 837
};

838 839 840 841 842 843
#ifdef CONFIG_MUXERS
AVOutputFormat null_muxer = {
    "null",
    NULL_IF_CONFIG_SMALL("null video format"),
    NULL,
    NULL,
844
    0,
845 846 847 848 849 850
#ifdef WORDS_BIGENDIAN
    CODEC_ID_PCM_S16BE,
#else
    CODEC_ID_PCM_S16LE,
#endif
    CODEC_ID_RAWVIDEO,
851
    NULL,
852 853 854 855 856 857 858 859 860 861 862 863
    null_write_packet,
    .flags = AVFMT_NOFILE | AVFMT_RAWPICTURE | AVFMT_NOTIMESTAMPS,
};
#endif //CONFIG_MUXERS

AVInputFormat rawvideo_demuxer = {
    "rawvideo",
    NULL_IF_CONFIG_SMALL("raw video format"),
    0,
    NULL,
    raw_read_header,
    rawvideo_read_packet,
864
    .flags= AVFMT_GENERIC_INDEX,
865 866
    .extensions = "yuv,cif,qcif,rgb",
    .value = CODEC_ID_RAWVIDEO,
867 868
};

869
#ifdef CONFIG_MUXERS
870 871 872 873 874
AVOutputFormat rawvideo_muxer = {
    "rawvideo",
    NULL_IF_CONFIG_SMALL("raw video format"),
    NULL,
    "yuv,rgb",
F
Fabrice Bellard 已提交
875
    0,
876
    CODEC_ID_NONE,
877
    CODEC_ID_RAWVIDEO,
878
    NULL,
F
Fabrice Bellard 已提交
879
    raw_write_packet,
880
    .flags= AVFMT_NOTIMESTAMPS,
F
Fabrice Bellard 已提交
881
};
882
#endif //CONFIG_MUXERS
F
Fabrice Bellard 已提交
883

884 885 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
#ifdef CONFIG_ROQ_MUXER
AVOutputFormat roq_muxer =
{
    "RoQ",
    NULL_IF_CONFIG_SMALL("id RoQ format"),
    NULL,
    "roq",
    0,
    CODEC_ID_ROQ_DPCM,
    CODEC_ID_ROQ,
    roq_write_header,
    raw_write_packet,
};
#endif //CONFIG_ROQ_MUXER

AVInputFormat shorten_demuxer = {
    "shn",
    NULL_IF_CONFIG_SMALL("raw Shorten"),
    0,
    NULL,
    audio_read_header,
    raw_read_partial_packet,
    .flags= AVFMT_GENERIC_INDEX,
    .extensions = "shn",
    .value = CODEC_ID_SHORTEN,
};

K
Kostya Shishkov 已提交
911 912
AVInputFormat vc1_demuxer = {
    "vc1",
913
    NULL_IF_CONFIG_SMALL("raw VC-1"),
K
Kostya Shishkov 已提交
914 915 916 917 918 919 920 921
    0,
    NULL /* vc1_probe */,
    video_read_header,
    raw_read_partial_packet,
    .extensions = "vc1",
    .value = CODEC_ID_VC1,
};

D
Diego Biurrun 已提交
922
/* PCM formats */
923

F
Fabrice Bellard 已提交
924
#define PCMINPUTDEF(name, long_name, ext, codec) \
925
AVInputFormat pcm_ ## name ## _demuxer = {\
926
    #name,\
927
    NULL_IF_CONFIG_SMALL(long_name),\
928 929 930 931
    0,\
    NULL,\
    raw_read_header,\
    raw_read_packet,\
B
Baptiste Coudurier 已提交
932
    NULL,\
F
Fabrice Bellard 已提交
933
    pcm_read_seek,\
934
    .flags= AVFMT_GENERIC_INDEX,\
935 936 937 938
    .extensions = ext,\
    .value = codec,\
};

939
#define PCMOUTPUTDEF(name, long_name, ext, codec) \
940
AVOutputFormat pcm_ ## name ## _muxer = {\
F
Fabrice Bellard 已提交
941
    #name,\
942
    NULL_IF_CONFIG_SMALL(long_name),\
F
Fabrice Bellard 已提交
943 944 945 946
    NULL,\
    ext,\
    0,\
    codec,\
947
    CODEC_ID_NONE,\
948
    NULL,\
F
Fabrice Bellard 已提交
949
    raw_write_packet,\
950
    .flags= AVFMT_NOTIMESTAMPS,\
F
Fabrice Bellard 已提交
951
};
952 953 954 955 956 957 958 959 960 961 962 963 964 965 966


#if !defined(CONFIG_MUXERS) && defined(CONFIG_DEMUXERS)
#define PCMDEF(name, long_name, ext, codec) \
        PCMINPUTDEF(name, long_name, ext, codec)
#elif defined(CONFIG_MUXERS) && !defined(CONFIG_DEMUXERS)
#define PCMDEF(name, long_name, ext, codec) \
        PCMOUTPUTDEF(name, long_name, ext, codec)
#elif defined(CONFIG_MUXERS) && defined(CONFIG_DEMUXERS)
#define PCMDEF(name, long_name, ext, codec) \
        PCMINPUTDEF(name, long_name, ext, codec)\
        PCMOUTPUTDEF(name, long_name, ext, codec)
#else
#define PCMDEF(name, long_name, ext, codec)
#endif
F
Fabrice Bellard 已提交
967 968

#ifdef WORDS_BIGENDIAN
F
Fabrice Bellard 已提交
969 970
#define BE_DEF(s) s
#define LE_DEF(s) NULL
F
Fabrice Bellard 已提交
971
#else
F
Fabrice Bellard 已提交
972 973
#define BE_DEF(s) NULL
#define LE_DEF(s) s
F
Fabrice Bellard 已提交
974 975 976
#endif


977
PCMDEF(s16be, "PCM signed 16 bit big-endian format",
F
Fabrice Bellard 已提交
978
       BE_DEF("sw"), CODEC_ID_PCM_S16BE)
F
Fabrice Bellard 已提交
979

980 981 982 983 984
PCMDEF(s16le, "PCM signed 16 bit little-endian format",
       LE_DEF("sw"), CODEC_ID_PCM_S16LE)

PCMDEF(s8, "PCM signed 8 bit format",
       "sb", CODEC_ID_PCM_S8)
F
Fabrice Bellard 已提交
985

986
PCMDEF(u16be, "PCM unsigned 16 bit big-endian format",
F
Fabrice Bellard 已提交
987
       BE_DEF("uw"), CODEC_ID_PCM_U16BE)
F
Fabrice Bellard 已提交
988

989 990
PCMDEF(u16le, "PCM unsigned 16 bit little-endian format",
       LE_DEF("uw"), CODEC_ID_PCM_U16LE)
F
Fabrice Bellard 已提交
991

992
PCMDEF(u8, "PCM unsigned 8 bit format",
F
Fabrice Bellard 已提交
993
       "ub", CODEC_ID_PCM_U8)
F
Fabrice Bellard 已提交
994

995
PCMDEF(alaw, "PCM A-law format",
F
Fabrice Bellard 已提交
996
       "al", CODEC_ID_PCM_ALAW)
F
Fabrice Bellard 已提交
997

998 999
PCMDEF(mulaw, "PCM mu-law format",
       "ul", CODEC_ID_PCM_MULAW)