static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)

{

    int ret, i, type, size, pts, flags, is_audio, next, pos;

    AVStream *st = NULL;



 for(;;){

    pos = url_ftell(s->pb);

    url_fskip(s->pb, 4); /* size of previous packet */

    type = get_byte(s->pb);

    size = get_be24(s->pb);

    pts = get_be24(s->pb);

    pts |= get_byte(s->pb) << 24;

//    av_log(s, AV_LOG_DEBUG, "type:%d, size:%d, pts:%d\n", type, size, pts);

    if (url_feof(s->pb))

        return AVERROR(EIO);

    url_fskip(s->pb, 3); /* stream id, always 0 */

    flags = 0;



    if(size == 0)

        continue;



    next= size + url_ftell(s->pb);



    if (type == FLV_TAG_TYPE_AUDIO) {

        is_audio=1;

        flags = get_byte(s->pb);

    } else if (type == FLV_TAG_TYPE_VIDEO) {

        is_audio=0;

        flags = get_byte(s->pb);

    } else {

        if (type == FLV_TAG_TYPE_META && size > 13+1+4)

            flv_read_metabody(s, next);

        else /* skip packet */

            av_log(s, AV_LOG_ERROR, "skipping flv packet: type %d, size %d, flags %d\n", type, size, flags);

        url_fseek(s->pb, next, SEEK_SET);

        continue;

    }



    /* now find stream */

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

        st = s->streams[i];

        if (st->id == is_audio)

            break;

    }

    if(i == s->nb_streams){

        av_log(NULL, AV_LOG_ERROR, "invalid stream\n");

        st= create_stream(s, is_audio);

        s->ctx_flags &= ~AVFMTCTX_NOHEADER;

    }

//    av_log(NULL, AV_LOG_DEBUG, "%d %X %d \n", is_audio, flags, st->discard);

    if(  (st->discard >= AVDISCARD_NONKEY && !((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY ||         is_audio))

       ||(st->discard >= AVDISCARD_BIDIR  &&  ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_DISP_INTER && !is_audio))

       || st->discard >= AVDISCARD_ALL

       ){

        url_fseek(s->pb, next, SEEK_SET);

        continue;

    }

    if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY)

        av_add_index_entry(st, pos, pts, size, 0, AVINDEX_KEYFRAME);

    break;

 }



    // if not streamed and no duration from metadata then seek to end to find the duration from the timestamps

    if(!url_is_streamed(s->pb) && s->duration==AV_NOPTS_VALUE){

        int size;

        const int pos= url_ftell(s->pb);

        const int fsize= url_fsize(s->pb);

        url_fseek(s->pb, fsize-4, SEEK_SET);

        size= get_be32(s->pb);

        url_fseek(s->pb, fsize-3-size, SEEK_SET);

        if(size == get_be24(s->pb) + 11){

            s->duration= get_be24(s->pb) * (int64_t)AV_TIME_BASE / 1000;

        }

        url_fseek(s->pb, pos, SEEK_SET);

    }



    if(is_audio){

        if(!st->codec->sample_rate || !st->codec->bits_per_sample || (!st->codec->codec_id && !st->codec->codec_tag)) {

            st->codec->channels = (flags & FLV_AUDIO_CHANNEL_MASK) == FLV_STEREO ? 2 : 1;

            if((flags & FLV_AUDIO_CODECID_MASK) == FLV_CODECID_NELLYMOSER_8HZ_MONO)

                st->codec->sample_rate= 8000;

            else

                st->codec->sample_rate = (44100 << ((flags & FLV_AUDIO_SAMPLERATE_MASK) >> FLV_AUDIO_SAMPLERATE_OFFSET) >> 3);

            st->codec->bits_per_sample = (flags & FLV_AUDIO_SAMPLESIZE_MASK) ? 16 : 8;

            flv_set_audio_codec(s, st, flags & FLV_AUDIO_CODECID_MASK);

        }

    }else{

        size -= flv_set_video_codec(s, st, flags & FLV_VIDEO_CODECID_MASK);

    }



    ret= av_get_packet(s->pb, pkt, size - 1);

    if (ret <= 0) {

        return AVERROR(EIO);

    }

    /* note: we need to modify the packet size here to handle the last

       packet */

    pkt->size = ret;

    pkt->pts = pts;

    pkt->stream_index = st->index;



    if (is_audio || ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY))

        pkt->flags |= PKT_FLAG_KEY;



    return ret;

}

static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)

{

    int ret, i, type, size, pts, flags, is_audio, next, pos;

    AVStream *st = NULL;



 for(;;){

    pos = url_ftell(s->pb);

    url_fskip(s->pb, 4); 

    type = get_byte(s->pb);

    size = get_be24(s->pb);

    pts = get_be24(s->pb);

    pts |= get_byte(s->pb) << 24;



    if (url_feof(s->pb))

        return AVERROR(EIO);

    url_fskip(s->pb, 3); 

    flags = 0;



    if(size == 0)

        continue;



    next= size + url_ftell(s->pb);



    if (type == FLV_TAG_TYPE_AUDIO) {

        is_audio=1;

        flags = get_byte(s->pb);

    } else if (type == FLV_TAG_TYPE_VIDEO) {

        is_audio=0;

        flags = get_byte(s->pb);

    } else {

        if (type == FLV_TAG_TYPE_META && size > 13+1+4)

            flv_read_metabody(s, next);

        else 

            av_log(s, AV_LOG_ERROR, "skipping flv packet: type %d, size %d, flags %d\n", type, size, flags);

        url_fseek(s->pb, next, SEEK_SET);

        continue;

    }



    

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

        st = s->streams[i];

        if (st->id == is_audio)

            break;

    }

    if(i == s->nb_streams){

        av_log(NULL, AV_LOG_ERROR, "invalid stream\n");

        st= create_stream(s, is_audio);

        s->ctx_flags &= ~AVFMTCTX_NOHEADER;

    }



    if(  (st->discard >= AVDISCARD_NONKEY && !((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY ||         is_audio))

       ||(st->discard >= AVDISCARD_BIDIR  &&  ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_DISP_INTER && !is_audio))

       || st->discard >= AVDISCARD_ALL

       ){

        url_fseek(s->pb, next, SEEK_SET);

        continue;

    }

    if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY)

        av_add_index_entry(st, pos, pts, size, 0, AVINDEX_KEYFRAME);

    break;

 }



    

    if(!url_is_streamed(s->pb) && s->duration==AV_NOPTS_VALUE){

        int size;

        const int pos= url_ftell(s->pb);

        const int fsize= url_fsize(s->pb);

        url_fseek(s->pb, fsize-4, SEEK_SET);

        size= get_be32(s->pb);

        url_fseek(s->pb, fsize-3-size, SEEK_SET);

        if(size == get_be24(s->pb) + 11){

            s->duration= get_be24(s->pb) * (int64_t)AV_TIME_BASE / 1000;

        }

        url_fseek(s->pb, pos, SEEK_SET);

    }



    if(is_audio){

        if(!st->codec->sample_rate || !st->codec->bits_per_sample || (!st->codec->codec_id && !st->codec->codec_tag)) {

            st->codec->channels = (flags & FLV_AUDIO_CHANNEL_MASK) == FLV_STEREO ? 2 : 1;

            if((flags & FLV_AUDIO_CODECID_MASK) == FLV_CODECID_NELLYMOSER_8HZ_MONO)

                st->codec->sample_rate= 8000;

            else

                st->codec->sample_rate = (44100 << ((flags & FLV_AUDIO_SAMPLERATE_MASK) >> FLV_AUDIO_SAMPLERATE_OFFSET) >> 3);

            st->codec->bits_per_sample = (flags & FLV_AUDIO_SAMPLESIZE_MASK) ? 16 : 8;

            flv_set_audio_codec(s, st, flags & FLV_AUDIO_CODECID_MASK);

        }

    }else{

        size -= flv_set_video_codec(s, st, flags & FLV_VIDEO_CODECID_MASK);

    }



    ret= av_get_packet(s->pb, pkt, size - 1);

    if (ret <= 0) {

        return AVERROR(EIO);

    }

    



    pkt->size = ret;

    pkt->pts = pts;

    pkt->stream_index = st->index;



    if (is_audio || ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY))

        pkt->flags |= PKT_FLAG_KEY;



    return ret;

}

static int FUNC_0(AVFormatContext *VAR_0, AVPacket *VAR_1)

{

    int VAR_2, VAR_3, VAR_4, VAR_11, VAR_6, VAR_7, VAR_8, VAR_9, VAR_11;

    AVStream *st = NULL;



 for(;;){

    VAR_11 = url_ftell(VAR_0->pb);

    url_fskip(VAR_0->pb, 4); 

    VAR_4 = get_byte(VAR_0->pb);

    VAR_11 = get_be24(VAR_0->pb);

    VAR_6 = get_be24(VAR_0->pb);

    VAR_6 |= get_byte(VAR_0->pb) << 24;



    if (url_feof(VAR_0->pb))

        return AVERROR(EIO);

    url_fskip(VAR_0->pb, 3); 

    VAR_7 = 0;



    if(VAR_11 == 0)

        continue;



    VAR_9= VAR_11 + url_ftell(VAR_0->pb);



    if (VAR_4 == FLV_TAG_TYPE_AUDIO) {

        VAR_8=1;

        VAR_7 = get_byte(VAR_0->pb);

    } else if (VAR_4 == FLV_TAG_TYPE_VIDEO) {

        VAR_8=0;

        VAR_7 = get_byte(VAR_0->pb);

    } else {

        if (VAR_4 == FLV_TAG_TYPE_META && VAR_11 > 13+1+4)

            flv_read_metabody(VAR_0, VAR_9);

        else 

            av_log(VAR_0, AV_LOG_ERROR, "skipping flv packet: VAR_4 %d, VAR_11 %d, VAR_7 %d\n", VAR_4, VAR_11, VAR_7);

        url_fseek(VAR_0->pb, VAR_9, SEEK_SET);

        continue;

    }



    

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

        st = VAR_0->streams[VAR_3];

        if (st->id == VAR_8)

            break;

    }

    if(VAR_3 == VAR_0->nb_streams){

        av_log(NULL, AV_LOG_ERROR, "invalid stream\n");

        st= create_stream(VAR_0, VAR_8);

        VAR_0->ctx_flags &= ~AVFMTCTX_NOHEADER;

    }



    if(  (st->discard >= AVDISCARD_NONKEY && !((VAR_7 & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY ||         VAR_8))

       ||(st->discard >= AVDISCARD_BIDIR  &&  ((VAR_7 & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_DISP_INTER && !VAR_8))

       || st->discard >= AVDISCARD_ALL

       ){

        url_fseek(VAR_0->pb, VAR_9, SEEK_SET);

        continue;

    }

    if ((VAR_7 & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY)

        av_add_index_entry(st, VAR_11, VAR_6, VAR_11, 0, AVINDEX_KEYFRAME);

    break;

 }



    

    if(!url_is_streamed(VAR_0->pb) && VAR_0->duration==AV_NOPTS_VALUE){

        int VAR_11;

        const int VAR_11= url_ftell(VAR_0->pb);

        const int VAR_11= url_fsize(VAR_0->pb);

        url_fseek(VAR_0->pb, VAR_11-4, SEEK_SET);

        VAR_11= get_be32(VAR_0->pb);

        url_fseek(VAR_0->pb, VAR_11-3-VAR_11, SEEK_SET);

        if(VAR_11 == get_be24(VAR_0->pb) + 11){

            VAR_0->duration= get_be24(VAR_0->pb) * (int64_t)AV_TIME_BASE / 1000;

        }

        url_fseek(VAR_0->pb, VAR_11, SEEK_SET);

    }



    if(VAR_8){

        if(!st->codec->sample_rate || !st->codec->bits_per_sample || (!st->codec->codec_id && !st->codec->codec_tag)) {

            st->codec->channels = (VAR_7 & FLV_AUDIO_CHANNEL_MASK) == FLV_STEREO ? 2 : 1;

            if((VAR_7 & FLV_AUDIO_CODECID_MASK) == FLV_CODECID_NELLYMOSER_8HZ_MONO)

                st->codec->sample_rate= 8000;

            else

                st->codec->sample_rate = (44100 << ((VAR_7 & FLV_AUDIO_SAMPLERATE_MASK) >> FLV_AUDIO_SAMPLERATE_OFFSET) >> 3);

            st->codec->bits_per_sample = (VAR_7 & FLV_AUDIO_SAMPLESIZE_MASK) ? 16 : 8;

            flv_set_audio_codec(VAR_0, st, VAR_7 & FLV_AUDIO_CODECID_MASK);

        }

    }else{

        VAR_11 -= flv_set_video_codec(VAR_0, st, VAR_7 & FLV_VIDEO_CODECID_MASK);

    }



    VAR_2= av_get_packet(VAR_0->pb, VAR_1, VAR_11 - 1);

    if (VAR_2 <= 0) {

        return AVERROR(EIO);

    }

    



    VAR_1->VAR_11 = VAR_2;

    VAR_1->VAR_6 = VAR_6;

    VAR_1->stream_index = st->index;



    if (VAR_8 || ((VAR_7 & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY))

        VAR_1->VAR_7 |= PKT_FLAG_KEY;



    return VAR_2;

}

static int FUNC_0(AVFormatContext *VAR_0, AVPacket *VAR_1)
{ int VAR_2, VAR_3, VAR_4, VAR_11, VAR_6, VAR_7, VAR_8, VAR_9, VAR_11; AVStream *st = NULL; for(;;){ VAR_11 = url_ftell(VAR_0->pb); url_fskip(VAR_0->pb, 4); VAR_4 = get_byte(VAR_0->pb); VAR_11 = get_be24(VAR_0->pb); VAR_6 = get_be24(VAR_0->pb); VAR_6 |= get_byte(VAR_0->pb) << 24; if (url_feof(VAR_0->pb))
return AVERROR(EIO); url_fskip(VAR_0->pb, 3); VAR_7 = 0; if(VAR_11 == 0)
continue; VAR_9= VAR_11 + url_ftell(VAR_0->pb); if (VAR_4 == FLV_TAG_TYPE_AUDIO) { VAR_8=1; VAR_7 = get_byte(VAR_0->pb); } else if (VAR_4 == FLV_TAG_TYPE_VIDEO) { VAR_8=0; VAR_7 = get_byte(VAR_0->pb); } else { if (VAR_4 == FLV_TAG_TYPE_META && VAR_11 > 13+1+4)
flv_read_metabody(VAR_0, VAR_9); else
av_log(VAR_0, AV_LOG_ERROR, "skipping flv packet: VAR_4 %d, VAR_11 %d, VAR_7 %d\n", VAR_4, VAR_11, VAR_7); url_fseek(VAR_0->pb, VAR_9, SEEK_SET); continue; } for(VAR_3=0;VAR_3<VAR_0->nb_streams;VAR_3++) { st = VAR_0->streams[VAR_3]; if (st->id == VAR_8)
break; } if(VAR_3 == VAR_0->nb_streams){ av_log(NULL, AV_LOG_ERROR, "invalid stream\n"); st= create_stream(VAR_0, VAR_8); VAR_0->ctx_flags &= ~AVFMTCTX_NOHEADER; } if(  (st->discard >= AVDISCARD_NONKEY && !((VAR_7 & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY ||         VAR_8))
||(st->discard >= AVDISCARD_BIDIR  &&  ((VAR_7 & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_DISP_INTER && !VAR_8))
|| st->discard >= AVDISCARD_ALL
){ url_fseek(VAR_0->pb, VAR_9, SEEK_SET); continue; } if ((VAR_7 & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY)
av_add_index_entry(st, VAR_11, VAR_6, VAR_11, 0, AVINDEX_KEYFRAME); break; } if(!url_is_streamed(VAR_0->pb) && VAR_0->duration==AV_NOPTS_VALUE){ int VAR_11; const int VAR_11= url_ftell(VAR_0->pb); const int VAR_11= url_fsize(VAR_0->pb); url_fseek(VAR_0->pb, VAR_11-4, SEEK_SET); VAR_11= get_be32(VAR_0->pb); url_fseek(VAR_0->pb, VAR_11-3-VAR_11, SEEK_SET); if(VAR_11 == get_be24(VAR_0->pb) + 11){ VAR_0->duration= get_be24(VAR_0->pb) * (int64_t)AV_TIME_BASE / 1000; } url_fseek(VAR_0->pb, VAR_11, SEEK_SET); } if(VAR_8){ if(!st->codec->sample_rate || !st->codec->bits_per_sample || (!st->codec->codec_id && !st->codec->codec_tag)) { st->codec->channels = (VAR_7 & FLV_AUDIO_CHANNEL_MASK) == FLV_STEREO ? 2 : 1; if((VAR_7 & FLV_AUDIO_CODECID_MASK) == FLV_CODECID_NELLYMOSER_8HZ_MONO)
st->codec->sample_rate= 8000; else
st->codec->sample_rate = (44100 << ((VAR_7 & FLV_AUDIO_SAMPLERATE_MASK) >> FLV_AUDIO_SAMPLERATE_OFFSET) >> 3); st->codec->bits_per_sample = (VAR_7 & FLV_AUDIO_SAMPLESIZE_MASK) ? 16 : 8; flv_set_audio_codec(VAR_0, st, VAR_7 & FLV_AUDIO_CODECID_MASK); } }else{ VAR_11 -= flv_set_video_codec(VAR_0, st, VAR_7 & FLV_VIDEO_CODECID_MASK); } VAR_2= av_get_packet(VAR_0->pb, VAR_1, VAR_11 - 1); if (VAR_2 <= 0) { return AVERROR(EIO); } VAR_1->VAR_11 = VAR_2; VAR_1->VAR_6 = VAR_6; VAR_1->stream_index = st->index; if (VAR_8 || ((VAR_7 & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY))
VAR_1->VAR_7 |= PKT_FLAG_KEY; return VAR_2; }