xref: /aosp_15_r20/external/libgav1/src/dsp/dsp.cc (revision 095378508e87ed692bf8dfeb34008b65b3735891)
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 Sanikop void 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 Sanikop dsp::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 Sanikop void 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 Sanikop const 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