static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
{
    int ret, i, type, size, flags, is_audio, next, pos;
    unsigned dts;
    AVStream *st = NULL;
 retry:
 for(;;){
    pos = url_ftell(s->pb);
    url_fskip(s->pb, 4);
    type = get_byte(s->pb);
    size = get_be24(s->pb);
    dts = get_be24(s->pb);
    dts |= 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);
        size--;
    } else if (type == FLV_TAG_TYPE_VIDEO) {
        is_audio=0;
        flags = get_byte(s->pb);
        size--;
        if ((flags & 0xf0) == 0x50)
            goto skip;
    } 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);
    skip:
        url_fseek(s->pb, next, SEEK_SET);
        continue;
    }
    if (!size)
        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, dts, 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);
    }
    if (st->codec->codec_id == CODEC_ID_AAC ||
        st->codec->codec_id == CODEC_ID_H264) {
        int type = get_byte(s->pb);
        size--;
        if (st->codec->codec_id == CODEC_ID_H264) {
            get_be24(s->pb);
        }
        if (type == 0) {
            if ((ret = flv_get_extradata(s, st, size)) < 0)
                return ret;
            goto retry;
        }
    }
    ret= av_get_packet(s->pb, pkt, size);
    if (ret <= 0) {
        return AVERROR(EIO);
    }
    pkt->size = ret;
    pkt->dts = dts;
    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)\n{\n    int ret, i, type, size, flags, is_audio, next, pos;\n    unsigned dts;\n    AVStream *st = NULL;\n retry:\n for(;;){\n    pos = url_ftell(s->pb);\n    url_fskip(s->pb, 4);\n    type = get_byte(s->pb);\n    size = get_be24(s->pb);\n    dts = get_be24(s->pb);\n    dts |= get_byte(s->pb) << 24;\n    if (url_feof(s->pb))\n        return AVERROR(EIO);\n    url_fskip(s->pb, 3);\n    flags = 0;\n    if(size == 0)\n        continue;\n    next= size + url_ftell(s->pb);\n    if (type == FLV_TAG_TYPE_AUDIO) {\n        is_audio=1;\n        flags = get_byte(s->pb);\n        size--;\n    } else if (type == FLV_TAG_TYPE_VIDEO) {\n        is_audio=0;\n        flags = get_byte(s->pb);\n        size--;\n        if ((flags & 0xf0) == 0x50)\n            goto skip;\n    } else {\n        if (type == FLV_TAG_TYPE_META && size > 13+1+4)\n            flv_read_metabody(s, next);\n        else\n            av_log(s, AV_LOG_ERROR, "skipping flv packet: type %d, size %d, flags %d\\n", type, size, flags);\n    skip:\n        url_fseek(s->pb, next, SEEK_SET);\n        continue;\n    }\n    if (!size)\n        continue;\n    for(i=0;i<s->nb_streams;i++) {\n        st = s->streams[i];\n        if (st->id == is_audio)\n            break;\n    }\n    if(i == s->nb_streams){\n        av_log(NULL, AV_LOG_ERROR, "invalid stream\\n");\n        st= create_stream(s, is_audio);\n        s->ctx_flags &= ~AVFMTCTX_NOHEADER;\n    }\n    if(  (st->discard >= AVDISCARD_NONKEY && !((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY ||         is_audio))\n       ||(st->discard >= AVDISCARD_BIDIR  &&  ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_DISP_INTER && !is_audio))\n       || st->discard >= AVDISCARD_ALL\n       ){\n        url_fseek(s->pb, next, SEEK_SET);\n        continue;\n    }\n    if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY)\n        av_add_index_entry(st, pos, dts, size, 0, AVINDEX_KEYFRAME);\n    break;\n }\n    if(!url_is_streamed(s->pb) && s->duration==AV_NOPTS_VALUE){\n        int size;\n        const int pos= url_ftell(s->pb);\n        const int fsize= url_fsize(s->pb);\n        url_fseek(s->pb, fsize-4, SEEK_SET);\n        size= get_be32(s->pb);\n        url_fseek(s->pb, fsize-3-size, SEEK_SET);\n        if(size == get_be24(s->pb) + 11){\n            s->duration= get_be24(s->pb) * (int64_t)AV_TIME_BASE / 1000;\n        }\n        url_fseek(s->pb, pos, SEEK_SET);\n    }\n    if(is_audio){\n        if(!st->codec->sample_rate || !st->codec->bits_per_sample || (!st->codec->codec_id && !st->codec->codec_tag)) {\n            st->codec->channels = (flags & FLV_AUDIO_CHANNEL_MASK) == FLV_STEREO ? 2 : 1;\n            if((flags & FLV_AUDIO_CODECID_MASK) == FLV_CODECID_NELLYMOSER_8HZ_MONO)\n                st->codec->sample_rate= 8000;\n            else\n                st->codec->sample_rate = (44100 << ((flags & FLV_AUDIO_SAMPLERATE_MASK) >> FLV_AUDIO_SAMPLERATE_OFFSET) >> 3);\n            st->codec->bits_per_sample = (flags & FLV_AUDIO_SAMPLESIZE_MASK) ? 16 : 8;\n            flv_set_audio_codec(s, st, flags & FLV_AUDIO_CODECID_MASK);\n        }\n    }else{\n        size -= flv_set_video_codec(s, st, flags & FLV_VIDEO_CODECID_MASK);\n    }\n    if (st->codec->codec_id == CODEC_ID_AAC ||\n        st->codec->codec_id == CODEC_ID_H264) {\n        int type = get_byte(s->pb);\n        size--;\n        if (st->codec->codec_id == CODEC_ID_H264) {\n            get_be24(s->pb);\n        }\n        if (type == 0) {\n            if ((ret = flv_get_extradata(s, st, size)) < 0)\n                return ret;\n            goto retry;\n        }\n    }\n    ret= av_get_packet(s->pb, pkt, size);\n    if (ret <= 0) {\n        return AVERROR(EIO);\n    }\n    pkt->size = ret;\n    pkt->dts = dts;\n    pkt->stream_index = st->index;\n    if (is_audio || ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY))\n        pkt->flags |= PKT_FLAG_KEY;\n    return ret;\n}']