static int asf_read_frame_header(AVFormatContext *s, AVIOContext *pb){

    ASFContext *asf = s->priv_data;

    int rsize = 1;

    int num = avio_r8(pb);

    int64_t ts0, ts1;



    asf->packet_segments--;

    asf->packet_key_frame = num >> 7;

    asf->stream_index = asf->asfid2avid[num & 0x7f];

    // sequence should be ignored!

    DO_2BITS(asf->packet_property >> 4, asf->packet_seq, 0);

    DO_2BITS(asf->packet_property >> 2, asf->packet_frag_offset, 0);

    DO_2BITS(asf->packet_property, asf->packet_replic_size, 0);

//printf("key:%d stream:%d seq:%d offset:%d replic_size:%d\n", asf->packet_key_frame, asf->stream_index, asf->packet_seq, //asf->packet_frag_offset, asf->packet_replic_size);

    if (asf->packet_replic_size >= 8) {

        asf->packet_obj_size = avio_rl32(pb);

        if(asf->packet_obj_size >= (1<<24) || asf->packet_obj_size <= 0){

            av_log(s, AV_LOG_ERROR, "packet_obj_size invalid\n");



        asf->packet_frag_timestamp = avio_rl32(pb); // timestamp

        if(asf->packet_replic_size >= 8+38+4){

//            for(i=0; i<asf->packet_replic_size-8; i++)

//                av_log(s, AV_LOG_DEBUG, "%02X ",avio_r8(pb));

//            av_log(s, AV_LOG_DEBUG, "\n");

            avio_skip(pb, 10);

            ts0= avio_rl64(pb);

            ts1= avio_rl64(pb);

            avio_skip(pb, 12);

            avio_rl32(pb);

            avio_skip(pb, asf->packet_replic_size - 8 - 38 - 4);

            if(ts0!= -1) asf->packet_frag_timestamp= ts0/10000;

            else         asf->packet_frag_timestamp= AV_NOPTS_VALUE;

        }else

            avio_skip(pb, asf->packet_replic_size - 8);

        rsize += asf->packet_replic_size; // FIXME - check validity

    } else if (asf->packet_replic_size==1){

        // multipacket - frag_offset is beginning timestamp

        asf->packet_time_start = asf->packet_frag_offset;

        asf->packet_frag_offset = 0;

        asf->packet_frag_timestamp = asf->packet_timestamp;



        asf->packet_time_delta = avio_r8(pb);

        rsize++;

    }else if(asf->packet_replic_size!=0){

        av_log(s, AV_LOG_ERROR, "unexpected packet_replic_size of %d\n", asf->packet_replic_size);







    if (asf->packet_flags & 0x01) {

        DO_2BITS(asf->packet_segsizetype >> 6, asf->packet_frag_size, 0); // 0 is illegal

        if(asf->packet_frag_size > asf->packet_size_left - rsize){

            if (asf->packet_frag_size > asf->packet_size_left - rsize + asf->packet_padsize) {

                av_log(s, AV_LOG_ERROR, "packet_frag_size is invalid (%d-%d)\n", asf->packet_size_left, rsize);


            } else {

                int diff = asf->packet_frag_size - (asf->packet_size_left - rsize);

                asf->packet_size_left += diff;

                asf->packet_padsize   -= diff;



        //printf("Fragsize %d\n", asf->packet_frag_size);

    } else {

        asf->packet_frag_size = asf->packet_size_left - rsize;

        //printf("Using rest  %d %d %d\n", asf->packet_frag_size, asf->packet_size_left, rsize);


    if (asf->packet_replic_size == 1) {

        asf->packet_multi_size = asf->packet_frag_size;

        if (asf->packet_multi_size > asf->packet_size_left)



    asf->packet_size_left -= rsize;

    //printf("___objsize____  %d   %d    rs:%d\n", asf->packet_obj_size, asf->packet_frag_offset, rsize);



    return 0;

static int asf_read_frame_header(AVFormatContext *s, AVIOContext *pb){

    ASFContext *asf = s->priv_data;

    int rsize = 1;

    int num = avio_r8(pb);

    int64_t ts0, ts1;



    asf->packet_segments--;

    asf->packet_key_frame = num >> 7;

    asf->stream_index = asf->asfid2avid[num & 0x7f];

    

    DO_2BITS(asf->packet_property >> 4, asf->packet_seq, 0);

    DO_2BITS(asf->packet_property >> 2, asf->packet_frag_offset, 0);

    DO_2BITS(asf->packet_property, asf->packet_replic_size, 0);



    if (asf->packet_replic_size >= 8) {

        asf->packet_obj_size = avio_rl32(pb);

        if(asf->packet_obj_size >= (1<<24) || asf->packet_obj_size <= 0){

            av_log(s, AV_LOG_ERROR, "packet_obj_size invalid\n");



        asf->packet_frag_timestamp = avio_rl32(pb); 

        if(asf->packet_replic_size >= 8+38+4){







            avio_skip(pb, 10);

            ts0= avio_rl64(pb);

            ts1= avio_rl64(pb);

            avio_skip(pb, 12);

            avio_rl32(pb);

            avio_skip(pb, asf->packet_replic_size - 8 - 38 - 4);

            if(ts0!= -1) asf->packet_frag_timestamp= ts0/10000;

            else         asf->packet_frag_timestamp= AV_NOPTS_VALUE;

        }else

            avio_skip(pb, asf->packet_replic_size - 8);

        rsize += asf->packet_replic_size; 

    } else if (asf->packet_replic_size==1){

        

        asf->packet_time_start = asf->packet_frag_offset;

        asf->packet_frag_offset = 0;

        asf->packet_frag_timestamp = asf->packet_timestamp;



        asf->packet_time_delta = avio_r8(pb);

        rsize++;

    }else if(asf->packet_replic_size!=0){

        av_log(s, AV_LOG_ERROR, "unexpected packet_replic_size of %d\n", asf->packet_replic_size);







    if (asf->packet_flags & 0x01) {

        DO_2BITS(asf->packet_segsizetype >> 6, asf->packet_frag_size, 0); 

        if(asf->packet_frag_size > asf->packet_size_left - rsize){

            if (asf->packet_frag_size > asf->packet_size_left - rsize + asf->packet_padsize) {

                av_log(s, AV_LOG_ERROR, "packet_frag_size is invalid (%d-%d)\n", asf->packet_size_left, rsize);


            } else {

                int diff = asf->packet_frag_size - (asf->packet_size_left - rsize);

                asf->packet_size_left += diff;

                asf->packet_padsize   -= diff;



        

    } else {

        asf->packet_frag_size = asf->packet_size_left - rsize;

        


    if (asf->packet_replic_size == 1) {

        asf->packet_multi_size = asf->packet_frag_size;

        if (asf->packet_multi_size > asf->packet_size_left)



    asf->packet_size_left -= rsize;

    



    return 0;

static int FUNC_0(AVFormatContext *VAR_0, AVIOContext *VAR_1){

    ASFContext *asf = VAR_0->priv_data;

    int VAR_2 = 1;

    int VAR_3 = avio_r8(VAR_1);

    int64_t ts0, ts1;



    asf->packet_segments--;

    asf->packet_key_frame = VAR_3 >> 7;

    asf->stream_index = asf->asfid2avid[VAR_3 & 0x7f];

    

    DO_2BITS(asf->packet_property >> 4, asf->packet_seq, 0);

    DO_2BITS(asf->packet_property >> 2, asf->packet_frag_offset, 0);

    DO_2BITS(asf->packet_property, asf->packet_replic_size, 0);



    if (asf->packet_replic_size >= 8) {

        asf->packet_obj_size = avio_rl32(VAR_1);

        if(asf->packet_obj_size >= (1<<24) || asf->packet_obj_size <= 0){

            av_log(VAR_0, AV_LOG_ERROR, "packet_obj_size invalid\n");



        asf->packet_frag_timestamp = avio_rl32(VAR_1); 

        if(asf->packet_replic_size >= 8+38+4){







            avio_skip(VAR_1, 10);

            ts0= avio_rl64(VAR_1);

            ts1= avio_rl64(VAR_1);

            avio_skip(VAR_1, 12);

            avio_rl32(VAR_1);

            avio_skip(VAR_1, asf->packet_replic_size - 8 - 38 - 4);

            if(ts0!= -1) asf->packet_frag_timestamp= ts0/10000;

            else         asf->packet_frag_timestamp= AV_NOPTS_VALUE;

        }else

            avio_skip(VAR_1, asf->packet_replic_size - 8);

        VAR_2 += asf->packet_replic_size; 

    } else if (asf->packet_replic_size==1){

        

        asf->packet_time_start = asf->packet_frag_offset;

        asf->packet_frag_offset = 0;

        asf->packet_frag_timestamp = asf->packet_timestamp;



        asf->packet_time_delta = avio_r8(VAR_1);

        VAR_2++;

    }else if(asf->packet_replic_size!=0){

        av_log(VAR_0, AV_LOG_ERROR, "unexpected packet_replic_size of %d\n", asf->packet_replic_size);







    if (asf->packet_flags & 0x01) {

        DO_2BITS(asf->packet_segsizetype >> 6, asf->packet_frag_size, 0); 

        if(asf->packet_frag_size > asf->packet_size_left - VAR_2){

            if (asf->packet_frag_size > asf->packet_size_left - VAR_2 + asf->packet_padsize) {

                av_log(VAR_0, AV_LOG_ERROR, "packet_frag_size is invalid (%d-%d)\n", asf->packet_size_left, VAR_2);


            } else {

                int VAR_4 = asf->packet_frag_size - (asf->packet_size_left - VAR_2);

                asf->packet_size_left += VAR_4;

                asf->packet_padsize   -= VAR_4;



        

    } else {

        asf->packet_frag_size = asf->packet_size_left - VAR_2;

        


    if (asf->packet_replic_size == 1) {

        asf->packet_multi_size = asf->packet_frag_size;

        if (asf->packet_multi_size > asf->packet_size_left)



    asf->packet_size_left -= VAR_2;

    



    return 0;

static int FUNC_0(AVFormatContext *VAR_0, AVIOContext *VAR_1){ ASFContext *asf = VAR_0->priv_data; int VAR_2 = 1; int VAR_3 = avio_r8(VAR_1); int64_t ts0, ts1; asf->packet_segments--; asf->packet_key_frame = VAR_3 >> 7; asf->stream_index = asf->asfid2avid[VAR_3 & 0x7f]; DO_2BITS(asf->packet_property >> 4, asf->packet_seq, 0); DO_2BITS(asf->packet_property >> 2, asf->packet_frag_offset, 0); DO_2BITS(asf->packet_property, asf->packet_replic_size, 0); if (asf->packet_replic_size >= 8) { asf->packet_obj_size = avio_rl32(VAR_1); if(asf->packet_obj_size >= (1<<24) || asf->packet_obj_size <= 0){ av_log(VAR_0, AV_LOG_ERROR, "packet_obj_size invalid\n"); asf->packet_frag_timestamp = avio_rl32(VAR_1); if(asf->packet_replic_size >= 8+38+4){ avio_skip(VAR_1, 10); ts0= avio_rl64(VAR_1); ts1= avio_rl64(VAR_1); avio_skip(VAR_1, 12); avio_rl32(VAR_1); avio_skip(VAR_1, asf->packet_replic_size - 8 - 38 - 4); if(ts0!= -1) asf->packet_frag_timestamp= ts0/10000; else         asf->packet_frag_timestamp= AV_NOPTS_VALUE; }else avio_skip(VAR_1, asf->packet_replic_size - 8); VAR_2 += asf->packet_replic_size; } else if (asf->packet_replic_size==1){ asf->packet_time_start = asf->packet_frag_offset; asf->packet_frag_offset = 0; asf->packet_frag_timestamp = asf->packet_timestamp; asf->packet_time_delta = avio_r8(VAR_1); VAR_2++; }else if(asf->packet_replic_size!=0){ av_log(VAR_0, AV_LOG_ERROR, "unexpected packet_replic_size of %d\n", asf->packet_replic_size); if (asf->packet_flags & 0x01) { DO_2BITS(asf->packet_segsizetype >> 6, asf->packet_frag_size, 0); if(asf->packet_frag_size > asf->packet_size_left - VAR_2){ if (asf->packet_frag_size > asf->packet_size_left - VAR_2 + asf->packet_padsize) { av_log(VAR_0, AV_LOG_ERROR, "packet_frag_size is invalid (%d-%d)\n", asf->packet_size_left, VAR_2); } else { int VAR_4 = asf->packet_frag_size - (asf->packet_size_left - VAR_2); asf->packet_size_left += VAR_4; asf->packet_padsize   -= VAR_4; } else { asf->packet_frag_size = asf->packet_size_left - VAR_2; if (asf->packet_replic_size == 1) { asf->packet_multi_size = asf->packet_frag_size; if (asf->packet_multi_size > asf->packet_size_left)
asf->packet_size_left -= VAR_2; return 0;