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_CONVOLVE_H_ 18*09537850SAkhilesh Sanikop #define LIBGAV1_SRC_DSP_CONVOLVE_H_ 19*09537850SAkhilesh Sanikop 20*09537850SAkhilesh Sanikop #include <cassert> 21*09537850SAkhilesh Sanikop 22*09537850SAkhilesh Sanikop // Pull in LIBGAV1_DspXXX defines representing the implementation status 23*09537850SAkhilesh Sanikop // of each function. The resulting value of each can be used by each module to 24*09537850SAkhilesh Sanikop // determine whether an implementation is needed at compile time. 25*09537850SAkhilesh Sanikop // IWYU pragma: begin_exports 26*09537850SAkhilesh Sanikop 27*09537850SAkhilesh Sanikop // ARM: 28*09537850SAkhilesh Sanikop #include "src/dsp/arm/convolve_neon.h" 29*09537850SAkhilesh Sanikop 30*09537850SAkhilesh Sanikop // x86: 31*09537850SAkhilesh Sanikop // Note includes should be sorted in logical order avx2/avx/sse4, etc. 32*09537850SAkhilesh Sanikop // The order of includes is important as each tests for a superior version 33*09537850SAkhilesh Sanikop // before setting the base. 34*09537850SAkhilesh Sanikop // clang-format off 35*09537850SAkhilesh Sanikop #include "src/dsp/x86/convolve_avx2.h" 36*09537850SAkhilesh Sanikop #include "src/dsp/x86/convolve_sse4.h" 37*09537850SAkhilesh Sanikop // clang-format on 38*09537850SAkhilesh Sanikop 39*09537850SAkhilesh Sanikop // IWYU pragma: end_exports 40*09537850SAkhilesh Sanikop 41*09537850SAkhilesh Sanikop namespace libgav1 { 42*09537850SAkhilesh Sanikop namespace dsp { 43*09537850SAkhilesh Sanikop 44*09537850SAkhilesh Sanikop // Initializes Dsp::convolve and Dsp::convolve_scale. This function is not 45*09537850SAkhilesh Sanikop // thread-safe. 46*09537850SAkhilesh Sanikop void ConvolveInit_C(); 47*09537850SAkhilesh Sanikop GetNumTapsInFilter(const int filter_index)48*09537850SAkhilesh Sanikopinline int GetNumTapsInFilter(const int filter_index) { 49*09537850SAkhilesh Sanikop if (filter_index < 2) { 50*09537850SAkhilesh Sanikop // Despite the names these only use 6 taps. 51*09537850SAkhilesh Sanikop // kInterpolationFilterEightTap 52*09537850SAkhilesh Sanikop // kInterpolationFilterEightTapSmooth 53*09537850SAkhilesh Sanikop return 6; 54*09537850SAkhilesh Sanikop } 55*09537850SAkhilesh Sanikop 56*09537850SAkhilesh Sanikop if (filter_index == 2) { 57*09537850SAkhilesh Sanikop // kInterpolationFilterEightTapSharp 58*09537850SAkhilesh Sanikop return 8; 59*09537850SAkhilesh Sanikop } 60*09537850SAkhilesh Sanikop 61*09537850SAkhilesh Sanikop if (filter_index == 3) { 62*09537850SAkhilesh Sanikop // kInterpolationFilterBilinear 63*09537850SAkhilesh Sanikop return 2; 64*09537850SAkhilesh Sanikop } 65*09537850SAkhilesh Sanikop 66*09537850SAkhilesh Sanikop assert(filter_index > 3); 67*09537850SAkhilesh Sanikop // For small sizes (width/height <= 4) the large filters are replaced with 4 68*09537850SAkhilesh Sanikop // tap options. 69*09537850SAkhilesh Sanikop // If the original filters were |kInterpolationFilterEightTap| or 70*09537850SAkhilesh Sanikop // |kInterpolationFilterEightTapSharp| then it becomes 71*09537850SAkhilesh Sanikop // |kInterpolationFilterSwitchable|. 72*09537850SAkhilesh Sanikop // If it was |kInterpolationFilterEightTapSmooth| then it becomes an unnamed 4 73*09537850SAkhilesh Sanikop // tap filter. 74*09537850SAkhilesh Sanikop return 4; 75*09537850SAkhilesh Sanikop } 76*09537850SAkhilesh Sanikop 77*09537850SAkhilesh Sanikop } // namespace dsp 78*09537850SAkhilesh Sanikop } // namespace libgav1 79*09537850SAkhilesh Sanikop 80*09537850SAkhilesh Sanikop #endif // LIBGAV1_SRC_DSP_CONVOLVE_H_ 81