static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)

{

    AVIContext *avi = s->priv_data;

    ByteIOContext *pb = &s->pb;

    uint32_t tag, tag1, handler;

    int codec_type, stream_index, frame_period, bit_rate, scale, rate;

    unsigned int size, nb_frames;

    int i, n;

    AVStream *st;

    AVIStream *ast;

    int xan_video = 0;  /* hack to support Xan A/V */



    if (get_riff(avi, pb) < 0)

        return -1;



    /* first list tag */

    stream_index = -1;

    codec_type = -1;

    frame_period = 0;

    for(;;) {

        if (url_feof(pb))

            goto fail;

        tag = get_le32(pb);

        size = get_le32(pb);

#ifdef DEBUG

        print_tag("tag", tag, size);

#endif



        switch(tag) {

        case MKTAG('L', 'I', 'S', 'T'):

            /* ignored, except when start of video packets */

            tag1 = get_le32(pb);

#ifdef DEBUG

            print_tag("list", tag1, 0);

#endif

            if (tag1 == MKTAG('m', 'o', 'v', 'i')) {

                avi->movi_list = url_ftell(pb) - 4;

                if(size) avi->movi_end = avi->movi_list + size;

                else     avi->movi_end = url_filesize(url_fileno(pb));

#ifdef DEBUG

                printf("movi end=%Lx\n", avi->movi_end);

#endif

                goto end_of_header;

            }

            break;

        case MKTAG('d', 'm', 'l', 'h'):

	    avi->is_odml = 1;

	    url_fskip(pb, size + (size & 1));

	    break;

        case MKTAG('a', 'v', 'i', 'h'):

	    /* avi header */

            /* using frame_period is bad idea */

            frame_period = get_le32(pb);

            bit_rate = get_le32(pb) * 8;

	    url_fskip(pb, 4 * 4);

            n = get_le32(pb);

            for(i=0;i<n;i++) {

                AVIStream *ast;

                st = av_new_stream(s, i);

                if (!st)

                    goto fail;



                ast = av_mallocz(sizeof(AVIStream));

                if (!ast)

                    goto fail;

                st->priv_data = ast;

	    }

            url_fskip(pb, size - 7 * 4);

            break;

        case MKTAG('s', 't', 'r', 'h'):

            /* stream header */

            stream_index++;

            tag1 = get_le32(pb);

            handler = get_le32(pb); /* codec tag */

#ifdef DEBUG

        print_tag("strh", tag1, -1);

#endif

            switch(tag1) {

            case MKTAG('i', 'a', 'v', 's'):

	    case MKTAG('i', 'v', 'a', 's'):

                /* 

	         * After some consideration -- I don't think we 

	         * have to support anything but DV in a type1 AVIs.

	         */

	        if (s->nb_streams != 1)

		    goto fail;

	        

		if (handler != MKTAG('d', 'v', 's', 'd') &&

	            handler != MKTAG('d', 'v', 'h', 'd') &&

		    handler != MKTAG('d', 'v', 's', 'l'))

	           goto fail;

                

		ast = s->streams[0]->priv_data;

		av_freep(&s->streams[0]->codec.extradata);

		av_freep(&s->streams[0]);

		s->nb_streams = 0;

	        avi->dv_demux = dv_init_demux(s);

		if (!avi->dv_demux)

		    goto fail;

		s->streams[0]->priv_data = ast;

		url_fskip(pb, 3 * 4);

		ast->scale = get_le32(pb);

		ast->rate = get_le32(pb);

	        stream_index = s->nb_streams - 1;

		url_fskip(pb, size - 7*4);

		break;

	    case MKTAG('v', 'i', 'd', 's'):

                codec_type = CODEC_TYPE_VIDEO;



                if (stream_index >= s->nb_streams) {

                    url_fskip(pb, size - 8);

                    break;

                } 



                st = s->streams[stream_index];

                ast = st->priv_data;

                st->codec.stream_codec_tag= handler;

                

                get_le32(pb); /* flags */

                get_le16(pb); /* priority */

                get_le16(pb); /* language */

                get_le32(pb); /* XXX: initial frame ? */

                scale = get_le32(pb); /* scale */

                rate = get_le32(pb); /* rate */



                if(scale && rate){

                }else if(frame_period){

                    rate = 1000000;

                    scale = frame_period;

                }else{

                    rate = 25;

                    scale = 1;

                }

                ast->rate = rate;

                ast->scale = scale;

                av_set_pts_info(st, 64, scale, rate);

                st->codec.frame_rate = rate;

                st->codec.frame_rate_base = scale;

                get_le32(pb); /* start */

                nb_frames = get_le32(pb);

                st->start_time = 0;

                st->duration = av_rescale(nb_frames,

                    st->codec.frame_rate_base * AV_TIME_BASE,

                    st->codec.frame_rate);

		url_fskip(pb, size - 9 * 4);

                break;

            case MKTAG('a', 'u', 'd', 's'):

                {

                    unsigned int length;



                    codec_type = CODEC_TYPE_AUDIO;



                    if (stream_index >= s->nb_streams) {

                        url_fskip(pb, size - 8);

                        break;

                    } 

                    st = s->streams[stream_index];

                    ast = st->priv_data;

                    

                    get_le32(pb); /* flags */

                    get_le16(pb); /* priority */

                    get_le16(pb); /* language */

                    get_le32(pb); /* initial frame */

                    ast->scale = get_le32(pb); /* scale */

                    ast->rate = get_le32(pb);

                    if(!ast->rate)

                        ast->rate= 1; //wrong but better then 1/0

                    if(!ast->scale)

                        ast->scale= 1; //wrong but better then 1/0

                    av_set_pts_info(st, 64, ast->scale, ast->rate);

                    ast->start= get_le32(pb); /* start */

                    length = get_le32(pb); /* length, in samples or bytes */

                    get_le32(pb); /* buffer size */

                    get_le32(pb); /* quality */

                    ast->sample_size = get_le32(pb); /* sample ssize */

//av_log(NULL, AV_LOG_DEBUG, "%d %d %d %d\n", ast->scale, ast->rate, ast->sample_size, ast->start);

                    st->start_time = 0;

                    if (ast->rate != 0)

                        st->duration = (int64_t)length * AV_TIME_BASE / ast->rate;

                    url_fskip(pb, size - 12 * 4);

                }

                break;

            case MKTAG('t', 'x', 't', 's'):

                //FIXME 

                codec_type = CODEC_TYPE_DATA; //CODEC_TYPE_SUB ?  FIXME

                url_fskip(pb, size - 8);

                break;

            case MKTAG('p', 'a', 'd', 's'):

                codec_type = CODEC_TYPE_UNKNOWN;

                url_fskip(pb, size - 8);

                stream_index--;

                break;

            default:

                av_log(s, AV_LOG_ERROR, "unknown stream type %X\n", tag1);

                goto fail;

            }

            break;

        case MKTAG('s', 't', 'r', 'f'):

            /* stream header */

            if (stream_index >= s->nb_streams || avi->dv_demux) {

                url_fskip(pb, size);

            } else {

                st = s->streams[stream_index];

                switch(codec_type) {

                case CODEC_TYPE_VIDEO:

                    get_le32(pb); /* size */

                    st->codec.width = get_le32(pb);

                    st->codec.height = get_le32(pb);

                    get_le16(pb); /* panes */

                    st->codec.bits_per_sample= get_le16(pb); /* depth */

                    tag1 = get_le32(pb);

                    get_le32(pb); /* ImageSize */

                    get_le32(pb); /* XPelsPerMeter */

                    get_le32(pb); /* YPelsPerMeter */

                    get_le32(pb); /* ClrUsed */

                    get_le32(pb); /* ClrImportant */



                 if(size > 10*4 && size<(1<<30)){

                    st->codec.extradata_size= size - 10*4;

                    st->codec.extradata= av_malloc(st->codec.extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);

                    get_buffer(pb, st->codec.extradata, st->codec.extradata_size);

                 }

                    

                    if(st->codec.extradata_size & 1) //FIXME check if the encoder really did this correctly

                        get_byte(pb);



                    /* Extract palette from extradata if bpp <= 8 */

                    /* This code assumes that extradata contains only palette */

                    /* This is true for all paletted codecs implemented in ffmpeg */

                    if (st->codec.extradata_size && (st->codec.bits_per_sample <= 8)) {

                        st->codec.palctrl = av_mallocz(sizeof(AVPaletteControl));

#ifdef WORDS_BIGENDIAN

                        for (i = 0; i < FFMIN(st->codec.extradata_size, AVPALETTE_SIZE)/4; i++)

                            st->codec.palctrl->palette[i] = bswap_32(((uint32_t*)st->codec.extradata)[i]);

#else

                        memcpy(st->codec.palctrl->palette, st->codec.extradata,

                               FFMIN(st->codec.extradata_size, AVPALETTE_SIZE));

#endif

                        st->codec.palctrl->palette_changed = 1;

                    }



#ifdef DEBUG

                    print_tag("video", tag1, 0);

#endif

                    st->codec.codec_type = CODEC_TYPE_VIDEO;

                    st->codec.codec_tag = tag1;

                    st->codec.codec_id = codec_get_id(codec_bmp_tags, tag1);

                    if (st->codec.codec_id == CODEC_ID_XAN_WC4)

                        xan_video = 1;

//                    url_fskip(pb, size - 5 * 4);

                    break;

                case CODEC_TYPE_AUDIO:

                    get_wav_header(pb, &st->codec, size);

                    if (size%2) /* 2-aligned (fix for Stargate SG-1 - 3x18 - Shades of Grey.avi) */

                        url_fskip(pb, 1);

                    /* special case time: To support Xan DPCM, hardcode

                     * the format if Xxan is the video codec */

                    st->need_parsing = 1;

                    /* force parsing as several audio frames can be in

                       one packet */

                    if (xan_video)

                        st->codec.codec_id = CODEC_ID_XAN_DPCM;

                    break;

                default:

                    st->codec.codec_type = CODEC_TYPE_DATA;

                    st->codec.codec_id= CODEC_ID_NONE;

                    st->codec.codec_tag= 0;

                    url_fskip(pb, size);

                    break;

                }

            }

            break;

        default:

            /* skip tag */

            size += (size & 1);

            url_fskip(pb, size);

            break;

        }

    }

 end_of_header:

    /* check stream number */

    if (stream_index != s->nb_streams - 1) {

    fail:

        for(i=0;i<s->nb_streams;i++) {

            av_freep(&s->streams[i]->codec.extradata);

            av_freep(&s->streams[i]);

        }

        return -1;

    }



    assert(!avi->index_loaded);

    avi_load_index(s);

    avi->index_loaded = 1;

 

    return 0;

}

static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)

{

    AVIContext *avi = s->priv_data;

    ByteIOContext *pb = &s->pb;

    uint32_t tag, tag1, handler;

    int codec_type, stream_index, frame_period, bit_rate, scale, rate;

    unsigned int size, nb_frames;

    int i, n;

    AVStream *st;

    AVIStream *ast;

    int xan_video = 0;  



    if (get_riff(avi, pb) < 0)

        return -1;



    

    stream_index = -1;

    codec_type = -1;

    frame_period = 0;

    for(;;) {

        if (url_feof(pb))

            goto fail;

        tag = get_le32(pb);

        size = get_le32(pb);

#ifdef DEBUG

        print_tag("tag", tag, size);

#endif



        switch(tag) {

        case MKTAG('L', 'I', 'S', 'T'):

            

            tag1 = get_le32(pb);

#ifdef DEBUG

            print_tag("list", tag1, 0);

#endif

            if (tag1 == MKTAG('m', 'o', 'v', 'i')) {

                avi->movi_list = url_ftell(pb) - 4;

                if(size) avi->movi_end = avi->movi_list + size;

                else     avi->movi_end = url_filesize(url_fileno(pb));

#ifdef DEBUG

                printf("movi end=%Lx\n", avi->movi_end);

#endif

                goto end_of_header;

            }

            break;

        case MKTAG('d', 'm', 'l', 'h'):

	    avi->is_odml = 1;

	    url_fskip(pb, size + (size & 1));

	    break;

        case MKTAG('a', 'v', 'i', 'h'):

	    

            

            frame_period = get_le32(pb);

            bit_rate = get_le32(pb) * 8;

	    url_fskip(pb, 4 * 4);

            n = get_le32(pb);

            for(i=0;i<n;i++) {

                AVIStream *ast;

                st = av_new_stream(s, i);

                if (!st)

                    goto fail;



                ast = av_mallocz(sizeof(AVIStream));

                if (!ast)

                    goto fail;

                st->priv_data = ast;

	    }

            url_fskip(pb, size - 7 * 4);

            break;

        case MKTAG('s', 't', 'r', 'h'):

            

            stream_index++;

            tag1 = get_le32(pb);

            handler = get_le32(pb); 

#ifdef DEBUG

        print_tag("strh", tag1, -1);

#endif

            switch(tag1) {

            case MKTAG('i', 'a', 'v', 's'):

	    case MKTAG('i', 'v', 'a', 's'):

                







	        if (s->nb_streams != 1)

		    goto fail;

	        

		if (handler != MKTAG('d', 'v', 's', 'd') &&

	            handler != MKTAG('d', 'v', 'h', 'd') &&

		    handler != MKTAG('d', 'v', 's', 'l'))

	           goto fail;

                

		ast = s->streams[0]->priv_data;

		av_freep(&s->streams[0]->codec.extradata);

		av_freep(&s->streams[0]);

		s->nb_streams = 0;

	        avi->dv_demux = dv_init_demux(s);

		if (!avi->dv_demux)

		    goto fail;

		s->streams[0]->priv_data = ast;

		url_fskip(pb, 3 * 4);

		ast->scale = get_le32(pb);

		ast->rate = get_le32(pb);

	        stream_index = s->nb_streams - 1;

		url_fskip(pb, size - 7*4);

		break;

	    case MKTAG('v', 'i', 'd', 's'):

                codec_type = CODEC_TYPE_VIDEO;



                if (stream_index >= s->nb_streams) {

                    url_fskip(pb, size - 8);

                    break;

                } 



                st = s->streams[stream_index];

                ast = st->priv_data;

                st->codec.stream_codec_tag= handler;

                

                get_le32(pb); 

                get_le16(pb); 

                get_le16(pb); 

                get_le32(pb); 

                scale = get_le32(pb); 

                rate = get_le32(pb); 



                if(scale && rate){

                }else if(frame_period){

                    rate = 1000000;

                    scale = frame_period;

                }else{

                    rate = 25;

                    scale = 1;

                }

                ast->rate = rate;

                ast->scale = scale;

                av_set_pts_info(st, 64, scale, rate);

                st->codec.frame_rate = rate;

                st->codec.frame_rate_base = scale;

                get_le32(pb); 

                nb_frames = get_le32(pb);

                st->start_time = 0;

                st->duration = av_rescale(nb_frames,

                    st->codec.frame_rate_base * AV_TIME_BASE,

                    st->codec.frame_rate);

		url_fskip(pb, size - 9 * 4);

                break;

            case MKTAG('a', 'u', 'd', 's'):

                {

                    unsigned int length;



                    codec_type = CODEC_TYPE_AUDIO;



                    if (stream_index >= s->nb_streams) {

                        url_fskip(pb, size - 8);

                        break;

                    } 

                    st = s->streams[stream_index];

                    ast = st->priv_data;

                    

                    get_le32(pb); 

                    get_le16(pb); 

                    get_le16(pb); 

                    get_le32(pb); 

                    ast->scale = get_le32(pb); 

                    ast->rate = get_le32(pb);

                    if(!ast->rate)

                        ast->rate= 1; 

                    if(!ast->scale)

                        ast->scale= 1; 

                    av_set_pts_info(st, 64, ast->scale, ast->rate);

                    ast->start= get_le32(pb); 

                    length = get_le32(pb); 

                    get_le32(pb); 

                    get_le32(pb); 

                    ast->sample_size = get_le32(pb); 



                    st->start_time = 0;

                    if (ast->rate != 0)

                        st->duration = (int64_t)length * AV_TIME_BASE / ast->rate;

                    url_fskip(pb, size - 12 * 4);

                }

                break;

            case MKTAG('t', 'x', 't', 's'):

                

                codec_type = CODEC_TYPE_DATA; 

                url_fskip(pb, size - 8);

                break;

            case MKTAG('p', 'a', 'd', 's'):

                codec_type = CODEC_TYPE_UNKNOWN;

                url_fskip(pb, size - 8);

                stream_index--;

                break;

            default:

                av_log(s, AV_LOG_ERROR, "unknown stream type %X\n", tag1);

                goto fail;

            }

            break;

        case MKTAG('s', 't', 'r', 'f'):

            

            if (stream_index >= s->nb_streams || avi->dv_demux) {

                url_fskip(pb, size);

            } else {

                st = s->streams[stream_index];

                switch(codec_type) {

                case CODEC_TYPE_VIDEO:

                    get_le32(pb); 

                    st->codec.width = get_le32(pb);

                    st->codec.height = get_le32(pb);

                    get_le16(pb); 

                    st->codec.bits_per_sample= get_le16(pb); 

                    tag1 = get_le32(pb);

                    get_le32(pb); 

                    get_le32(pb); 

                    get_le32(pb); 

                    get_le32(pb); 

                    get_le32(pb); 



                 if(size > 10*4 && size<(1<<30)){

                    st->codec.extradata_size= size - 10*4;

                    st->codec.extradata= av_malloc(st->codec.extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);

                    get_buffer(pb, st->codec.extradata, st->codec.extradata_size);

                 }

                    

                    if(st->codec.extradata_size & 1) check if the encoder really did this correctly

                        get_byte(pb);



                    

                    

                    

                    if (st->codec.extradata_size && (st->codec.bits_per_sample <= 8)) {

                        st->codec.palctrl = av_mallocz(sizeof(AVPaletteControl));

#ifdef WORDS_BIGENDIAN

                        for (i = 0; i < FFMIN(st->codec.extradata_size, AVPALETTE_SIZE)/4; i++)

                            st->codec.palctrl->palette[i] = bswap_32(((uint32_t*)st->codec.extradata)[i]);

#else

                        memcpy(st->codec.palctrl->palette, st->codec.extradata,

                               FFMIN(st->codec.extradata_size, AVPALETTE_SIZE));

#endif

                        st->codec.palctrl->palette_changed = 1;

                    }



#ifdef DEBUG

                    print_tag("video", tag1, 0);

#endif

                    st->codec.codec_type = CODEC_TYPE_VIDEO;

                    st->codec.codec_tag = tag1;

                    st->codec.codec_id = codec_get_id(codec_bmp_tags, tag1);

                    if (st->codec.codec_id == CODEC_ID_XAN_WC4)

                        xan_video = 1;



                    break;

                case CODEC_TYPE_AUDIO:

                    get_wav_header(pb, &st->codec, size);

                    if (size%2) 

                        url_fskip(pb, 1);

                    



                    st->need_parsing = 1;

                    



                    if (xan_video)

                        st->codec.codec_id = CODEC_ID_XAN_DPCM;

                    break;

                default:

                    st->codec.codec_type = CODEC_TYPE_DATA;

                    st->codec.codec_id= CODEC_ID_NONE;

                    st->codec.codec_tag= 0;

                    url_fskip(pb, size);

                    break;

                }

            }

            break;

        default:

            

            size += (size & 1);

            url_fskip(pb, size);

            break;

        }

    }

 end_of_header:

    

    if (stream_index != s->nb_streams - 1) {

    fail:

        for(i=0;i<s->nb_streams;i++) {

            av_freep(&s->streams[i]->codec.extradata);

            av_freep(&s->streams[i]);

        }

        return -1;

    }



    assert(!avi->index_loaded);

    avi_load_index(s);

    avi->index_loaded = 1;

 

    return 0;

}

                    st->codec.frame_rate_base * AV_TIME_BASE,
static int FUNC_0(AVFormatContext *VAR_0, AVFormatParameters *VAR_1)

{

    AVIContext *avi = VAR_0->priv_data;

    ByteIOContext *pb = &VAR_0->pb;

    uint32_t tag, tag1, handler;

    int VAR_2, VAR_3, VAR_4, VAR_5, VAR_6, VAR_7;

    unsigned int VAR_8, VAR_9;

    int VAR_10, VAR_11;

    AVStream *st;

    AVIStream *ast;

    int VAR_12 = 0;  



    if (get_riff(avi, pb) < 0)

        return -1;



    

    VAR_3 = -1;

    VAR_2 = -1;

    VAR_4 = 0;

    for(;;) {

        if (url_feof(pb))

            goto fail;

        tag = get_le32(pb);

        VAR_8 = get_le32(pb);

#ifdef DEBUG

        print_tag("tag", tag, VAR_8);

#endif



        switch(tag) {

        case MKTAG('L', 'I', 'S', 'T'):

            

            tag1 = get_le32(pb);

#ifdef DEBUG

            print_tag("list", tag1, 0);

#endif

            if (tag1 == MKTAG('m', 'o', 'v', 'VAR_10')) {

                avi->movi_list = url_ftell(pb) - 4;

                if(VAR_8) avi->movi_end = avi->movi_list + VAR_8;

                else     avi->movi_end = url_filesize(url_fileno(pb));

#ifdef DEBUG

                printf("movi end=%Lx\VAR_11", avi->movi_end);

#endif

                goto end_of_header;

            }

            break;

        case MKTAG('d', 'm', 'l', 'h'):

	    avi->is_odml = 1;

	    url_fskip(pb, VAR_8 + (VAR_8 & 1));

	    break;

        case MKTAG('a', 'v', 'VAR_10', 'h'):

	    

            

            VAR_4 = get_le32(pb);

            VAR_5 = get_le32(pb) * 8;

	    url_fskip(pb, 4 * 4);

            VAR_11 = get_le32(pb);

            for(VAR_10=0;VAR_10<VAR_11;VAR_10++) {

                AVIStream *ast;

                st = av_new_stream(VAR_0, VAR_10);

                if (!st)

                    goto fail;



                ast = av_mallocz(sizeof(AVIStream));

                if (!ast)

                    goto fail;

                st->priv_data = ast;

	    }

            url_fskip(pb, VAR_8 - 7 * 4);

            break;

        case MKTAG('VAR_0', 't', 'r', 'h'):

            

            VAR_3++;

            tag1 = get_le32(pb);

            handler = get_le32(pb); 

#ifdef DEBUG

        print_tag("strh", tag1, -1);

#endif

            switch(tag1) {

            case MKTAG('VAR_10', 'a', 'v', 'VAR_0'):

	    case MKTAG('VAR_10', 'v', 'a', 'VAR_0'):

                







	        if (VAR_0->nb_streams != 1)

		    goto fail;

	        

		if (handler != MKTAG('d', 'v', 'VAR_0', 'd') &&

	            handler != MKTAG('d', 'v', 'h', 'd') &&

		    handler != MKTAG('d', 'v', 'VAR_0', 'l'))

	           goto fail;

                

		ast = VAR_0->streams[0]->priv_data;

		av_freep(&VAR_0->streams[0]->codec.extradata);

		av_freep(&VAR_0->streams[0]);

		VAR_0->nb_streams = 0;

	        avi->dv_demux = dv_init_demux(VAR_0);

		if (!avi->dv_demux)

		    goto fail;

		VAR_0->streams[0]->priv_data = ast;

		url_fskip(pb, 3 * 4);

		ast->VAR_6 = get_le32(pb);

		ast->VAR_7 = get_le32(pb);

	        VAR_3 = VAR_0->nb_streams - 1;

		url_fskip(pb, VAR_8 - 7*4);

		break;

	    case MKTAG('v', 'VAR_10', 'd', 'VAR_0'):

                VAR_2 = CODEC_TYPE_VIDEO;



                if (VAR_3 >= VAR_0->nb_streams) {

                    url_fskip(pb, VAR_8 - 8);

                    break;

                } 



                st = VAR_0->streams[VAR_3];

                ast = st->priv_data;

                st->codec.stream_codec_tag= handler;

                

                get_le32(pb); 

                get_le16(pb); 

                get_le16(pb); 

                get_le32(pb); 

                VAR_6 = get_le32(pb); 

                VAR_7 = get_le32(pb); 



                if(VAR_6 && VAR_7){

                }else if(VAR_4){

                    VAR_7 = 1000000;

                    VAR_6 = VAR_4;

                }else{

                    VAR_7 = 25;

                    VAR_6 = 1;

                }

                ast->VAR_7 = VAR_7;

                ast->VAR_6 = VAR_6;

                av_set_pts_info(st, 64, VAR_6, VAR_7);

                st->codec.frame_rate = VAR_7;

                st->codec.frame_rate_base = VAR_6;

                get_le32(pb); 

                VAR_9 = get_le32(pb);

                st->start_time = 0;

                st->duration = av_rescale(VAR_9,

                    st->codec.frame_rate_base * AV_TIME_BASE,

                    st->codec.frame_rate);

		url_fskip(pb, VAR_8 - 9 * 4);

                break;

            case MKTAG('a', 'u', 'd', 'VAR_0'):

                {

                    unsigned int VAR_13;



                    VAR_2 = CODEC_TYPE_AUDIO;



                    if (VAR_3 >= VAR_0->nb_streams) {

                        url_fskip(pb, VAR_8 - 8);

                        break;

                    } 

                    st = VAR_0->streams[VAR_3];

                    ast = st->priv_data;

                    

                    get_le32(pb); 

                    get_le16(pb); 

                    get_le16(pb); 

                    get_le32(pb); 

                    ast->VAR_6 = get_le32(pb); 

                    ast->VAR_7 = get_le32(pb);

                    if(!ast->VAR_7)

                        ast->VAR_7= 1; 

                    if(!ast->VAR_6)

                        ast->VAR_6= 1; 

                    av_set_pts_info(st, 64, ast->VAR_6, ast->VAR_7);

                    ast->start= get_le32(pb); 

                    VAR_13 = get_le32(pb); 

                    get_le32(pb); 

                    get_le32(pb); 

                    ast->sample_size = get_le32(pb); 



                    st->start_time = 0;

                    if (ast->VAR_7 != 0)

                        st->duration = (int64_t)VAR_13 * AV_TIME_BASE / ast->VAR_7;

                    url_fskip(pb, VAR_8 - 12 * 4);

                }

                break;

            case MKTAG('t', 'x', 't', 'VAR_0'):

                

                VAR_2 = CODEC_TYPE_DATA; 

                url_fskip(pb, VAR_8 - 8);

                break;

            case MKTAG('p', 'a', 'd', 'VAR_0'):

                VAR_2 = CODEC_TYPE_UNKNOWN;

                url_fskip(pb, VAR_8 - 8);

                VAR_3--;

                break;

            default:

                av_log(VAR_0, AV_LOG_ERROR, "unknown stream type %X\VAR_11", tag1);

                goto fail;

            }

            break;

        case MKTAG('VAR_0', 't', 'r', 'f'):

            

            if (VAR_3 >= VAR_0->nb_streams || avi->dv_demux) {

                url_fskip(pb, VAR_8);

            } else {

                st = VAR_0->streams[VAR_3];

                switch(VAR_2) {

                case CODEC_TYPE_VIDEO:

                    get_le32(pb); 

                    st->codec.width = get_le32(pb);

                    st->codec.height = get_le32(pb);

                    get_le16(pb); 

                    st->codec.bits_per_sample= get_le16(pb); 

                    tag1 = get_le32(pb);

                    get_le32(pb); 

                    get_le32(pb); 

                    get_le32(pb); 

                    get_le32(pb); 

                    get_le32(pb); 



                 if(VAR_8 > 10*4 && VAR_8<(1<<30)){

                    st->codec.extradata_size= VAR_8 - 10*4;

                    st->codec.extradata= av_malloc(st->codec.extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);

                    get_buffer(pb, st->codec.extradata, st->codec.extradata_size);

                 }

                    

                    if(st->codec.extradata_size & 1) check if the encoder really did this correctly

                        get_byte(pb);



                    

                    

                    

                    if (st->codec.extradata_size && (st->codec.bits_per_sample <= 8)) {

                        st->codec.palctrl = av_mallocz(sizeof(AVPaletteControl));

#ifdef WORDS_BIGENDIAN

                        for (VAR_10 = 0; VAR_10 < FFMIN(st->codec.extradata_size, AVPALETTE_SIZE)/4; VAR_10++)

                            st->codec.palctrl->palette[VAR_10] = bswap_32(((uint32_t*)st->codec.extradata)[VAR_10]);

#else

                        memcpy(st->codec.palctrl->palette, st->codec.extradata,

                               FFMIN(st->codec.extradata_size, AVPALETTE_SIZE));

#endif

                        st->codec.palctrl->palette_changed = 1;

                    }



#ifdef DEBUG

                    print_tag("video", tag1, 0);

#endif

                    st->codec.VAR_2 = CODEC_TYPE_VIDEO;

                    st->codec.codec_tag = tag1;

                    st->codec.codec_id = codec_get_id(codec_bmp_tags, tag1);

                    if (st->codec.codec_id == CODEC_ID_XAN_WC4)

                        VAR_12 = 1;



                    break;

                case CODEC_TYPE_AUDIO:

                    get_wav_header(pb, &st->codec, VAR_8);

                    if (VAR_8%2) 

                        url_fskip(pb, 1);

                    



                    st->need_parsing = 1;

                    



                    if (VAR_12)

                        st->codec.codec_id = CODEC_ID_XAN_DPCM;

                    break;

                default:

                    st->codec.VAR_2 = CODEC_TYPE_DATA;

                    st->codec.codec_id= CODEC_ID_NONE;

                    st->codec.codec_tag= 0;

                    url_fskip(pb, VAR_8);

                    break;

                }

            }

            break;

        default:

            

            VAR_8 += (VAR_8 & 1);

            url_fskip(pb, VAR_8);

            break;

        }

    }

 end_of_header:

    

    if (VAR_3 != VAR_0->nb_streams - 1) {

    fail:

        for(VAR_10=0;VAR_10<VAR_0->nb_streams;VAR_10++) {

            av_freep(&VAR_0->streams[VAR_10]->codec.extradata);

            av_freep(&VAR_0->streams[VAR_10]);

        }

        return -1;

    }



    assert(!avi->index_loaded);

    avi_load_index(VAR_0);

    avi->index_loaded = 1;

 

    return 0;

}

static int FUNC_0(AVFormatContext *VAR_0, AVFormatParameters *VAR_1)
{ AVIContext *avi = VAR_0->priv_data; ByteIOContext *pb = &VAR_0->pb; uint32_t tag, tag1, handler; int VAR_2, VAR_3, VAR_4, VAR_5, VAR_6, VAR_7; unsigned int VAR_8, VAR_9; int VAR_10, VAR_11; AVStream *st; AVIStream *ast; int VAR_12 = 0; if (get_riff(avi, pb) < 0)
return -1; VAR_3 = -1; VAR_2 = -1; VAR_4 = 0; for(;;) { if (url_feof(pb))
goto fail; tag = get_le32(pb); VAR_8 = get_le32(pb); #ifdef DEBUG
print_tag("tag", tag, VAR_8); #endif
switch(tag) { case MKTAG('L', 'I', 'S', 'T'):
tag1 = get_le32(pb); #ifdef DEBUG
print_tag("list", tag1, 0); #endif
if (tag1 == MKTAG('m', 'o', 'v', 'VAR_10')) { avi->movi_list = url_ftell(pb) - 4; if(VAR_8) avi->movi_end = avi->movi_list + VAR_8; else     avi->movi_end = url_filesize(url_fileno(pb)); #ifdef DEBUG
printf("movi end=%Lx\VAR_11", avi->movi_end); #endif
goto end_of_header; } break; case MKTAG('d', 'm', 'l', 'h'):
avi->is_odml = 1; url_fskip(pb, VAR_8 + (VAR_8 & 1)); break; case MKTAG('a', 'v', 'VAR_10', 'h'):
VAR_4 = get_le32(pb); VAR_5 = get_le32(pb) * 8; url_fskip(pb, 4 * 4); VAR_11 = get_le32(pb); for(VAR_10=0;VAR_10<VAR_11;VAR_10++) { AVIStream *ast; st = av_new_stream(VAR_0, VAR_10); if (!st)
goto fail; ast = av_mallocz(sizeof(AVIStream)); if (!ast)
goto fail; st->priv_data = ast; } url_fskip(pb, VAR_8 - 7 * 4); break; case MKTAG('VAR_0', 't', 'r', 'h'):
VAR_3++; tag1 = get_le32(pb); handler = get_le32(pb); #ifdef DEBUG
print_tag("strh", tag1, -1); #endif
switch(tag1) { case MKTAG('VAR_10', 'a', 'v', 'VAR_0'):
case MKTAG('VAR_10', 'v', 'a', 'VAR_0'):
if (VAR_0->nb_streams != 1)
goto fail; if (handler != MKTAG('d', 'v', 'VAR_0', 'd') &&
handler != MKTAG('d', 'v', 'h', 'd') &&
handler != MKTAG('d', 'v', 'VAR_0', 'l'))
goto fail; ast = VAR_0->streams[0]->priv_data; av_freep(&VAR_0->streams[0]->codec.extradata); av_freep(&VAR_0->streams[0]); VAR_0->nb_streams = 0; avi->dv_demux = dv_init_demux(VAR_0); if (!avi->dv_demux)
goto fail; VAR_0->streams[0]->priv_data = ast; url_fskip(pb, 3 * 4); ast->VAR_6 = get_le32(pb); ast->VAR_7 = get_le32(pb); VAR_3 = VAR_0->nb_streams - 1; url_fskip(pb, VAR_8 - 7*4); break; case MKTAG('v', 'VAR_10', 'd', 'VAR_0'):
VAR_2 = CODEC_TYPE_VIDEO; if (VAR_3 >= VAR_0->nb_streams) { url_fskip(pb, VAR_8 - 8); break; } st = VAR_0->streams[VAR_3]; ast = st->priv_data; st->codec.stream_codec_tag= handler; get_le32(pb); get_le16(pb); get_le16(pb); get_le32(pb); VAR_6 = get_le32(pb); VAR_7 = get_le32(pb); if(VAR_6 && VAR_7){ }else if(VAR_4){ VAR_7 = 1000000; VAR_6 = VAR_4; }else{ VAR_7 = 25; VAR_6 = 1; } ast->VAR_7 = VAR_7; ast->VAR_6 = VAR_6; av_set_pts_info(st, 64, VAR_6, VAR_7); st->codec.frame_rate = VAR_7; st->codec.frame_rate_base = VAR_6; get_le32(pb); VAR_9 = get_le32(pb); st->start_time = 0; st->duration = av_rescale(VAR_9,
st->codec.frame_rate_base * AV_TIME_BASE,
st->codec.frame_rate); url_fskip(pb, VAR_8 - 9 * 4); break; case MKTAG('a', 'u', 'd', 'VAR_0'):
{ unsigned int VAR_13; VAR_2 = CODEC_TYPE_AUDIO; if (VAR_3 >= VAR_0->nb_streams) { url_fskip(pb, VAR_8 - 8); break; } st = VAR_0->streams[VAR_3]; ast = st->priv_data; get_le32(pb); get_le16(pb); get_le16(pb); get_le32(pb); ast->VAR_6 = get_le32(pb); ast->VAR_7 = get_le32(pb); if(!ast->VAR_7)
ast->VAR_7= 1; if(!ast->VAR_6)
ast->VAR_6= 1; av_set_pts_info(st, 64, ast->VAR_6, ast->VAR_7); ast->start= get_le32(pb); VAR_13 = get_le32(pb); get_le32(pb); get_le32(pb); ast->sample_size = get_le32(pb); st->start_time = 0; if (ast->VAR_7 != 0)
st->duration = (int64_t)VAR_13 * AV_TIME_BASE / ast->VAR_7; url_fskip(pb, VAR_8 - 12 * 4); } break; case MKTAG('t', 'x', 't', 'VAR_0'):
VAR_2 = CODEC_TYPE_DATA; url_fskip(pb, VAR_8 - 8); break; case MKTAG('p', 'a', 'd', 'VAR_0'):
VAR_2 = CODEC_TYPE_UNKNOWN; url_fskip(pb, VAR_8 - 8); VAR_3--; break; default:
av_log(VAR_0, AV_LOG_ERROR, "unknown stream type %X\VAR_11", tag1); goto fail; } break; case MKTAG('VAR_0', 't', 'r', 'f'):
if (VAR_3 >= VAR_0->nb_streams || avi->dv_demux) { url_fskip(pb, VAR_8); } else { st = VAR_0->streams[VAR_3]; switch(VAR_2) { case CODEC_TYPE_VIDEO:
get_le32(pb); st->codec.width = get_le32(pb); st->codec.height = get_le32(pb); get_le16(pb); st->codec.bits_per_sample= get_le16(pb); tag1 = get_le32(pb); get_le32(pb); get_le32(pb); get_le32(pb); get_le32(pb); get_le32(pb); if(VAR_8 > 10*4 && VAR_8<(1<<30)){ st->codec.extradata_size= VAR_8 - 10*4; st->codec.extradata= av_malloc(st->codec.extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); get_buffer(pb, st->codec.extradata, st->codec.extradata_size); } if(st->codec.extradata_size & 1) check if the encoder really did this correctly
get_byte(pb); if (st->codec.extradata_size && (st->codec.bits_per_sample <= 8)) { st->codec.palctrl = av_mallocz(sizeof(AVPaletteControl)); #ifdef WORDS_BIGENDIAN
for (VAR_10 = 0; VAR_10 < FFMIN(st->codec.extradata_size, AVPALETTE_SIZE)/4; VAR_10++) st->codec.palctrl->palette[VAR_10] = bswap_32(((uint32_t*)st->codec.extradata)[VAR_10]); #else
memcpy(st->codec.palctrl->palette, st->codec.extradata,
FFMIN(st->codec.extradata_size, AVPALETTE_SIZE)); #endif
st->codec.palctrl->palette_changed = 1; } #ifdef DEBUG
print_tag("video", tag1, 0); #endif
st->codec.VAR_2 = CODEC_TYPE_VIDEO; st->codec.codec_tag = tag1; st->codec.codec_id = codec_get_id(codec_bmp_tags, tag1); if (st->codec.codec_id == CODEC_ID_XAN_WC4)
VAR_12 = 1; break; case CODEC_TYPE_AUDIO:
get_wav_header(pb, &st->codec, VAR_8); if (VAR_8%2)
url_fskip(pb, 1); st->need_parsing = 1; if (VAR_12)
st->codec.codec_id = CODEC_ID_XAN_DPCM; break; default:
st->codec.VAR_2 = CODEC_TYPE_DATA; st->codec.codec_id= CODEC_ID_NONE; st->codec.codec_tag= 0; url_fskip(pb, VAR_8); break; } } break; default:
VAR_8 += (VAR_8 & 1); url_fskip(pb, VAR_8); break; } } end_of_header:
if (VAR_3 != VAR_0->nb_streams - 1) { fail:
for(VAR_10=0;VAR_10<VAR_0->nb_streams;VAR_10++) { av_freep(&VAR_0->streams[VAR_10]->codec.extradata); av_freep(&VAR_0->streams[VAR_10]); } return -1; } assert(!avi->index_loaded); avi_load_index(VAR_0); avi->index_loaded = 1; return 0; }