blob: dac90565aacf4b4f579c33629de29279fdb03871 [file] [log] [blame] [edit]
/*
* Copyright (c) 2021, Alliance for Open Media. All rights reserved
*
* This source code is subject to the terms of the BSD 3-Clause Clear License
* and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear
* License was not distributed with this source code in the LICENSE file, you
* can obtain it at aomedia.org/license/software-license/bsd-3-c-c/. If the
* Alliance for Open Media Patent License 1.0 was not distributed with this
* source code in the PATENTS file, you can obtain it at
* aomedia.org/license/patent-license/.
*/
#include "av1/common/av1_common_int.h"
#include "av1/common/blockd.h"
#include "av1/common/common.h"
#include "av1/common/entropy.h"
#include "av1/common/quant_common.h"
#include "av1/common/seg_common.h"
// clang-format off
// 64, q_index = 0
// Q = 2^((q_index + 127)/24) q_index in [1, 24]
// Q[(q_index - 1) % 24) + 1] * 2^((q_index-1)/24) q_index in [25, 255]
static const uint16_t ac_qlookup_QTX[25] = {
64, 40, 41, 43, 44, 45, 47, 48, 49, 51, 52,
54, 55, 57, 59, 60, 62, 64, 66, 68, 70, 72,
74, 76, 78
};
#ifndef NDEBUG
static const uint16_t ac_qlookup_QTX_full[QINDEX_RANGE_8_BITS] = {
64, 40, 41, 43, 44, 45, 47, 48, 49, 51, 52,
54, 55, 57, 59, 60, 62, 64, 66, 68, 70, 72,
74, 76, 78, 80, 82, 86, 88, 90, 94, 96, 98,
102, 104, 108, 110, 114, 118, 120, 124, 128, 132, 136,
140, 144, 148, 152, 156, 160, 164, 172, 176, 180, 188,
192, 196, 204, 208, 216, 220, 228, 236, 240, 248, 256,
264, 272, 280, 288, 296, 304, 312, 320, 328, 344, 352,
360, 376, 384, 392, 408, 416, 432, 440, 456, 472, 480,
496, 512, 528, 544, 560, 576, 592, 608, 624, 640, 656,
688, 704, 720, 752, 768, 784, 816, 832, 864, 880, 912,
944, 960, 992, 1024, 1056, 1088, 1120, 1152, 1184, 1216, 1248,
1280, 1312, 1376, 1408, 1440, 1504, 1536, 1568, 1632, 1664, 1728,
1760, 1824, 1888, 1920, 1984, 2048, 2112, 2176, 2240, 2304, 2368,
2432, 2496, 2560, 2624, 2752, 2816, 2880, 3008, 3072, 3136, 3264,
3328, 3456, 3520, 3648, 3776, 3840, 3968, 4096, 4224, 4352, 4480,
4608, 4736, 4864, 4992, 5120, 5248, 5504, 5632, 5760, 6016, 6144,
6272, 6528, 6656, 6912, 7040, 7296, 7552, 7680, 7936, 8192, 8448,
8704, 8960, 9216, 9472, 9728, 9984, 10240, 10496, 11008, 11264, 11520,
12032, 12288, 12544, 13056, 13312, 13824, 14080, 14592, 15104, 15360, 15872,
16384, 16896, 17408, 17920, 18432, 18944, 19456, 19968, 20480, 20992, 22016,
22528, 23040, 24064, 24576, 25088, 26112, 26624, 27648, 28160, 29184, 30208,
30720, 31744, 32768, 33792, 34816, 35840, 36864, 37888, 38912, 39936, 40960,
41984, 44032, 45056, 46080, 48128, 49152, 50176, 52224, 53248, 55296, 56320,
58368, 60416, 61440
};
#endif // NDEBUG
// clang-format on
// Coefficient scaling and quantization with AV1 TX are tailored to
// the AV1 TX transforms. Regardless of the bit-depth of the input,
// the transform stages scale the coefficient values up by a factor of
// 8 (3 bits) over the scale of the pixel values. Thus, for 8-bit
// input, the coefficients have effectively 11 bits of scale depth
// (8+3), 10-bit input pixels result in 13-bit coefficient depth
// (10+3) and 12-bit pixels yield 15-bit (12+3) coefficient depth.
// All quantizers are built using this invariant of x8, 3-bit scaling,
// thus the Q3 suffix.
// A partial exception to this rule is large transforms; to avoid
// overflow, TX blocks with > 256 pels (>16x16) are scaled only
// 4-times unity (2 bits) over the pixel depth, and TX blocks with
// over 1024 pixels (>32x32) are scaled up only 2x unity (1 bit).
// This descaling is found via av1_tx_get_scale(). Thus, 16x32, 32x16
// and 32x32 transforms actually return Q2 coefficients, and 32x64,
// 64x32 and 64x64 transforms return Q1 coefficients. However, the
// quantizers are de-scaled down on-the-fly by the same amount
// (av1_tx_get_scale()) during quantization, and as such the
// dequantized/decoded coefficients, even for large TX blocks, are always
// effectively Q3. Meanwhile, quantized/coded coefficients are Q0
// because Qn quantizers are applied to Qn tx coefficients.
// Note that encoder decision making (which uses the quantizer to
// generate several bespoke lamdas for RDO and other heuristics)
// expects quantizers to be larger for higher-bitdepth input. In
// addition, the minimum allowable quantizer is 4; smaller values will
// underflow to 0 in the actual quantization routines.
#if CONFIG_TCQ
int tcq_parity(int absLevel) {
int par = absLevel & 1;
return par;
}
int tcq_init_state(int tcq_mode) {
int state = tcq_mode << 8;
return state;
}
int tcq_next_state(const int curState, const int absLevel) {
int tcq_mode = curState >> 8;
int state = curState & 255;
int nextState = 0;
if (tcq_mode == TCQ_8ST) {
switch (state) {
case 0: nextState = !(tcq_parity(absLevel)) ? 0 : 4; break;
case 1: nextState = !(tcq_parity(absLevel)) ? 4 : 0; break;
case 2: nextState = !(tcq_parity(absLevel)) ? 1 : 5; break;
case 3: nextState = !(tcq_parity(absLevel)) ? 5 : 1; break;
case 4: nextState = !(tcq_parity(absLevel)) ? 6 : 2; break;
case 5: nextState = !(tcq_parity(absLevel)) ? 2 : 6; break;
case 6: nextState = !(tcq_parity(absLevel)) ? 7 : 3; break;
case 7: nextState = !(tcq_parity(absLevel)) ? 3 : 7; break;
default: nextState = !(tcq_parity(absLevel)) ? 0 : 4; break;
}
} else { // TCQ_DISABLE
nextState = 0;
}
nextState += (tcq_mode << 8);
return nextState;
}
#endif // CONFIG_TCQ
int32_t av1_dc_quant_QTX(int qindex, int delta, int base_dc_delta_q,
aom_bit_depth_t bit_depth) {
int q_clamped;
if ((qindex == 0) && (delta + base_dc_delta_q <= 0))
q_clamped = 0;
else
q_clamped = clamp(qindex + base_dc_delta_q + delta, 1,
bit_depth == AOM_BITS_8 ? MAXQ_8_BITS
: bit_depth == AOM_BITS_10 ? MAXQ_10_BITS
: MAXQ);
if (q_clamped == 0) return (int32_t)ac_qlookup_QTX[q_clamped];
int qindex_offset = MAXQ_OFFSET * (bit_depth - 8);
// for 8 bit video, Q is calculated as
// 64, q_idx = 0
// Q = 2^((q_idx + 127)/24) q_idx in [1, 24]
// Q[(q_idx - 1) % 24) + 1] * 2^((q_idx-1)/24) q_idx in [25, 255]
if (q_clamped > MAXQ_8_BITS) {
switch (bit_depth) {
case AOM_BITS_8: assert(q_clamped <= MAXQ_8_BITS);
case AOM_BITS_10: {
int32_t Q;
if ((q_clamped - qindex_offset) < 25) {
Q = ac_qlookup_QTX[q_clamped - qindex_offset];
} else {
Q = ac_qlookup_QTX[(q_clamped - qindex_offset - 1) % 24 + 1]
<< ((q_clamped - qindex_offset - 1) / 24);
assert(Q == ac_qlookup_QTX_full[q_clamped - qindex_offset]);
}
return 4 * Q;
}
case AOM_BITS_12: {
int32_t Q;
if ((q_clamped - qindex_offset) < 25) {
Q = ac_qlookup_QTX[q_clamped - qindex_offset];
} else {
Q = ac_qlookup_QTX[(q_clamped - qindex_offset - 1) % 24 + 1]
<< ((q_clamped - qindex_offset - 1) / 24);
assert(Q == ac_qlookup_QTX_full[q_clamped - qindex_offset]);
}
return 16 * Q;
}
default:
assert(0 &&
"bit_depth should be AOM_BITS_8, AOM_BITS_10 or AOM_BITS_12");
return -1;
}
} else {
int32_t Q;
if (q_clamped < 25) {
Q = ac_qlookup_QTX[q_clamped];
} else {
Q = ac_qlookup_QTX[((q_clamped - 1) % 24) + 1] << ((q_clamped - 1) / 24);
assert(Q == ac_qlookup_QTX_full[q_clamped]);
}
return Q;
}
}
int32_t av1_ac_quant_QTX(int qindex, int delta, int base_ac_delta_q,
aom_bit_depth_t bit_depth) {
int q_clamped;
if ((qindex == 0) && (delta + base_ac_delta_q <= 0))
q_clamped = 0;
else
q_clamped = clamp(qindex + base_ac_delta_q + delta, 1,
bit_depth == AOM_BITS_8 ? MAXQ_8_BITS
: bit_depth == AOM_BITS_10 ? MAXQ_10_BITS
: MAXQ);
if (q_clamped == 0) return (int32_t)ac_qlookup_QTX[q_clamped];
int qindex_offset = MAXQ_OFFSET * (bit_depth - 8);
// for 8 bit video, Q is calculated as
// 64, q_idx = 0
// Q = 2^((q_idx + 127)/24) q_idx in [1, 24]
// Q[(q_idx - 1) % 24) + 1] * 2^((q_idx-1)/24) q_idx in [25, 255]
if (q_clamped > MAXQ_8_BITS) {
switch (bit_depth) {
case AOM_BITS_8: assert(q_clamped <= MAXQ_8_BITS);
case AOM_BITS_10: {
int32_t Q;
if ((q_clamped - qindex_offset) < 25) {
Q = ac_qlookup_QTX[q_clamped - qindex_offset];
} else {
Q = ac_qlookup_QTX[(q_clamped - qindex_offset - 1) % 24 + 1]
<< ((q_clamped - qindex_offset - 1) / 24);
assert(Q == ac_qlookup_QTX_full[q_clamped - qindex_offset]);
}
return 4 * Q;
}
case AOM_BITS_12: {
int32_t Q;
if ((q_clamped - qindex_offset) < 25) {
Q = ac_qlookup_QTX[q_clamped - qindex_offset];
} else {
Q = ac_qlookup_QTX[(q_clamped - qindex_offset - 1) % 24 + 1]
<< ((q_clamped - qindex_offset - 1) / 24);
assert(Q == ac_qlookup_QTX_full[q_clamped - qindex_offset]);
}
return 16 * Q;
}
default:
assert(0 &&
"bit_depth should be AOM_BITS_8, AOM_BITS_10 or AOM_BITS_12");
return -1;
}
} else {
int32_t Q;
if (q_clamped < 25) {
Q = ac_qlookup_QTX[q_clamped];
} else {
Q = ac_qlookup_QTX[((q_clamped - 1) % 24) + 1] << ((q_clamped - 1) / 24);
assert(Q == ac_qlookup_QTX_full[q_clamped]);
}
return Q;
}
}
int av1_get_qindex(const struct segmentation *seg, int segment_id,
int base_qindex, aom_bit_depth_t bit_depth) {
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 = base_qindex + data;
return clamp(seg_qindex, 0,
bit_depth == AOM_BITS_8 ? MAXQ_8_BITS
: bit_depth == AOM_BITS_10 ? MAXQ_10_BITS
: MAXQ);
} else {
return base_qindex;
}
}
bool av1_use_qmatrix(const CommonQuantParams *quant_params,
const struct macroblockd *xd, int segment_id) {
// True if explicit Q matrix levels and this is not a lossless segment.
return quant_params->using_qmatrix && !xd->lossless[segment_id];
}
const qm_val_t *av1_iqmatrix(const CommonQuantParams *quant_params, int qmlevel,
int plane, TX_SIZE tx_size) {
assert(quant_params->giqmatrix[qmlevel][plane][tx_size] != NULL ||
qmlevel == NUM_QM_LEVELS - 1);
return quant_params->giqmatrix[qmlevel][plane][tx_size];
}
const qm_val_t *av1_qmatrix(const CommonQuantParams *quant_params, int qmlevel,
int plane, TX_SIZE tx_size) {
assert(quant_params->gqmatrix[qmlevel][plane][tx_size] != NULL ||
qmlevel == NUM_QM_LEVELS - 1);
return quant_params->gqmatrix[qmlevel][plane][tx_size];
}
// Returns true if the tx_type corresponds to non-identity transform in both
// horizontal and vertical directions.
static INLINE bool is_2d_transform(TX_TYPE tx_type) {
return (get_primary_tx_type(tx_type) < IDTX);
}
const qm_val_t *av1_get_iqmatrix(const CommonQuantParams *quant_params,
const MACROBLOCKD *xd, int plane,
TX_SIZE tx_size, TX_TYPE tx_type) {
const struct macroblockd_plane *const pd = &xd->plane[plane];
const MB_MODE_INFO *const mbmi = xd->mi[0];
const int seg_id = mbmi->segment_id;
const TX_SIZE qm_tx_size = av1_get_adjusted_tx_size(tx_size);
// Use a flat matrix (i.e. no weighting) for 1D and Identity transforms
return is_2d_transform(tx_type)
? pd->seg_iqmatrix[seg_id][qm_tx_size]
: quant_params->giqmatrix[NUM_QM_LEVELS - 1][0][qm_tx_size];
}
const qm_val_t *av1_get_qmatrix(const CommonQuantParams *quant_params,
const MACROBLOCKD *xd, int plane,
TX_SIZE tx_size, TX_TYPE tx_type) {
const struct macroblockd_plane *const pd = &xd->plane[plane];
const MB_MODE_INFO *const mbmi = xd->mi[0];
const int seg_id = mbmi->segment_id;
const TX_SIZE qm_tx_size = av1_get_adjusted_tx_size(tx_size);
// Use a flat matrix (i.e. no weighting) for 1D and Identity transforms
return is_2d_transform(tx_type)
? pd->seg_qmatrix[seg_id][qm_tx_size]
: quant_params->gqmatrix[NUM_QM_LEVELS - 1][0][qm_tx_size];
}
static const qm_val_t source_8x8_iwt_base_matrix[NUM_QM_LEVELS - 1][2][64];
static const qm_val_t source_8x4_iwt_base_matrix[NUM_QM_LEVELS - 1][2][8 * 4];
static const qm_val_t source_4x8_iwt_base_matrix[NUM_QM_LEVELS - 1][2][4 * 8];
// Upsamples base matrix using indexing according to input and output
// dimensions.
static void upsample(const int input_w, const int input_h, const int output_w,
const int output_h, const qm_val_t *input,
qm_val_t *output) {
assert(input_w <= output_w && input_h <= output_h);
int stride_h = output_h / input_h;
int stride_w = output_w / input_w;
for (int y = 0; y < output_h; ++y) {
for (int x = 0; x < output_w; ++x) {
int subsample_x = x / stride_w;
int subsample_y = y / stride_h;
output[(y * output_w) + x] = input[subsample_y * input_w + subsample_x];
}
}
}
// Downsamples base matrix using indexing according to input and output
// dimensions
static void downsample(const int input_w, const int input_h, const int output_w,
const int output_h, const int offsetw, const int offseth,
const qm_val_t *input, qm_val_t *output) {
assert(input_w >= output_w && input_h >= output_h);
const int stride_w = input_w / output_w;
const int stride_h = input_h / output_h;
for (int j = 0; j < output_h; ++j) {
for (int i = 0; i < output_w; ++i) {
output[j * output_w + i] = input[((j * stride_h + offseth) * input_w) +
(i * stride_w + offsetw)];
}
}
}
// Given output tx size and QM level, output the correctly scaled matrix based
// on the source matrices.
static void scale_tx(const int txsize, const int level, const int plane,
qm_val_t *output) {
int height = tx_size_high[txsize];
int width = tx_size_wide[txsize];
if (width == 4 && height == 4) {
// TX4X4 is the only case using downsampling
downsample(8, 8, 4, 4, 0, 0, source_8x8_iwt_base_matrix[level][plane],
output);
} else if (width == height) {
// source_8x8_iwt_base_matrix
upsample(8, 8, width, height, source_8x8_iwt_base_matrix[level][plane],
output);
} else if (width < height) {
upsample(4, 8, width, height, source_4x8_iwt_base_matrix[level][plane],
output);
} else {
// width > height
upsample(8, 4, width, height, source_8x4_iwt_base_matrix[level][plane],
output);
}
}
// Inverts the iwt matrix to get the wt matrix.
static void calc_wt_matrix(const int txsize, const qm_val_t *iwt_matrix,
qm_val_t *wt_matrix) {
const int size = tx_size_2d[txsize];
for (int i = 0; i < size; ++i) {
assert(iwt_matrix[i] != 0);
wt_matrix[i] = (int)1024 / iwt_matrix[i];
}
}
void av1_qm_init(CommonQuantParams *quant_params, int num_planes) {
for (int q = 0; q < NUM_QM_LEVELS; ++q) {
for (int c = 0; c < num_planes; ++c) {
// Generate matrices for each tx size
int current = 0;
for (int t = 0; t < TX_SIZES_ALL; ++t) {
const int size = tx_size_2d[t];
const int qm_tx_size = av1_get_adjusted_tx_size(t);
if (q == NUM_QM_LEVELS - 1) {
quant_params->gqmatrix[q][c][t] = NULL;
quant_params->giqmatrix[q][c][t] = NULL;
} else if (t != qm_tx_size) { // Reuse matrices for 'qm_tx_size'
assert(t > qm_tx_size);
quant_params->gqmatrix[q][c][t] =
quant_params->gqmatrix[q][c][qm_tx_size];
quant_params->giqmatrix[q][c][t] =
quant_params->giqmatrix[q][c][qm_tx_size];
} else {
assert(current + size <= QM_TOTAL_SIZE);
// Generate the iwt and wt matrices from the base matrices.
const int plane = (c >= 1);
if (c < 2) {
scale_tx(t, q, plane,
&quant_params->iwt_matrix_ref[q][plane][current]);
calc_wt_matrix(t, &quant_params->iwt_matrix_ref[q][plane][current],
&quant_params->wt_matrix_ref[q][plane][current]);
}
quant_params->gqmatrix[q][c][t] =
&quant_params->wt_matrix_ref[q][plane][current];
quant_params->giqmatrix[q][c][t] =
&quant_params->iwt_matrix_ref[q][plane][current];
current += size;
}
}
}
}
}
/*
Base matrices for QM levels 0-13 can be generated from a parametric
equation. With the parameters below.
QM indices 14 and 15 use the original AV1 8x8 matrices as a base due
to those being a step functions.
// Generate base matrices
if(q < 13){
generate_base_matrix(
8, 8, iwt_matrix_para[BASE_TX_8X8][c][q],
iwt_matrix_para_fp[BASE_TX_8X8],
&gen_source_8x8_iwt_base_matrix[q][c][0]);
// 8x4
generate_base_matrix(
8, 4, iwt_matrix_para[BASE_TX_8X4][c][q],
iwt_matrix_para_fp[BASE_TX_8X4],
&gen_source_8x4_iwt_base_matrix[q][c][0]);
// 4x8
generate_base_matrix(
4, 8, iwt_matrix_para[BASE_TX_4X8][c][q],
iwt_matrix_para_fp[BASE_TX_4X8],
&gen_source_4x8_iwt_base_matrix[q][c][0]);
} else {
// Copy index 13 and 14 from table
}
enum {
BASE_TX_8X8 = 0, // 8x8 transform
BASE_TX_4X8 = 1, // 4x8 transform
BASE_TX_8X4 = 2, // 8x4 transform
BASE_TX_SIZES_ALL = 3, // Includes rectangular transforms
} UENUM1BYTE(BASE_TX_SIZE);
void generate_base_matrix(const int outw, const int outh, const int* para,
const int* para_fp, qm_val_t* output) {
for (int y = 0; y < outh; ++y) {
for (int x = 0; x < outw; ++x) {
// The model is fitted in 32x32 domain so 8x8 idx has to be multiplied
by 4. int y_idx_in_model = y * 4; int x_idx_in_model = x * 4;
int val = (para[0] * x_idx_in_model * x_idx_in_model * y_idx_in_model *
y_idx_in_model >>
para_fp[0]) +
(para[1] * x_idx_in_model * x_idx_in_model * y_idx_in_model >>
para_fp[1]) +
(para[2] * x_idx_in_model * y_idx_in_model * y_idx_in_model >>
para_fp[2]) +
(para[3] * x_idx_in_model * x_idx_in_model >> para_fp[3]) +
(para[4] * x_idx_in_model * y_idx_in_model >> para_fp[4]) +
(para[5] * y_idx_in_model * y_idx_in_model >> para_fp[5]) +
(para[6] * x_idx_in_model >> para_fp[6]) +
(para[7] * y_idx_in_model >> para_fp[7]) + para[8];
output[y * outw + x] = val;
}
}
// DC Coefficient is always 32.
output[0] = 32;
}
// [8x8/8x4/4x8]
static const int iwt_matrix_para_fp[BASE_TX_SIZES_ALL][9] = {
{18, 13, 13, 9, 9, 9, 6, 6, 1},
{16, 11, 11, 9, 9, 9, 6, 6, 1},
{16, 11, 11, 9, 9, 9, 6, 6, 1}
};
// [8x8/4x8/8x4][color idx][QM idx]
static const int iwt_matrix_para[BASE_TX_SIZES_ALL][2][13][9] = {
{
{
// 8x8 luma
{167, -128, -128, 49, 217, 49, 0, 0, 26},
{142, -111, -111, 48, 193, 48, -11, -11, 27},
{117, -93, -93, 46, 166, 46, -22, -22, 29},
{94, -76, -76, 44, 138, 44, -32, -32, 30},
{76, -61, -61, 43, 114, 43, -43, -43, 31},
{67, -54, -54, 42, 101, 42, -55, -55, 33},
{60, -49, -49, 39, 92, 39, -62, -62, 34},
{51, -41, -41, 32, 78, 32, -57, -57, 34},
{41, -33, -33, 25, 64, 25, -50, -50, 34},
{31, -24, -24, 18, 45, 18, -38, -38, 34},
{25, -18, -18, 12, 32, 12, -28, -28, 33},
{18, -12, -12, 6, 19, 6, -12, -12, 32},
{6, -4, -4, 2, 7, 2, -4, -4, 32}
},
{
// 8x8 chroma
{71, -49, -49, 4, 71, 4, 68, 68, 30},
{56, -36, -36, 2, 48, 2, 70, 70, 30},
{43, -25, -25, 1, 27, 1, 72, 72, 29},
{30, -12, -12, -1, 3, -1, 75, 75, 29},
{20, -2, -2, -3, -17, -3, 79, 79, 28},
{17, 2, 2, -5, -31, -5, 84, 84, 27},
{18, 2, 2, -7, -34, -7, 88, 88, 26},
{22, -1, -1, -9, -30, -9, 91, 91, 25},
{29, -9, -9, -8, -18, -8, 88, 88, 24},
{39, -22, -22, -3, 10, -3, 68, 68, 24},
{49, -40, -40, 8, 55, 8, 22, 22, 27},
{33, -35, -35, 18, 66, 18, -26, -26, 31},
{0, -5, -5, 10, 17, 10, -20, -20, 32}
}
},
{
{
// 4x8 luma
{196, -72, -149, 46, 470, 165, 17, 37, 25},
{169, -63, -130, 45, 423, 175, 3, -1, 27},
{142, -54, -111, 44, 368, 187, -12, -42, 28},
{113, -43, -88, 43, 299, 196, -23, -80, 30},
{92, -35, -72, 42, 248, 199, -37, -111, 31},
{81, -30, -63, 40, 218, 197, -49, -139, 33},
{72, -27, -57, 37, 197, 178, -56, -142, 34},
{61, -23, -48, 31, 169, 144, -53, -126, 34},
{50, -19, -40, 25, 140, 117, -47, -112, 34},
{40, -15, -31, 18, 108, 93, -37, -98, 34},
{31, -10, -22, 11, 70, 60, -25, -66, 33},
{25, -8, -18, 5, 53, 29, -12, -32, 32},
{5, -1, -3, 2, 9, 5, -2, -3, 31},
},
{
// 4x8 chroma
{83, -27, -53, 2, 142, -10, 75, 165, 31},
{69, -21, -42, 1, 103, -8, 77, 159, 30},
{51, -14, -26, 0, 52, -13, 77, 165, 30},
{33, -6, -10, -2, -6, -19, 80, 169, 29},
{23, -1, 1, -4, -50, -25, 83, 179, 28},
{17, 2, 9, -6, -85, -37, 88, 193, 28},
{21, 1, 6, -7, -80, -43, 89, 198, 27},
{23, 0, 3, -9, -77, -54, 94, 210, 25},
{32, -5, -7, -9, -47, -50, 92, 202, 24},
{46, -12, -25, -5, 20, -21, 73, 150, 24},
{58, -21, -47, 5, 115, 35, 31, 46, 27},
{41, -19, -43, 16, 142, 78, -19, -51, 31},
{3, -4, -8, 11, 43, 42, -19, -33, 31},
}
},
{
{
// 8x4 luma
{196, -149, -72, 165, 470, 46, 37, 17, 25},
{169, -130, -63, 175, 423, 45, -1, 3, 27},
{142, -111, -54, 187, 368, 44, -42, -12, 28},
{113, -88, -43, 196, 299, 43, -80, -23, 30},
{92, -72, -35, 199, 248, 42, -111, -37, 31},
{81, -63, -30, 197, 218, 40, -139, -49, 33},
{72, -57, -27, 178, 197, 37, -142, -56, 34},
{61, -48, -23, 144, 169, 31, -126, -53, 34},
{50, -40, -19, 117, 140, 25, -112, -47, 34},
{40, -31, -15, 93, 108, 18, -98, -37, 34},
{31, -22, -10, 60, 70, 11, -66, -25, 33},
{25, -18, -8, 29, 53, 5, -32, -12, 32},
{5, -3, -1, 5, 9, 2, -3, -2, 31},
},
{
// 8x4 chroma
{83, -53, -27, -10, 142, 2, 165, 75, 31},
{69, -42, -21, -8, 103, 1, 159, 77, 30},
{51, -26, -14, -13, 52, 0, 165, 77, 30},
{33, -10, -6, -19, -6, -2, 169, 80, 29},
{23, 1, -1, -25, -50, -4, 179, 83, 28},
{17, 9, 2, -37, -85, -6, 193, 88, 28},
{21, 6, 1, -43, -80, -7, 198, 89, 27},
{23, 3, 0, -54, -77, -9, 210, 94, 25},
{32, -7, -5, -50, -47, -9, 202, 92, 24},
{46, -25, -12, -21, 20, -5, 150, 73, 24},
{58, -47, -21, 35, 115, 5, 46, 31, 27},
{41, -43, -19, 78, 142, 16, -51, -19, 31},
{3, -8, -4, 42, 43, 11, -33, -19, 31},
}
}
};
*/
/* Provide 15 sets of base quantization matrices for chroma and luma
and each TX size. Matrices for different TX sizes are in fact
scaled from the 8x8, 8x4, and 4x8 sizes using indexing.
Intra and inter matrix sets are the same.
Matrices for different QM levels have been rescaled in the
frequency domain according to different nominal viewing
distances. Matrices for QM level 15 are omitted because they are
not used.
*/
/* clang-format off */
static const qm_val_t source_8x8_iwt_base_matrix[NUM_QM_LEVELS - 1][2][64] = {
{
{
/* Luma */
32, 27, 32, 39, 50, 64, 81, 101,
27, 32, 40, 49, 60, 72, 85, 100,
32, 40, 51, 60, 72, 83, 95, 106,
39, 49, 60, 72, 83, 94, 106, 117,
50, 60, 72, 83, 95, 108, 120, 133,
64, 72, 83, 94, 108, 122, 138, 155,
81, 85, 95, 106, 120, 138, 159, 181,
101, 100, 106, 117, 133, 155, 181, 213,
},
{
/* Chroma */
32, 34, 38, 43, 49, 54, 59, 65,
34, 38, 43, 47, 53, 58, 61, 65,
38, 43, 47, 54, 58, 62, 64, 68,
43, 47, 54, 58, 64, 68, 70, 72,
49, 53, 58, 64, 70, 74, 77, 81,
54, 58, 62, 68, 74, 80, 84, 89,
59, 61, 64, 70, 77, 84, 90, 99,
65, 65, 68, 72, 81, 89, 99, 110,
},
},
{
{
/* Luma */
32, 27, 31, 37, 48, 60, 76, 95,
27, 31, 37, 45, 56, 66, 78, 93,
31, 37, 47, 54, 66, 75, 87, 100,
37, 45, 54, 64, 75, 85, 97, 109,
48, 56, 66, 75, 88, 99, 111, 124,
60, 66, 75, 85, 99, 111, 125, 143,
76, 78, 87, 97, 111, 125, 145, 167,
95, 93, 100, 109, 124, 143, 167, 194,
},
{
/* Chroma */
32, 34, 38, 43, 48, 52, 58, 63,
34, 37, 42, 47, 51, 54, 59, 63,
38, 42, 46, 51, 57, 59, 63, 66,
43, 47, 51, 57, 61, 64, 68, 71,
48, 51, 57, 61, 68, 69, 75, 77,
52, 54, 59, 64, 69, 73, 80, 84,
58, 59, 63, 68, 75, 80, 88, 96,
63, 63, 66, 71, 77, 84, 96, 106,
},
},
{
{
/* Luma */
32, 28, 31, 36, 46, 57, 71, 89,
28, 30, 35, 41, 51, 60, 73, 87,
31, 35, 42, 50, 60, 69, 80, 92,
36, 41, 50, 58, 69, 78, 89, 101,
46, 51, 60, 69, 81, 90, 102, 115,
57, 60, 69, 78, 90, 103, 116, 130,
71, 73, 80, 89, 102, 116, 133, 151,
89, 87, 92, 101, 115, 130, 151, 177,
},
{
/* Chroma */
32, 33, 38, 42, 47, 51, 57, 61,
33, 35, 41, 45, 49, 54, 57, 60,
38, 41, 46, 50, 53, 58, 62, 63,
42, 45, 50, 53, 58, 61, 65, 67,
47, 49, 53, 58, 62, 65, 71, 73,
51, 54, 58, 61, 65, 70, 75, 80,
57, 57, 62, 65, 71, 75, 83, 90,
61, 60, 63, 67, 73, 80, 90, 100,
},
},
{
{
/* Luma */
32, 29, 31, 36, 44, 54, 67, 83,
29, 30, 33, 39, 48, 58, 68, 81,
31, 33, 40, 46, 55, 65, 74, 85,
36, 39, 46, 53, 63, 72, 81, 93,
44, 48, 55, 63, 74, 82, 93, 104,
54, 58, 65, 72, 82, 92, 105, 119,
67, 68, 74, 81, 93, 105, 119, 137,
83, 81, 85, 93, 104, 119, 137, 159,
},
{
/* Chroma */
32, 32, 37, 42, 46, 51, 55, 59,
32, 33, 38, 43, 46, 50, 54, 57,
37, 38, 43, 47, 50, 54, 58, 60,
42, 43, 47, 51, 55, 58, 61, 65,
46, 46, 50, 55, 59, 62, 67, 70,
51, 50, 54, 58, 62, 69, 73, 79,
55, 54, 58, 61, 67, 73, 79, 87,
59, 57, 60, 65, 70, 79, 87, 97,
},
},
{
{
/* Luma */
32, 29, 30, 34, 41, 50, 62, 77,
29, 28, 32, 35, 44, 51, 62, 74,
30, 32, 36, 41, 48, 57, 66, 78,
34, 35, 41, 49, 55, 64, 75, 84,
41, 44, 48, 55, 65, 73, 84, 96,
50, 51, 57, 64, 73, 84, 95, 109,
62, 62, 66, 75, 84, 95, 111, 125,
77, 74, 78, 84, 96, 109, 125, 147,
},
{
/* Chroma */
32, 31, 36, 41, 45, 49, 53, 57,
31, 31, 35, 40, 43, 47, 50, 54,
36, 35, 39, 43, 47, 50, 53, 57,
41, 40, 43, 48, 51, 55, 59, 62,
45, 43, 47, 51, 56, 58, 63, 68,
49, 47, 50, 55, 58, 64, 69, 75,
53, 50, 53, 59, 63, 69, 75, 84,
57, 54, 57, 62, 68, 75, 84, 93,
},
},
{
{
/* Luma */
32, 30, 31, 33, 40, 47, 59, 72,
30, 28, 31, 33, 41, 46, 57, 70,
31, 31, 34, 37, 46, 51, 61, 72,
33, 33, 37, 42, 49, 57, 67, 76,
40, 41, 46, 49, 59, 66, 76, 87,
47, 46, 51, 57, 66, 73, 85, 98,
59, 57, 61, 67, 76, 85, 98, 113,
72, 70, 72, 76, 87, 98, 113, 132,
},
{
/* Chroma */
32, 31, 36, 40, 45, 49, 52, 55,
31, 34, 38, 41, 45, 48, 50, 52,
36, 38, 41, 43, 47, 49, 52, 54,
40, 41, 43, 45, 48, 51, 53, 56,
45, 45, 47, 48, 53, 55, 58, 62,
49, 48, 49, 51, 55, 58, 62, 68,
52, 50, 52, 53, 58, 62, 69, 75,
55, 52, 54, 56, 62, 68, 75, 84,
},
},
{
{
/* Luma */
32, 31, 30, 32, 37, 44, 53, 65,
31, 28, 29, 31, 36, 44, 52, 62,
30, 29, 29, 35, 39, 45, 53, 63,
32, 31, 35, 37, 44, 51, 57, 66,
37, 36, 39, 44, 51, 57, 65, 74,
44, 44, 45, 51, 57, 65, 74, 85,
53, 52, 53, 57, 65, 74, 84, 97,
65, 62, 63, 66, 74, 85, 97, 112,
},
{
/* Chroma */
32, 30, 36, 40, 44, 47, 51, 53,
30, 32, 37, 40, 43, 45, 48, 49,
36, 37, 41, 43, 46, 47, 51, 52,
40, 40, 43, 45, 47, 49, 51, 53,
44, 43, 46, 47, 51, 52, 56, 58,
47, 45, 47, 49, 52, 53, 59, 62,
51, 48, 51, 51, 56, 59, 65, 71,
53, 49, 52, 53, 58, 62, 71, 79,
},
},
{
{
/* Luma */
32, 31, 30, 32, 35, 41, 48, 58,
31, 28, 28, 32, 33, 40, 46, 55,
30, 28, 29, 33, 36, 41, 48, 56,
32, 32, 33, 37, 41, 46, 52, 59,
35, 33, 36, 41, 45, 50, 57, 67,
41, 40, 41, 46, 50, 57, 65, 75,
48, 46, 48, 52, 57, 65, 73, 85,
58, 55, 56, 59, 67, 75, 85, 100,
},
{
/* Chroma */
32, 29, 34, 39, 42, 45, 48, 50,
29, 30, 34, 38, 40, 42, 44, 46,
34, 34, 37, 40, 42, 44, 46, 47,
39, 38, 40, 43, 45, 46, 49, 50,
42, 40, 42, 45, 47, 49, 51, 53,
45, 42, 44, 46, 49, 52, 54, 59,
48, 44, 46, 49, 51, 54, 60, 65,
50, 46, 47, 50, 53, 59, 65, 74,
},
},
{
{
/* Luma */
32, 30, 30, 31, 33, 37, 43, 50,
30, 26, 27, 29, 30, 35, 40, 46,
30, 27, 28, 31, 33, 38, 42, 47,
31, 29, 31, 35, 36, 41, 46, 51,
33, 30, 33, 36, 40, 45, 50, 56,
37, 35, 38, 41, 45, 49, 56, 62,
43, 40, 42, 46, 50, 56, 63, 72,
50, 46, 47, 51, 56, 62, 72, 82,
},
{
/* Chroma */
32, 28, 34, 37, 42, 44, 48, 49,
28, 29, 34, 37, 40, 42, 45, 45,
34, 34, 39, 41, 43, 44, 47, 47,
37, 37, 41, 42, 45, 44, 47, 46,
42, 40, 43, 45, 48, 47, 50, 51,
44, 42, 44, 44, 47, 48, 52, 52,
48, 45, 47, 47, 50, 52, 55, 59,
49, 45, 47, 46, 51, 52, 59, 63,
},
},
{
{
/* Luma */
32, 31, 31, 31, 33, 36, 39, 44,
31, 27, 28, 29, 31, 34, 36, 39,
31, 28, 29, 30, 33, 36, 37, 40,
31, 29, 30, 30, 34, 36, 38, 43,
33, 31, 33, 34, 37, 41, 43, 47,
36, 34, 36, 36, 41, 43, 47, 53,
39, 36, 37, 38, 43, 47, 51, 57,
44, 39, 40, 43, 47, 53, 57, 64,
},
{
/* Chroma */
32, 27, 31, 35, 39, 42, 45, 48,
27, 28, 32, 35, 39, 40, 41, 43,
31, 32, 35, 37, 41, 42, 42, 44,
35, 35, 37, 41, 42, 44, 44, 44,
39, 39, 41, 42, 46, 46, 46, 46,
42, 40, 42, 44, 46, 46, 49, 48,
45, 41, 42, 44, 46, 49, 50, 54,
48, 43, 44, 44, 46, 48, 54, 60,
},
},
{
{
/* Luma */
32, 31, 30, 30, 32, 33, 35, 38,
31, 28, 28, 28, 30, 31, 32, 36,
30, 28, 27, 28, 30, 31, 32, 35,
30, 28, 28, 29, 31, 32, 33, 36,
32, 30, 30, 31, 35, 34, 37, 40,
33, 31, 31, 32, 34, 37, 38, 42,
35, 32, 32, 33, 37, 38, 42, 47,
38, 36, 35, 36, 40, 42, 47, 52,
},
{
/* Chroma */
32, 28, 30, 33, 36, 39, 44, 48,
28, 28, 31, 35, 36, 39, 42, 44,
30, 31, 33, 37, 40, 40, 42, 44,
33, 35, 37, 39, 41, 41, 44, 45,
36, 36, 40, 41, 44, 44, 46, 45,
39, 39, 40, 41, 44, 42, 46, 46,
44, 42, 42, 44, 46, 46, 48, 50,
48, 44, 44, 45, 45, 46, 50, 51,
},
},
{
{
/* Luma */
32, 31, 30, 30, 32, 32, 33, 35,
31, 28, 28, 28, 30, 29, 30, 32,
30, 28, 28, 27, 30, 29, 30, 31,
30, 28, 27, 28, 30, 28, 29, 32,
32, 30, 30, 30, 33, 32, 34, 34,
32, 29, 29, 28, 32, 32, 33, 36,
33, 30, 30, 29, 34, 33, 35, 39,
35, 32, 31, 32, 34, 36, 39, 43,
},
{
/* Chroma */
32, 29, 29, 31, 33, 36, 41, 46,
29, 27, 28, 31, 32, 35, 40, 43,
29, 28, 29, 33, 35, 37, 40, 43,
31, 31, 33, 35, 37, 39, 43, 44,
33, 32, 35, 37, 40, 41, 43, 45,
36, 35, 37, 39, 41, 42, 44, 47,
41, 40, 40, 43, 43, 44, 46, 48,
46, 43, 43, 44, 45, 47, 48, 51,
},
},
{
{
/* Luma */
32, 31, 31, 31, 32, 31, 32, 33,
31, 28, 28, 28, 29, 29, 29, 30,
31, 28, 28, 29, 30, 29, 29, 31,
31, 28, 29, 29, 29, 29, 29, 31,
32, 29, 30, 29, 32, 30, 32, 32,
31, 29, 29, 29, 30, 30, 31, 32,
32, 29, 29, 29, 32, 31, 32, 34,
33, 30, 31, 31, 32, 32, 34, 36,
},
{
/* Chroma */
32, 30, 30, 30, 32, 32, 35, 38,
30, 26, 27, 27, 30, 30, 33, 36,
30, 27, 28, 29, 31, 32, 35, 37,
30, 27, 29, 28, 32, 32, 34, 38,
32, 30, 31, 32, 34, 34, 37, 39,
32, 30, 32, 32, 34, 35, 36, 39,
35, 33, 35, 34, 37, 36, 39, 41,
38, 36, 37, 38, 39, 39, 41, 42,
},
},
{
{
/* Luma */
31, 31, 31, 31, 31, 31, 32, 32,
31, 32, 32, 32, 32, 32, 32, 32,
31, 32, 32, 32, 32, 32, 32, 32,
31, 32, 32, 32, 32, 32, 32, 32,
31, 32, 32, 32, 32, 32, 32, 32,
31, 32, 32, 32, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 33, 33,
32, 32, 32, 32, 32, 32, 33, 33,
},
{
/* Chroma */
31, 31, 31, 31, 30, 31, 33, 33,
31, 31, 31, 31, 31, 32, 34, 34,
31, 31, 31, 31, 31, 32, 34, 34,
31, 31, 31, 31, 31, 32, 35, 35,
30, 31, 31, 31, 32, 32, 35, 35,
31, 32, 32, 32, 32, 33, 36, 36,
33, 34, 34, 35, 35, 36, 39, 39,
33, 34, 34, 35, 35, 36, 39, 39,
},
},
{
{
/* Luma */
31, 31, 31, 31, 31, 31, 31, 31,
31, 31, 31, 31, 31, 31, 31, 31,
31, 31, 31, 32, 32, 32, 32, 32,
31, 31, 32, 32, 32, 32, 32, 32,
31, 31, 32, 32, 32, 32, 32, 32,
31, 31, 32, 32, 32, 32, 32, 32,
31, 31, 32, 32, 32, 32, 32, 32,
31, 31, 32, 32, 32, 32, 32, 32,
},
{
/* Chroma */
31, 31, 31, 31, 31, 31, 31, 30,
31, 31, 31, 31, 31, 31, 31, 31,
31, 31, 31, 31, 31, 31, 31, 31,
31, 31, 31, 31, 31, 31, 31, 31,
31, 31, 31, 31, 31, 31, 31, 31,
31, 31, 31, 31, 31, 31, 31, 31,
31, 31, 31, 31, 31, 31, 31, 31,
30, 31, 31, 31, 31, 31, 31, 31,
},
},
};
static const qm_val_t source_8x4_iwt_base_matrix[NUM_QM_LEVELS - 1][2][8 * 4] = {
{
{
/* Luma */
32, 27, 32, 40, 52, 65, 82, 102,
32, 40, 52, 62, 74, 83, 95, 104,
49, 59, 70, 82, 95, 104, 118, 129,
77, 80, 88, 99, 114, 130, 151, 174,
},
{
/* Chroma */
32, 35, 40, 45, 50, 55, 61, 66,
40, 45, 50, 56, 60, 63, 66, 67,
49, 53, 59, 64, 69, 72, 77, 79,
58, 59, 63, 69, 75, 81, 90, 98,
},
},
{
{
/* Luma */
32, 28, 32, 39, 49, 62, 78, 96,
31, 38, 47, 56, 66, 77, 88, 98,
47, 55, 65, 76, 88, 99, 111, 123,
75, 77, 84, 94, 108, 125, 143, 166,
},
{
/* Chroma */
32, 34, 39, 44, 49, 54, 59, 64,
38, 42, 48, 53, 56, 60, 63, 64,
48, 51, 56, 62, 67, 70, 73, 77,
56, 57, 61, 65, 71, 78, 87, 95,
},
},
{
{
/* Luma */
32, 28, 31, 37, 47, 58, 72, 89,
30, 35, 44, 50, 62, 69, 80, 90,
45, 52, 60, 69, 81, 90, 100, 111,
72, 72, 79, 88, 102, 114, 131, 150,
},
{
/* Chroma */
32, 34, 39, 44, 49, 54, 58, 63,
39, 42, 47, 51, 56, 59, 62, 64,
48, 50, 55, 60, 65, 68, 71, 76,
56, 55, 60, 66, 71, 78, 85, 93,
},
},
{
{
/* Luma */
32, 29, 32, 37, 45, 55, 69, 84,
31, 34, 40, 47, 57, 65, 75, 85,
44, 48, 57, 64, 74, 83, 95, 105,
70, 70, 76, 84, 96, 109, 125, 142,
},
{
/* Chroma */
32, 33, 38, 43, 48, 52, 56, 60,
38, 39, 44, 49, 53, 56, 58, 60,
47, 47, 52, 55, 61, 63, 67, 72,
54, 54, 56, 61, 67, 73, 80, 89,
},
},
{
{
/* Luma */
32, 29, 31, 35, 42, 51, 64, 78,
30, 30, 36, 43, 50, 56, 67, 78,
41, 43, 50, 56, 66, 73, 85, 95,
65, 64, 68, 76, 86, 96, 112, 129,
},
{
/* Chroma */
32, 32, 37, 41, 46, 49, 54, 57,
38, 39, 42, 45, 49, 52, 55, 58,
46, 45, 48, 51, 55, 57, 62, 66,
53, 51, 54, 57, 63, 68, 76, 84,
},
},
{
{
/* Luma */
32, 30, 31, 34, 40, 48, 59, 72,
30, 30, 34, 38, 46, 52, 61, 71,
39, 40, 45, 50, 58, 66, 75, 87,
61, 59, 62, 68, 78, 89, 102, 119,
},
{
/* Chroma */
32, 32, 38, 42, 47, 50, 54, 56,
38, 39, 42, 44, 49, 49, 53, 54,
47, 46, 49, 51, 54, 56, 60, 63,
53, 51, 54, 56, 62, 65, 73, 80,
},
},
{
{
/* Luma */
32, 31, 31, 33, 38, 44, 54, 65,
30, 30, 32, 35, 40, 46, 54, 62,
38, 38, 41, 45, 53, 58, 67, 77,
57, 54, 56, 61, 68, 77, 89, 103,
},
{
/* Chroma */
32, 31, 37, 41, 45, 48, 52, 54,
37, 38, 42, 43, 46, 47, 51, 52,
45, 44, 47, 48, 52, 53, 57, 61,
51, 48, 51, 53, 57, 62, 70, 76,
},
},
{
{
/* Luma */
32, 30, 30, 32, 35, 41, 48, 57,
30, 28, 30, 33, 37, 42, 48, 53,
36, 34, 38, 42, 47, 52, 59, 65,
50, 46, 49, 53, 59, 67, 77, 87,
},
{
/* Chroma */
32, 29, 34, 39, 43, 46, 49, 52,
36, 37, 40, 42, 45, 46, 48, 50,
44, 43, 44, 47, 48, 49, 53, 56,
48, 44, 46, 49, 52, 56, 62, 68,
},
},
{
{
/* Luma */
32, 31, 31, 32, 34, 38, 44, 51,
30, 28, 29, 32, 35, 37, 43, 47,
34, 32, 36, 39, 42, 45, 51, 56,
45, 42, 44, 46, 51, 55, 63, 72,
},
{
/* Chroma */
32, 28, 33, 38, 42, 44, 47, 50,
34, 34, 38, 41, 44, 43, 44, 45,
42, 41, 43, 45, 47, 46, 47, 48,
46, 43, 44, 45, 48, 49, 53, 59,
},
},
{
{
/* Luma */
32, 31, 31, 32, 33, 36, 40, 44,
29, 27, 28, 30, 31, 33, 37, 39,
32, 30, 32, 34, 37, 38, 42, 45,
41, 38, 39, 41, 44, 48, 53, 58,
},
{
/* Chroma */
32, 27, 32, 35, 39, 42, 45, 47,
32, 33, 37, 38, 41, 43, 43, 42,
39, 38, 41, 42, 45, 45, 46, 46,
46, 41, 43, 43, 46, 48, 52, 55,
},
},
{
{
/* Luma */
32, 31, 30, 31, 31, 33, 35, 38,
29, 27, 26, 28, 28, 30, 31, 33,
31, 29, 28, 31, 32, 34, 36, 38,
36, 33, 33, 34, 37, 40, 44, 49,
},
{
/* Chroma */
32, 28, 30, 33, 36, 39, 43, 47,
30, 31, 34, 37, 39, 39, 42, 42,
36, 36, 38, 41, 42, 42, 43, 43,
44, 41, 41, 42, 43, 42, 46, 48,
},
},
{
{
/* Luma */
32, 31, 30, 30, 31, 31, 32, 33,
30, 28, 28, 27, 29, 29, 29, 29,
31, 29, 29, 29, 32, 30, 32, 33,
34, 30, 30, 30, 33, 33, 36, 39,
},
{
/* Chroma */
32, 29, 30, 31, 34, 37, 41, 46,
29, 28, 30, 32, 35, 39, 39, 42,
33, 31, 35, 36, 40, 42, 43, 44,
42, 39, 39, 39, 43, 44, 44, 47,
},
},
{
{
/* Luma */
32, 30, 30, 30, 31, 31, 32, 33,
30, 27, 27, 27, 29, 29, 29, 30,
30, 27, 28, 27, 30, 29, 30, 31,
31, 28, 28, 29, 30, 31, 33, 35,
},
{
/* Chroma */
32, 29, 29, 30, 31, 33, 35, 38,
29, 26, 27, 29, 31, 31, 34, 36,
31, 29, 31, 32, 33, 35, 37, 38,
35, 33, 34, 35, 37, 37, 38, 40,
},
},
{
{
/* Luma */
31, 31, 31, 31, 31, 31, 32, 32,
31, 32, 32, 32, 32, 32, 32, 32,
31, 32, 32, 32, 32, 32, 32, 32,
32, 32, 32, 32, 32, 33, 33, 33,
},
{
/* Chroma */
31, 31, 31, 31, 31, 31, 34, 34,
31, 31, 31, 32, 32, 33, 36, 36,
31, 31, 31, 32, 32, 33, 36, 36,
34, 35, 35, 36, 36, 37, 40, 40,
},
},
{
{
/* Luma */
31, 31, 31, 31, 31, 31, 31, 31,
31, 31, 32, 32, 32, 32, 32, 32,
31, 31, 32, 32, 32, 32, 32, 32,
31, 31, 32, 32, 32, 32, 32, 32,
},
{
/* Chroma */
31, 31, 31, 31, 31, 31, 31, 30,
31, 31, 31, 31, 31, 31, 31, 31,
31, 31, 31, 31, 31, 31, 32, 32,
31, 31, 31, 31, 31, 31, 32, 32,
},
},
};
static const qm_val_t source_4x8_iwt_base_matrix[NUM_QM_LEVELS - 1][2][4 * 8] = {
{
{
/* Luma */
32, 32, 49, 77,
27, 40, 59, 80,
32, 52, 70, 88,
40, 62, 82, 99,
52, 74, 95, 114,
65, 83, 104, 130,
82, 95, 118, 151,
102, 104, 129, 174,
},
{
/* Chroma */
32, 40, 49, 58,
35, 45, 53, 59,
40, 50, 59, 63,
45, 56, 64, 69,
50, 60, 69, 75,
55, 63, 72, 81,
61, 66, 77, 90,
66, 67, 79, 98,
},
},
{
{
/* Luma */
32, 31, 47, 75,
28, 38, 55, 77,
32, 47, 65, 84,
39, 56, 76, 94,
49, 66, 88, 108,
62, 77, 99, 125,
78, 88, 111, 143,
96, 98, 123, 166,
},
{
/* Chroma */
32, 38, 48, 56,
34, 42, 51, 57,
39, 48, 56, 61,
44, 53, 62, 65,
49, 56, 67, 71,
54, 60, 70, 78,
59, 63, 73, 87,
64, 64, 77, 95,
},
},
{
{
/* Luma */
32, 30, 45, 72,
28, 35, 52, 72,
31, 44, 60, 79,
37, 50, 69, 88,
47, 62, 81, 102,
58, 69, 90, 114,
72, 80, 100, 131,
89, 90, 111, 150,
},
{
/* Chroma */
32, 39, 48, 56,
34, 42, 50, 55,
39, 47, 55, 60,
44, 51, 60, 66,
49, 56, 65, 71,
54, 59, 68, 78,
58, 62, 71, 85,
63, 64, 76, 93,
},
},
{
{
/* Luma */
32, 31, 44, 70,
29, 34, 48, 70,
32, 40, 57, 76,
37, 47, 64, 84,
45, 57, 74, 96,
55, 65, 83, 109,
69, 75, 95, 125,
84, 85, 105, 142,
},
{
/* Chroma */
32, 38, 47, 54,
33, 39, 47, 54,
38, 44, 52, 56,
43, 49, 55, 61,
48, 53, 61, 67,
52, 56, 63, 73,
56, 58, 67, 80,
60, 60, 72, 89,
},
},
{
{
/* Luma */
32, 30, 41, 65,
29, 30, 43, 64,
31, 36, 50, 68,
35, 43, 56, 76,
42, 50, 66, 86,
51, 56, 73, 96,
64, 67, 85, 112,
78, 78, 95, 129,
},
{
/* Chroma */
32, 38, 46, 53,
32, 39, 45, 51,
37, 42, 48, 54,
41, 45, 51, 57,
46, 49, 55, 63,
49, 52, 57, 68,
54, 55, 62, 76,
57, 58, 66, 84,
},
},
{
{
/* Luma */
32, 30, 39, 61,
30, 30, 40, 59,
31, 34, 45, 62,
34, 38, 50, 68,
40, 46, 58, 78,
48, 52, 66, 89,
59, 61, 75, 102,
72, 71, 87, 119,
},
{
/* Chroma */
32, 38, 47, 53,
32, 39, 46, 51,
38, 42, 49, 54,
42, 44, 51, 56,
47, 49, 54, 62,
50, 49, 56, 65,
54, 53, 60, 73,
56, 54, 63, 80,
},
},
{
{
/* Luma */
32, 30, 38, 57,
31, 30, 38, 54,
31, 32, 41, 56,
33, 35, 45, 61,
38, 40, 53, 68,
44, 46, 58, 77,
54, 54, 67, 89,
65, 62, 77, 103,
},
{
/* Chroma */
32, 37, 45, 51,
31, 38, 44, 48,
37, 42, 47, 51,
41, 43, 48, 53,
45, 46, 52, 57,
48, 47, 53, 62,
52, 51, 57, 70,
54, 52, 61, 76,
},
},
{
{
/* Luma */
32, 30, 36, 50,
30, 28, 34, 46,
30, 30, 38, 49,
32, 33, 42, 53,
35, 37, 47, 59,
41, 42, 52, 67,
48, 48, 59, 77,
57, 53, 65, 87,
},
{
/* Chroma */
32, 36, 44, 48,
29, 37, 43, 44,
34, 40, 44, 46,
39, 42, 47, 49,
43, 45, 48, 52,
46, 46, 49, 56,
49, 48, 53, 62,
52, 50, 56, 68,
},
},
{
{
/* Luma */
32, 30, 34, 45,
31, 28, 32, 42,
31, 29, 36, 44,
32, 32, 39, 46,
34, 35, 42, 51,
38, 37, 45, 55,
44, 43, 51, 63,
51, 47, 56, 72,
},
{
/* Chroma */
32, 34, 42, 46,
28, 34, 41, 43,
33, 38, 43, 44,
38, 41, 45, 45,
42, 44, 47, 48,
44, 43, 46, 49,
47, 44, 47, 53,
50, 45, 48, 59,
},
},
{
{
/* Luma */
32, 29, 32, 41,
31, 27, 30, 38,
31, 28, 32, 39,
32, 30, 34, 41,
33, 31, 37, 44,
36, 33, 38, 48,
40, 37, 42, 53,
44, 39, 45, 58,
},
{
/* Chroma */
32, 32, 39, 46,
27, 33, 38, 41,
32, 37, 41, 43,
35, 38, 42, 43,
39, 41, 45, 46,
42, 43, 45, 48,
45, 43, 46, 52,
47, 42, 46, 55,
},
},
{
{
/* Luma */
32, 29, 31, 36,
31, 27, 29, 33,
30, 26, 28, 33,
31, 28, 31, 34,
31, 28, 32, 37,
33, 30, 34, 40,
35, 31, 36, 44,
38, 33, 38, 49,
},
{
/* Chroma */
32, 30, 36, 44,
28, 31, 36, 41,
30, 34, 38, 41,
33, 37, 41, 42,
36, 39, 42, 43,
39, 39, 42, 42,
43, 42, 43, 46,
47, 42, 43, 48,
},
},
{
{
/* Luma */
32, 30, 31, 34,
31, 28, 29, 30,
30, 28, 29, 30,
30, 27, 29, 30,
31, 29, 32, 33,
31, 29, 30, 33,
32, 29, 32, 36,
33, 29, 33, 39,
},
{
/* Chroma */
32, 29, 33, 42,
29, 28, 31, 39,
30, 30, 35, 39,
31, 32, 36, 39,
34, 35, 40, 43,
37, 39, 42, 44,
41, 39, 43, 44,
46, 42, 44, 47,
},
},
{
{
/* Luma */
32, 30, 30, 31,
30, 27, 27, 28,
30, 27, 28, 28,
30, 27, 27, 29,
31, 29, 30, 30,
31, 29, 29, 31,
32, 29, 30, 33,
33, 30, 31, 35,
},
{
/* Chroma */
32, 29, 31, 35,
29, 26, 29, 33,
29, 27, 31, 34,
30, 29, 32, 35,
31, 31, 33, 37,
33, 31, 35, 37,
35, 34, 37, 38,
38, 36, 38, 40,
},
},
{
{
/* Luma */
31, 31, 31, 32,
31, 32, 32, 32,
31, 32, 32, 32,
31, 32, 32, 32,
31, 32, 32, 32,
31, 32, 32, 33,
32, 32, 32, 33,
32, 32, 32, 33,
},
{
/* Chroma */
31, 31, 31, 34,
31, 31, 31, 35,
31, 31, 31, 35,
31, 32, 32, 36,
31, 32, 32, 36,
31, 33, 33, 37,
34, 36, 36, 40,
34, 36, 36, 40,
},
},
{
{
/* Luma */
31, 31, 31, 31,
31, 31, 31, 31,
31, 32, 32, 32,
31, 32, 32, 32,
31, 32, 32, 32,
31, 32, 32, 32,
31, 32, 32, 32,
31, 32, 32, 32,
},
{
/* Chroma */
31, 31, 31, 31,
31, 31, 31, 31,
31, 31, 31, 31,
31, 31, 31, 31,
31, 31, 31, 31,
31, 31, 31, 31,
31, 31, 32, 32,
30, 31, 32, 32,
},
},
};
/* clang-format on */