1*09537850SAkhilesh Sanikop /* 2*09537850SAkhilesh Sanikop * Copyright 2019 The libgav1 Authors 3*09537850SAkhilesh Sanikop * 4*09537850SAkhilesh Sanikop * Licensed under the Apache License, Version 2.0 (the "License"); 5*09537850SAkhilesh Sanikop * you may not use this file except in compliance with the License. 6*09537850SAkhilesh Sanikop * You may obtain a copy of the License at 7*09537850SAkhilesh Sanikop * 8*09537850SAkhilesh Sanikop * http://www.apache.org/licenses/LICENSE-2.0 9*09537850SAkhilesh Sanikop * 10*09537850SAkhilesh Sanikop * Unless required by applicable law or agreed to in writing, software 11*09537850SAkhilesh Sanikop * distributed under the License is distributed on an "AS IS" BASIS, 12*09537850SAkhilesh Sanikop * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*09537850SAkhilesh Sanikop * See the License for the specific language governing permissions and 14*09537850SAkhilesh Sanikop * limitations under the License. 15*09537850SAkhilesh Sanikop */ 16*09537850SAkhilesh Sanikop 17*09537850SAkhilesh Sanikop #ifndef LIBGAV1_SRC_DSP_COMMON_H_ 18*09537850SAkhilesh Sanikop #define LIBGAV1_SRC_DSP_COMMON_H_ 19*09537850SAkhilesh Sanikop 20*09537850SAkhilesh Sanikop #include <cstdint> 21*09537850SAkhilesh Sanikop 22*09537850SAkhilesh Sanikop #include "src/dsp/constants.h" 23*09537850SAkhilesh Sanikop #include "src/utils/constants.h" 24*09537850SAkhilesh Sanikop #include "src/utils/memory.h" 25*09537850SAkhilesh Sanikop 26*09537850SAkhilesh Sanikop namespace libgav1 { 27*09537850SAkhilesh Sanikop 28*09537850SAkhilesh Sanikop enum { kSgrStride = kRestorationUnitWidth + 32 }; // anonymous enum 29*09537850SAkhilesh Sanikop 30*09537850SAkhilesh Sanikop // Self guided projection filter. 31*09537850SAkhilesh Sanikop struct SgrProjInfo { 32*09537850SAkhilesh Sanikop int index; 33*09537850SAkhilesh Sanikop int multiplier[2]; 34*09537850SAkhilesh Sanikop }; 35*09537850SAkhilesh Sanikop 36*09537850SAkhilesh Sanikop struct WienerInfo { 37*09537850SAkhilesh Sanikop static const int kVertical = 0; 38*09537850SAkhilesh Sanikop static const int kHorizontal = 1; 39*09537850SAkhilesh Sanikop int16_t number_leading_zero_coefficients[2]; 40*09537850SAkhilesh Sanikop alignas(kMaxAlignment) int16_t filter[2][(kWienerFilterTaps + 1) / 2]; 41*09537850SAkhilesh Sanikop }; 42*09537850SAkhilesh Sanikop 43*09537850SAkhilesh Sanikop struct RestorationUnitInfo : public MaxAlignedAllocable { 44*09537850SAkhilesh Sanikop LoopRestorationType type; 45*09537850SAkhilesh Sanikop SgrProjInfo sgr_proj_info; 46*09537850SAkhilesh Sanikop WienerInfo wiener_info; 47*09537850SAkhilesh Sanikop }; 48*09537850SAkhilesh Sanikop 49*09537850SAkhilesh Sanikop struct SgrBuffer { 50*09537850SAkhilesh Sanikop alignas(kMaxAlignment) uint16_t sum3[4 * kSgrStride]; 51*09537850SAkhilesh Sanikop alignas(kMaxAlignment) uint16_t sum5[5 * kSgrStride]; 52*09537850SAkhilesh Sanikop alignas(kMaxAlignment) uint32_t square_sum3[4 * kSgrStride]; 53*09537850SAkhilesh Sanikop alignas(kMaxAlignment) uint32_t square_sum5[5 * kSgrStride]; 54*09537850SAkhilesh Sanikop alignas(kMaxAlignment) uint16_t ma343[4 * kRestorationUnitWidth]; 55*09537850SAkhilesh Sanikop alignas(kMaxAlignment) uint16_t ma444[3 * kRestorationUnitWidth]; 56*09537850SAkhilesh Sanikop alignas(kMaxAlignment) uint16_t ma565[2 * kRestorationUnitWidth]; 57*09537850SAkhilesh Sanikop alignas(kMaxAlignment) uint32_t b343[4 * kRestorationUnitWidth]; 58*09537850SAkhilesh Sanikop alignas(kMaxAlignment) uint32_t b444[3 * kRestorationUnitWidth]; 59*09537850SAkhilesh Sanikop alignas(kMaxAlignment) uint32_t b565[2 * kRestorationUnitWidth]; 60*09537850SAkhilesh Sanikop // The following 2 buffers are only used by the C functions. Since SgrBuffer 61*09537850SAkhilesh Sanikop // is smaller than |wiener_buffer| in RestorationBuffer which is an union, 62*09537850SAkhilesh Sanikop // it's OK to always keep the following 2 buffers. 63*09537850SAkhilesh Sanikop alignas(kMaxAlignment) uint8_t ma[kSgrStride]; // [0, 255] 64*09537850SAkhilesh Sanikop // b is less than 2^16 for 8-bit. However, making it a template slows down the 65*09537850SAkhilesh Sanikop // C function by 5%. So b is fixed to 32-bit. 66*09537850SAkhilesh Sanikop alignas(kMaxAlignment) uint32_t b[kSgrStride]; 67*09537850SAkhilesh Sanikop }; 68*09537850SAkhilesh Sanikop 69*09537850SAkhilesh Sanikop union RestorationBuffer { 70*09537850SAkhilesh Sanikop // For self-guided filter. 71*09537850SAkhilesh Sanikop SgrBuffer sgr_buffer; 72*09537850SAkhilesh Sanikop // For wiener filter. 73*09537850SAkhilesh Sanikop // The array |intermediate| in Section 7.17.4, the intermediate results 74*09537850SAkhilesh Sanikop // between the horizontal and vertical filters. 75*09537850SAkhilesh Sanikop alignas(kMaxAlignment) int16_t 76*09537850SAkhilesh Sanikop wiener_buffer[(kRestorationUnitHeight + kWienerFilterTaps - 1) * 77*09537850SAkhilesh Sanikop kRestorationUnitWidth]; 78*09537850SAkhilesh Sanikop }; 79*09537850SAkhilesh Sanikop 80*09537850SAkhilesh Sanikop } // namespace libgav1 81*09537850SAkhilesh Sanikop 82*09537850SAkhilesh Sanikop #endif // LIBGAV1_SRC_DSP_COMMON_H_ 83