blob: 83968edc6ad57a7eb4e9d95a92dad056621d5b58 [file] [log] [blame]
#include "src/reconstruction.h"
#include <cassert>
#include <cstdint>
#include "src/utils/common.h"
namespace libgav1 {
namespace {
// Maps TransformType to dsp::Transform1D for the row transforms.
constexpr dsp::Transform1D kRowTransform[kNumTransformTypes] = {
dsp::k1DTransformDct, dsp::k1DTransformAdst,
dsp::k1DTransformDct, dsp::k1DTransformAdst,
dsp::k1DTransformAdst, dsp::k1DTransformDct,
dsp::k1DTransformAdst, dsp::k1DTransformAdst,
dsp::k1DTransformAdst, dsp::k1DTransformIdentity,
dsp::k1DTransformIdentity, dsp::k1DTransformDct,
dsp::k1DTransformIdentity, dsp::k1DTransformAdst,
dsp::k1DTransformIdentity, dsp::k1DTransformAdst};
// Maps TransformType to dsp::Transform1D for the column transforms.
constexpr dsp::Transform1D kColumnTransform[kNumTransformTypes] = {
dsp::k1DTransformDct, dsp::k1DTransformDct,
dsp::k1DTransformAdst, dsp::k1DTransformAdst,
dsp::k1DTransformDct, dsp::k1DTransformAdst,
dsp::k1DTransformAdst, dsp::k1DTransformAdst,
dsp::k1DTransformAdst, dsp::k1DTransformIdentity,
dsp::k1DTransformDct, dsp::k1DTransformIdentity,
dsp::k1DTransformAdst, dsp::k1DTransformIdentity,
dsp::k1DTransformAdst, dsp::k1DTransformIdentity};
dsp::TransformSize1D Get1DTransformSize(int size_log2) {
return static_cast<dsp::TransformSize1D>(size_log2 - 2);
}
} // namespace
template <typename Residual, typename Pixel>
void Reconstruct(const dsp::Dsp& dsp, TransformType tx_type,
TransformSize tx_size, bool lossless, Residual* const buffer,
int start_x, int start_y, Array2DView<Pixel>* frame,
int16_t non_zero_coeff_count) {
static_assert(sizeof(Residual) == 2 || sizeof(Residual) == 4, "");
const int tx_width_log2 = kTransformWidthLog2[tx_size];
const int tx_height_log2 = kTransformHeightLog2[tx_size];
// Row transform.
const dsp::TransformSize1D row_transform_size =
Get1DTransformSize(tx_width_log2);
const dsp::Transform1D row_transform =
lossless ? dsp::k1DTransformWht : kRowTransform[tx_type];
const dsp::InverseTransformAddFunc row_transform_func =
dsp.inverse_transforms[row_transform_size][row_transform];
assert(row_transform_func != nullptr);
row_transform_func(tx_type, tx_size, buffer, start_x, start_y, frame,
/*is_row=*/true, non_zero_coeff_count);
// Column transform.
const dsp::TransformSize1D column_transform_size =
Get1DTransformSize(tx_height_log2);
const dsp::Transform1D column_transform =
lossless ? dsp::k1DTransformWht : kColumnTransform[tx_type];
const dsp::InverseTransformAddFunc column_transform_func =
dsp.inverse_transforms[column_transform_size][column_transform];
assert(column_transform_func != nullptr);
column_transform_func(tx_type, tx_size, buffer, start_x, start_y, frame,
/*is_row=*/false, non_zero_coeff_count);
}
template void Reconstruct(const dsp::Dsp& dsp, TransformType tx_type,
TransformSize tx_size, bool lossless, int16_t* buffer,
int start_x, int start_y, Array2DView<uint8_t>* frame,
int16_t non_zero_coeff_count);
#if LIBGAV1_MAX_BITDEPTH >= 10
template void Reconstruct(const dsp::Dsp& dsp, TransformType tx_type,
TransformSize tx_size, bool lossless, int32_t* buffer,
int start_x, int start_y,
Array2DView<uint16_t>* frame,
int16_t non_zero_coeff_count);
#endif
} // namespace libgav1