Skip to content
Snippets Groups Projects
raw.c 31.6 KiB
Newer Older
  • Learn to ignore specific revisions
  •  * Copyright (c) 2001 Fabrice Bellard
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
     *
    
     * This file is part of FFmpeg.
     *
     * FFmpeg is free software; you can redistribute it and/or
    
     * modify it under the terms of the GNU Lesser General Public
     * License as published by the Free Software Foundation; either
    
     * version 2.1 of the License, or (at your option) any later version.
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
     *
    
     * FFmpeg is distributed in the hope that it will be useful,
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
    
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     * Lesser General Public License for more details.
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
     *
    
     * You should have received a copy of the GNU Lesser General Public
    
     * License along with FFmpeg; if not, write to the Free Software
    
     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
     */
    
    
    #include "libavutil/crc.h"
    #include "libavcodec/ac3_parser.h"
    
    #include "libavcodec/get_bits.h"
    
    #include "libavcodec/bytestream.h"
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    #include "avformat.h"
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    
    /* simple formats */
    
    #if CONFIG_NULL_MUXER
    
    static int null_write_packet(struct AVFormatContext *s, AVPacket *pkt)
    {
        return 0;
    }
    
    int ff_raw_write_packet(AVFormatContext *s, AVPacket *pkt)
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    {
    
        put_buffer(s->pb, pkt->data, pkt->size);
        put_flush_packet(s->pb);
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        return 0;
    }
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    
    
    #if CONFIG_DEMUXERS
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    /* raw input */
    
    static int raw_read_header(AVFormatContext *s, AVFormatParameters *ap)
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    {
        AVStream *st;
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        st = av_new_stream(s, 0);
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        if (!st)
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
            id = s->iformat->value;
            if (id == CODEC_ID_RAWVIDEO) {
    
                st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
            } else {
    
                st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
            }
    
                st->codec->sample_rate = ap->sample_rate;
    
                if(ap->channels) st->codec->channels = ap->channels;
                else             st->codec->channels = 1;
    
                st->codec->bits_per_coded_sample = av_get_bits_per_sample(st->codec->codec_id);
                assert(st->codec->bits_per_coded_sample > 0);
                st->codec->block_align = st->codec->bits_per_coded_sample*st->codec->channels/8;
    
                av_set_pts_info(st, 64, 1, st->codec->sample_rate);
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
                break;
    
                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);
    
                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;
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
                break;
            default:
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
                return -1;
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
            }
        return 0;
    }
    
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    #define RAW_PACKET_SIZE 1024
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    
    
    static int raw_read_packet(AVFormatContext *s, AVPacket *pkt)
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    {
    
        int ret, size, bps;
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        //    AVStream *st = s->streams[0];
    
        size= RAW_SAMPLES*s->streams[0]->codec->block_align;
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    
    
        ret= av_get_packet(s->pb, pkt, size);
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    
        pkt->stream_index = 0;
    
    
        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);
    
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        return ret;
    }
    
    
    int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt)
    
    {
        int ret, size;
    
        size = RAW_PACKET_SIZE;
    
        if (av_new_packet(pkt, size) < 0)
    
        pkt->pos= url_ftell(s->pb);
    
        ret = get_partial_buffer(s->pb, pkt->data, size);
    
    #if CONFIG_RAWVIDEO_DEMUXER
    
    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 CONFIG_INGENIENT_DEMUXER
    
    // http://www.artificis.hu/files/texts/ingenient.txt
    static int ingenient_read_packet(AVFormatContext *s, AVPacket *pkt)
    {
        int ret, size, w, h, unk1, unk2;
    
        if (get_le32(s->pb) != MKTAG('M', 'J', 'P', 'G'))
    
            return AVERROR(EIO); // FIXME
    
        w = get_le16(s->pb);
        h = get_le16(s->pb);
    
        url_fskip(s->pb, 8); // zero + size (padded?)
        url_fskip(s->pb, 2);
        unk1 = get_le16(s->pb);
        unk2 = get_le16(s->pb);
    
        url_fskip(s->pb, 22); // ASCII timestamp
    
        av_log(s, AV_LOG_DEBUG, "Ingenient packet: size=%d, width=%d, height=%d, unk1=%d unk2=%d\n",
    
            size, w, h, unk1, unk2);
    
        pkt->pos = url_ftell(s->pb);
    
        ret = get_buffer(s->pb, pkt->data, size);
    
    #if CONFIG_DEMUXERS
    
    int pcm_read_seek(AVFormatContext *s,
    
                      int stream_index, int64_t timestamp, int flags)
    
    {
        AVStream *st;
    
        int block_align, byte_rate;
        int64_t pos, ret;
    
    
        st = s->streams[0];
    
    
        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;
    
        if (block_align <= 0 || byte_rate <= 0)
            return -1;
    
    
        /* compute the position by aligning it to block_align */
    
        pos = av_rescale_rnd(timestamp * byte_rate,
                             st->time_base.num,
    
                             st->time_base.den * (int64_t)block_align,
                             (flags & AVSEEK_FLAG_BACKWARD) ? AV_ROUND_DOWN : AV_ROUND_UP);
        pos *= block_align;
    
    
        /* recompute exact position */
    
        st->cur_dts = av_rescale(pos, st->time_base.den, byte_rate * (int64_t)st->time_base.num);
    
        if ((ret = url_fseek(s->pb, pos + s->data_offset, SEEK_SET)) < 0)
            return ret;
    
    static int audio_read_header(AVFormatContext *s,
                                 AVFormatParameters *ap)
    
    Måns Rullgård's avatar
    Måns Rullgård committed
    {
    
        AVStream *st = av_new_stream(s, 0);
    
    Måns Rullgård's avatar
    Måns Rullgård committed
        if (!st)
    
        st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
    
        st->codec->codec_id = s->iformat->value;
    
        st->need_parsing = AVSTREAM_PARSE_FULL;
    
    Måns Rullgård's avatar
    Måns Rullgård committed
        /* the parameters will be extracted from the compressed bitstream */
    
    Måns Rullgård's avatar
    Måns Rullgård committed
        return 0;
    }
    
    
    /* MPEG-1/H.263 input */
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    static int video_read_header(AVFormatContext *s,
                                 AVFormatParameters *ap)
    {
        AVStream *st;
    
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        st = av_new_stream(s, 0);
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        if (!st)
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    
    
        st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
    
        st->codec->codec_id = s->iformat->value;
    
        st->need_parsing = AVSTREAM_PARSE_FULL;
    
        /* for MJPEG, specify frame rate */
        /* for MPEG-4 specify it, too (most MPEG-4 streams do not have the fixed_vop_rate set ...)*/
    
        if (ap->time_base.num) {
    
        } else if ( st->codec->codec_id == CODEC_ID_MJPEG ||
    
                    st->codec->codec_id == CODEC_ID_MPEG4 ||
    
                    st->codec->codec_id == CODEC_ID_DIRAC ||
    
                    st->codec->codec_id == CODEC_ID_DNXHD ||
    
                    st->codec->codec_id == CODEC_ID_VC1   ||
    
                    st->codec->codec_id == CODEC_ID_H264) {
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        }
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        return 0;
    }
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    
    
    #if CONFIG_MPEGVIDEO_DEMUXER
    
    #define SEQ_START_CODE          0x000001b3
    #define GOP_START_CODE          0x000001b8
    #define PICTURE_START_CODE      0x00000100
    
    #define SLICE_START_CODE        0x00000101
    #define PACK_START_CODE         0x000001ba
    
    #define VIDEO_ID                0x000001e0
    #define AUDIO_ID                0x000001c0
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    
    static int mpegvideo_probe(AVProbeData *p)
    {
    
        uint32_t code= -1;
    
        int pic=0, seq=0, slice=0, pspack=0, pes=0;
    
        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;
                }
    
                if     ((code & 0x1f0) == VIDEO_ID)   pes++;
                else if((code & 0x1e0) == AUDIO_ID)   pes++;
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        }
    
        if(seq && seq*9<=pic*10 && pic*9<=slice*10 && !pspack && !pes)
    
            return pic>1 ? AVPROBE_SCORE_MAX/2+1 : AVPROBE_SCORE_MAX/4; // +1 for .mpg
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        return 0;
    }
    
    #if CONFIG_CAVSVIDEO_DEMUXER
    
    #define CAVS_SEQ_START_CODE       0x000001b0
    #define CAVS_PIC_I_START_CODE     0x000001b3
    #define CAVS_UNDEF_START_CODE     0x000001b4
    #define CAVS_PIC_PB_START_CODE    0x000001b6
    #define CAVS_VIDEO_EDIT_CODE      0x000001b7
    #define CAVS_PROFILE_JIZHUN       0x20
    
    static int cavsvideo_probe(AVProbeData *p)
    {
        uint32_t code= -1;
        int pic=0, seq=0, slice_pos = 0;
        int i;
    
        for(i=0; i<p->buf_size; i++){
            code = (code<<8) + p->buf[i];
            if ((code & 0xffffff00) == 0x100) {
                if(code < CAVS_SEQ_START_CODE) {
                    /* slices have to be consecutive */
                    if(code < slice_pos)
                        return 0;
                    slice_pos = code;
                } else {
                    slice_pos = 0;
                }
                if (code == CAVS_SEQ_START_CODE) {
                    seq++;
                    /* check for the only currently supported profile */
                    if(p->buf[i+1] != CAVS_PROFILE_JIZHUN)
                        return 0;
                } else if ((code == CAVS_PIC_I_START_CODE) ||
                           (code == CAVS_PIC_PB_START_CODE)) {
                    pic++;
                } else if ((code == CAVS_UNDEF_START_CODE) ||
                           (code >  CAVS_VIDEO_EDIT_CODE)) {
                    return 0;
                }
            }
        }
        if(seq && seq*9<=pic*10)
            return AVPROBE_SCORE_MAX/2;
        return 0;
    }
    
    #if CONFIG_M4V_DEMUXER
    
    #define VISUAL_OBJECT_START_CODE       0x000001b5
    #define VOP_START_CODE                 0x000001b6
    
    static int mpeg4video_probe(AVProbeData *probe_packet)
    {
        uint32_t temp_buffer= -1;
    
        int VO=0, VOL=0, VOP = 0, VISO = 0, res=0;
    
        int i;
    
        for(i=0; i<probe_packet->buf_size; i++){
            temp_buffer = (temp_buffer<<8) + probe_packet->buf[i];
    
            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++;
    
        if ( VOP >= VISO && VOP >= VOL && VO >= VOL && VOL > 0 && res==0)
    
            return AVPROBE_SCORE_MAX/2;
        return 0;
    }
    
    #if CONFIG_H264_DEMUXER
    
    Michael Niedermayer's avatar
    Michael Niedermayer committed
    static int h264_probe(AVProbeData *p)
    {
        uint32_t code= -1;
    
        int sps=0, pps=0, idr=0, res=0, sli=0;
    
    Michael Niedermayer's avatar
    Michael Niedermayer committed
        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){
    
                case     1:   sli++; break;
    
    Michael Niedermayer's avatar
    Michael Niedermayer committed
                case     5:   idr++; break;
                case     7:
                    if(p->buf[i+2]&0x0F)
                        return 0;
                    sps++;
                    break;
                case     8:   pps++; break;
                }
            }
        }
    
        if(sps && pps && (idr||sli>3) && res<(sps+pps+idr))
    
    Michael Niedermayer's avatar
    Michael Niedermayer committed
            return AVPROBE_SCORE_MAX/2+1; // +1 for .mpg
        return 0;
    }
    
    Michael Niedermayer's avatar
    Michael Niedermayer committed
    
    
    #if CONFIG_H263_DEMUXER
    
    static int h263_probe(AVProbeData *p)
    {
    
        uint64_t code= -1;
        int i;
        int valid_psc=0;
        int invalid_psc=0;
        int res_change=0;
        int src_fmt, last_src_fmt=-1;
    
        int last_gn=0;
    
        for(i=0; i<p->buf_size; i++){
            code = (code<<8) + p->buf[i];
            if ((code & 0xfffffc0000) == 0x800000) {
                src_fmt= (code>>2)&3;
                if(   src_fmt != last_src_fmt
                   && last_src_fmt>0 && last_src_fmt<6
                   && src_fmt<6)
                    res_change++;
    
                if((code&0x300)==0x200 && src_fmt){
                    valid_psc++;
    
                    last_gn=0;
    
                }else
                    invalid_psc++;
                last_src_fmt= src_fmt;
    
            } else if((code & 0xffff800000) == 0x800000) {
                int gn= (code>>(23-5)) & 0x1F;
                if(gn<last_gn){
                    invalid_psc++;
                }else
                    last_gn= gn;
    
    //av_log(NULL, AV_LOG_ERROR, "h263_probe: psc:%d invalid:%d res_change:%d\n", valid_psc, invalid_psc, res_change);
    
    //h263_probe: psc:3 invalid:0 res_change:0 (1588/recent_ffmpeg_parses_mpg_incorrectly.mpg)
        if(valid_psc > 2*invalid_psc + 2*res_change + 3){
    
            return 50;
        }else if(valid_psc > 2*invalid_psc)
            return 25;
    
    #if CONFIG_H261_DEMUXER
    
        uint32_t code= -1;
        int i;
        int valid_psc=0;
        int invalid_psc=0;
        int next_gn=0;
        int src_fmt=0;
        GetBitContext gb;
    
        init_get_bits(&gb, p->buf, p->buf_size*8);
    
        for(i=0; i<p->buf_size*8; i++){
    
            if ((code & 0x01ff0000) || !(code & 0xff00)) {
                code = (code<<8) + get_bits(&gb, 8);
                i += 7;
            } else
    
    Reimar Döffinger's avatar
    Reimar Döffinger committed
                code = (code<<1) + get_bits1(&gb);
    
            if ((code & 0xffff0000) == 0x10000) {
                int gn= (code>>12)&0xf;
                if(!gn)
                    src_fmt= code&8;
                if(gn != next_gn) invalid_psc++;
                else              valid_psc++;
    
                if(src_fmt){ // CIF
                    next_gn= (gn+1     )%13;
                }else{       //QCIF
                    next_gn= (gn+1+!!gn)% 7;
                }
            }
    
            return 50;
        }else if(valid_psc > 2*invalid_psc + 2)
            return 25;
    
    #if CONFIG_DTS_DEMUXER
    
    Benjamin Larsson's avatar
    Benjamin Larsson committed
    #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;
    
    Benjamin Larsson's avatar
    Benjamin Larsson committed
    
        buf = p->buf;
    
        for(; buf < (p->buf+p->buf_size)-2; buf+=2) {
            bufp = buf;
            state = (state << 16) | bytestream_get_be16(&bufp);
    
    
            /* regular bitstream */
    
    Benjamin Larsson's avatar
    Benjamin Larsson committed
            if (state == DCA_MARKER_RAW_BE || state == DCA_MARKER_RAW_LE)
    
    Benjamin Larsson's avatar
    Benjamin Larsson committed
    
    
            /* 14 bits big-endian bitstream */
    
    Benjamin Larsson's avatar
    Benjamin Larsson committed
            if (state == DCA_MARKER_14B_BE)
                if ((bytestream_get_be16(&bufp) & 0xFFF0) == 0x07F0)
    
    Benjamin Larsson's avatar
    Benjamin Larsson committed
    
    
            /* 14 bits little-endian bitstream */
    
    Benjamin Larsson's avatar
    Benjamin Larsson committed
            if (state == DCA_MARKER_14B_LE)
                if ((bytestream_get_be16(&bufp) & 0xF0FF) == 0xF007)
    
    Benjamin Larsson's avatar
    Benjamin Larsson committed
        }
    
        sum = markers[0] + markers[1] + markers[2];
        max = markers[1] > markers[0];
        max = markers[2] > markers[max] ? 2 : max;
        if (markers[max] > 3 && p->buf_size / markers[max] < 32*1024 &&
            markers[max] * 4 > sum * 3)
            return AVPROBE_SCORE_MAX/2+1;
    
    Benjamin Larsson's avatar
    Benjamin Larsson committed
    
        return 0;
    }
    
    Benjamin Larsson's avatar
    Benjamin Larsson committed
    
    
    #if CONFIG_DIRAC_DEMUXER
    
    static int dirac_probe(AVProbeData *p)
    {
        if (AV_RL32(p->buf) == MKTAG('B', 'B', 'C', 'D'))
            return AVPROBE_SCORE_MAX;
        else
            return 0;
    }
    
    #if CONFIG_DNXHD_DEMUXER
    
    Baptiste Coudurier's avatar
    Baptiste Coudurier committed
    static int dnxhd_probe(AVProbeData *p)
    {
        static const uint8_t header[] = {0x00,0x00,0x02,0x80,0x01};
    
        int w, h, compression_id;
        if (p->buf_size < 0x2c)
            return 0;
        if (memcmp(p->buf, header, 5))
            return 0;
        h = AV_RB16(p->buf + 0x18);
        w = AV_RB16(p->buf + 0x1a);
        if (!w || !h)
            return 0;
        compression_id = AV_RB32(p->buf + 0x28);
        if (compression_id < 1237 || compression_id > 1253)
    
    Baptiste Coudurier's avatar
    Baptiste Coudurier committed
            return 0;
    
    #if CONFIG_AC3_DEMUXER || CONFIG_EAC3_DEMUXER
    
    static int ac3_eac3_probe(AVProbeData *p, enum CodecID expected_codec_id)
    
        int max_frames, first_frames = 0, frames;
    
        uint8_t *buf, *buf2, *end;
        AC3HeaderInfo hdr;
    
        enum CodecID codec_id = CODEC_ID_AC3;
    
        max_frames = 0;
        buf = p->buf;
    
    
        for(; buf < end; buf++) {
            buf2 = buf;
    
            for(frames = 0; buf2 < end; frames++) {
    
                init_get_bits(&gbc, buf2, 54);
                if(ff_ac3_parse_header(&gbc, &hdr) < 0)
    
                if(buf2 + hdr.frame_size > end ||
                   av_crc(av_crc_get_table(AV_CRC_16_ANSI), 0, buf2 + 2, hdr.frame_size - 2))
                    break;
    
                if (hdr.bitstream_id > 10)
    
                buf2 += hdr.frame_size;
            }
            max_frames = FFMAX(max_frames, frames);
            if(buf == p->buf)
                first_frames = frames;
        }
    
        if(codec_id != expected_codec_id) return 0;
    
        // keep this in sync with mp3 probe, both need to avoid
        // issues with MPEG-files!
        if   (first_frames>=4) return AVPROBE_SCORE_MAX/2+1;
        else if(max_frames>500)return AVPROBE_SCORE_MAX/2;
        else if(max_frames>=4) return AVPROBE_SCORE_MAX/4;
    
        else if(max_frames>=1) return 1;
        else                   return 0;
    
    #if CONFIG_AC3_DEMUXER
    
    static int ac3_probe(AVProbeData *p)
    {
    
        return ac3_eac3_probe(p, CODEC_ID_AC3);
    
    #if CONFIG_EAC3_DEMUXER
    
    static int eac3_probe(AVProbeData *p)
    {
    
        return ac3_eac3_probe(p, CODEC_ID_EAC3);
    
    /* Note: Do not forget to add new entries to the Makefile as well. */
    
    
    #if CONFIG_AC3_DEMUXER
    
    AVInputFormat ac3_demuxer = {
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        "ac3",
    
        NULL_IF_CONFIG_SMALL("raw AC-3"),
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        0,
    
        .flags= AVFMT_GENERIC_INDEX,
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    };
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    
    
    #if CONFIG_AC3_MUXER
    
    AVOutputFormat ac3_muxer = {
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        "ac3",
    
        NULL_IF_CONFIG_SMALL("raw AC-3"),
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        "ac3",
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        0,
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        CODEC_ID_AC3,
    
        ff_raw_write_packet,
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    };
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    
    
    #if CONFIG_DIRAC_DEMUXER
    
    AVInputFormat dirac_demuxer = {
        "dirac",
    
        NULL_IF_CONFIG_SMALL("raw Dirac"),
    
        .flags= AVFMT_GENERIC_INDEX,
        .value = CODEC_ID_DIRAC,
    };
    
    #if CONFIG_DIRAC_MUXER
    
    AVOutputFormat dirac_muxer = {
        "dirac",
    
        NULL_IF_CONFIG_SMALL("raw Dirac"),
    
        ff_raw_write_packet,
    
    #if CONFIG_DNXHD_DEMUXER
    
    Baptiste Coudurier's avatar
    Baptiste Coudurier committed
    AVInputFormat dnxhd_demuxer = {
        "dnxhd",
        NULL_IF_CONFIG_SMALL("raw DNxHD (SMPTE VC-3)"),
        0,
        dnxhd_probe,
        video_read_header,
    
    Baptiste Coudurier's avatar
    Baptiste Coudurier committed
        .flags= AVFMT_GENERIC_INDEX,
        .value = CODEC_ID_DNXHD,
    };
    #endif
    
    
    #if CONFIG_DNXHD_MUXER
    
    Baptiste Coudurier's avatar
    Baptiste Coudurier committed
    AVOutputFormat dnxhd_muxer = {
        "dnxhd",
        NULL_IF_CONFIG_SMALL("raw DNxHD (SMPTE VC-3)"),
        NULL,
        "dnxhd",
        0,
        CODEC_ID_NONE,
        CODEC_ID_DNXHD,
        NULL,
    
        ff_raw_write_packet,
    
    Baptiste Coudurier's avatar
    Baptiste Coudurier committed
        .flags= AVFMT_NOTIMESTAMPS,
    };
    #endif
    
    
    #if CONFIG_DTS_DEMUXER
    
    AVInputFormat dts_demuxer = {
    
    Benjamin Larsson's avatar
    Benjamin Larsson committed
        dts_probe,
    
        .flags= AVFMT_GENERIC_INDEX,
    
    #if CONFIG_DTS_MUXER
    
    AVOutputFormat dts_muxer = {
        "dts",
        NULL_IF_CONFIG_SMALL("raw DTS"),
        "audio/x-dca",
        "dts",
    
    Måns Rullgård's avatar
    Måns Rullgård committed
        0,
    
    Måns Rullgård's avatar
    Måns Rullgård committed
        NULL,
    
        ff_raw_write_packet,
    
    #if CONFIG_EAC3_DEMUXER
    
    AVInputFormat eac3_demuxer = {
        "eac3",
        NULL_IF_CONFIG_SMALL("raw E-AC-3"),
        0,
        eac3_probe,
        audio_read_header,
    
        .flags= AVFMT_GENERIC_INDEX,
        .extensions = "eac3",
        .value = CODEC_ID_EAC3,
    };
    #endif
    
    
    #if CONFIG_EAC3_MUXER
    
    AVOutputFormat eac3_muxer = {
        "eac3",
        NULL_IF_CONFIG_SMALL("raw E-AC-3"),
        "audio/x-eac3",
        "eac3",
        0,
        CODEC_ID_EAC3,
        CODEC_ID_NONE,
        NULL,
    
        ff_raw_write_packet,
    
        .flags= AVFMT_NOTIMESTAMPS,
    };
    #endif
    
    
    #if CONFIG_GSM_DEMUXER
    
    AVInputFormat gsm_demuxer = {
        "gsm",
    
        NULL_IF_CONFIG_SMALL("raw GSM"),
    
        .flags= AVFMT_GENERIC_INDEX,
        .extensions = "gsm",
        .value = CODEC_ID_GSM,
    };
    
    #if CONFIG_H261_DEMUXER
    
    AVInputFormat h261_demuxer = {
    
        NULL_IF_CONFIG_SMALL("raw H.261"),
    
        .flags= AVFMT_GENERIC_INDEX,
    
    #if CONFIG_H261_MUXER
    
    AVOutputFormat h261_muxer = {
    
        NULL_IF_CONFIG_SMALL("raw H.261"),
    
        ff_raw_write_packet,
    
    #if CONFIG_H263_DEMUXER
    
    AVInputFormat h263_demuxer = {
    
        NULL_IF_CONFIG_SMALL("raw H.263"),
    
        0,
        h263_probe,
        video_read_header,
    
        .flags= AVFMT_GENERIC_INDEX,
    
    //    .extensions = "h263", //FIXME remove after writing mpeg4_probe
        .value = CODEC_ID_H263,
    };
    
    #if CONFIG_H263_MUXER
    
    AVOutputFormat h263_muxer = {
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        "h263",
    
        NULL_IF_CONFIG_SMALL("raw H.263"),
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        "video/x-h263",
        "h263",
        0,
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        CODEC_ID_H263,
    
        ff_raw_write_packet,
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    };
    
    #if CONFIG_H264_DEMUXER
    
    AVInputFormat h264_demuxer = {
        "h264",
        NULL_IF_CONFIG_SMALL("raw H.264 video format"),
        0,
    
    Michael Niedermayer's avatar
    Michael Niedermayer committed
        h264_probe,
    
        .flags= AVFMT_GENERIC_INDEX,
        .extensions = "h26l,h264,264", //FIXME remove after writing mpeg4_probe
        .value = CODEC_ID_H264,
    };
    
    #if CONFIG_H264_MUXER
    
    AVOutputFormat h264_muxer = {
        "h264",
        NULL_IF_CONFIG_SMALL("raw H.264 video format"),
        NULL,
        "h264",
        0,
        CODEC_ID_NONE,
        CODEC_ID_H264,
        NULL,
    
        ff_raw_write_packet,
    
    #if CONFIG_CAVSVIDEO_MUXER
    AVOutputFormat cavsvideo_muxer = {
        "cavsvideo",
        NULL_IF_CONFIG_SMALL("raw Chinese AVS video"),
        NULL,
        "cavs",
        0,
        CODEC_ID_NONE,
        CODEC_ID_CAVS,
        NULL,
    
        ff_raw_write_packet,
    
        .flags= AVFMT_NOTIMESTAMPS,
    };
    #endif
    
    
    #if CONFIG_INGENIENT_DEMUXER
    
    AVInputFormat ingenient_demuxer = {
        "ingenient",
    
        NULL_IF_CONFIG_SMALL("raw Ingenient MJPEG"),
    
        0,
        NULL,
        video_read_header,
        ingenient_read_packet,
        .flags= AVFMT_GENERIC_INDEX,
        .extensions = "cgi", // FIXME
        .value = CODEC_ID_MJPEG,
    };
    
    #if CONFIG_M4V_DEMUXER
    
    AVInputFormat m4v_demuxer = {
    
    Michael Niedermayer's avatar
    Michael Niedermayer committed
        "m4v",
    
        NULL_IF_CONFIG_SMALL("raw MPEG-4 video format"),
    
    Michael Niedermayer's avatar
    Michael Niedermayer committed
        0,
    
        mpeg4video_probe, /** probing for MPEG-4 data */
    
    Michael Niedermayer's avatar
    Michael Niedermayer committed
        video_read_header,
    
        .flags= AVFMT_GENERIC_INDEX,
    
        .extensions = "m4v",
    
    Michael Niedermayer's avatar
    Michael Niedermayer committed
    };
    
    #if CONFIG_M4V_MUXER
    
    AVOutputFormat m4v_muxer = {
    
        NULL_IF_CONFIG_SMALL("raw MPEG-4 video format"),
    
        ff_raw_write_packet,
    
    #if CONFIG_MJPEG_DEMUXER
    
    AVInputFormat mjpeg_demuxer = {
        "mjpeg",
    
        NULL_IF_CONFIG_SMALL("raw MJPEG video"),
    
        video_read_header,
    
        .flags= AVFMT_GENERIC_INDEX,
    
        .extensions = "mjpg,mjpeg",
        .value = CODEC_ID_MJPEG,
    
    #if CONFIG_MJPEG_MUXER
    
    AVOutputFormat mjpeg_muxer = {
        "mjpeg",
    
        NULL_IF_CONFIG_SMALL("raw MJPEG video"),
    
        0,
        CODEC_ID_NONE,
    
        ff_raw_write_packet,
    
    #if CONFIG_MLP_DEMUXER
    
    AVInputFormat mlp_demuxer = {
        "mlp",
        NULL_IF_CONFIG_SMALL("raw MLP"),
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        0,
    
        .flags= AVFMT_GENERIC_INDEX,
    
        .extensions = "mlp",
        .value = CODEC_ID_MLP,
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    };
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    
    
    #if CONFIG_MLP_MUXER
    
    Ramiro Polla's avatar
    Ramiro Polla committed
    AVOutputFormat mlp_muxer = {
        "mlp",