Merge commit '4bb1070c154e49d35805fbcdac9c9e92f702ef96'
authorDerek Buitenhuis <derek.buitenhuis@gmail.com>
Sun, 22 Nov 2015 16:55:56 +0000 (16:55 +0000)
committerDerek Buitenhuis <derek.buitenhuis@gmail.com>
Sun, 22 Nov 2015 16:57:43 +0000 (16:57 +0000)
* commit '4bb1070c154e49d35805fbcdac9c9e92f702ef96':
  ffv1: Explicitly name the coder type

  Conflicts:
      libavcodec/ffv1.h
      libavcodec/ffv1dec.c
      libavcodec/ffv1enc.c

Merged-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
1  2 
libavcodec/ffv1.c
libavcodec/ffv1.h
libavcodec/ffv1dec.c
libavcodec/ffv1enc.c

@@@ -73,9 -160,9 +73,9 @@@ av_cold int ff_ffv1_init_slice_state(FF
      for (j = 0; j < f->plane_count; j++) {
          PlaneContext *const p = &fs->plane[j];
  
-         if (fs->ac) {
+         if (fs->ac != AC_GOLOMB_RICE) {
              if (!p->state)
 -                p->state = av_malloc(CONTEXT_SIZE * p->context_count *
 +                p->state = av_malloc_array(p->context_count, CONTEXT_SIZE *
                                       sizeof(uint8_t));
              if (!p->state)
                  return AVERROR(ENOMEM);
          }
      }
  
-     if (fs->ac > 1) {
+     if (fs->ac == AC_RANGE_CUSTOM_TAB) {
          //FIXME only redo if state_transition changed
          for (j = 1; j < 256; j++) {
 -            fs->c.one_state[j]        = f->state_transition[j];
 +            fs->c. one_state[      j] = f->state_transition[j];
              fs->c.zero_state[256 - j] = 256 - fs->c.one_state[j];
          }
      }
  #define MAX_QUANT_TABLES 8
  #define MAX_CONTEXT_INPUTS 5
  
 -extern const uint8_t ff_log2_run[41];
 -
 -extern const int8_t ffv1_quant5_10bit[256];
 -extern const int8_t ffv1_quant5[256];
 -extern const int8_t ffv1_quant9_10bit[256];
 -extern const int8_t ffv1_quant11[256];
 -extern const uint8_t ffv1_ver2_state[256];
 -
+ #define AC_GOLOMB_RICE          0
+ #define AC_RANGE_DEFAULT_TAB    1
+ #define AC_RANGE_CUSTOM_TAB     2
  typedef struct VlcState {
      int16_t drift;
      uint16_t error_sum;
@@@ -423,13 -364,13 +423,13 @@@ static int decode_slice(AVCodecContext 
      x      = fs->slice_x;
      y      = fs->slice_y;
  
-     if (!fs->ac) {
+     if (fs->ac == AC_GOLOMB_RICE) {
 -        if (f->version == 3 && f->minor_version > 1 || f->version > 3)
 +        if (f->version == 3 && f->micro_version > 1 || f->version > 3)
              get_rac(&fs->c, (uint8_t[]) { 129 });
          fs->ac_byte_count = f->version > 2 || (!x && !y) ? fs->c.bytestream - fs->c.bytestream_start - 1 : 0;
 -        init_get_bits(&fs->gb, fs->c.bytestream_start + fs->ac_byte_count,
 -                      (fs->c.bytestream_end - fs->c.bytestream_start -
 -                       fs->ac_byte_count) * 8);
 +        init_get_bits(&fs->gb,
 +                      fs->c.bytestream_start + fs->ac_byte_count,
 +                      (fs->c.bytestream_end - fs->c.bytestream_start - fs->ac_byte_count) * 8);
      }
  
      av_assert1(width && height);
                                 p->data[2] + ps * x + y * p->linesize[2] };
          decode_rgb_frame(fs, planes, width, height, p->linesize);
      }
-     if (fs->ac && f->version > 2) {
+     if (fs->ac != AC_GOLOMB_RICE && f->version > 2) {
          int v;
          get_rac(&fs->c, (uint8_t[]) { 129 });
 -        v = fs->c.bytestream_end - fs->c.bytestream - 2 - 5 * f->ec;
 +        v = fs->c.bytestream_end - fs->c.bytestream - 2 - 5*f->ec;
          if (v) {
 -            av_log(f->avctx, AV_LOG_ERROR, "bytestream end mismatching by %d\n",
 -                   v);
 +            av_log(f->avctx, AV_LOG_ERROR, "bytestream end mismatching by %d\n", v);
              fs->slice_damaged = 1;
          }
      }
@@@ -529,18 -473,13 +529,19 @@@ static int read_extra_header(FFV1Contex
      ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8);
  
      f->version = get_symbol(c, state, 0);
 +    if (f->version < 2) {
 +        av_log(f->avctx, AV_LOG_ERROR, "Invalid version in global header\n");
 +        return AVERROR_INVALIDDATA;
 +    }
      if (f->version > 2) {
          c->bytestream_end -= 4;
 -        f->minor_version   = get_symbol(c, state, 0);
 +        f->micro_version = get_symbol(c, state, 0);
 +        if (f->micro_version < 0)
 +            return AVERROR_INVALIDDATA;
      }
-     f->ac = f->avctx->coder_type = get_symbol(c, state, 0);
-     if (f->ac > 1) {
+     f->ac = get_symbol(c, state, 0);
+     if (f->ac == AC_RANGE_CUSTOM_TAB) {
          for (i = 1; i < 256; i++)
              f->state_transition[i] = get_symbol(c, state, 1) + c->one_state[i];
      }
@@@ -646,10 -558,13 +647,11 @@@ static int read_header(FFV1Context *f
              return AVERROR_INVALIDDATA;
          }
          f->version = v;
-         f->ac      = f->avctx->coder_type = get_symbol(c, state, 0);
-         if (f->ac > 1) {
 -
+         f->ac = get_symbol(c, state, 0);
+         if (f->ac == AC_RANGE_CUSTOM_TAB) {
              for (i = 1; i < 256; i++)
 -                f->state_transition[i] =
 -                    get_symbol(c, state, 1) + c->one_state[i];
 +                f->state_transition[i] = get_symbol(c, state, 1) + c->one_state[i];
          }
  
          colorspace          = get_symbol(c, state, 0); //YUV cs type
@@@ -274,8 -178,8 +274,8 @@@ static av_always_inline int encode_line
      int run_count = 0;
      int run_mode  = 0;
  
-     if (s->ac) {
+     if (s->ac != AC_GOLOMB_RICE) {
 -        if (c->bytestream_end - c->bytestream < w * 20) {
 +        if (c->bytestream_end - c->bytestream < w * 35) {
              av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
              return AVERROR_INVALIDDATA;
          }
@@@ -695,15 -578,19 +695,15 @@@ static av_cold int encode_init(AVCodecC
          s->ec = (s->version >= 3);
      }
  
 -    if (s->version >= 2 &&
 -        avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
 -        av_log(avctx, AV_LOG_ERROR,
 -               "Version %d requested, please set -strict experimental in "
 -               "order to enable it\n",
 -               s->version);
 -        return AVERROR(ENOSYS);
 +    if ((s->version == 2 || s->version>3) && avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
 +        av_log(avctx, AV_LOG_ERROR, "Version 2 needed for requested features but version 2 is experimental and not enabled\n");
 +        return AVERROR_INVALIDDATA;
      }
  
-     s->ac = avctx->coder_type > 0 ? 2 : 0;
+     s->ac = avctx->coder_type > 0 ? AC_RANGE_CUSTOM_TAB : AC_GOLOMB_RICE;
  
      s->plane_count = 3;
 -    switch (avctx->pix_fmt) {
 +    switch(avctx->pix_fmt) {
      case AV_PIX_FMT_YUV444P9:
      case AV_PIX_FMT_YUV422P9:
      case AV_PIX_FMT_YUV420P9:
      case AV_PIX_FMT_GBRP10:
          if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
              s->bits_per_raw_sample = 10;
 -    case AV_PIX_FMT_GBRP16:
 +    case AV_PIX_FMT_GBRP12:
          if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
 -            s->bits_per_raw_sample = 16;
 +            s->bits_per_raw_sample = 12;
 +    case AV_PIX_FMT_GBRP14:
 +        if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
 +            s->bits_per_raw_sample = 14;
          else if (!s->bits_per_raw_sample)
              s->bits_per_raw_sample = avctx->bits_per_raw_sample;
 -        s->colorspace    = 1;
 +        s->colorspace = 1;
          s->chroma_planes = 1;
 -        s->version       = FFMAX(s->version, 1);
 +        s->version = FFMAX(s->version, 1);
-         if (!s->ac && avctx->coder_type == -1) {
-             av_log(avctx, AV_LOG_INFO, "bits_per_raw_sample > 8, forcing coder 1\n");
-             s->ac = 2;
-         }
-         if (!s->ac) {
-             av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample of more than 8 needs -coder 1 currently\n");
-             return AVERROR(ENOSYS);
++        if (s->ac == AC_GOLOMB_RICE) {
++            av_log(avctx, AV_LOG_INFO,
++                   "bits_per_raw_sample > 8, forcing coder 1\n");
++            s->ac = AC_RANGE_CUSTOM_TAB;
 +        }
          break;
      default:
          av_log(avctx, AV_LOG_ERROR, "format not supported\n");
          return AVERROR(EINVAL);
      }
  
-     if (s->ac > 1)
+     if (s->ac == AC_RANGE_CUSTOM_TAB)
          for (i = 1; i < 256; i++)
 -            s->state_transition[i] = ffv1_ver2_state[i];
 +            s->state_transition[i] = ver2_state[i];
  
      for (i = 0; i < 256; i++) {
          s->quant_table_count = 2;
@@@ -1150,12 -883,11 +1144,12 @@@ retry
      if (f->version > 2) {
          encode_slice_header(f, fs);
      }
-     if (!fs->ac) {
+     if (fs->ac == AC_GOLOMB_RICE) {
          if (f->version > 2)
              put_rac(&fs->c, (uint8_t[]) { 129 }, 0);
 -        fs->ac_byte_count = f->version > 2 || (!x && !y) ? ff_rac_terminate( &fs->c) : 0;
 -        init_put_bits(&fs->pb, fs->c.bytestream_start + fs->ac_byte_count,
 +        fs->ac_byte_count = f->version > 2 || (!x && !y) ? ff_rac_terminate(&fs->c) : 0;
 +        init_put_bits(&fs->pb,
 +                      fs->c.bytestream_start + fs->ac_byte_count,
                        fs->c.bytestream_end - fs->c.bytestream_start - fs->ac_byte_count);
      }