shithub: libvpx

ref: 7c1fdf02cd7554b1be0626e454d910c7ad06fe08
dir: /vp9/common/vp9_quant_common.c/

View raw version
/*
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "vp9/common/vp9_common.h"
#include "vp9/common/vp9_quant_common.h"
#include "vp9/common/vp9_seg_common.h"

static const int16_t dc_qlookup[QINDEX_RANGE] = {
  4,       8,    8,    9,   10,   11,   12,   12,
  13,     14,   15,   16,   17,   18,   19,   19,
  20,     21,   22,   23,   24,   25,   26,   26,
  27,     28,   29,   30,   31,   32,   32,   33,
  34,     35,   36,   37,   38,   38,   39,   40,
  41,     42,   43,   43,   44,   45,   46,   47,
  48,     48,   49,   50,   51,   52,   53,   53,
  54,     55,   56,   57,   57,   58,   59,   60,
  61,     62,   62,   63,   64,   65,   66,   66,
  67,     68,   69,   70,   70,   71,   72,   73,
  74,     74,   75,   76,   77,   78,   78,   79,
  80,     81,   81,   82,   83,   84,   85,   85,
  87,     88,   90,   92,   93,   95,   96,   98,
  99,    101,  102,  104,  105,  107,  108,  110,
  111,   113,  114,  116,  117,  118,  120,  121,
  123,   125,  127,  129,  131,  134,  136,  138,
  140,   142,  144,  146,  148,  150,  152,  154,
  156,   158,  161,  164,  166,  169,  172,  174,
  177,   180,  182,  185,  187,  190,  192,  195,
  199,   202,  205,  208,  211,  214,  217,  220,
  223,   226,  230,  233,  237,  240,  243,  247,
  250,   253,  257,  261,  265,  269,  272,  276,
  280,   284,  288,  292,  296,  300,  304,  309,
  313,   317,  322,  326,  330,  335,  340,  344,
  349,   354,  359,  364,  369,  374,  379,  384,
  389,   395,  400,  406,  411,  417,  423,  429,
  435,   441,  447,  454,  461,  467,  475,  482,
  489,   497,  505,  513,  522,  530,  539,  549,
  559,   569,  579,  590,  602,  614,  626,  640,
  654,   668,  684,  700,  717,  736,  755,  775,
  796,   819,  843,  869,  896,  925,  955,  988,
  1022, 1058, 1098, 1139, 1184, 1232, 1282, 1336,
};

#if CONFIG_VP9_HIGHBITDEPTH
static const int16_t dc_qlookup_10[QINDEX_RANGE] = {
  4,     9,    10,    13,    15,    17,    20,    22,
  25,    28,    31,    34,    37,    40,    43,    47,
  50,    53,    57,    60,    64,    68,    71,    75,
  78,    82,    86,    90,    93,    97,   101,   105,
  109,   113,   116,   120,   124,   128,   132,   136,
  140,   143,   147,   151,   155,   159,   163,   166,
  170,   174,   178,   182,   185,   189,   193,   197,
  200,   204,   208,   212,   215,   219,   223,   226,
  230,   233,   237,   241,   244,   248,   251,   255,
  259,   262,   266,   269,   273,   276,   280,   283,
  287,   290,   293,   297,   300,   304,   307,   310,
  314,   317,   321,   324,   327,   331,   334,   337,
  343,   350,   356,   362,   369,   375,   381,   387,
  394,   400,   406,   412,   418,   424,   430,   436,
  442,   448,   454,   460,   466,   472,   478,   484,
  490,   499,   507,   516,   525,   533,   542,   550,
  559,   567,   576,   584,   592,   601,   609,   617,
  625,   634,   644,   655,   666,   676,   687,   698,
  708,   718,   729,   739,   749,   759,   770,   782,
  795,   807,   819,   831,   844,   856,   868,   880,
  891,   906,   920,   933,   947,   961,   975,   988,
  1001,  1015,  1030,  1045,  1061,  1076,  1090,  1105,
  1120,  1137,  1153,  1170,  1186,  1202,  1218,  1236,
  1253,  1271,  1288,  1306,  1323,  1342,  1361,  1379,
  1398,  1416,  1436,  1456,  1476,  1496,  1516,  1537,
  1559,  1580,  1601,  1624,  1647,  1670,  1692,  1717,
  1741,  1766,  1791,  1817,  1844,  1871,  1900,  1929,
  1958,  1990,  2021,  2054,  2088,  2123,  2159,  2197,
  2236,  2276,  2319,  2363,  2410,  2458,  2508,  2561,
  2616,  2675,  2737,  2802,  2871,  2944,  3020,  3102,
  3188,  3280,  3375,  3478,  3586,  3702,  3823,  3953,
  4089,  4236,  4394,  4559,  4737,  4929,  5130,  5347,
};

static const int16_t dc_qlookup_12[QINDEX_RANGE] = {
  4,    12,    18,    25,    33,    41,    50,    60,
  70,    80,    91,   103,   115,   127,   140,   153,
  166,   180,   194,   208,   222,   237,   251,   266,
  281,   296,   312,   327,   343,   358,   374,   390,
  405,   421,   437,   453,   469,   484,   500,   516,
  532,   548,   564,   580,   596,   611,   627,   643,
  659,   674,   690,   706,   721,   737,   752,   768,
  783,   798,   814,   829,   844,   859,   874,   889,
  904,   919,   934,   949,   964,   978,   993,  1008,
  1022,  1037,  1051,  1065,  1080,  1094,  1108,  1122,
  1136,  1151,  1165,  1179,  1192,  1206,  1220,  1234,
  1248,  1261,  1275,  1288,  1302,  1315,  1329,  1342,
  1368,  1393,  1419,  1444,  1469,  1494,  1519,  1544,
  1569,  1594,  1618,  1643,  1668,  1692,  1717,  1741,
  1765,  1789,  1814,  1838,  1862,  1885,  1909,  1933,
  1957,  1992,  2027,  2061,  2096,  2130,  2165,  2199,
  2233,  2267,  2300,  2334,  2367,  2400,  2434,  2467,
  2499,  2532,  2575,  2618,  2661,  2704,  2746,  2788,
  2830,  2872,  2913,  2954,  2995,  3036,  3076,  3127,
  3177,  3226,  3275,  3324,  3373,  3421,  3469,  3517,
  3565,  3621,  3677,  3733,  3788,  3843,  3897,  3951,
  4005,  4058,  4119,  4181,  4241,  4301,  4361,  4420,
  4479,  4546,  4612,  4677,  4742,  4807,  4871,  4942,
  5013,  5083,  5153,  5222,  5291,  5367,  5442,  5517,
  5591,  5665,  5745,  5825,  5905,  5984,  6063,  6149,
  6234,  6319,  6404,  6495,  6587,  6678,  6769,  6867,
  6966,  7064,  7163,  7269,  7376,  7483,  7599,  7715,
  7832,  7958,  8085,  8214,  8352,  8492,  8635,  8788,
  8945,  9104,  9275,  9450,  9639,  9832, 10031, 10245,
  10465, 10702, 10946, 11210, 11482, 11776, 12081, 12409,
  12750, 13118, 13501, 13913, 14343, 14807, 15290, 15812,
  16356, 16943, 17575, 18237, 18949, 19718, 20521, 21387,
};
#endif

static const int16_t ac_qlookup[QINDEX_RANGE] = {
  4,       8,    9,   10,   11,   12,   13,   14,
  15,     16,   17,   18,   19,   20,   21,   22,
  23,     24,   25,   26,   27,   28,   29,   30,
  31,     32,   33,   34,   35,   36,   37,   38,
  39,     40,   41,   42,   43,   44,   45,   46,
  47,     48,   49,   50,   51,   52,   53,   54,
  55,     56,   57,   58,   59,   60,   61,   62,
  63,     64,   65,   66,   67,   68,   69,   70,
  71,     72,   73,   74,   75,   76,   77,   78,
  79,     80,   81,   82,   83,   84,   85,   86,
  87,     88,   89,   90,   91,   92,   93,   94,
  95,     96,   97,   98,   99,  100,  101,  102,
  104,   106,  108,  110,  112,  114,  116,  118,
  120,   122,  124,  126,  128,  130,  132,  134,
  136,   138,  140,  142,  144,  146,  148,  150,
  152,   155,  158,  161,  164,  167,  170,  173,
  176,   179,  182,  185,  188,  191,  194,  197,
  200,   203,  207,  211,  215,  219,  223,  227,
  231,   235,  239,  243,  247,  251,  255,  260,
  265,   270,  275,  280,  285,  290,  295,  300,
  305,   311,  317,  323,  329,  335,  341,  347,
  353,   359,  366,  373,  380,  387,  394,  401,
  408,   416,  424,  432,  440,  448,  456,  465,
  474,   483,  492,  501,  510,  520,  530,  540,
  550,   560,  571,  582,  593,  604,  615,  627,
  639,   651,  663,  676,  689,  702,  715,  729,
  743,   757,  771,  786,  801,  816,  832,  848,
  864,   881,  898,  915,  933,  951,  969,  988,
  1007, 1026, 1046, 1066, 1087, 1108, 1129, 1151,
  1173, 1196, 1219, 1243, 1267, 1292, 1317, 1343,
  1369, 1396, 1423, 1451, 1479, 1508, 1537, 1567,
  1597, 1628, 1660, 1692, 1725, 1759, 1793, 1828,
};

#if CONFIG_VP9_HIGHBITDEPTH
static const int16_t ac_qlookup_10[QINDEX_RANGE] = {
  4,     9,    11,    13,    16,    18,    21,    24,
  27,    30,    33,    37,    40,    44,    48,    51,
  55,    59,    63,    67,    71,    75,    79,    83,
  88,    92,    96,   100,   105,   109,   114,   118,
  122,   127,   131,   136,   140,   145,   149,   154,
  158,   163,   168,   172,   177,   181,   186,   190,
  195,   199,   204,   208,   213,   217,   222,   226,
  231,   235,   240,   244,   249,   253,   258,   262,
  267,   271,   275,   280,   284,   289,   293,   297,
  302,   306,   311,   315,   319,   324,   328,   332,
  337,   341,   345,   349,   354,   358,   362,   367,
  371,   375,   379,   384,   388,   392,   396,   401,
  409,   417,   425,   433,   441,   449,   458,   466,
  474,   482,   490,   498,   506,   514,   523,   531,
  539,   547,   555,   563,   571,   579,   588,   596,
  604,   616,   628,   640,   652,   664,   676,   688,
  700,   713,   725,   737,   749,   761,   773,   785,
  797,   809,   825,   841,   857,   873,   889,   905,
  922,   938,   954,   970,   986,  1002,  1018,  1038,
  1058,  1078,  1098,  1118,  1138,  1158,  1178,  1198,
  1218,  1242,  1266,  1290,  1314,  1338,  1362,  1386,
  1411,  1435,  1463,  1491,  1519,  1547,  1575,  1603,
  1631,  1663,  1695,  1727,  1759,  1791,  1823,  1859,
  1895,  1931,  1967,  2003,  2039,  2079,  2119,  2159,
  2199,  2239,  2283,  2327,  2371,  2415,  2459,  2507,
  2555,  2603,  2651,  2703,  2755,  2807,  2859,  2915,
  2971,  3027,  3083,  3143,  3203,  3263,  3327,  3391,
  3455,  3523,  3591,  3659,  3731,  3803,  3876,  3952,
  4028,  4104,  4184,  4264,  4348,  4432,  4516,  4604,
  4692,  4784,  4876,  4972,  5068,  5168,  5268,  5372,
  5476,  5584,  5692,  5804,  5916,  6032,  6148,  6268,
  6388,  6512,  6640,  6768,  6900,  7036,  7172,  7312,
};

static const int16_t ac_qlookup_12[QINDEX_RANGE] = {
  4,    13,    19,    27,    35,    44,    54,    64,
  75,    87,    99,   112,   126,   139,   154,   168,
  183,   199,   214,   230,   247,   263,   280,   297,
  314,   331,   349,   366,   384,   402,   420,   438,
  456,   475,   493,   511,   530,   548,   567,   586,
  604,   623,   642,   660,   679,   698,   716,   735,
  753,   772,   791,   809,   828,   846,   865,   884,
  902,   920,   939,   957,   976,   994,  1012,  1030,
  1049,  1067,  1085,  1103,  1121,  1139,  1157,  1175,
  1193,  1211,  1229,  1246,  1264,  1282,  1299,  1317,
  1335,  1352,  1370,  1387,  1405,  1422,  1440,  1457,
  1474,  1491,  1509,  1526,  1543,  1560,  1577,  1595,
  1627,  1660,  1693,  1725,  1758,  1791,  1824,  1856,
  1889,  1922,  1954,  1987,  2020,  2052,  2085,  2118,
  2150,  2183,  2216,  2248,  2281,  2313,  2346,  2378,
  2411,  2459,  2508,  2556,  2605,  2653,  2701,  2750,
  2798,  2847,  2895,  2943,  2992,  3040,  3088,  3137,
  3185,  3234,  3298,  3362,  3426,  3491,  3555,  3619,
  3684,  3748,  3812,  3876,  3941,  4005,  4069,  4149,
  4230,  4310,  4390,  4470,  4550,  4631,  4711,  4791,
  4871,  4967,  5064,  5160,  5256,  5352,  5448,  5544,
  5641,  5737,  5849,  5961,  6073,  6185,  6297,  6410,
  6522,  6650,  6778,  6906,  7034,  7162,  7290,  7435,
  7579,  7723,  7867,  8011,  8155,  8315,  8475,  8635,
  8795,  8956,  9132,  9308,  9484,  9660,  9836, 10028,
  10220, 10412, 10604, 10812, 11020, 11228, 11437, 11661,
  11885, 12109, 12333, 12573, 12813, 13053, 13309, 13565,
  13821, 14093, 14365, 14637, 14925, 15213, 15502, 15806,
  16110, 16414, 16734, 17054, 17390, 17726, 18062, 18414,
  18766, 19134, 19502, 19886, 20270, 20670, 21070, 21486,
  21902, 22334, 22766, 23214, 23662, 24126, 24590, 25070,
  25551, 26047, 26559, 27071, 27599, 28143, 28687, 29247,
};
#endif

int16_t vp9_dc_quant(int qindex, int delta, vpx_bit_depth_t bit_depth) {
#if CONFIG_VP9_HIGHBITDEPTH
  switch (bit_depth) {
    case VPX_BITS_8:
      return dc_qlookup[clamp(qindex + delta, 0, MAXQ)];
    case VPX_BITS_10:
      return dc_qlookup_10[clamp(qindex + delta, 0, MAXQ)];
    case VPX_BITS_12:
      return dc_qlookup_12[clamp(qindex + delta, 0, MAXQ)];
    default:
      assert(0 && "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12");
      return -1;
  }
#else
  (void) bit_depth;
  return dc_qlookup[clamp(qindex + delta, 0, MAXQ)];
#endif
}

int16_t vp9_ac_quant(int qindex, int delta, vpx_bit_depth_t bit_depth) {
#if CONFIG_VP9_HIGHBITDEPTH
  switch (bit_depth) {
    case VPX_BITS_8:
      return ac_qlookup[clamp(qindex + delta, 0, MAXQ)];
    case VPX_BITS_10:
      return ac_qlookup_10[clamp(qindex + delta, 0, MAXQ)];
    case VPX_BITS_12:
      return ac_qlookup_12[clamp(qindex + delta, 0, MAXQ)];
    default:
      assert(0 && "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12");
      return -1;
  }
#else
  (void) bit_depth;
  return ac_qlookup[clamp(qindex + delta, 0, MAXQ)];
#endif
}

int vp9_get_qindex(const struct segmentation *seg, int segment_id,
                   int base_qindex) {
  if (segfeature_active(seg, segment_id, SEG_LVL_ALT_Q)) {
    const int data = get_segdata(seg, segment_id, SEG_LVL_ALT_Q);
    const int seg_qindex = seg->abs_delta == SEGMENT_ABSDATA ?
        data : base_qindex + data;
    return clamp(seg_qindex, 0, MAXQ);
  } else {
    return base_qindex;
  }
}