xref: /aosp_15_r20/external/libhevc/encoder/var_q_operator.h (revision c83a76b084498d55f252f48b2e3786804cdf24b7)
1*c83a76b0SSuyog Pawar /******************************************************************************
2*c83a76b0SSuyog Pawar  *
3*c83a76b0SSuyog Pawar  * Copyright (C) 2018 The Android Open Source Project
4*c83a76b0SSuyog Pawar  *
5*c83a76b0SSuyog Pawar  * Licensed under the Apache License, Version 2.0 (the "License");
6*c83a76b0SSuyog Pawar  * you may not use this file except in compliance with the License.
7*c83a76b0SSuyog Pawar  * You may obtain a copy of the License at:
8*c83a76b0SSuyog Pawar  *
9*c83a76b0SSuyog Pawar  * http://www.apache.org/licenses/LICENSE-2.0
10*c83a76b0SSuyog Pawar  *
11*c83a76b0SSuyog Pawar  * Unless required by applicable law or agreed to in writing, software
12*c83a76b0SSuyog Pawar  * distributed under the License is distributed on an "AS IS" BASIS,
13*c83a76b0SSuyog Pawar  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*c83a76b0SSuyog Pawar  * See the License for the specific language governing permissions and
15*c83a76b0SSuyog Pawar  * limitations under the License.
16*c83a76b0SSuyog Pawar  *
17*c83a76b0SSuyog Pawar  *****************************************************************************
18*c83a76b0SSuyog Pawar  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*c83a76b0SSuyog Pawar */
20*c83a76b0SSuyog Pawar #ifndef VAR_Q_OPERATOR_H
21*c83a76b0SSuyog Pawar #define VAR_Q_OPERATOR_H
22*c83a76b0SSuyog Pawar 
23*c83a76b0SSuyog Pawar typedef struct
24*c83a76b0SSuyog Pawar {
25*c83a76b0SSuyog Pawar     WORD32 sm; /* MSB 1 bit sign & rest magnitude */
26*c83a76b0SSuyog Pawar     WORD32 e; /* Q-format */
27*c83a76b0SSuyog Pawar } number_t;
28*c83a76b0SSuyog Pawar 
29*c83a76b0SSuyog Pawar void mult32_var_q(number_t a, number_t b, number_t *c);
30*c83a76b0SSuyog Pawar 
31*c83a76b0SSuyog Pawar void div32_var_q(number_t a, number_t b, number_t *c);
32*c83a76b0SSuyog Pawar 
33*c83a76b0SSuyog Pawar void add32_var_q(number_t a, number_t b, number_t *c);
34*c83a76b0SSuyog Pawar 
35*c83a76b0SSuyog Pawar void sub32_var_q(number_t a, number_t b, number_t *c);
36*c83a76b0SSuyog Pawar 
37*c83a76b0SSuyog Pawar void sqrt32_var_q(number_t a, number_t *c);
38*c83a76b0SSuyog Pawar 
39*c83a76b0SSuyog Pawar void number_t_to_word32(number_t num_a, WORD32 *a);
40*c83a76b0SSuyog Pawar 
41*c83a76b0SSuyog Pawar void convert_float_to_fix(float a_f, number_t *a);
42*c83a76b0SSuyog Pawar 
43*c83a76b0SSuyog Pawar void convert_fix_to_float(number_t a, float *a_f);
44*c83a76b0SSuyog Pawar 
45*c83a76b0SSuyog Pawar #define SET_VAR_Q(a, b, c)                                                                         \
46*c83a76b0SSuyog Pawar     {                                                                                              \
47*c83a76b0SSuyog Pawar         (a).sm = (b);                                                                              \
48*c83a76b0SSuyog Pawar         (a).e = (c);                                                                               \
49*c83a76b0SSuyog Pawar     }
50*c83a76b0SSuyog Pawar 
51*c83a76b0SSuyog Pawar /*right shift greated than 32 bit for word32 variable is undefined*/
52*c83a76b0SSuyog Pawar #define convert_varq_to_fixq(varq, a, q_fact)                                                      \
53*c83a76b0SSuyog Pawar     {                                                                                              \
54*c83a76b0SSuyog Pawar         if((varq).e > q_fact)                                                                      \
55*c83a76b0SSuyog Pawar         {                                                                                          \
56*c83a76b0SSuyog Pawar             if(((varq).e - q_fact) >= (WORD32)(sizeof(WORD32) * 8))                                \
57*c83a76b0SSuyog Pawar             {                                                                                      \
58*c83a76b0SSuyog Pawar                 *a = 0;                                                                            \
59*c83a76b0SSuyog Pawar             }                                                                                      \
60*c83a76b0SSuyog Pawar             else                                                                                   \
61*c83a76b0SSuyog Pawar             {                                                                                      \
62*c83a76b0SSuyog Pawar                 *a = (varq).sm >> ((varq).e - q_fact);                                             \
63*c83a76b0SSuyog Pawar             }                                                                                      \
64*c83a76b0SSuyog Pawar         }                                                                                          \
65*c83a76b0SSuyog Pawar         else                                                                                       \
66*c83a76b0SSuyog Pawar             *a = (varq).sm << (q_fact - (varq).e);                                                 \
67*c83a76b0SSuyog Pawar     }
68*c83a76b0SSuyog Pawar 
69*c83a76b0SSuyog Pawar #define SET_VARQ_FRM_FIXQ(fixq, var_q, q_fact)                                                     \
70*c83a76b0SSuyog Pawar     {                                                                                              \
71*c83a76b0SSuyog Pawar         (var_q).sm = fixq;                                                                         \
72*c83a76b0SSuyog Pawar         (var_q).e = q_fact;                                                                        \
73*c83a76b0SSuyog Pawar     }
74*c83a76b0SSuyog Pawar #endif
75