1/*
2 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "vp9/common/vp9_common.h"
12#include "vp9/common/vp9_quant_common.h"
13#include "vp9/common/vp9_seg_common.h"
14
15static const int16_t dc_qlookup[QINDEX_RANGE] = {
16  4,       8,    8,    9,   10,   11,   12,   12,
17  13,     14,   15,   16,   17,   18,   19,   19,
18  20,     21,   22,   23,   24,   25,   26,   26,
19  27,     28,   29,   30,   31,   32,   32,   33,
20  34,     35,   36,   37,   38,   38,   39,   40,
21  41,     42,   43,   43,   44,   45,   46,   47,
22  48,     48,   49,   50,   51,   52,   53,   53,
23  54,     55,   56,   57,   57,   58,   59,   60,
24  61,     62,   62,   63,   64,   65,   66,   66,
25  67,     68,   69,   70,   70,   71,   72,   73,
26  74,     74,   75,   76,   77,   78,   78,   79,
27  80,     81,   81,   82,   83,   84,   85,   85,
28  87,     88,   90,   92,   93,   95,   96,   98,
29  99,    101,  102,  104,  105,  107,  108,  110,
30  111,   113,  114,  116,  117,  118,  120,  121,
31  123,   125,  127,  129,  131,  134,  136,  138,
32  140,   142,  144,  146,  148,  150,  152,  154,
33  156,   158,  161,  164,  166,  169,  172,  174,
34  177,   180,  182,  185,  187,  190,  192,  195,
35  199,   202,  205,  208,  211,  214,  217,  220,
36  223,   226,  230,  233,  237,  240,  243,  247,
37  250,   253,  257,  261,  265,  269,  272,  276,
38  280,   284,  288,  292,  296,  300,  304,  309,
39  313,   317,  322,  326,  330,  335,  340,  344,
40  349,   354,  359,  364,  369,  374,  379,  384,
41  389,   395,  400,  406,  411,  417,  423,  429,
42  435,   441,  447,  454,  461,  467,  475,  482,
43  489,   497,  505,  513,  522,  530,  539,  549,
44  559,   569,  579,  590,  602,  614,  626,  640,
45  654,   668,  684,  700,  717,  736,  755,  775,
46  796,   819,  843,  869,  896,  925,  955,  988,
47  1022, 1058, 1098, 1139, 1184, 1232, 1282, 1336,
48};
49
50#if CONFIG_VP9_HIGHBITDEPTH
51static const int16_t dc_qlookup_10[QINDEX_RANGE] = {
52  4,     9,    10,    13,    15,    17,    20,    22,
53  25,    28,    31,    34,    37,    40,    43,    47,
54  50,    53,    57,    60,    64,    68,    71,    75,
55  78,    82,    86,    90,    93,    97,   101,   105,
56  109,   113,   116,   120,   124,   128,   132,   136,
57  140,   143,   147,   151,   155,   159,   163,   166,
58  170,   174,   178,   182,   185,   189,   193,   197,
59  200,   204,   208,   212,   215,   219,   223,   226,
60  230,   233,   237,   241,   244,   248,   251,   255,
61  259,   262,   266,   269,   273,   276,   280,   283,
62  287,   290,   293,   297,   300,   304,   307,   310,
63  314,   317,   321,   324,   327,   331,   334,   337,
64  343,   350,   356,   362,   369,   375,   381,   387,
65  394,   400,   406,   412,   418,   424,   430,   436,
66  442,   448,   454,   460,   466,   472,   478,   484,
67  490,   499,   507,   516,   525,   533,   542,   550,
68  559,   567,   576,   584,   592,   601,   609,   617,
69  625,   634,   644,   655,   666,   676,   687,   698,
70  708,   718,   729,   739,   749,   759,   770,   782,
71  795,   807,   819,   831,   844,   856,   868,   880,
72  891,   906,   920,   933,   947,   961,   975,   988,
73  1001,  1015,  1030,  1045,  1061,  1076,  1090,  1105,
74  1120,  1137,  1153,  1170,  1186,  1202,  1218,  1236,
75  1253,  1271,  1288,  1306,  1323,  1342,  1361,  1379,
76  1398,  1416,  1436,  1456,  1476,  1496,  1516,  1537,
77  1559,  1580,  1601,  1624,  1647,  1670,  1692,  1717,
78  1741,  1766,  1791,  1817,  1844,  1871,  1900,  1929,
79  1958,  1990,  2021,  2054,  2088,  2123,  2159,  2197,
80  2236,  2276,  2319,  2363,  2410,  2458,  2508,  2561,
81  2616,  2675,  2737,  2802,  2871,  2944,  3020,  3102,
82  3188,  3280,  3375,  3478,  3586,  3702,  3823,  3953,
83  4089,  4236,  4394,  4559,  4737,  4929,  5130,  5347,
84};
85
86static const int16_t dc_qlookup_12[QINDEX_RANGE] = {
87  4,    12,    18,    25,    33,    41,    50,    60,
88  70,    80,    91,   103,   115,   127,   140,   153,
89  166,   180,   194,   208,   222,   237,   251,   266,
90  281,   296,   312,   327,   343,   358,   374,   390,
91  405,   421,   437,   453,   469,   484,   500,   516,
92  532,   548,   564,   580,   596,   611,   627,   643,
93  659,   674,   690,   706,   721,   737,   752,   768,
94  783,   798,   814,   829,   844,   859,   874,   889,
95  904,   919,   934,   949,   964,   978,   993,  1008,
96  1022,  1037,  1051,  1065,  1080,  1094,  1108,  1122,
97  1136,  1151,  1165,  1179,  1192,  1206,  1220,  1234,
98  1248,  1261,  1275,  1288,  1302,  1315,  1329,  1342,
99  1368,  1393,  1419,  1444,  1469,  1494,  1519,  1544,
100  1569,  1594,  1618,  1643,  1668,  1692,  1717,  1741,
101  1765,  1789,  1814,  1838,  1862,  1885,  1909,  1933,
102  1957,  1992,  2027,  2061,  2096,  2130,  2165,  2199,
103  2233,  2267,  2300,  2334,  2367,  2400,  2434,  2467,
104  2499,  2532,  2575,  2618,  2661,  2704,  2746,  2788,
105  2830,  2872,  2913,  2954,  2995,  3036,  3076,  3127,
106  3177,  3226,  3275,  3324,  3373,  3421,  3469,  3517,
107  3565,  3621,  3677,  3733,  3788,  3843,  3897,  3951,
108  4005,  4058,  4119,  4181,  4241,  4301,  4361,  4420,
109  4479,  4546,  4612,  4677,  4742,  4807,  4871,  4942,
110  5013,  5083,  5153,  5222,  5291,  5367,  5442,  5517,
111  5591,  5665,  5745,  5825,  5905,  5984,  6063,  6149,
112  6234,  6319,  6404,  6495,  6587,  6678,  6769,  6867,
113  6966,  7064,  7163,  7269,  7376,  7483,  7599,  7715,
114  7832,  7958,  8085,  8214,  8352,  8492,  8635,  8788,
115  8945,  9104,  9275,  9450,  9639,  9832, 10031, 10245,
116  10465, 10702, 10946, 11210, 11482, 11776, 12081, 12409,
117  12750, 13118, 13501, 13913, 14343, 14807, 15290, 15812,
118  16356, 16943, 17575, 18237, 18949, 19718, 20521, 21387,
119};
120#endif
121
122static const int16_t ac_qlookup[QINDEX_RANGE] = {
123  4,       8,    9,   10,   11,   12,   13,   14,
124  15,     16,   17,   18,   19,   20,   21,   22,
125  23,     24,   25,   26,   27,   28,   29,   30,
126  31,     32,   33,   34,   35,   36,   37,   38,
127  39,     40,   41,   42,   43,   44,   45,   46,
128  47,     48,   49,   50,   51,   52,   53,   54,
129  55,     56,   57,   58,   59,   60,   61,   62,
130  63,     64,   65,   66,   67,   68,   69,   70,
131  71,     72,   73,   74,   75,   76,   77,   78,
132  79,     80,   81,   82,   83,   84,   85,   86,
133  87,     88,   89,   90,   91,   92,   93,   94,
134  95,     96,   97,   98,   99,  100,  101,  102,
135  104,   106,  108,  110,  112,  114,  116,  118,
136  120,   122,  124,  126,  128,  130,  132,  134,
137  136,   138,  140,  142,  144,  146,  148,  150,
138  152,   155,  158,  161,  164,  167,  170,  173,
139  176,   179,  182,  185,  188,  191,  194,  197,
140  200,   203,  207,  211,  215,  219,  223,  227,
141  231,   235,  239,  243,  247,  251,  255,  260,
142  265,   270,  275,  280,  285,  290,  295,  300,
143  305,   311,  317,  323,  329,  335,  341,  347,
144  353,   359,  366,  373,  380,  387,  394,  401,
145  408,   416,  424,  432,  440,  448,  456,  465,
146  474,   483,  492,  501,  510,  520,  530,  540,
147  550,   560,  571,  582,  593,  604,  615,  627,
148  639,   651,  663,  676,  689,  702,  715,  729,
149  743,   757,  771,  786,  801,  816,  832,  848,
150  864,   881,  898,  915,  933,  951,  969,  988,
151  1007, 1026, 1046, 1066, 1087, 1108, 1129, 1151,
152  1173, 1196, 1219, 1243, 1267, 1292, 1317, 1343,
153  1369, 1396, 1423, 1451, 1479, 1508, 1537, 1567,
154  1597, 1628, 1660, 1692, 1725, 1759, 1793, 1828,
155};
156
157#if CONFIG_VP9_HIGHBITDEPTH
158static const int16_t ac_qlookup_10[QINDEX_RANGE] = {
159  4,     9,    11,    13,    16,    18,    21,    24,
160  27,    30,    33,    37,    40,    44,    48,    51,
161  55,    59,    63,    67,    71,    75,    79,    83,
162  88,    92,    96,   100,   105,   109,   114,   118,
163  122,   127,   131,   136,   140,   145,   149,   154,
164  158,   163,   168,   172,   177,   181,   186,   190,
165  195,   199,   204,   208,   213,   217,   222,   226,
166  231,   235,   240,   244,   249,   253,   258,   262,
167  267,   271,   275,   280,   284,   289,   293,   297,
168  302,   306,   311,   315,   319,   324,   328,   332,
169  337,   341,   345,   349,   354,   358,   362,   367,
170  371,   375,   379,   384,   388,   392,   396,   401,
171  409,   417,   425,   433,   441,   449,   458,   466,
172  474,   482,   490,   498,   506,   514,   523,   531,
173  539,   547,   555,   563,   571,   579,   588,   596,
174  604,   616,   628,   640,   652,   664,   676,   688,
175  700,   713,   725,   737,   749,   761,   773,   785,
176  797,   809,   825,   841,   857,   873,   889,   905,
177  922,   938,   954,   970,   986,  1002,  1018,  1038,
178  1058,  1078,  1098,  1118,  1138,  1158,  1178,  1198,
179  1218,  1242,  1266,  1290,  1314,  1338,  1362,  1386,
180  1411,  1435,  1463,  1491,  1519,  1547,  1575,  1603,
181  1631,  1663,  1695,  1727,  1759,  1791,  1823,  1859,
182  1895,  1931,  1967,  2003,  2039,  2079,  2119,  2159,
183  2199,  2239,  2283,  2327,  2371,  2415,  2459,  2507,
184  2555,  2603,  2651,  2703,  2755,  2807,  2859,  2915,
185  2971,  3027,  3083,  3143,  3203,  3263,  3327,  3391,
186  3455,  3523,  3591,  3659,  3731,  3803,  3876,  3952,
187  4028,  4104,  4184,  4264,  4348,  4432,  4516,  4604,
188  4692,  4784,  4876,  4972,  5068,  5168,  5268,  5372,
189  5476,  5584,  5692,  5804,  5916,  6032,  6148,  6268,
190  6388,  6512,  6640,  6768,  6900,  7036,  7172,  7312,
191};
192
193static const int16_t ac_qlookup_12[QINDEX_RANGE] = {
194  4,    13,    19,    27,    35,    44,    54,    64,
195  75,    87,    99,   112,   126,   139,   154,   168,
196  183,   199,   214,   230,   247,   263,   280,   297,
197  314,   331,   349,   366,   384,   402,   420,   438,
198  456,   475,   493,   511,   530,   548,   567,   586,
199  604,   623,   642,   660,   679,   698,   716,   735,
200  753,   772,   791,   809,   828,   846,   865,   884,
201  902,   920,   939,   957,   976,   994,  1012,  1030,
202  1049,  1067,  1085,  1103,  1121,  1139,  1157,  1175,
203  1193,  1211,  1229,  1246,  1264,  1282,  1299,  1317,
204  1335,  1352,  1370,  1387,  1405,  1422,  1440,  1457,
205  1474,  1491,  1509,  1526,  1543,  1560,  1577,  1595,
206  1627,  1660,  1693,  1725,  1758,  1791,  1824,  1856,
207  1889,  1922,  1954,  1987,  2020,  2052,  2085,  2118,
208  2150,  2183,  2216,  2248,  2281,  2313,  2346,  2378,
209  2411,  2459,  2508,  2556,  2605,  2653,  2701,  2750,
210  2798,  2847,  2895,  2943,  2992,  3040,  3088,  3137,
211  3185,  3234,  3298,  3362,  3426,  3491,  3555,  3619,
212  3684,  3748,  3812,  3876,  3941,  4005,  4069,  4149,
213  4230,  4310,  4390,  4470,  4550,  4631,  4711,  4791,
214  4871,  4967,  5064,  5160,  5256,  5352,  5448,  5544,
215  5641,  5737,  5849,  5961,  6073,  6185,  6297,  6410,
216  6522,  6650,  6778,  6906,  7034,  7162,  7290,  7435,
217  7579,  7723,  7867,  8011,  8155,  8315,  8475,  8635,
218  8795,  8956,  9132,  9308,  9484,  9660,  9836, 10028,
219  10220, 10412, 10604, 10812, 11020, 11228, 11437, 11661,
220  11885, 12109, 12333, 12573, 12813, 13053, 13309, 13565,
221  13821, 14093, 14365, 14637, 14925, 15213, 15502, 15806,
222  16110, 16414, 16734, 17054, 17390, 17726, 18062, 18414,
223  18766, 19134, 19502, 19886, 20270, 20670, 21070, 21486,
224  21902, 22334, 22766, 23214, 23662, 24126, 24590, 25070,
225  25551, 26047, 26559, 27071, 27599, 28143, 28687, 29247,
226};
227#endif
228
229int16_t vp9_dc_quant(int qindex, int delta, vpx_bit_depth_t bit_depth) {
230#if CONFIG_VP9_HIGHBITDEPTH
231  switch (bit_depth) {
232    case VPX_BITS_8:
233      return dc_qlookup[clamp(qindex + delta, 0, MAXQ)];
234    case VPX_BITS_10:
235      return dc_qlookup_10[clamp(qindex + delta, 0, MAXQ)];
236    case VPX_BITS_12:
237      return dc_qlookup_12[clamp(qindex + delta, 0, MAXQ)];
238    default:
239      assert(0 && "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12");
240      return -1;
241  }
242#else
243  (void) bit_depth;
244  return dc_qlookup[clamp(qindex + delta, 0, MAXQ)];
245#endif
246}
247
248int16_t vp9_ac_quant(int qindex, int delta, vpx_bit_depth_t bit_depth) {
249#if CONFIG_VP9_HIGHBITDEPTH
250  switch (bit_depth) {
251    case VPX_BITS_8:
252      return ac_qlookup[clamp(qindex + delta, 0, MAXQ)];
253    case VPX_BITS_10:
254      return ac_qlookup_10[clamp(qindex + delta, 0, MAXQ)];
255    case VPX_BITS_12:
256      return ac_qlookup_12[clamp(qindex + delta, 0, MAXQ)];
257    default:
258      assert(0 && "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12");
259      return -1;
260  }
261#else
262  (void) bit_depth;
263  return ac_qlookup[clamp(qindex + delta, 0, MAXQ)];
264#endif
265}
266
267int vp9_get_qindex(const struct segmentation *seg, int segment_id,
268                   int base_qindex) {
269  if (segfeature_active(seg, segment_id, SEG_LVL_ALT_Q)) {
270    const int data = get_segdata(seg, segment_id, SEG_LVL_ALT_Q);
271    const int seg_qindex = seg->abs_delta == SEGMENT_ABSDATA ?
272        data : base_qindex + data;
273    return clamp(seg_qindex, 0, MAXQ);
274  } else {
275    return base_qindex;
276  }
277}
278
279