fourxm->video_pts_inc = (int)(90000.0 / fourxm->fps);
static int fourxm_read_header(AVFormatContext *s,                              AVFormatParameters *ap){    ByteIOContext *pb = &s->pb;    unsigned int fourcc_tag;    unsigned int size;    int header_size;    FourxmDemuxContext *fourxm = (FourxmDemuxContext *)s->priv_data;    unsigned char *header;    int i;    int current_track = -1;    AVStream *st;    fourxm->track_count = 0;    fourxm->tracks = NULL;    fourxm->selected_track = 0;    fourxm->fps = 1.0;    /* skip the first 3 32-bit numbers */    url_fseek(pb, 12, SEEK_CUR);    /* check for LIST-HEAD */    GET_LIST_HEADER();    header_size = size - 4;    if (fourcc_tag != HEAD_TAG)        return AVERROR_INVALIDDATA;    /* allocate space for the header and load the whole thing */    header = av_malloc(header_size);    if (!header)        return AVERROR_NOMEM;    if (get_buffer(pb, header, header_size) != header_size)        return AVERROR_IO;    /* take the lazy approach and search for any and all vtrk and strk chunks */    for (i = 0; i < header_size - 8; i++) {        fourcc_tag = LE_32(&header[i]);        size = LE_32(&header[i + 4]);        if (fourcc_tag == std__TAG) {            fourxm->fps = get_le_float(&header[i + 12]);            fourxm->video_pts_inc = (int)(90000.0 / fourxm->fps);        } else if (fourcc_tag == vtrk_TAG) {            /* check that there is enough data */            if (size != vtrk_SIZE) {                av_free(header);                return AVERROR_INVALIDDATA;            }            fourxm->width = LE_32(&header[i + 36]);            fourxm->height = LE_32(&header[i + 40]);            i += 8 + size;            /* allocate a new AVStream */            st = av_new_stream(s, 0);            if (!st)                return AVERROR_NOMEM;            av_set_pts_info(st, 33, 1, 90000);            fourxm->video_stream_index = st->index;            st->codec.frame_rate = fourxm->fps;            st->codec.frame_rate_base = 1.0;            st->codec.codec_type = CODEC_TYPE_VIDEO;            st->codec.codec_id = CODEC_ID_4XM;            st->codec.codec_tag = 0;  /* no fourcc */            st->codec.width = fourxm->width;            st->codec.height = fourxm->height;        } else if (fourcc_tag == strk_TAG) {            /* check that there is enough data */            if (size != strk_SIZE) {                av_free(header);                return AVERROR_INVALIDDATA;            }            current_track = LE_32(&header[i + 8]);            if (current_track + 1 > fourxm->track_count) {                fourxm->track_count = current_track + 1;                if((unsigned)fourxm->track_count >= UINT_MAX / sizeof(AudioTrack))                    return -1;                fourxm->tracks = av_realloc(fourxm->tracks,                     fourxm->track_count * sizeof(AudioTrack));                if (!fourxm->tracks) {                    av_free(header);                    return AVERROR_NOMEM;                }            }            fourxm->tracks[current_track].adpcm = LE_32(&header[i + 12]);            fourxm->tracks[current_track].channels = LE_32(&header[i + 36]);            fourxm->tracks[current_track].sample_rate = LE_32(&header[i + 40]);            fourxm->tracks[current_track].bits = LE_32(&header[i + 44]);            i += 8 + size;            /* allocate a new AVStream */            st = av_new_stream(s, current_track);            if (!st)                return AVERROR_NOMEM;            /* set the pts reference (1 pts = 1/90000) */            av_set_pts_info(st, 33, 1, 90000);            fourxm->tracks[current_track].stream_index = st->index;            st->codec.codec_type = CODEC_TYPE_AUDIO;            st->codec.codec_tag = 1;            st->codec.channels = fourxm->tracks[current_track].channels;            st->codec.sample_rate = fourxm->tracks[current_track].sample_rate;            st->codec.bits_per_sample = fourxm->tracks[current_track].bits;            st->codec.bit_rate = st->codec.channels * st->codec.sample_rate *                st->codec.bits_per_sample;            st->codec.block_align = st->codec.channels * st->codec.bits_per_sample;            if (fourxm->tracks[current_track].adpcm)                st->codec.codec_id = CODEC_ID_ADPCM_4XM;            else if (st->codec.bits_per_sample == 8)                st->codec.codec_id = CODEC_ID_PCM_U8;            else                st->codec.codec_id = CODEC_ID_PCM_S16LE;        }    }    av_free(header);    /* skip over the LIST-MOVI chunk (which is where the stream should be */    GET_LIST_HEADER();    if (fourcc_tag != MOVI_TAG)        return AVERROR_INVALIDDATA;    /* initialize context members */    fourxm->video_pts = -fourxm->video_pts_inc;  /* first frame will push to 0 */    fourxm->audio_pts = 0;    return 0;}