shift = 12 - (in[4+i*2] & 15);
filter = in[4+i*2] >> 4;
- if (filter > 4) {
- av_log(avctx, AV_LOG_ERROR,
- "Invalid XA-ADPCM filter %d (max. allowed is 4)\n",
- filter);
- return AVERROR_INVALIDDATA;
+ if (filter >= FF_ARRAY_ELEMS(xa_adpcm_table)) {
- av_log_ask_for_sample(NULL, "unknown filter %d\n", filter);
++ av_log_ask_for_sample(avctx, "unknown XA-ADPCM filter %d\n", filter);
+ filter=0;
}
f0 = xa_adpcm_table[filter][0];
f1 = xa_adpcm_table[filter][1];
shift = 12 - (in[5+i*2] & 15);
filter = in[5+i*2] >> 4;
- if (filter > 4) {
- av_log(avctx, AV_LOG_ERROR,
- "Invalid XA-ADPCM filter %d (max. allowed is 4)\n",
- filter);
- return AVERROR_INVALIDDATA;
+ if (filter >= FF_ARRAY_ELEMS(xa_adpcm_table)) {
- av_log_ask_for_sample(NULL, "unknown filter %d\n", filter);
++ av_log_ask_for_sample(avctx, "unknown XA-ADPCM filter %d\n", filter);
+ filter=0;
}
+
f0 = xa_adpcm_table[filter][0];
f1 = xa_adpcm_table[filter][1];
avctx->pix_fmt = PIX_FMT_PAL8;
- if (avctx->extradata_size != 16*8 + 4*256)
- return -1;
-
- s->frame.reference = 1;
+ avcodec_get_frame_defaults(&s->frame);
+ s->frame.reference = 3;
+ bytestream2_init(&s->gb, avctx->extradata, avctx->extradata_size);
+ if (bytestream2_get_bytes_left(&s->gb) < 16 * 8 + 4 * 256)
+ return -1;
- buf = avctx->extradata + 16*8;
+ bytestream2_skipu(&s->gb, 16 * 8);
for (i = 0; i < 256; i++)
- s->palette[i] = bytestream_get_le32(&buf);
+ s->palette[i] = bytestream2_get_le32u(&s->gb);
return 0;
}
h->ref_count[1]= h->pps.ref_count[1];
if(h->slice_type_nos != AV_PICTURE_TYPE_I){
- unsigned max= (16<<(s->picture_structure != PICT_FRAME))-1;
- int max_refs = s->picture_structure == PICT_FRAME ? 16 : 32;
++ unsigned max= s->picture_structure == PICT_FRAME ? 15 : 31;
+
if(h->slice_type_nos == AV_PICTURE_TYPE_B){
h->direct_spatial_mv_pred= get_bits1(&s->gb);
}
h->ref_count[0]= get_ue_golomb(&s->gb) + 1;
if(h->slice_type_nos==AV_PICTURE_TYPE_B)
h->ref_count[1]= get_ue_golomb(&s->gb) + 1;
-
}
- if(h->ref_count[0]-1 > max || h->ref_count[1]-1 > max){
+
- if (h->ref_count[0] > max_refs || h->ref_count[1] > max_refs) {
++ if (h->ref_count[0]-1 > max || h->ref_count[1]-1 > max){
av_log(h->s.avctx, AV_LOG_ERROR, "reference overflow\n");
- h->ref_count[0]= h->ref_count[1]= 1;
- return -1;
+ h->ref_count[0] = h->ref_count[1] = 1;
+ return AVERROR_INVALIDDATA;
}
+
if(h->slice_type_nos == AV_PICTURE_TYPE_B)
h->list_count= 2;
else
--- /dev/null
-da0c0bd12ac141c976ffa6a71832ab4b *./tests/data/vsynth1/ffvhuff.avi
++0632ffae6f1e06dd299bf41a845b9099 *./tests/data/vsynth1/ffvhuff.avi
+ 5987208 ./tests/data/vsynth1/ffvhuff.avi
+ c5ccac874dbf808e9088bc3107860042 *./tests/data/ffvhuff.vsynth1.out.yuv
+ stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 7603200/ 7603200
--- /dev/null
-d31aab445b24f738df45fdd7479d6dd7 *./tests/data/vsynth2/ffvhuff.avi
++63926d8835dd5779dca0a4bc081ca8ae *./tests/data/vsynth2/ffvhuff.avi
+ 4988056 ./tests/data/vsynth2/ffvhuff.avi
+ dde5895817ad9d219f79a52d0bdfb001 *./tests/data/ffvhuff.vsynth2.out.yuv
+ stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 7603200/ 7603200