#define VC1_EXTRADATA_SIZE 4
-static int vc1t_probe(AVProbeData *p)
+static int vc1t_probe(const AVProbeData *p)
{
+ uint32_t size;
+
if (p->buf_size < 24)
return 0;
- if (p->buf[3] != 0xC5 || AV_RL32(&p->buf[4]) != 4 || AV_RL32(&p->buf[20]) != 0xC)
+
+ size = AV_RL32(&p->buf[4]);
+ if (p->buf[3] != 0xC5 || size < 4 || size > p->buf_size - 20 ||
+ AV_RL32(&p->buf[size+16]) != 0xC)
return 0;
return AVPROBE_SCORE_EXTENSION;
{
AVIOContext *pb = s->pb;
AVStream *st;
- int frames;
+ int frames, ret;
uint32_t fps;
+ uint32_t size;
frames = avio_rl24(pb);
- if(avio_r8(pb) != 0xC5 || avio_rl32(pb) != 4)
+ if (avio_r8(pb) != 0xC5 || ((size = avio_rl32(pb)) < 4))
return AVERROR_INVALIDDATA;
/* init video codec */
st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
st->codecpar->codec_id = AV_CODEC_ID_WMV3;
- if (ff_get_extradata(s, st->codecpar, pb, VC1_EXTRADATA_SIZE) < 0)
- return AVERROR(ENOMEM);
+ if ((ret = ff_get_extradata(s, st->codecpar, pb, VC1_EXTRADATA_SIZE)) < 0)
+ return ret;
+
+ avio_skip(pb, size - 4);
st->codecpar->height = avio_rl32(pb);
st->codecpar->width = avio_rl32(pb);
if(avio_rl32(pb) != 0xC)
return pkt->size;
}
-AVInputFormat ff_vc1t_demuxer = {
+const AVInputFormat ff_vc1t_demuxer = {
.name = "vc1test",
.long_name = NULL_IF_CONFIG_SMALL("VC-1 test bitstream"),
.read_probe = vc1t_probe,
.read_header = vc1t_read_header,
.read_packet = vc1t_read_packet,
+ .extensions = "rcv",
.flags = AVFMT_GENERIC_INDEX,
};