diff --git a/libavcodec/ffv1.c b/libavcodec/ffv1.c index e2301e6ce3..fd3e4f70b5 100644 --- a/libavcodec/ffv1.c +++ b/libavcodec/ffv1.c @@ -1551,20 +1551,48 @@ static int read_header(FFV1Context *f){ memset(state, 128, sizeof(state)); if(f->version < 2){ - f->version= get_symbol(c, state, 0); - f->ac= f->avctx->coder_type= get_symbol(c, state, 0); - if(f->ac>1){ - for(i=1; i<256; i++){ - f->state_transition[i]= get_symbol(c, state, 1) + c->one_state[i]; + int chroma_h_shift, chroma_v_shift, colorspace, bits_per_raw_sample; + int transparency; + unsigned v = get_symbol(c, state, 0); + if (v > 1) { + av_log(f->avctx, AV_LOG_ERROR, + "invalid version %d in version 1 header\n", v); + return AVERROR_INVALIDDATA; + } + f->version = v; + + f->ac = f->avctx->coder_type = get_symbol(c, state, 0); + + if (f->ac > 1) { + for (i = 1; i < 256; i++) + f->state_transition[i] = + get_symbol(c, state, 1) + c->one_state[i]; + } + + colorspace = get_symbol(c, state, 0); //YUV cs type + bits_per_raw_sample = f->version > 0 ? get_symbol(c, state, 0) : f->avctx->bits_per_raw_sample; + get_rac(c, state); //no chroma = false + chroma_h_shift = get_symbol(c, state, 0); + chroma_v_shift = get_symbol(c, state, 0); + transparency = get_rac(c, state); + + if (f->plane_count) { + if (colorspace != f->colorspace || + bits_per_raw_sample != f->avctx->bits_per_raw_sample || + chroma_h_shift != f->chroma_h_shift || + chroma_v_shift != f->chroma_v_shift || + transparency != f->transparency) { + av_log(f->avctx, AV_LOG_ERROR, "Invalid change of global parameters\n"); + return AVERROR_INVALIDDATA; } } - f->colorspace= get_symbol(c, state, 0); //YUV cs type - if(f->version>0) - f->avctx->bits_per_raw_sample= get_symbol(c, state, 0); - get_rac(c, state); //no chroma = false - f->chroma_h_shift= get_symbol(c, state, 0); - f->chroma_v_shift= get_symbol(c, state, 0); - f->transparency= get_rac(c, state); + + f->colorspace = colorspace; + f->avctx->bits_per_raw_sample = bits_per_raw_sample; + f->chroma_h_shift = chroma_h_shift; + f->chroma_v_shift = chroma_v_shift; + f->transparency = transparency; + f->plane_count= 2 + f->transparency; }