- st->codec->width = get_be16(pb);
- st->codec->height = get_be16(pb);
- st->codec->time_base.num= 1;
- fps= get_be16(pb);
- st->codec->codec_type = CODEC_TYPE_VIDEO;
- get_be32(pb);
- fps2= get_be16(pb);
- get_be16(pb);
-
- st->codec->extradata_size= codec_data_size - (url_ftell(pb) - codec_pos);
-
- if(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE <= (unsigned)st->codec->extradata_size){
- //check is redundant as get_buffer() will catch this
- av_log(s, AV_LOG_ERROR, "st->codec->extradata_size too large\n");
- return -1;
- }
- st->codec->extradata= av_mallocz(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
- if (!st->codec->extradata)
- return AVERROR(ENOMEM);
- get_buffer(pb, st->codec->extradata, st->codec->extradata_size);
-
-// av_log(s, AV_LOG_DEBUG, "fps= %d fps2= %d\n", fps, fps2);
- st->codec->time_base.den = fps * st->codec->time_base.num;
- switch(((uint8_t*)st->codec->extradata)[4]>>4){
- case 1: st->codec->codec_id = CODEC_ID_RV10; break;
- case 2: st->codec->codec_id = CODEC_ID_RV20; break;
- case 3: st->codec->codec_id = CODEC_ID_RV30; break;
- case 4: st->codec->codec_id = CODEC_ID_RV40; break;
- default: goto fail1;
- }
+ st->codec->width = avio_rb16(pb);
+ st->codec->height = avio_rb16(pb);
+ avio_skip(pb, 2); // looks like bits per sample
+ avio_skip(pb, 4); // always zero?
+ st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
+ st->need_parsing = AVSTREAM_PARSE_TIMESTAMPS;
+ fps = avio_rb32(pb);
+
+ if ((ret = rm_read_extradata(pb, st->codec, codec_data_size - (avio_tell(pb) - codec_pos))) < 0)
+ return ret;
+
+ av_reduce(&st->codec->time_base.num, &st->codec->time_base.den,
+ 0x10000, fps, (1 << 30) - 1);
+ st->avg_frame_rate.num = st->codec->time_base.den;
+ st->avg_frame_rate.den = st->codec->time_base.num;