xref: /aosp_15_r20/external/libvpx/vpx_dsp/vpx_dsp_common.h (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2015 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker  *
4*fb1b10abSAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker  */
10*fb1b10abSAndroid Build Coastguard Worker 
11*fb1b10abSAndroid Build Coastguard Worker #ifndef VPX_VPX_DSP_VPX_DSP_COMMON_H_
12*fb1b10abSAndroid Build Coastguard Worker #define VPX_VPX_DSP_VPX_DSP_COMMON_H_
13*fb1b10abSAndroid Build Coastguard Worker 
14*fb1b10abSAndroid Build Coastguard Worker #include <limits.h>
15*fb1b10abSAndroid Build Coastguard Worker 
16*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_config.h"
17*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_integer.h"
18*fb1b10abSAndroid Build Coastguard Worker #include "vpx_ports/mem.h"
19*fb1b10abSAndroid Build Coastguard Worker 
20*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus
21*fb1b10abSAndroid Build Coastguard Worker extern "C" {
22*fb1b10abSAndroid Build Coastguard Worker #endif
23*fb1b10abSAndroid Build Coastguard Worker 
24*fb1b10abSAndroid Build Coastguard Worker #define VPXMIN(x, y) (((x) < (y)) ? (x) : (y))
25*fb1b10abSAndroid Build Coastguard Worker #define VPXMAX(x, y) (((x) > (y)) ? (x) : (y))
26*fb1b10abSAndroid Build Coastguard Worker 
27*fb1b10abSAndroid Build Coastguard Worker #define VPX_SWAP(type, a, b) \
28*fb1b10abSAndroid Build Coastguard Worker   do {                       \
29*fb1b10abSAndroid Build Coastguard Worker     type c = (b);            \
30*fb1b10abSAndroid Build Coastguard Worker     (b) = a;                 \
31*fb1b10abSAndroid Build Coastguard Worker     (a) = c;                 \
32*fb1b10abSAndroid Build Coastguard Worker   } while (0)
33*fb1b10abSAndroid Build Coastguard Worker 
34*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
35*fb1b10abSAndroid Build Coastguard Worker // Note:
36*fb1b10abSAndroid Build Coastguard Worker // tran_low_t  is the datatype used for final transform coefficients.
37*fb1b10abSAndroid Build Coastguard Worker // tran_high_t is the datatype used for intermediate transform stages.
38*fb1b10abSAndroid Build Coastguard Worker typedef int64_t tran_high_t;
39*fb1b10abSAndroid Build Coastguard Worker typedef int32_t tran_low_t;
40*fb1b10abSAndroid Build Coastguard Worker #else
41*fb1b10abSAndroid Build Coastguard Worker // Note:
42*fb1b10abSAndroid Build Coastguard Worker // tran_low_t  is the datatype used for final transform coefficients.
43*fb1b10abSAndroid Build Coastguard Worker // tran_high_t is the datatype used for intermediate transform stages.
44*fb1b10abSAndroid Build Coastguard Worker typedef int32_t tran_high_t;
45*fb1b10abSAndroid Build Coastguard Worker typedef int16_t tran_low_t;
46*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
47*fb1b10abSAndroid Build Coastguard Worker 
48*fb1b10abSAndroid Build Coastguard Worker typedef int16_t tran_coef_t;
49*fb1b10abSAndroid Build Coastguard Worker 
50*fb1b10abSAndroid Build Coastguard Worker // Visual Studio 2022 (cl.exe) targeting AArch64 with optimizations enabled
51*fb1b10abSAndroid Build Coastguard Worker // produces invalid code for clip_pixel() when the return type is uint8_t.
52*fb1b10abSAndroid Build Coastguard Worker // See:
53*fb1b10abSAndroid Build Coastguard Worker // https://developercommunity.visualstudio.com/t/Misoptimization-for-ARM64-in-VS-2022-17/10363361
54*fb1b10abSAndroid Build Coastguard Worker // TODO(jzern): check the compiler version after a fix for the issue is
55*fb1b10abSAndroid Build Coastguard Worker // released.
56*fb1b10abSAndroid Build Coastguard Worker #if defined(_MSC_VER) && defined(_M_ARM64) && !defined(__clang__)
clip_pixel(int val)57*fb1b10abSAndroid Build Coastguard Worker static INLINE int clip_pixel(int val) {
58*fb1b10abSAndroid Build Coastguard Worker   return (val > 255) ? 255 : (val < 0) ? 0 : val;
59*fb1b10abSAndroid Build Coastguard Worker }
60*fb1b10abSAndroid Build Coastguard Worker #else
clip_pixel(int val)61*fb1b10abSAndroid Build Coastguard Worker static INLINE uint8_t clip_pixel(int val) {
62*fb1b10abSAndroid Build Coastguard Worker   return (val > 255) ? 255 : (val < 0) ? 0 : val;
63*fb1b10abSAndroid Build Coastguard Worker }
64*fb1b10abSAndroid Build Coastguard Worker #endif
65*fb1b10abSAndroid Build Coastguard Worker 
clamp(int value,int low,int high)66*fb1b10abSAndroid Build Coastguard Worker static INLINE int clamp(int value, int low, int high) {
67*fb1b10abSAndroid Build Coastguard Worker   return value < low ? low : (value > high ? high : value);
68*fb1b10abSAndroid Build Coastguard Worker }
69*fb1b10abSAndroid Build Coastguard Worker 
fclamp(double value,double low,double high)70*fb1b10abSAndroid Build Coastguard Worker static INLINE double fclamp(double value, double low, double high) {
71*fb1b10abSAndroid Build Coastguard Worker   return value < low ? low : (value > high ? high : value);
72*fb1b10abSAndroid Build Coastguard Worker }
73*fb1b10abSAndroid Build Coastguard Worker 
lclamp(int64_t value,int64_t low,int64_t high)74*fb1b10abSAndroid Build Coastguard Worker static INLINE int64_t lclamp(int64_t value, int64_t low, int64_t high) {
75*fb1b10abSAndroid Build Coastguard Worker   return value < low ? low : (value > high ? high : value);
76*fb1b10abSAndroid Build Coastguard Worker }
77*fb1b10abSAndroid Build Coastguard Worker 
clip_pixel_highbd(int val,int bd)78*fb1b10abSAndroid Build Coastguard Worker static INLINE uint16_t clip_pixel_highbd(int val, int bd) {
79*fb1b10abSAndroid Build Coastguard Worker   switch (bd) {
80*fb1b10abSAndroid Build Coastguard Worker     case 8:
81*fb1b10abSAndroid Build Coastguard Worker     default: return (uint16_t)clamp(val, 0, 255);
82*fb1b10abSAndroid Build Coastguard Worker     case 10: return (uint16_t)clamp(val, 0, 1023);
83*fb1b10abSAndroid Build Coastguard Worker     case 12: return (uint16_t)clamp(val, 0, 4095);
84*fb1b10abSAndroid Build Coastguard Worker   }
85*fb1b10abSAndroid Build Coastguard Worker }
86*fb1b10abSAndroid Build Coastguard Worker 
87*fb1b10abSAndroid Build Coastguard Worker // Returns the saturating cast of a double value to int.
saturate_cast_double_to_int(double d)88*fb1b10abSAndroid Build Coastguard Worker static INLINE int saturate_cast_double_to_int(double d) {
89*fb1b10abSAndroid Build Coastguard Worker   if (d > INT_MAX) return INT_MAX;
90*fb1b10abSAndroid Build Coastguard Worker   return (int)d;
91*fb1b10abSAndroid Build Coastguard Worker }
92*fb1b10abSAndroid Build Coastguard Worker 
93*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus
94*fb1b10abSAndroid Build Coastguard Worker }  // extern "C"
95*fb1b10abSAndroid Build Coastguard Worker #endif
96*fb1b10abSAndroid Build Coastguard Worker 
97*fb1b10abSAndroid Build Coastguard Worker #endif  // VPX_VPX_DSP_VPX_DSP_COMMON_H_
98