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