// Copyright (c) the JPEG XL 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.
#if defined (LIB_JXL_ENC_TRANSFORMS_INL_H_) == defined (HWY_TARGET_TOGGLE)
#ifdef LIB_JXL_ENC_TRANSFORMS_INL_H_
#undef LIB_JXL_ENC_TRANSFORMS_INL_H_
#else
#define LIB_JXL_ENC_TRANSFORMS_INL_H_
#endif
#include <cstddef>
#include <cstdint>
#include <hwy/highway.h>
#include "lib/jxl/ac_strategy.h"
#include "lib/jxl/dct-inl.h"
#include "lib/jxl/dct_scales.h"
HWY_BEFORE_NAMESPACE();
namespace jxl {
enum class AcStrategyType : uint32_t;
namespace HWY_NAMESPACE {
namespace {
// Inverse of ReinterpretingDCT.
template <size_t DCT_ROWS, size_t DCT_COLS, size_t LF_ROWS, size_t LF_COLS,
size_t ROWS, size_t COLS>
HWY_INLINE void ReinterpretingIDCT(const float * input,
const size_t input_stride, float * output,
const size_t output_stride) {
HWY_ALIGN float block[ROWS * COLS] = {};
if (ROWS < COLS) {
for (size_t y = 0 ; y < LF_ROWS; y++) {
for (size_t x = 0 ; x < LF_COLS; x++) {
block[y * COLS + x] = input[y * input_stride + x] *
DCTTotalResampleScale<DCT_ROWS, ROWS>(y) *
DCTTotalResampleScale<DCT_COLS, COLS>(x);
}
}
} else {
for (size_t y = 0 ; y < LF_COLS; y++) {
for (size_t x = 0 ; x < LF_ROWS; x++) {
block[y * ROWS + x] = input[y * input_stride + x] *
DCTTotalResampleScale<DCT_COLS, COLS>(y) *
DCTTotalResampleScale<DCT_ROWS, ROWS>(x);
}
}
}
// ROWS, COLS <= 8, so we can put scratch space on the stack.
HWY_ALIGN float scratch_space[ROWS * COLS * 3 ];
ComputeScaledIDCT<ROWS, COLS>()(block, DCTTo(output, output_stride),
scratch_space);
}
template <size_t S>
void DCT2TopBlock(const float * block, size_t stride, float * out) {
static_assert(kBlockDim % S == 0 , "S should be a divisor of kBlockDim" );
static_assert(S % 2 == 0 , "S should be even" );
float temp[kDCTBlockSize];
constexpr size_t num_2x2 = S / 2 ;
for (size_t y = 0 ; y < num_2x2; y++) {
for (size_t x = 0 ; x < num_2x2; x++) {
float c00 = block[y * 2 * stride + x * 2 ];
float c01 = block[y * 2 * stride + x * 2 + 1 ];
float c10 = block[(y * 2 + 1 ) * stride + x * 2 ];
float c11 = block[(y * 2 + 1 ) * stride + x * 2 + 1 ];
float r00 = c00 + c01 + c10 + c11;
float r01 = c00 + c01 - c10 - c11;
float r10 = c00 - c01 + c10 - c11;
float r11 = c00 - c01 - c10 + c11;
r00 *= 0 .25 f;
r01 *= 0 .25 f;
r10 *= 0 .25 f;
r11 *= 0 .25 f;
temp[y * kBlockDim + x] = r00;
temp[y * kBlockDim + num_2x2 + x] = r01;
temp[(y + num_2x2) * kBlockDim + x] = r10;
temp[(y + num_2x2) * kBlockDim + num_2x2 + x] = r11;
}
}
for (size_t y = 0 ; y < S; y++) {
for (size_t x = 0 ; x < S; x++) {
out[y * kBlockDim + x] = temp[y * kBlockDim + x];
}
}
}
void AFVDCT4x4(const float * JXL_RESTRICT pixels, float * JXL_RESTRICT coeffs) {
HWY_ALIGN static constexpr float k4x4AFVBasisTranspose[16 ][16 ] = {
{
0 .2500000000000000 ,
0 .8769029297991420 f,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
-0 .4105377591765233 f,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
},
{
0 .2500000000000000 ,
0 .2206518106944235 f,
0 .0000000000000000 ,
0 .0000000000000000 ,
-0 .7071067811865474 f,
0 .6235485373547691 f,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
},
{
0 .2500000000000000 ,
-0 .1014005039375376 f,
0 .4067007583026075 f,
-0 .2125574805828875 f,
0 .0000000000000000 ,
-0 .0643507165794627 f,
-0 .4517556589999482 f,
-0 .3046847507248690 f,
0 .3017929516615495 f,
0 .4082482904638627 f,
0 .1747866975480809 f,
-0 .2110560104933578 f,
-0 .1426608480880726 f,
-0 .1381354035075859 f,
-0 .1743760259965107 f,
0 .1135498731499434 f,
},
{
0 .2500000000000000 ,
-0 .1014005039375375 f,
0 .4444481661973445 f,
0 .3085497062849767 f,
0 .0000000000000000 f,
-0 .0643507165794627 f,
0 .1585450355184006 f,
0 .5112616136591823 f,
0 .2579236279634118 f,
0 .0000000000000000 ,
0 .0812611176717539 f,
0 .1856718091610980 f,
-0 .3416446842253372 f,
0 .3302282550303788 f,
0 .0702790691196284 f,
-0 .0741750459581035 f,
},
{
0 .2500000000000000 ,
0 .2206518106944236 f,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .7071067811865476 f,
0 .6235485373547694 f,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
},
{
0 .2500000000000000 ,
-0 .1014005039375378 f,
0 .0000000000000000 ,
0 .4706702258572536 f,
0 .0000000000000000 ,
-0 .0643507165794628 f,
-0 .0403851516082220 f,
0 .0000000000000000 ,
0 .1627234014286620 f,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .7367497537172237 f,
0 .0875511500058708 f,
-0 .2921026642334881 f,
0 .1940289303259434 f,
},
{
0 .2500000000000000 ,
-0 .1014005039375377 f,
0 .1957439937204294 f,
-0 .1621205195722993 f,
0 .0000000000000000 ,
-0 .0643507165794628 f,
0 .0074182263792424 f,
-0 .2904801297289980 f,
0 .0952002265347504 f,
0 .0000000000000000 ,
-0 .3675398009862027 f,
0 .4921585901373873 f,
0 .2462710772207515 f,
-0 .0794670660590957 f,
0 .3623817333531167 f,
-0 .4351904965232280 f,
},
{
0 .2500000000000000 ,
-0 .1014005039375376 f,
0 .2929100136981264 f,
0 .0000000000000000 ,
0 .0000000000000000 ,
-0 .0643507165794627 f,
0 .3935103426921017 f,
-0 .0657870154914280 f,
0 .0000000000000000 ,
-0 .4082482904638628 f,
-0 .3078822139579090 f,
-0 .3852501370925192 f,
-0 .0857401903551931 f,
-0 .4613374887461511 f,
0 .0000000000000000 ,
0 .2191868483885747 f,
},
{
0 .2500000000000000 ,
-0 .1014005039375376 f,
-0 .4067007583026072 f,
-0 .2125574805828705 f,
0 .0000000000000000 ,
-0 .0643507165794627 f,
-0 .4517556589999464 f,
0 .3046847507248840 f,
0 .3017929516615503 f,
-0 .4082482904638635 f,
-0 .1747866975480813 f,
0 .2110560104933581 f,
-0 .1426608480880734 f,
-0 .1381354035075829 f,
-0 .1743760259965108 f,
0 .1135498731499426 f,
},
{
0 .2500000000000000 ,
-0 .1014005039375377 f,
-0 .1957439937204287 f,
-0 .1621205195722833 f,
0 .0000000000000000 ,
-0 .0643507165794628 f,
0 .0074182263792444 f,
0 .2904801297290076 f,
0 .0952002265347505 f,
0 .0000000000000000 ,
0 .3675398009862011 f,
-0 .4921585901373891 f,
0 .2462710772207514 f,
-0 .0794670660591026 f,
0 .3623817333531165 f,
-0 .4351904965232251 f,
},
{
0 .2500000000000000 ,
-0 .1014005039375375 f,
0 .0000000000000000 ,
-0 .4706702258572528 f,
0 .0000000000000000 ,
-0 .0643507165794627 f,
0 .1107416575309343 f,
0 .0000000000000000 ,
-0 .1627234014286617 f,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .1488339922711357 f,
0 .4972464710953509 f,
0 .2921026642334879 f,
0 .5550443808910661 f,
},
{
0 .2500000000000000 ,
-0 .1014005039375377 f,
0 .1137907446044809 f,
-0 .1464291867126764 f,
0 .0000000000000000 ,
-0 .0643507165794628 f,
0 .0829816309488205 f,
-0 .2388977352334460 f,
-0 .3531238544981630 f,
-0 .4082482904638630 f,
0 .4826689115059883 f,
0 .1741941265991622 f,
-0 .0476868035022925 f,
0 .1253805944856366 f,
-0 .4326608024727445 f,
-0 .2546827712406646 f,
},
{
0 .2500000000000000 ,
-0 .1014005039375377 f,
-0 .4444481661973438 f,
0 .3085497062849487 f,
0 .0000000000000000 ,
-0 .0643507165794628 f,
0 .1585450355183970 f,
-0 .5112616136592012 f,
0 .2579236279634129 f,
0 .0000000000000000 ,
-0 .0812611176717504 f,
-0 .1856718091610990 f,
-0 .3416446842253373 f,
0 .3302282550303805 f,
0 .0702790691196282 f,
-0 .0741750459581023 f,
},
{
0 .2500000000000000 ,
-0 .1014005039375376 f,
-0 .2929100136981264 f,
0 .0000000000000000 ,
0 .0000000000000000 ,
-0 .0643507165794627 f,
0 .3935103426921022 f,
0 .0657870154914254 f,
0 .0000000000000000 ,
0 .4082482904638634 f,
0 .3078822139579031 f,
0 .3852501370925211 f,
-0 .0857401903551927 f,
-0 .4613374887461554 f,
0 .0000000000000000 ,
0 .2191868483885728 f,
},
{
0 .2500000000000000 ,
-0 .1014005039375376 f,
-0 .1137907446044814 f,
-0 .1464291867126654 f,
0 .0000000000000000 ,
-0 .0643507165794627 f,
0 .0829816309488214 f,
0 .2388977352334547 f,
-0 .3531238544981624 f,
0 .4082482904638630 f,
-0 .4826689115059858 f,
-0 .1741941265991621 f,
-0 .0476868035022928 f,
0 .1253805944856431 f,
-0 .4326608024727457 f,
-0 .2546827712406641 f,
},
{
0 .2500000000000000 ,
-0 .1014005039375374 f,
0 .0000000000000000 ,
0 .4251149611657548 f,
0 .0000000000000000 ,
-0 .0643507165794626 f,
-0 .4517556589999480 f,
0 .0000000000000000 ,
-0 .6035859033230976 f,
0 .0000000000000000 ,
0 .0000000000000000 ,
0 .0000000000000000 ,
-0 .1426608480880724 f,
-0 .1381354035075845 f,
0 .3487520519930227 f,
0 .1135498731499429 f,
},
};
const HWY_CAPPED(float , 16 ) d;
for (size_t i = 0 ; i < 16 ; i += Lanes(d)) {
auto scalar = Zero(d);
for (size_t j = 0 ; j < 16 ; j++) {
auto px = Set(d, pixels[j]);
auto basis = Load(d, k4x4AFVBasisTranspose[j] + i);
scalar = MulAdd(px, basis, scalar);
}
Store(scalar, d, coeffs + i);
}
}
// Coefficient layout:
// - (even, even) positions hold AFV coefficients
// - (odd, even) positions hold DCT4x4 coefficients
// - (any, odd) positions hold DCT4x8 coefficients
template <size_t afv_kind>
void AFVTransformFromPixels(const float * JXL_RESTRICT pixels,
size_t pixels_stride,
float * JXL_RESTRICT coefficients) {
HWY_ALIGN float scratch_space[4 * 8 * 5 ];
size_t afv_x = afv_kind & 1 ;
size_t afv_y = afv_kind / 2 ;
HWY_ALIGN float block[4 * 8 ] = {};
for (size_t iy = 0 ; iy < 4 ; iy++) {
for (size_t ix = 0 ; ix < 4 ; ix++) {
block[(afv_y == 1 ? 3 - iy : iy) * 4 + (afv_x == 1 ? 3 - ix : ix)] =
pixels[(iy + 4 * afv_y) * pixels_stride + ix + 4 * afv_x];
}
}
// AFV coefficients in (even, even) positions.
HWY_ALIGN float coeff[4 * 4 ];
AFVDCT4x4(block, coeff);
for (size_t iy = 0 ; iy < 4 ; iy++) {
for (size_t ix = 0 ; ix < 4 ; ix++) {
coefficients[iy * 2 * 8 + ix * 2 ] = coeff[iy * 4 + ix];
}
}
// 4x4 DCT of the block with same y and different x.
ComputeScaledDCT<4 , 4 >()(
DCTFrom(pixels + afv_y * 4 * pixels_stride + (afv_x == 1 ? 0 : 4 ),
pixels_stride),
block, scratch_space);
// ... in (odd, even) positions.
for (size_t iy = 0 ; iy < 4 ; iy++) {
for (size_t ix = 0 ; ix < 8 ; ix++) {
coefficients[iy * 2 * 8 + ix * 2 + 1 ] = block[iy * 4 + ix];
}
}
// 4x8 DCT of the other half of the block.
ComputeScaledDCT<4 , 8 >()(
DCTFrom(pixels + (afv_y == 1 ? 0 : 4 ) * pixels_stride, pixels_stride),
block, scratch_space);
for (size_t iy = 0 ; iy < 4 ; iy++) {
for (size_t ix = 0 ; ix < 8 ; ix++) {
coefficients[(1 + iy * 2 ) * 8 + ix] = block[iy * 8 + ix];
}
}
float block00 = coefficients[0 ] * 0 .25 f;
float block01 = coefficients[1 ];
float block10 = coefficients[8 ];
coefficients[0 ] = (block00 + block01 + 2 * block10) * 0 .25 f;
coefficients[1 ] = (block00 - block01) * 0 .5 f;
coefficients[8 ] = (block00 + block01 - 2 * block10) * 0 .25 f;
}
HWY_MAYBE_UNUSED void TransformFromPixels(const AcStrategyType strategy,
const float * JXL_RESTRICT pixels,
size_t pixels_stride,
float * JXL_RESTRICT coefficients,
float * JXL_RESTRICT scratch_space) {
using Type = AcStrategyType;
switch (strategy) {
case Type::IDENTITY: {
for (size_t y = 0 ; y < 2 ; y++) {
for (size_t x = 0 ; x < 2 ; x++) {
float block_dc = 0 ;
for (size_t iy = 0 ; iy < 4 ; iy++) {
for (size_t ix = 0 ; ix < 4 ; ix++) {
block_dc += pixels[(y * 4 + iy) * pixels_stride + x * 4 + ix];
}
}
block_dc *= 1 .0 f / 16 ;
for (size_t iy = 0 ; iy < 4 ; iy++) {
for (size_t ix = 0 ; ix < 4 ; ix++) {
if (ix == 1 && iy == 1 ) continue ;
coefficients[(y + iy * 2 ) * 8 + x + ix * 2 ] =
pixels[(y * 4 + iy) * pixels_stride + x * 4 + ix] -
pixels[(y * 4 + 1 ) * pixels_stride + x * 4 + 1 ];
}
}
coefficients[(y + 2 ) * 8 + x + 2 ] = coefficients[y * 8 + x];
coefficients[y * 8 + x] = block_dc;
}
}
float block00 = coefficients[0 ];
float block01 = coefficients[1 ];
float block10 = coefficients[8 ];
float block11 = coefficients[9 ];
coefficients[0 ] = (block00 + block01 + block10 + block11) * 0 .25 f;
coefficients[1 ] = (block00 + block01 - block10 - block11) * 0 .25 f;
coefficients[8 ] = (block00 - block01 + block10 - block11) * 0 .25 f;
coefficients[9 ] = (block00 - block01 - block10 + block11) * 0 .25 f;
break ;
}
case Type::DCT8X4: {
for (size_t x = 0 ; x < 2 ; x++) {
HWY_ALIGN float block[4 * 8 ];
ComputeScaledDCT<8 , 4 >()(DCTFrom(pixels + x * 4 , pixels_stride), block,
scratch_space);
for (size_t iy = 0 ; iy < 4 ; iy++) {
for (size_t ix = 0 ; ix < 8 ; ix++) {
// Store transposed.
coefficients[(x + iy * 2 ) * 8 + ix] = block[iy * 8 + ix];
}
}
}
float block0 = coefficients[0 ];
float block1 = coefficients[8 ];
coefficients[0 ] = (block0 + block1) * 0 .5 f;
coefficients[8 ] = (block0 - block1) * 0 .5 f;
break ;
}
case Type::DCT4X8: {
for (size_t y = 0 ; y < 2 ; y++) {
HWY_ALIGN float block[4 * 8 ];
ComputeScaledDCT<4 , 8 >()(
DCTFrom(pixels + y * 4 * pixels_stride, pixels_stride), block,
scratch_space);
for (size_t iy = 0 ; iy < 4 ; iy++) {
for (size_t ix = 0 ; ix < 8 ; ix++) {
coefficients[(y + iy * 2 ) * 8 + ix] = block[iy * 8 + ix];
}
}
}
float block0 = coefficients[0 ];
float block1 = coefficients[8 ];
coefficients[0 ] = (block0 + block1) * 0 .5 f;
coefficients[8 ] = (block0 - block1) * 0 .5 f;
break ;
}
case Type::DCT4X4: {
for (size_t y = 0 ; y < 2 ; y++) {
for (size_t x = 0 ; x < 2 ; x++) {
HWY_ALIGN float block[4 * 4 ];
ComputeScaledDCT<4 , 4 >()(
DCTFrom(pixels + y * 4 * pixels_stride + x * 4 , pixels_stride),
block, scratch_space);
for (size_t iy = 0 ; iy < 4 ; iy++) {
for (size_t ix = 0 ; ix < 4 ; ix++) {
coefficients[(y + iy * 2 ) * 8 + x + ix * 2 ] = block[iy * 4 + ix];
}
}
}
}
float block00 = coefficients[0 ];
float block01 = coefficients[1 ];
float block10 = coefficients[8 ];
float block11 = coefficients[9 ];
coefficients[0 ] = (block00 + block01 + block10 + block11) * 0 .25 f;
coefficients[1 ] = (block00 + block01 - block10 - block11) * 0 .25 f;
coefficients[8 ] = (block00 - block01 + block10 - block11) * 0 .25 f;
coefficients[9 ] = (block00 - block01 - block10 + block11) * 0 .25 f;
break ;
}
case Type::DCT2X2: {
DCT2TopBlock<8 >(pixels, pixels_stride, coefficients);
DCT2TopBlock<4 >(coefficients, kBlockDim, coefficients);
DCT2TopBlock<2 >(coefficients, kBlockDim, coefficients);
break ;
}
case Type::DCT16X16: {
ComputeScaledDCT<16 , 16 >()(DCTFrom(pixels, pixels_stride), coefficients,
scratch_space);
break ;
}
case Type::DCT16X8: {
ComputeScaledDCT<16 , 8 >()(DCTFrom(pixels, pixels_stride), coefficients,
scratch_space);
break ;
}
case Type::DCT8X16: {
ComputeScaledDCT<8 , 16 >()(DCTFrom(pixels, pixels_stride), coefficients,
scratch_space);
break ;
}
case Type::DCT32X8: {
ComputeScaledDCT<32 , 8 >()(DCTFrom(pixels, pixels_stride), coefficients,
scratch_space);
break ;
}
case Type::DCT8X32: {
ComputeScaledDCT<8 , 32 >()(DCTFrom(pixels, pixels_stride), coefficients,
scratch_space);
break ;
}
case Type::DCT32X16: {
ComputeScaledDCT<32 , 16 >()(DCTFrom(pixels, pixels_stride), coefficients,
scratch_space);
break ;
}
case Type::DCT16X32: {
ComputeScaledDCT<16 , 32 >()(DCTFrom(pixels, pixels_stride), coefficients,
scratch_space);
break ;
}
case Type::DCT32X32: {
ComputeScaledDCT<32 , 32 >()(DCTFrom(pixels, pixels_stride), coefficients,
scratch_space);
break ;
}
case Type::DCT: {
ComputeScaledDCT<8 , 8 >()(DCTFrom(pixels, pixels_stride), coefficients,
scratch_space);
break ;
}
case Type::AFV0: {
AFVTransformFromPixels<0 >(pixels, pixels_stride, coefficients);
break ;
}
case Type::AFV1: {
AFVTransformFromPixels<1 >(pixels, pixels_stride, coefficients);
break ;
}
case Type::AFV2: {
AFVTransformFromPixels<2 >(pixels, pixels_stride, coefficients);
break ;
}
case Type::AFV3: {
AFVTransformFromPixels<3 >(pixels, pixels_stride, coefficients);
break ;
}
case Type::DCT64X64: {
ComputeScaledDCT<64 , 64 >()(DCTFrom(pixels, pixels_stride), coefficients,
scratch_space);
break ;
}
case Type::DCT64X32: {
ComputeScaledDCT<64 , 32 >()(DCTFrom(pixels, pixels_stride), coefficients,
scratch_space);
break ;
}
case Type::DCT32X64: {
ComputeScaledDCT<32 , 64 >()(DCTFrom(pixels, pixels_stride), coefficients,
scratch_space);
break ;
}
case Type::DCT128X128: {
ComputeScaledDCT<128 , 128 >()(DCTFrom(pixels, pixels_stride), coefficients,
scratch_space);
break ;
}
case Type::DCT128X64: {
ComputeScaledDCT<128 , 64 >()(DCTFrom(pixels, pixels_stride), coefficients,
scratch_space);
break ;
}
case Type::DCT64X128: {
ComputeScaledDCT<64 , 128 >()(DCTFrom(pixels, pixels_stride), coefficients,
scratch_space);
break ;
}
case Type::DCT256X256: {
ComputeScaledDCT<256 , 256 >()(DCTFrom(pixels, pixels_stride), coefficients,
scratch_space);
break ;
}
case Type::DCT256X128: {
ComputeScaledDCT<256 , 128 >()(DCTFrom(pixels, pixels_stride), coefficients,
scratch_space);
break ;
}
case Type::DCT128X256: {
ComputeScaledDCT<128 , 256 >()(DCTFrom(pixels, pixels_stride), coefficients,
scratch_space);
break ;
}
}
}
HWY_MAYBE_UNUSED void DCFromLowestFrequencies(const AcStrategyType strategy,
const float * block, float * dc,
size_t dc_stride) {
using Type = AcStrategyType;
switch (strategy) {
case Type::DCT16X8: {
ReinterpretingIDCT</*DCT_ROWS=*/2 * kBlockDim, /*DCT_COLS=*/kBlockDim,
/*LF_ROWS=*/2, /*LF_COLS=*/1, /*ROWS=*/2, /*COLS=*/1>(
block, 2 * kBlockDim, dc, dc_stride);
break ;
}
case Type::DCT8X16: {
ReinterpretingIDCT</*DCT_ROWS=*/kBlockDim, /*DCT_COLS=*/2 * kBlockDim,
/*LF_ROWS=*/1, /*LF_COLS=*/2, /*ROWS=*/1, /*COLS=*/2>(
block, 2 * kBlockDim, dc, dc_stride);
break ;
}
case Type::DCT16X16: {
ReinterpretingIDCT</*DCT_ROWS=*/2 * kBlockDim, /*DCT_COLS=*/2 * kBlockDim,
/*LF_ROWS=*/2, /*LF_COLS=*/2, /*ROWS=*/2, /*COLS=*/2>(
block, 2 * kBlockDim, dc, dc_stride);
break ;
}
case Type::DCT32X8: {
ReinterpretingIDCT</*DCT_ROWS=*/4 * kBlockDim, /*DCT_COLS=*/kBlockDim,
/*LF_ROWS=*/4, /*LF_COLS=*/1, /*ROWS=*/4, /*COLS=*/1>(
block, 4 * kBlockDim, dc, dc_stride);
break ;
}
case Type::DCT8X32: {
ReinterpretingIDCT</*DCT_ROWS=*/kBlockDim, /*DCT_COLS=*/4 * kBlockDim,
/*LF_ROWS=*/1, /*LF_COLS=*/4, /*ROWS=*/1, /*COLS=*/4>(
block, 4 * kBlockDim, dc, dc_stride);
break ;
}
case Type::DCT32X16: {
ReinterpretingIDCT</*DCT_ROWS=*/4 * kBlockDim, /*DCT_COLS=*/2 * kBlockDim,
/*LF_ROWS=*/4, /*LF_COLS=*/2, /*ROWS=*/4, /*COLS=*/2>(
block, 4 * kBlockDim, dc, dc_stride);
break ;
}
case Type::DCT16X32: {
ReinterpretingIDCT</*DCT_ROWS=*/2 * kBlockDim, /*DCT_COLS=*/4 * kBlockDim,
/*LF_ROWS=*/2, /*LF_COLS=*/4, /*ROWS=*/2, /*COLS=*/4>(
block, 4 * kBlockDim, dc, dc_stride);
break ;
}
case Type::DCT32X32: {
ReinterpretingIDCT</*DCT_ROWS=*/4 * kBlockDim, /*DCT_COLS=*/4 * kBlockDim,
/*LF_ROWS=*/4, /*LF_COLS=*/4, /*ROWS=*/4, /*COLS=*/4>(
block, 4 * kBlockDim, dc, dc_stride);
break ;
}
case Type::DCT64X32: {
ReinterpretingIDCT</*DCT_ROWS=*/8 * kBlockDim, /*DCT_COLS=*/4 * kBlockDim,
/*LF_ROWS=*/8, /*LF_COLS=*/4, /*ROWS=*/8, /*COLS=*/4>(
block, 8 * kBlockDim, dc, dc_stride);
break ;
}
case Type::DCT32X64: {
ReinterpretingIDCT</*DCT_ROWS=*/4 * kBlockDim, /*DCT_COLS=*/8 * kBlockDim,
/*LF_ROWS=*/4, /*LF_COLS=*/8, /*ROWS=*/4, /*COLS=*/8>(
block, 8 * kBlockDim, dc, dc_stride);
break ;
}
case Type::DCT64X64: {
ReinterpretingIDCT</*DCT_ROWS=*/8 * kBlockDim, /*DCT_COLS=*/8 * kBlockDim,
/*LF_ROWS=*/8, /*LF_COLS=*/8, /*ROWS=*/8, /*COLS=*/8>(
block, 8 * kBlockDim, dc, dc_stride);
break ;
}
case Type::DCT128X64: {
ReinterpretingIDCT<
/*DCT_ROWS=*/16 * kBlockDim, /*DCT_COLS=*/8 * kBlockDim,
/*LF_ROWS=*/16, /*LF_COLS=*/8, /*ROWS=*/16, /*COLS=*/8>(
block, 16 * kBlockDim, dc, dc_stride);
break ;
}
case Type::DCT64X128: {
ReinterpretingIDCT<
/*DCT_ROWS=*/8 * kBlockDim, /*DCT_COLS=*/16 * kBlockDim,
/*LF_ROWS=*/8, /*LF_COLS=*/16, /*ROWS=*/8, /*COLS=*/16>(
block, 16 * kBlockDim, dc, dc_stride);
break ;
}
case Type::DCT128X128: {
ReinterpretingIDCT<
/*DCT_ROWS=*/16 * kBlockDim, /*DCT_COLS=*/16 * kBlockDim,
/*LF_ROWS=*/16, /*LF_COLS=*/16, /*ROWS=*/16, /*COLS=*/16>(
block, 16 * kBlockDim, dc, dc_stride);
break ;
}
case Type::DCT256X128: {
ReinterpretingIDCT<
/*DCT_ROWS=*/32 * kBlockDim, /*DCT_COLS=*/16 * kBlockDim,
/*LF_ROWS=*/32, /*LF_COLS=*/16, /*ROWS=*/32, /*COLS=*/16>(
block, 32 * kBlockDim, dc, dc_stride);
break ;
}
case Type::DCT128X256: {
ReinterpretingIDCT<
/*DCT_ROWS=*/16 * kBlockDim, /*DCT_COLS=*/32 * kBlockDim,
/*LF_ROWS=*/16, /*LF_COLS=*/32, /*ROWS=*/16, /*COLS=*/32>(
block, 32 * kBlockDim, dc, dc_stride);
break ;
}
case Type::DCT256X256: {
ReinterpretingIDCT<
/*DCT_ROWS=*/32 * kBlockDim, /*DCT_COLS=*/32 * kBlockDim,
/*LF_ROWS=*/32, /*LF_COLS=*/32, /*ROWS=*/32, /*COLS=*/32>(
block, 32 * kBlockDim, dc, dc_stride);
break ;
}
case Type::DCT:
case Type::DCT2X2:
case Type::DCT4X4:
case Type::DCT4X8:
case Type::DCT8X4:
case Type::AFV0:
case Type::AFV1:
case Type::AFV2:
case Type::AFV3:
case Type::IDENTITY:
dc[0 ] = block[0 ];
break ;
}
}
} // namespace
// NOLINTNEXTLINE(google-readability-namespace-comments)
} // namespace HWY_NAMESPACE
} // namespace jxl
HWY_AFTER_NAMESPACE();
#endif // LIB_JXL_ENC_TRANSFORMS_INL_H_
Messung V0.5 in Prozent C=87 H=83 G=84
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet am 2026-06-04)
¤
*© Formatika GbR, Deutschland