15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2010 Google Inc. All Rights Reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// that can be found in the COPYING file in the root of the source
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// tree. An additional intellectual property rights grant can be found
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// in the file PATENTS. All contributing project authors may
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// be found in the AUTHORS file in the root of the source tree.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -----------------------------------------------------------------------------
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Quantizer initialization
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: Skal (pascal.massimino@gmail.com)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "./vp8i.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE int clip(int v, int M) {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return v < 0 ? 0 : v > M ? M : v;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Paragraph 14.1
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint8_t kDcTable[128] = {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  4,     5,   6,   7,   8,   9,  10,  10,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  11,   12,  13,  14,  15,  16,  17,  17,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  18,   19,  20,  20,  21,  21,  22,  22,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  23,   23,  24,  25,  25,  26,  27,  28,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  29,   30,  31,  32,  33,  34,  35,  36,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  37,   37,  38,  39,  40,  41,  42,  43,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  44,   45,  46,  46,  47,  48,  49,  50,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  51,   52,  53,  54,  55,  56,  57,  58,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  59,   60,  61,  62,  63,  64,  65,  66,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  67,   68,  69,  70,  71,  72,  73,  74,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  75,   76,  76,  77,  78,  79,  80,  81,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  82,   83,  84,  85,  86,  87,  88,  89,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  91,   93,  95,  96,  98, 100, 101, 102,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  104, 106, 108, 110, 112, 114, 116, 118,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  122, 124, 126, 128, 130, 132, 134, 136,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  138, 140, 143, 145, 148, 151, 154, 157
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint16_t kAcTable[128] = {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  4,     5,   6,   7,   8,   9,  10,  11,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  12,   13,  14,  15,  16,  17,  18,  19,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  20,   21,  22,  23,  24,  25,  26,  27,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  28,   29,  30,  31,  32,  33,  34,  35,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  36,   37,  38,  39,  40,  41,  42,  43,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  44,   45,  46,  47,  48,  49,  50,  51,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  52,   53,  54,  55,  56,  57,  58,  60,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  62,   64,  66,  68,  70,  72,  74,  76,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  78,   80,  82,  84,  86,  88,  90,  92,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  94,   96,  98, 100, 102, 104, 106, 108,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  110, 112, 114, 116, 119, 122, 125, 128,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  131, 134, 137, 140, 143, 146, 149, 152,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  155, 158, 161, 164, 167, 170, 173, 177,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  181, 185, 189, 193, 197, 201, 205, 209,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  213, 217, 221, 225, 229, 234, 239, 245,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  249, 254, 259, 264, 269, 274, 279, 284
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Paragraph 9.6
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VP8ParseQuant(VP8Decoder* const dec) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VP8BitReader* const br = &dec->br_;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int base_q0 = VP8GetValue(br, 7);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int dqy1_dc = VP8Get(br) ? VP8GetSignedValue(br, 4) : 0;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int dqy2_dc = VP8Get(br) ? VP8GetSignedValue(br, 4) : 0;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int dqy2_ac = VP8Get(br) ? VP8GetSignedValue(br, 4) : 0;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int dquv_dc = VP8Get(br) ? VP8GetSignedValue(br, 4) : 0;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int dquv_ac = VP8Get(br) ? VP8GetSignedValue(br, 4) : 0;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const VP8SegmentHeader* const hdr = &dec->segment_hdr_;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (i = 0; i < NUM_MB_SEGMENTS; ++i) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int q;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (hdr->use_segment_) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      q = hdr->quantizer_[i];
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!hdr->absolute_delta_) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        q += base_q0;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (i > 0) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dec->dqm_[i] = dec->dqm_[0];
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        q = base_q0;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      VP8QuantMatrix* const m = &dec->dqm_[i];
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      m->y1_mat_[0] = kDcTable[clip(q + dqy1_dc, 127)];
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      m->y1_mat_[1] = kAcTable[clip(q + 0,       127)];
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      m->y2_mat_[0] = kDcTable[clip(q + dqy2_dc, 127)] * 2;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // For all x in [0..284], x*155/100 is bitwise equal to (x*101581) >> 16.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The smallest precision for that is '(x*6349) >> 12' but 16 is a good
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // word size.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      m->y2_mat_[1] = (kAcTable[clip(q + dqy2_ac, 127)] * 101581) >> 16;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (m->y2_mat_[1] < 8) m->y2_mat_[1] = 8;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      m->uv_mat_[0] = kDcTable[clip(q + dquv_dc, 117)];
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      m->uv_mat_[1] = kAcTable[clip(q + dquv_ac, 127)];
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      m->uv_quant_ = q + dquv_ac;   // for dithering strength evaluation
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
111