};
static const vpx_prob default_ext_tx_prob[EXT_TX_SIZES][EXT_TX_TYPES - 1] = {
- { 216, 20, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
- { 192, 20, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
- { 168, 20, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
+ { 160, 20, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
+ { 144, 20, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
+ { 128, 20, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
};
#endif // CONFIG_EXT_TX
#if CONFIG_EXT_TX
void idst4_c(const tran_low_t *input, tran_low_t *output) {
static const int N = 4;
- static const int sinvalue_lookup_table[] = {
- 9630, 15582
+ // {sin(pi/5), sin(pi*2/5)} * sqrt(2/5) * sqrt(2)
+ static const int32_t sinvalue_lookup[] = {
+ 141124871, 228344838,
};
- static const int mult = 14654; // sqrt(4/5)
int i, j;
for (i = 0; i < N; i++) {
int64_t sum = 0;
}
idx = idx > N + 1 - idx ? N + 1 - idx : idx;
if (idx == 0) continue;
- idx--;
- sum += (int64_t)input[j] * sinvalue_lookup_table[idx] * (sign ? -1 : 1);
+ sum += (int64_t)input[j] * sinvalue_lookup[idx - 1] * (sign ? -1 : 1);
}
- sum = (sum * mult) >> (2 * DCT_CONST_BITS);
+ sum = ROUND_POWER_OF_TWO(sum, (2 * DCT_CONST_BITS));
output[i] = WRAPLOW(sum, 8);
}
}
void idst8_c(const tran_low_t *input, tran_low_t *output) {
static const int N = 8;
- static const int sinvalue_lookup_table[] = {
- 5604, 10531, 14189, 16135
+ // {sin(pi/9), sin(pi*2/9), ..., sin(pi*4/9)} * sqrt(2/9) * 2
+ static const int32_t sinvalue_lookup[] = {
+ 86559612, 162678858, 219176632, 249238470
};
- static const int mult = 15447; // 2*sqrt(2/9)
int i, j;
for (i = 0; i < N; i++) {
int64_t sum = 0;
}
idx = idx > N + 1 - idx ? N + 1 - idx : idx;
if (idx == 0) continue;
- idx--;
- sum += (int64_t)input[j] * sinvalue_lookup_table[idx] * (sign ? -1 : 1);
+ sum += (int64_t)input[j] * sinvalue_lookup[idx - 1] * (sign ? -1 : 1);
}
- sum = (sum * mult) >> (2 * DCT_CONST_BITS);
+ sum = ROUND_POWER_OF_TWO(sum, (2 * DCT_CONST_BITS));
output[i] = WRAPLOW(sum, 8);
}
}
void idst16_c(const tran_low_t *input, tran_low_t *output) {
static const int N = 16;
- static const int sinvalue_lookup_table[] = {
- 3011, 5919, 8625, 11038,
- 13075, 14666, 15759, 16314
+ // {sin(pi/17), sin(pi*2/17, ..., sin(pi*8/17)} * sqrt(2/17) * 2 * sqrt(2)
+ static const int32_t sinvalue_lookup[] = {
+ 47852167, 94074787, 137093803, 175444254,
+ 207820161, 233119001, 250479254, 259309736
};
- static const int mult = 15895; // 2*sqrt(4/17)
int i, j;
for (i = 0; i < N; i++) {
int64_t sum = 0;
}
idx = idx > N + 1 - idx ? N + 1 - idx : idx;
if (idx == 0) continue;
- idx--;
- sum += (int64_t)input[j] * sinvalue_lookup_table[idx] * (sign ? -1 : 1);
+ sum += (int64_t)input[j] * sinvalue_lookup[idx - 1] * (sign ? -1 : 1);
}
- sum = (sum * mult) >> (2 * DCT_CONST_BITS);
+ sum = ROUND_POWER_OF_TWO(sum, (2 * DCT_CONST_BITS));
output[i] = WRAPLOW(sum, 8);
}
}
#if CONFIG_VP9_HIGHBITDEPTH
void highbd_idst4_c(const tran_low_t *input, tran_low_t *output, int bd) {
static const int N = 4;
- static const int sinvalue_lookup_table[] = {
- 9630, 15582
+ // {sin(pi/5), sin(pi*2/5)} * sqrt(2/5) * sqrt(2)
+ static const int32_t sinvalue_lookup[] = {
+ 141124871, 228344838,
};
- static const int mult = 14654; // sqrt(4/5)
int i, j;
(void) bd;
for (i = 0; i < N; i++) {
}
idx = idx > N + 1 - idx ? N + 1 - idx : idx;
if (idx == 0) continue;
- idx--;
- sum += (int64_t)input[j] * sinvalue_lookup_table[idx] * (sign ? -1 : 1);
+ sum += (int64_t)input[j] * sinvalue_lookup[idx - 1] * (sign ? -1 : 1);
}
- sum = (sum * mult) >> (2 * DCT_CONST_BITS);
+ sum = ROUND_POWER_OF_TWO(sum, (2 * DCT_CONST_BITS));
output[i] = WRAPLOW(sum, bd);
}
}
void highbd_idst8_c(const tran_low_t *input, tran_low_t *output, int bd) {
static const int N = 8;
- static const int sinvalue_lookup_table[] = {
- 5604, 10531, 14189, 16135
+ // {sin(pi/9), sin(pi*2/9), ..., sin(pi*4/9)} * sqrt(2/9) * 2
+ static const int32_t sinvalue_lookup[] = {
+ 86559612, 162678858, 219176632, 249238470
};
- static const int mult = 15447; // 2*sqrt(2/9)
int i, j;
(void) bd;
for (i = 0; i < N; i++) {
}
idx = idx > N + 1 - idx ? N + 1 - idx : idx;
if (idx == 0) continue;
- idx--;
- sum += (int64_t)input[j] * sinvalue_lookup_table[idx] * (sign ? -1 : 1);
+ sum += (int64_t)input[j] * sinvalue_lookup[idx - 1] * (sign ? -1 : 1);
}
- sum = (sum * mult) >> (2 * DCT_CONST_BITS);
+ sum = ROUND_POWER_OF_TWO(sum, (2 * DCT_CONST_BITS));
output[i] = WRAPLOW(sum, bd);
}
}
void highbd_idst16_c(const tran_low_t *input, tran_low_t *output, int bd) {
static const int N = 16;
- static const int sinvalue_lookup_table[] = {
- 3011, 5919, 8625, 11038,
- 13075, 14666, 15759, 16314
+ // {sin(pi/17), sin(pi*2/17, ..., sin(pi*8/17)} * sqrt(2/17) * 2 * sqrt(2)
+ static const int32_t sinvalue_lookup[] = {
+ 47852167, 94074787, 137093803, 175444254,
+ 207820161, 233119001, 250479254, 259309736
};
- static const int mult = 15895; // 2*sqrt(4/17)
int i, j;
(void) bd;
for (i = 0; i < N; i++) {
}
idx = idx > N + 1 - idx ? N + 1 - idx : idx;
if (idx == 0) continue;
- idx--;
- sum += (int64_t)input[j] * sinvalue_lookup_table[idx] * (sign ? -1 : 1);
+ sum += (int64_t)input[j] * sinvalue_lookup[idx - 1] * (sign ? -1 : 1);
}
- sum = (sum * mult) >> (2 * DCT_CONST_BITS);
+ sum = ROUND_POWER_OF_TWO(sum, (2 * DCT_CONST_BITS));
output[i] = WRAPLOW(sum, bd);
}
}
#if CONFIG_EXT_TX
void fdst4(const tran_low_t *input, tran_low_t *output) {
static const int N = 4;
- static const int sinvalue_lookup_table[] = {
- 9630, 15582
+ // {sin(pi/5), sin(pi*2/5)} * sqrt(2/5) * sqrt(2)
+ static const int32_t sinvalue_lookup[] = {
+ 141124871, 228344838,
};
- static const int mult = 14654; // sqrt(4/5)
int i, j;
for (i = 0; i < N; i++) {
int64_t sum = 0;
idx = idx > N + 1 - idx ? N + 1 - idx : idx;
if (idx == 0) continue;
idx--;
- sum += (int64_t)input[j] * sinvalue_lookup_table[idx] * (sign ? -1 : 1);
+ sum += (int64_t)input[j] * sinvalue_lookup[idx] * (sign ? -1 : 1);
}
- output[i] = (sum * mult) >> (2 * DCT_CONST_BITS);
+ output[i] = ROUND_POWER_OF_TWO(sum, (2 * DCT_CONST_BITS));
}
}
void fdst8(const tran_low_t *input, tran_low_t *output) {
static const int N = 8;
- static const int sinvalue_lookup_table[] = {
- 5604, 10531, 14189, 16135
+ // {sin(pi/9), sin(pi*2/9), ..., sin(pi*4/9)} * sqrt(2/9) * 2
+ static const int sinvalue_lookup[] = {
+ 86559612, 162678858, 219176632, 249238470
};
- static const int mult = 15447; // 2*sqrt(2/9)
int i, j;
for (i = 0; i < N; i++) {
int64_t sum = 0;
idx = idx > N + 1 - idx ? N + 1 - idx : idx;
if (idx == 0) continue;
idx--;
- sum += (int64_t)input[j] * sinvalue_lookup_table[idx] * (sign ? -1 : 1);
+ sum += (int64_t)input[j] * sinvalue_lookup[idx] * (sign ? -1 : 1);
}
- output[i] = (sum * mult) >> (2 * DCT_CONST_BITS);
+ output[i] = ROUND_POWER_OF_TWO(sum, (2 * DCT_CONST_BITS));
}
}
void fdst16(const tran_low_t *input, tran_low_t *output) {
static const int N = 16;
- static const int sinvalue_lookup_table[] = {
- 3011, 5919, 8625, 11038,
- 13075, 14666, 15759, 16314
+ // {sin(pi/17), sin(pi*2/17, ..., sin(pi*8/17)} * sqrt(2/17) * 2 * sqrt(2)
+ static const int sinvalue_lookup[] = {
+ 47852167, 94074787, 137093803, 175444254,
+ 207820161, 233119001, 250479254, 259309736
};
- static const int mult = 15895; // 2*sqrt(4/17)
int i, j;
for (i = 0; i < N; i++) {
int64_t sum = 0;
idx = idx > N + 1 - idx ? N + 1 - idx : idx;
if (idx == 0) continue;
idx--;
- sum += (int64_t)input[j] * sinvalue_lookup_table[idx] * (sign ? -1 : 1);
+ sum += (int64_t)input[j] * sinvalue_lookup[idx] * (sign ? -1 : 1);
}
- output[i] = (sum * mult) >> (2 * DCT_CONST_BITS);
+ output[i] = ROUND_POWER_OF_TWO(sum, (2 * DCT_CONST_BITS));
}
}
#endif // CONFIG_EXT_TX