1*09537850SAkhilesh Sanikop // Copyright 2019 The libgav1 Authors 2*09537850SAkhilesh Sanikop // 3*09537850SAkhilesh Sanikop // Licensed under the Apache License, Version 2.0 (the "License"); 4*09537850SAkhilesh Sanikop // you may not use this file except in compliance with the License. 5*09537850SAkhilesh Sanikop // You may obtain a copy of the License at 6*09537850SAkhilesh Sanikop // 7*09537850SAkhilesh Sanikop // http://www.apache.org/licenses/LICENSE-2.0 8*09537850SAkhilesh Sanikop // 9*09537850SAkhilesh Sanikop // Unless required by applicable law or agreed to in writing, software 10*09537850SAkhilesh Sanikop // distributed under the License is distributed on an "AS IS" BASIS, 11*09537850SAkhilesh Sanikop // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*09537850SAkhilesh Sanikop // See the License for the specific language governing permissions and 13*09537850SAkhilesh Sanikop // limitations under the License. 14*09537850SAkhilesh Sanikop 15*09537850SAkhilesh Sanikop #include "src/dsp/dsp.h" 16*09537850SAkhilesh Sanikop 17*09537850SAkhilesh Sanikop #include <mutex> // NOLINT (unapproved c++11 header) 18*09537850SAkhilesh Sanikop 19*09537850SAkhilesh Sanikop #include "src/dsp/average_blend.h" 20*09537850SAkhilesh Sanikop #include "src/dsp/cdef.h" 21*09537850SAkhilesh Sanikop #include "src/dsp/convolve.h" 22*09537850SAkhilesh Sanikop #include "src/dsp/distance_weighted_blend.h" 23*09537850SAkhilesh Sanikop #include "src/dsp/film_grain.h" 24*09537850SAkhilesh Sanikop #include "src/dsp/intra_edge.h" 25*09537850SAkhilesh Sanikop #include "src/dsp/intrapred.h" 26*09537850SAkhilesh Sanikop #include "src/dsp/intrapred_cfl.h" 27*09537850SAkhilesh Sanikop #include "src/dsp/intrapred_directional.h" 28*09537850SAkhilesh Sanikop #include "src/dsp/intrapred_filter.h" 29*09537850SAkhilesh Sanikop #include "src/dsp/intrapred_smooth.h" 30*09537850SAkhilesh Sanikop #include "src/dsp/inverse_transform.h" 31*09537850SAkhilesh Sanikop #include "src/dsp/loop_filter.h" 32*09537850SAkhilesh Sanikop #include "src/dsp/loop_restoration.h" 33*09537850SAkhilesh Sanikop #include "src/dsp/mask_blend.h" 34*09537850SAkhilesh Sanikop #include "src/dsp/motion_field_projection.h" 35*09537850SAkhilesh Sanikop #include "src/dsp/motion_vector_search.h" 36*09537850SAkhilesh Sanikop #include "src/dsp/obmc.h" 37*09537850SAkhilesh Sanikop #include "src/dsp/super_res.h" 38*09537850SAkhilesh Sanikop #include "src/dsp/warp.h" 39*09537850SAkhilesh Sanikop #include "src/dsp/weight_mask.h" 40*09537850SAkhilesh Sanikop #include "src/utils/cpu.h" 41*09537850SAkhilesh Sanikop 42*09537850SAkhilesh Sanikop namespace libgav1 { 43*09537850SAkhilesh Sanikop namespace dsp_internal { 44*09537850SAkhilesh Sanikop DspInit_C()45*09537850SAkhilesh Sanikopvoid DspInit_C() { 46*09537850SAkhilesh Sanikop dsp::AverageBlendInit_C(); 47*09537850SAkhilesh Sanikop dsp::CdefInit_C(); 48*09537850SAkhilesh Sanikop dsp::ConvolveInit_C(); 49*09537850SAkhilesh Sanikop dsp::DistanceWeightedBlendInit_C(); 50*09537850SAkhilesh Sanikop dsp::FilmGrainInit_C(); 51*09537850SAkhilesh Sanikop dsp::IntraEdgeInit_C(); 52*09537850SAkhilesh Sanikop dsp::IntraPredCflInit_C(); 53*09537850SAkhilesh Sanikop dsp::IntraPredDirectionalInit_C(); 54*09537850SAkhilesh Sanikop dsp::IntraPredFilterInit_C(); 55*09537850SAkhilesh Sanikop dsp::IntraPredInit_C(); 56*09537850SAkhilesh Sanikop dsp::IntraPredSmoothInit_C(); 57*09537850SAkhilesh Sanikop dsp::InverseTransformInit_C(); 58*09537850SAkhilesh Sanikop dsp::LoopFilterInit_C(); 59*09537850SAkhilesh Sanikop dsp::LoopRestorationInit_C(); 60*09537850SAkhilesh Sanikop dsp::MaskBlendInit_C(); 61*09537850SAkhilesh Sanikop dsp::MotionFieldProjectionInit_C(); 62*09537850SAkhilesh Sanikop dsp::MotionVectorSearchInit_C(); 63*09537850SAkhilesh Sanikop dsp::ObmcInit_C(); 64*09537850SAkhilesh Sanikop dsp::SuperResInit_C(); 65*09537850SAkhilesh Sanikop dsp::WarpInit_C(); 66*09537850SAkhilesh Sanikop dsp::WeightMaskInit_C(); 67*09537850SAkhilesh Sanikop } 68*09537850SAkhilesh Sanikop GetWritableDspTable(int bitdepth)69*09537850SAkhilesh Sanikopdsp::Dsp* GetWritableDspTable(int bitdepth) { 70*09537850SAkhilesh Sanikop switch (bitdepth) { 71*09537850SAkhilesh Sanikop case 8: { 72*09537850SAkhilesh Sanikop static dsp::Dsp dsp_8bpp; 73*09537850SAkhilesh Sanikop return &dsp_8bpp; 74*09537850SAkhilesh Sanikop } 75*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10 76*09537850SAkhilesh Sanikop case 10: { 77*09537850SAkhilesh Sanikop static dsp::Dsp dsp_10bpp; 78*09537850SAkhilesh Sanikop return &dsp_10bpp; 79*09537850SAkhilesh Sanikop } 80*09537850SAkhilesh Sanikop #endif 81*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH == 12 82*09537850SAkhilesh Sanikop case 12: { 83*09537850SAkhilesh Sanikop static dsp::Dsp dsp_12bpp; 84*09537850SAkhilesh Sanikop return &dsp_12bpp; 85*09537850SAkhilesh Sanikop } 86*09537850SAkhilesh Sanikop #endif 87*09537850SAkhilesh Sanikop } 88*09537850SAkhilesh Sanikop return nullptr; 89*09537850SAkhilesh Sanikop } 90*09537850SAkhilesh Sanikop 91*09537850SAkhilesh Sanikop } // namespace dsp_internal 92*09537850SAkhilesh Sanikop 93*09537850SAkhilesh Sanikop namespace dsp { 94*09537850SAkhilesh Sanikop DspInit()95*09537850SAkhilesh Sanikopvoid DspInit() { 96*09537850SAkhilesh Sanikop static std::once_flag once; 97*09537850SAkhilesh Sanikop std::call_once(once, []() { 98*09537850SAkhilesh Sanikop dsp_internal::DspInit_C(); 99*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_SSE4_1 || LIBGAV1_ENABLE_AVX2 100*09537850SAkhilesh Sanikop const uint32_t cpu_features = GetCpuInfo(); 101*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_SSE4_1 102*09537850SAkhilesh Sanikop if ((cpu_features & kSSE4_1) != 0) { 103*09537850SAkhilesh Sanikop AverageBlendInit_SSE4_1(); 104*09537850SAkhilesh Sanikop CdefInit_SSE4_1(); 105*09537850SAkhilesh Sanikop ConvolveInit_SSE4_1(); 106*09537850SAkhilesh Sanikop DistanceWeightedBlendInit_SSE4_1(); 107*09537850SAkhilesh Sanikop FilmGrainInit_SSE4_1(); 108*09537850SAkhilesh Sanikop IntraEdgeInit_SSE4_1(); 109*09537850SAkhilesh Sanikop IntraPredCflInit_SSE4_1(); 110*09537850SAkhilesh Sanikop IntraPredDirectionalInit_SSE4_1(); 111*09537850SAkhilesh Sanikop IntraPredFilterInit_SSE4_1(); 112*09537850SAkhilesh Sanikop IntraPredInit_SSE4_1(); 113*09537850SAkhilesh Sanikop IntraPredCflInit_SSE4_1(); 114*09537850SAkhilesh Sanikop IntraPredSmoothInit_SSE4_1(); 115*09537850SAkhilesh Sanikop InverseTransformInit_SSE4_1(); 116*09537850SAkhilesh Sanikop LoopFilterInit_SSE4_1(); 117*09537850SAkhilesh Sanikop LoopRestorationInit_SSE4_1(); 118*09537850SAkhilesh Sanikop MaskBlendInit_SSE4_1(); 119*09537850SAkhilesh Sanikop MotionFieldProjectionInit_SSE4_1(); 120*09537850SAkhilesh Sanikop MotionVectorSearchInit_SSE4_1(); 121*09537850SAkhilesh Sanikop ObmcInit_SSE4_1(); 122*09537850SAkhilesh Sanikop SuperResInit_SSE4_1(); 123*09537850SAkhilesh Sanikop WarpInit_SSE4_1(); 124*09537850SAkhilesh Sanikop WeightMaskInit_SSE4_1(); 125*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10 126*09537850SAkhilesh Sanikop LoopRestorationInit10bpp_SSE4_1(); 127*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH >= 10 128*09537850SAkhilesh Sanikop } 129*09537850SAkhilesh Sanikop #endif // LIBGAV1_ENABLE_SSE4_1 130*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_AVX2 131*09537850SAkhilesh Sanikop if ((cpu_features & kAVX2) != 0) { 132*09537850SAkhilesh Sanikop CdefInit_AVX2(); 133*09537850SAkhilesh Sanikop ConvolveInit_AVX2(); 134*09537850SAkhilesh Sanikop LoopRestorationInit_AVX2(); 135*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10 136*09537850SAkhilesh Sanikop LoopRestorationInit10bpp_AVX2(); 137*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH >= 10 138*09537850SAkhilesh Sanikop } 139*09537850SAkhilesh Sanikop #endif // LIBGAV1_ENABLE_AVX2 140*09537850SAkhilesh Sanikop #endif // LIBGAV1_ENABLE_SSE4_1 || LIBGAV1_ENABLE_AVX2 141*09537850SAkhilesh Sanikop #if LIBGAV1_ENABLE_NEON 142*09537850SAkhilesh Sanikop AverageBlendInit_NEON(); 143*09537850SAkhilesh Sanikop CdefInit_NEON(); 144*09537850SAkhilesh Sanikop ConvolveInit_NEON(); 145*09537850SAkhilesh Sanikop DistanceWeightedBlendInit_NEON(); 146*09537850SAkhilesh Sanikop FilmGrainInit_NEON(); 147*09537850SAkhilesh Sanikop IntraEdgeInit_NEON(); 148*09537850SAkhilesh Sanikop IntraPredCflInit_NEON(); 149*09537850SAkhilesh Sanikop IntraPredDirectionalInit_NEON(); 150*09537850SAkhilesh Sanikop IntraPredFilterInit_NEON(); 151*09537850SAkhilesh Sanikop IntraPredInit_NEON(); 152*09537850SAkhilesh Sanikop IntraPredSmoothInit_NEON(); 153*09537850SAkhilesh Sanikop InverseTransformInit_NEON(); 154*09537850SAkhilesh Sanikop LoopFilterInit_NEON(); 155*09537850SAkhilesh Sanikop LoopRestorationInit_NEON(); 156*09537850SAkhilesh Sanikop MaskBlendInit_NEON(); 157*09537850SAkhilesh Sanikop MotionFieldProjectionInit_NEON(); 158*09537850SAkhilesh Sanikop MotionVectorSearchInit_NEON(); 159*09537850SAkhilesh Sanikop ObmcInit_NEON(); 160*09537850SAkhilesh Sanikop SuperResInit_NEON(); 161*09537850SAkhilesh Sanikop WarpInit_NEON(); 162*09537850SAkhilesh Sanikop WeightMaskInit_NEON(); 163*09537850SAkhilesh Sanikop #if LIBGAV1_MAX_BITDEPTH >= 10 164*09537850SAkhilesh Sanikop ConvolveInit10bpp_NEON(); 165*09537850SAkhilesh Sanikop InverseTransformInit10bpp_NEON(); 166*09537850SAkhilesh Sanikop LoopFilterInit10bpp_NEON(); 167*09537850SAkhilesh Sanikop LoopRestorationInit10bpp_NEON(); 168*09537850SAkhilesh Sanikop #endif // LIBGAV1_MAX_BITDEPTH >= 10 169*09537850SAkhilesh Sanikop #endif // LIBGAV1_ENABLE_NEON 170*09537850SAkhilesh Sanikop }); 171*09537850SAkhilesh Sanikop } 172*09537850SAkhilesh Sanikop GetDspTable(int bitdepth)173*09537850SAkhilesh Sanikopconst Dsp* GetDspTable(int bitdepth) { 174*09537850SAkhilesh Sanikop return dsp_internal::GetWritableDspTable(bitdepth); 175*09537850SAkhilesh Sanikop } 176*09537850SAkhilesh Sanikop 177*09537850SAkhilesh Sanikop } // namespace dsp 178*09537850SAkhilesh Sanikop } // namespace libgav1 179