xref: /aosp_15_r20/external/libhevc/encoder/hme_common_utils.c (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 
21*c83a76b0SSuyog Pawar /*****************************************************************************/
22*c83a76b0SSuyog Pawar /* File Includes                                                             */
23*c83a76b0SSuyog Pawar /*****************************************************************************/
24*c83a76b0SSuyog Pawar /* System include files */
25*c83a76b0SSuyog Pawar #include <stdio.h>
26*c83a76b0SSuyog Pawar #include <assert.h>
27*c83a76b0SSuyog Pawar #include <stdlib.h>
28*c83a76b0SSuyog Pawar #include <math.h>
29*c83a76b0SSuyog Pawar #include <time.h>
30*c83a76b0SSuyog Pawar 
31*c83a76b0SSuyog Pawar /* User include files */
32*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
33*c83a76b0SSuyog Pawar #include "ihevc_macros.h"
34*c83a76b0SSuyog Pawar #include "ihevc_debug.h"
35*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
36*c83a76b0SSuyog Pawar 
37*c83a76b0SSuyog Pawar #include "hme_datatype.h"
38*c83a76b0SSuyog Pawar #include "hme_common_defs.h"
39*c83a76b0SSuyog Pawar 
40*c83a76b0SSuyog Pawar /*****************************************************************************/
41*c83a76b0SSuyog Pawar /* Function Definitions                                                      */
42*c83a76b0SSuyog Pawar /*****************************************************************************/
43*c83a76b0SSuyog Pawar 
44*c83a76b0SSuyog Pawar /**
45*c83a76b0SSuyog Pawar ********************************************************************************
46*c83a76b0SSuyog Pawar *  @fn     S16 median4_s16(S16 i2_n1, S16 i2_n2, S16 i2_n3, S16 i2_n4);
47*c83a76b0SSuyog Pawar *
48*c83a76b0SSuyog Pawar *  @brief  Returns median4 of 4 16 bits signed nubers
49*c83a76b0SSuyog Pawar *
50*c83a76b0SSuyog Pawar *  @param[in] i2_n1 : first number
51*c83a76b0SSuyog Pawar *
52*c83a76b0SSuyog Pawar *  @param[in] i2_n2 : 2nd number
53*c83a76b0SSuyog Pawar *
54*c83a76b0SSuyog Pawar *  @param[in] i2_n3 : 3rd number
55*c83a76b0SSuyog Pawar *
56*c83a76b0SSuyog Pawar *  @param[in] i2_n4 : 4th number (order does not matter)
57*c83a76b0SSuyog Pawar *
58*c83a76b0SSuyog Pawar *  @return range of the number
59*c83a76b0SSuyog Pawar ********************************************************************************
60*c83a76b0SSuyog Pawar */
median4_s16(S16 i2_n1,S16 i2_n2,S16 i2_n3,S16 i2_n4)61*c83a76b0SSuyog Pawar S16 median4_s16(S16 i2_n1, S16 i2_n2, S16 i2_n3, S16 i2_n4)
62*c83a76b0SSuyog Pawar {
63*c83a76b0SSuyog Pawar     S16 i2_max, i2_min;
64*c83a76b0SSuyog Pawar 
65*c83a76b0SSuyog Pawar     i2_max = MAX(i2_n1, i2_n2);
66*c83a76b0SSuyog Pawar     i2_max = MAX(i2_max, i2_n3);
67*c83a76b0SSuyog Pawar     i2_max = MAX(i2_max, i2_n4);
68*c83a76b0SSuyog Pawar 
69*c83a76b0SSuyog Pawar     i2_min = MIN(i2_n1, i2_n2);
70*c83a76b0SSuyog Pawar     i2_min = MIN(i2_min, i2_n3);
71*c83a76b0SSuyog Pawar     i2_min = MIN(i2_min, i2_n4);
72*c83a76b0SSuyog Pawar 
73*c83a76b0SSuyog Pawar     return ((S16)((i2_n1 + i2_n2 + i2_n3 + i2_n4 - i2_max - i2_min) >> 1));
74*c83a76b0SSuyog Pawar }
75*c83a76b0SSuyog Pawar 
hme_compute_2d_sum_u08(U08 * pu1_inp,S32 i4_wd,S32 i4_ht,S32 i4_stride)76*c83a76b0SSuyog Pawar U32 hme_compute_2d_sum_u08(U08 *pu1_inp, S32 i4_wd, S32 i4_ht, S32 i4_stride)
77*c83a76b0SSuyog Pawar {
78*c83a76b0SSuyog Pawar     S32 i, j;
79*c83a76b0SSuyog Pawar     U32 u4_sum = 0;
80*c83a76b0SSuyog Pawar 
81*c83a76b0SSuyog Pawar     for(i = 0; i < i4_ht; i++)
82*c83a76b0SSuyog Pawar     {
83*c83a76b0SSuyog Pawar         for(j = 0; j < i4_wd; j++)
84*c83a76b0SSuyog Pawar             u4_sum += (U32)pu1_inp[j];
85*c83a76b0SSuyog Pawar 
86*c83a76b0SSuyog Pawar         pu1_inp += i4_stride;
87*c83a76b0SSuyog Pawar     }
88*c83a76b0SSuyog Pawar 
89*c83a76b0SSuyog Pawar     return (u4_sum);
90*c83a76b0SSuyog Pawar }
hme_compute_2d_sum_u16(U16 * pu2_inp,S32 i4_wd,S32 i4_ht,S32 i4_stride)91*c83a76b0SSuyog Pawar U32 hme_compute_2d_sum_u16(U16 *pu2_inp, S32 i4_wd, S32 i4_ht, S32 i4_stride)
92*c83a76b0SSuyog Pawar {
93*c83a76b0SSuyog Pawar     S32 i, j;
94*c83a76b0SSuyog Pawar     U32 u4_sum = 0;
95*c83a76b0SSuyog Pawar 
96*c83a76b0SSuyog Pawar     for(i = 0; i < i4_ht; i++)
97*c83a76b0SSuyog Pawar     {
98*c83a76b0SSuyog Pawar         for(j = 0; j < i4_wd; j++)
99*c83a76b0SSuyog Pawar             u4_sum += (U32)pu2_inp[j];
100*c83a76b0SSuyog Pawar 
101*c83a76b0SSuyog Pawar         pu2_inp += i4_stride;
102*c83a76b0SSuyog Pawar     }
103*c83a76b0SSuyog Pawar 
104*c83a76b0SSuyog Pawar     return (u4_sum);
105*c83a76b0SSuyog Pawar }
hme_compute_2d_sum_u32(U32 * pu4_inp,S32 i4_wd,S32 i4_ht,S32 i4_stride)106*c83a76b0SSuyog Pawar U32 hme_compute_2d_sum_u32(U32 *pu4_inp, S32 i4_wd, S32 i4_ht, S32 i4_stride)
107*c83a76b0SSuyog Pawar {
108*c83a76b0SSuyog Pawar     S32 i, j;
109*c83a76b0SSuyog Pawar     U32 u4_sum = 0;
110*c83a76b0SSuyog Pawar 
111*c83a76b0SSuyog Pawar     for(i = 0; i < i4_ht; i++)
112*c83a76b0SSuyog Pawar     {
113*c83a76b0SSuyog Pawar         for(j = 0; j < i4_wd; j++)
114*c83a76b0SSuyog Pawar             u4_sum += (U32)pu4_inp[j];
115*c83a76b0SSuyog Pawar 
116*c83a76b0SSuyog Pawar         pu4_inp += i4_stride;
117*c83a76b0SSuyog Pawar     }
118*c83a76b0SSuyog Pawar 
119*c83a76b0SSuyog Pawar     return (u4_sum);
120*c83a76b0SSuyog Pawar }
121*c83a76b0SSuyog Pawar /**
122*c83a76b0SSuyog Pawar ********************************************************************************
123*c83a76b0SSuyog Pawar *  @fn     S32 hme_compute_2d_sum_unsigned(void *pv_inp,
124*c83a76b0SSuyog Pawar *                                       S32 i4_blk_wd,
125*c83a76b0SSuyog Pawar *                                       S32 i4_blk_ht,
126*c83a76b0SSuyog Pawar *                                   S32 i4_stride,
127*c83a76b0SSuyog Pawar *                                   S32 i4_datatype)
128*c83a76b0SSuyog Pawar *
129*c83a76b0SSuyog Pawar *  @brief  Computes and returns 2D sum of a unsigned 2d buffer, with datatype
130*c83a76b0SSuyog Pawar *          equal to 8/16/32 bit.
131*c83a76b0SSuyog Pawar *
132*c83a76b0SSuyog Pawar *  @param[in] pv_inp : input pointer
133*c83a76b0SSuyog Pawar *
134*c83a76b0SSuyog Pawar *  @param[in] i4_blk_wd : block width
135*c83a76b0SSuyog Pawar *
136*c83a76b0SSuyog Pawar *  @param[in] i4_blk_ht : block ht
137*c83a76b0SSuyog Pawar *
138*c83a76b0SSuyog Pawar *  @param[in] i4_stride : stride
139*c83a76b0SSuyog Pawar *
140*c83a76b0SSuyog Pawar *  @param[in] i4_datatype : datatype 1 - 8 bit, 2 - 16 bit, 4 - 32 bit
141*c83a76b0SSuyog Pawar *
142*c83a76b0SSuyog Pawar *  @return sum of i4_blk_wd * i4_blk_ht number of entries starting at pv_inp
143*c83a76b0SSuyog Pawar ********************************************************************************
144*c83a76b0SSuyog Pawar */
145*c83a76b0SSuyog Pawar 
hme_compute_2d_sum_unsigned(void * pv_inp,S32 i4_blk_wd,S32 i4_blk_ht,S32 i4_stride,S32 i4_datatype)146*c83a76b0SSuyog Pawar U32 hme_compute_2d_sum_unsigned(
147*c83a76b0SSuyog Pawar     void *pv_inp, S32 i4_blk_wd, S32 i4_blk_ht, S32 i4_stride, S32 i4_datatype)
148*c83a76b0SSuyog Pawar {
149*c83a76b0SSuyog Pawar     if(i4_datatype == sizeof(U08))
150*c83a76b0SSuyog Pawar         return (hme_compute_2d_sum_u08((U08 *)pv_inp, i4_blk_wd, i4_blk_ht, i4_stride));
151*c83a76b0SSuyog Pawar     else if(i4_datatype == sizeof(U16))
152*c83a76b0SSuyog Pawar         return (hme_compute_2d_sum_u16((U16 *)pv_inp, i4_blk_wd, i4_blk_ht, i4_stride));
153*c83a76b0SSuyog Pawar     else if(i4_datatype == sizeof(U32))
154*c83a76b0SSuyog Pawar         return (hme_compute_2d_sum_u32((U32 *)pv_inp, i4_blk_wd, i4_blk_ht, i4_stride));
155*c83a76b0SSuyog Pawar     else
156*c83a76b0SSuyog Pawar         ASSERT(0);
157*c83a76b0SSuyog Pawar 
158*c83a76b0SSuyog Pawar     return 0;
159*c83a76b0SSuyog Pawar }
160*c83a76b0SSuyog Pawar 
161*c83a76b0SSuyog Pawar /**
162*c83a76b0SSuyog Pawar ********************************************************************************
163*c83a76b0SSuyog Pawar *  @fn     S32 get_rand_num(S32 low, S32 high)
164*c83a76b0SSuyog Pawar *
165*c83a76b0SSuyog Pawar *  @brief  returns a radom integer in the closed interval [low, high - 1]
166*c83a76b0SSuyog Pawar *
167*c83a76b0SSuyog Pawar *  @param[in] low : lower limit
168*c83a76b0SSuyog Pawar *
169*c83a76b0SSuyog Pawar *  @param[in] high : higher limit
170*c83a76b0SSuyog Pawar *
171*c83a76b0SSuyog Pawar *  @return S32 result: the random number
172*c83a76b0SSuyog Pawar ********************************************************************************
173*c83a76b0SSuyog Pawar */
get_rand_num(S32 low,S32 high)174*c83a76b0SSuyog Pawar S32 get_rand_num(S32 low, S32 high)
175*c83a76b0SSuyog Pawar {
176*c83a76b0SSuyog Pawar     double num;
177*c83a76b0SSuyog Pawar     S32 result;
178*c83a76b0SSuyog Pawar     num = (double)rand() / (double)RAND_MAX;
179*c83a76b0SSuyog Pawar     num = num * (high - low) + low;
180*c83a76b0SSuyog Pawar 
181*c83a76b0SSuyog Pawar     result = (S32)floor((num + 0.5));
182*c83a76b0SSuyog Pawar     if(result < low)
183*c83a76b0SSuyog Pawar         result = low;
184*c83a76b0SSuyog Pawar     if(result >= high)
185*c83a76b0SSuyog Pawar         result = high - 1;
186*c83a76b0SSuyog Pawar 
187*c83a76b0SSuyog Pawar     return (result);
188*c83a76b0SSuyog Pawar }
189