| // Constants and utility functions used for inverse transform implementations. |
| // This will be included inside an anonymous namespace on files where these are |
| // necessary. |
| |
| // The value at index i is derived as: round(cos(pi * i / 128) * (1 << 12)). |
| constexpr int16_t kCos128[65] = { |
| 4096, 4095, 4091, 4085, 4076, 4065, 4052, 4036, 4017, 3996, 3973, |
| 3948, 3920, 3889, 3857, 3822, 3784, 3745, 3703, 3659, 3612, 3564, |
| 3513, 3461, 3406, 3349, 3290, 3229, 3166, 3102, 3035, 2967, 2896, |
| 2824, 2751, 2675, 2598, 2520, 2440, 2359, 2276, 2191, 2106, 2019, |
| 1931, 1842, 1751, 1660, 1567, 1474, 1380, 1285, 1189, 1092, 995, |
| 897, 799, 700, 601, 501, 401, 301, 201, 101, 0}; |
| |
| inline int16_t Cos128(int angle) { |
| angle &= 0xff; |
| |
| // If |angle| is 128, this function returns -4096 (= -2^12), which will |
| // cause the 32-bit multiplications in ButterflyRotation() to overflow if |
| // dst[a] or dst[b] is -2^19 (a possible corner case when |range| is 20): |
| // |
| // (-2^12) * (-2^19) = 2^31, which cannot be represented as an int32_t. |
| // |
| // Note: |range| is 20 when bitdepth is 12 and a row transform is performed. |
| // |
| // Assert that this angle is never used by DCT or ADST. |
| assert(angle != 128); |
| if (angle <= 64) return kCos128[angle]; |
| if (angle <= 128) return -kCos128[128 - angle]; |
| if (angle <= 192) return -kCos128[angle - 128]; |
| return kCos128[256 - angle]; |
| } |
| |
| inline int16_t Sin128(int angle) { return Cos128(angle - 64); } |
| |
| // The value for index i is derived as: |
| // round(sqrt(2) * sin(i * pi / 9) * 2 / 3 * (1 << 12)). |
| constexpr int16_t kAdst4Multiplier[4] = {1321, 2482, 3344, 3803}; |
| |
| constexpr uint8_t kTransformRowShift[kNumTransformSizes] = { |
| 0, 0, 1, 0, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2}; |
| |
| constexpr bool kShouldRound[kNumTransformSizes] = { |
| false, true, false, true, false, true, false, false, true, false, |
| true, false, false, true, false, true, false, true, false}; |
| |
| constexpr int16_t kIdentity4Multiplier /* round(2^12 * sqrt(2)) */ = 0x16A1; |
| constexpr int16_t kIdentity4MultiplierFraction /* round(2^12 * (sqrt(2) - 1))*/ |
| = 0x6A1; |
| constexpr int16_t kIdentity16Multiplier /* 2 * round(2^12 * sqrt(2)) */ = 11586; |
| constexpr int16_t kTransformRowMultiplier /* round(2^12 / sqrt(2)) */ = 2896; |