Merge commit 'b5d7b80a7e43779ca2962ba56442579c2a7e927d' into release/0.10
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 12 Aug 2014 18:28:37 +0000 (20:28 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 12 Aug 2014 18:28:37 +0000 (20:28 +0200)
* commit 'b5d7b80a7e43779ca2962ba56442579c2a7e927d':
  ffv1dec: check that global parameters do not change in version 0/1

Conflicts:
libavcodec/ffv1.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/ffv1.c

@@@ -1551,21 -1518,46 +1551,49 @@@ 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->colorspace= get_symbol(c, state, 0); //YUV cs type
-         if(f->version>0)
-             f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
+         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
-         f->chroma_h_shift= get_symbol(c, state, 0);
-         f->chroma_v_shift= get_symbol(c, state, 0);
-         f->transparency= get_rac(c, state);
+         chroma_h_shift      = get_symbol(c, state, 0);
+         chroma_v_shift      = get_symbol(c, state, 0);
 -        get_rac(c, state); //transparency plane
++        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) {
++                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                 = 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->plane_count= 2 + f->transparency;
      }
  
      if(f->colorspace==0){