Blame src/dec/quant_dec.c

Packit 9c6abc
// Copyright 2010 Google Inc. All Rights Reserved.
Packit 9c6abc
//
Packit 9c6abc
// Use of this source code is governed by a BSD-style license
Packit 9c6abc
// that can be found in the COPYING file in the root of the source
Packit 9c6abc
// tree. An additional intellectual property rights grant can be found
Packit 9c6abc
// in the file PATENTS. All contributing project authors may
Packit 9c6abc
// be found in the AUTHORS file in the root of the source tree.
Packit 9c6abc
// -----------------------------------------------------------------------------
Packit 9c6abc
//
Packit 9c6abc
// Quantizer initialization
Packit 9c6abc
//
Packit 9c6abc
// Author: Skal (pascal.massimino@gmail.com)
Packit 9c6abc
Packit 9c6abc
#include "src/dec/vp8i_dec.h"
Packit 9c6abc
Packit 9c6abc
static WEBP_INLINE int clip(int v, int M) {
Packit 9c6abc
  return v < 0 ? 0 : v > M ? M : v;
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
// Paragraph 14.1
Packit 9c6abc
static const uint8_t kDcTable[128] = {
Packit 9c6abc
  4,     5,   6,   7,   8,   9,  10,  10,
Packit 9c6abc
  11,   12,  13,  14,  15,  16,  17,  17,
Packit 9c6abc
  18,   19,  20,  20,  21,  21,  22,  22,
Packit 9c6abc
  23,   23,  24,  25,  25,  26,  27,  28,
Packit 9c6abc
  29,   30,  31,  32,  33,  34,  35,  36,
Packit 9c6abc
  37,   37,  38,  39,  40,  41,  42,  43,
Packit 9c6abc
  44,   45,  46,  46,  47,  48,  49,  50,
Packit 9c6abc
  51,   52,  53,  54,  55,  56,  57,  58,
Packit 9c6abc
  59,   60,  61,  62,  63,  64,  65,  66,
Packit 9c6abc
  67,   68,  69,  70,  71,  72,  73,  74,
Packit 9c6abc
  75,   76,  76,  77,  78,  79,  80,  81,
Packit 9c6abc
  82,   83,  84,  85,  86,  87,  88,  89,
Packit 9c6abc
  91,   93,  95,  96,  98, 100, 101, 102,
Packit 9c6abc
  104, 106, 108, 110, 112, 114, 116, 118,
Packit 9c6abc
  122, 124, 126, 128, 130, 132, 134, 136,
Packit 9c6abc
  138, 140, 143, 145, 148, 151, 154, 157
Packit 9c6abc
};
Packit 9c6abc
Packit 9c6abc
static const uint16_t kAcTable[128] = {
Packit 9c6abc
  4,     5,   6,   7,   8,   9,  10,  11,
Packit 9c6abc
  12,   13,  14,  15,  16,  17,  18,  19,
Packit 9c6abc
  20,   21,  22,  23,  24,  25,  26,  27,
Packit 9c6abc
  28,   29,  30,  31,  32,  33,  34,  35,
Packit 9c6abc
  36,   37,  38,  39,  40,  41,  42,  43,
Packit 9c6abc
  44,   45,  46,  47,  48,  49,  50,  51,
Packit 9c6abc
  52,   53,  54,  55,  56,  57,  58,  60,
Packit 9c6abc
  62,   64,  66,  68,  70,  72,  74,  76,
Packit 9c6abc
  78,   80,  82,  84,  86,  88,  90,  92,
Packit 9c6abc
  94,   96,  98, 100, 102, 104, 106, 108,
Packit 9c6abc
  110, 112, 114, 116, 119, 122, 125, 128,
Packit 9c6abc
  131, 134, 137, 140, 143, 146, 149, 152,
Packit 9c6abc
  155, 158, 161, 164, 167, 170, 173, 177,
Packit 9c6abc
  181, 185, 189, 193, 197, 201, 205, 209,
Packit 9c6abc
  213, 217, 221, 225, 229, 234, 239, 245,
Packit 9c6abc
  249, 254, 259, 264, 269, 274, 279, 284
Packit 9c6abc
};
Packit 9c6abc
Packit 9c6abc
//------------------------------------------------------------------------------
Packit 9c6abc
// Paragraph 9.6
Packit 9c6abc
Packit 9c6abc
void VP8ParseQuant(VP8Decoder* const dec) {
Packit 9c6abc
  VP8BitReader* const br = &dec->br_;
Packit 9c6abc
  const int base_q0 = VP8GetValue(br, 7);
Packit 9c6abc
  const int dqy1_dc = VP8Get(br) ? VP8GetSignedValue(br, 4) : 0;
Packit 9c6abc
  const int dqy2_dc = VP8Get(br) ? VP8GetSignedValue(br, 4) : 0;
Packit 9c6abc
  const int dqy2_ac = VP8Get(br) ? VP8GetSignedValue(br, 4) : 0;
Packit 9c6abc
  const int dquv_dc = VP8Get(br) ? VP8GetSignedValue(br, 4) : 0;
Packit 9c6abc
  const int dquv_ac = VP8Get(br) ? VP8GetSignedValue(br, 4) : 0;
Packit 9c6abc
Packit 9c6abc
  const VP8SegmentHeader* const hdr = &dec->segment_hdr_;
Packit 9c6abc
  int i;
Packit 9c6abc
Packit 9c6abc
  for (i = 0; i < NUM_MB_SEGMENTS; ++i) {
Packit 9c6abc
    int q;
Packit 9c6abc
    if (hdr->use_segment_) {
Packit 9c6abc
      q = hdr->quantizer_[i];
Packit 9c6abc
      if (!hdr->absolute_delta_) {
Packit 9c6abc
        q += base_q0;
Packit 9c6abc
      }
Packit 9c6abc
    } else {
Packit 9c6abc
      if (i > 0) {
Packit 9c6abc
        dec->dqm_[i] = dec->dqm_[0];
Packit 9c6abc
        continue;
Packit 9c6abc
      } else {
Packit 9c6abc
        q = base_q0;
Packit 9c6abc
      }
Packit 9c6abc
    }
Packit 9c6abc
    {
Packit 9c6abc
      VP8QuantMatrix* const m = &dec->dqm_[i];
Packit 9c6abc
      m->y1_mat_[0] = kDcTable[clip(q + dqy1_dc, 127)];
Packit 9c6abc
      m->y1_mat_[1] = kAcTable[clip(q + 0,       127)];
Packit 9c6abc
Packit 9c6abc
      m->y2_mat_[0] = kDcTable[clip(q + dqy2_dc, 127)] * 2;
Packit 9c6abc
      // For all x in [0..284], x*155/100 is bitwise equal to (x*101581) >> 16.
Packit 9c6abc
      // The smallest precision for that is '(x*6349) >> 12' but 16 is a good
Packit 9c6abc
      // word size.
Packit 9c6abc
      m->y2_mat_[1] = (kAcTable[clip(q + dqy2_ac, 127)] * 101581) >> 16;
Packit 9c6abc
      if (m->y2_mat_[1] < 8) m->y2_mat_[1] = 8;
Packit 9c6abc
Packit 9c6abc
      m->uv_mat_[0] = kDcTable[clip(q + dquv_dc, 117)];
Packit 9c6abc
      m->uv_mat_[1] = kAcTable[clip(q + dquv_ac, 127)];
Packit 9c6abc
Packit 9c6abc
      m->uv_quant_ = q + dquv_ac;   // for dithering strength evaluation
Packit 9c6abc
    }
Packit 9c6abc
  }
Packit 9c6abc
}
Packit 9c6abc
Packit 9c6abc
//------------------------------------------------------------------------------
Packit 9c6abc