xref: /aosp_15_r20/external/libhevc/encoder/ihevce_common_utils.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 
21*c83a76b0SSuyog Pawar /**
22*c83a76b0SSuyog Pawar ******************************************************************************
23*c83a76b0SSuyog Pawar * @file ihevce_common_utils.h
24*c83a76b0SSuyog Pawar *
25*c83a76b0SSuyog Pawar * @brief
26*c83a76b0SSuyog Pawar *  Contains the declarations and definitions of common utils for encoder
27*c83a76b0SSuyog Pawar *
28*c83a76b0SSuyog Pawar * @author
29*c83a76b0SSuyog Pawar *  ittiam
30*c83a76b0SSuyog Pawar *
31*c83a76b0SSuyog Pawar ******************************************************************************
32*c83a76b0SSuyog Pawar */
33*c83a76b0SSuyog Pawar 
34*c83a76b0SSuyog Pawar #ifndef _IHEVCE_COMMON_UTILS_H_
35*c83a76b0SSuyog Pawar #define _IHEVCE_COMMON_UTILS_H_
36*c83a76b0SSuyog Pawar 
37*c83a76b0SSuyog Pawar #include <math.h>
38*c83a76b0SSuyog Pawar #include <limits.h>
39*c83a76b0SSuyog Pawar 
40*c83a76b0SSuyog Pawar /*****************************************************************************/
41*c83a76b0SSuyog Pawar /* Constant Macros                                                           */
42*c83a76b0SSuyog Pawar /*****************************************************************************/
43*c83a76b0SSuyog Pawar 
44*c83a76b0SSuyog Pawar /*****************************************************************************/
45*c83a76b0SSuyog Pawar /* Function Macros                                                           */
46*c83a76b0SSuyog Pawar /*****************************************************************************/
47*c83a76b0SSuyog Pawar 
48*c83a76b0SSuyog Pawar /**
49*c83a76b0SSuyog Pawar ******************************************************************************
50*c83a76b0SSuyog Pawar *  @macro  IHEVCE_WT_PRED
51*c83a76b0SSuyog Pawar *  @brief Implements wt pred formula as per spec
52*c83a76b0SSuyog Pawar ******************************************************************************
53*c83a76b0SSuyog Pawar */
54*c83a76b0SSuyog Pawar #define IHEVCE_WT_PRED(p0, p1, w0, w1, rnd, shift)                                                 \
55*c83a76b0SSuyog Pawar     (((((WORD32)w0) * ((WORD32)p0) + ((WORD32)w1) * ((WORD32)p1)) >> shift) + rnd)
56*c83a76b0SSuyog Pawar 
57*c83a76b0SSuyog Pawar #define SORT_PRIMARY_INTTYPE_ARRAY_AND_REORDER_GENERIC_COMPANION_ARRAY(                            \
58*c83a76b0SSuyog Pawar     primary_array, companion_array, array_length, type_companion)                                  \
59*c83a76b0SSuyog Pawar     {                                                                                              \
60*c83a76b0SSuyog Pawar         WORD32 i, j;                                                                               \
61*c83a76b0SSuyog Pawar                                                                                                    \
62*c83a76b0SSuyog Pawar         for(i = 0; i < (array_length - 1); i++)                                                    \
63*c83a76b0SSuyog Pawar         {                                                                                          \
64*c83a76b0SSuyog Pawar             for(j = (i + 1); j < array_length; j++)                                                \
65*c83a76b0SSuyog Pawar             {                                                                                      \
66*c83a76b0SSuyog Pawar                 if(primary_array[i] > primary_array[j])                                            \
67*c83a76b0SSuyog Pawar                 {                                                                                  \
68*c83a76b0SSuyog Pawar                     type_companion t;                                                              \
69*c83a76b0SSuyog Pawar                                                                                                    \
70*c83a76b0SSuyog Pawar                     SWAP(primary_array[i], primary_array[j]);                                      \
71*c83a76b0SSuyog Pawar                                                                                                    \
72*c83a76b0SSuyog Pawar                     t = companion_array[i];                                                        \
73*c83a76b0SSuyog Pawar                     companion_array[i] = companion_array[j];                                       \
74*c83a76b0SSuyog Pawar                     companion_array[j] = t;                                                        \
75*c83a76b0SSuyog Pawar                 }                                                                                  \
76*c83a76b0SSuyog Pawar             }                                                                                      \
77*c83a76b0SSuyog Pawar         }                                                                                          \
78*c83a76b0SSuyog Pawar     }
79*c83a76b0SSuyog Pawar 
80*c83a76b0SSuyog Pawar #define SORT_PRIMARY_INTTYPE_ARRAY_AND_REORDER_INTTYPE_COMPANION_ARRAY(                            \
81*c83a76b0SSuyog Pawar     primary_array, companion_array, array_length)                                                  \
82*c83a76b0SSuyog Pawar     {                                                                                              \
83*c83a76b0SSuyog Pawar         WORD32 i, j;                                                                               \
84*c83a76b0SSuyog Pawar                                                                                                    \
85*c83a76b0SSuyog Pawar         for(i = 0; i < (array_length - 1); i++)                                                    \
86*c83a76b0SSuyog Pawar         {                                                                                          \
87*c83a76b0SSuyog Pawar             for(j = (i + 1); j < array_length; j++)                                                \
88*c83a76b0SSuyog Pawar             {                                                                                      \
89*c83a76b0SSuyog Pawar                 if(primary_array[i] > primary_array[j])                                            \
90*c83a76b0SSuyog Pawar                 {                                                                                  \
91*c83a76b0SSuyog Pawar                     type_companion t;                                                              \
92*c83a76b0SSuyog Pawar                                                                                                    \
93*c83a76b0SSuyog Pawar                     SWAP(primary_array[i], primary_array[j]);                                      \
94*c83a76b0SSuyog Pawar                     SWAP(companion_array[i], companion_array[j]);                                  \
95*c83a76b0SSuyog Pawar                 }                                                                                  \
96*c83a76b0SSuyog Pawar             }                                                                                      \
97*c83a76b0SSuyog Pawar         }                                                                                          \
98*c83a76b0SSuyog Pawar     }
99*c83a76b0SSuyog Pawar 
100*c83a76b0SSuyog Pawar #define SORT_INTTYPE_ARRAY(primary_array, array_length)                                            \
101*c83a76b0SSuyog Pawar     {                                                                                              \
102*c83a76b0SSuyog Pawar         WORD32 i, j;                                                                               \
103*c83a76b0SSuyog Pawar                                                                                                    \
104*c83a76b0SSuyog Pawar         for(i = 0; i < (array_length - 1); i++)                                                    \
105*c83a76b0SSuyog Pawar         {                                                                                          \
106*c83a76b0SSuyog Pawar             for(j = (i + 1); j < array_length; j++)                                                \
107*c83a76b0SSuyog Pawar             {                                                                                      \
108*c83a76b0SSuyog Pawar                 if(primary_array[i] > primary_array[j])                                            \
109*c83a76b0SSuyog Pawar                 {                                                                                  \
110*c83a76b0SSuyog Pawar                     SWAP(primary_array[i], primary_array[j]);                                      \
111*c83a76b0SSuyog Pawar                 }                                                                                  \
112*c83a76b0SSuyog Pawar             }                                                                                      \
113*c83a76b0SSuyog Pawar         }                                                                                          \
114*c83a76b0SSuyog Pawar     }
115*c83a76b0SSuyog Pawar 
116*c83a76b0SSuyog Pawar #define SET_BIT(x, bitpos) ((x) | (1 << (bitpos)))
117*c83a76b0SSuyog Pawar 
118*c83a76b0SSuyog Pawar #define CLEAR_BIT(x, bitpos) ((x) & (~(1 << (bitpos))))
119*c83a76b0SSuyog Pawar 
120*c83a76b0SSuyog Pawar #define CU_TREE_NODE_FILL(ps_node, valid_flag, posx, posy, size, inter_eval_enable)                \
121*c83a76b0SSuyog Pawar     {                                                                                              \
122*c83a76b0SSuyog Pawar         ps_node->is_node_valid = valid_flag;                                                       \
123*c83a76b0SSuyog Pawar         ps_node->u1_cu_size = size;                                                                \
124*c83a76b0SSuyog Pawar         ps_node->u1_intra_eval_enable = 0;                                                         \
125*c83a76b0SSuyog Pawar         ps_node->b3_cu_pos_x = posx;                                                               \
126*c83a76b0SSuyog Pawar         ps_node->b3_cu_pos_y = posy;                                                               \
127*c83a76b0SSuyog Pawar         ps_node->u1_inter_eval_enable = inter_eval_enable;                                         \
128*c83a76b0SSuyog Pawar     }
129*c83a76b0SSuyog Pawar 
130*c83a76b0SSuyog Pawar /*****************************************************************************/
131*c83a76b0SSuyog Pawar /* Extern Function Declarations                                              */
132*c83a76b0SSuyog Pawar /*****************************************************************************/
133*c83a76b0SSuyog Pawar 
134*c83a76b0SSuyog Pawar void ihevce_copy_2d(
135*c83a76b0SSuyog Pawar     UWORD8 *pu1_dst,
136*c83a76b0SSuyog Pawar     WORD32 dst_stride,
137*c83a76b0SSuyog Pawar     UWORD8 *pu1_src,
138*c83a76b0SSuyog Pawar     WORD32 src_stride,
139*c83a76b0SSuyog Pawar     WORD32 blk_wd,
140*c83a76b0SSuyog Pawar     WORD32 blk_ht);
141*c83a76b0SSuyog Pawar 
142*c83a76b0SSuyog Pawar void ihevce_2d_square_copy_luma(
143*c83a76b0SSuyog Pawar     void *p_dst,
144*c83a76b0SSuyog Pawar     WORD32 dst_strd,
145*c83a76b0SSuyog Pawar     void *p_src,
146*c83a76b0SSuyog Pawar     WORD32 src_strd,
147*c83a76b0SSuyog Pawar     WORD32 num_cols_to_copy,
148*c83a76b0SSuyog Pawar     WORD32 unit_size);
149*c83a76b0SSuyog Pawar 
150*c83a76b0SSuyog Pawar void ihevce_wt_avg_2d(
151*c83a76b0SSuyog Pawar     UWORD8 *pu1_pred0,
152*c83a76b0SSuyog Pawar     UWORD8 *pu1_pred1,
153*c83a76b0SSuyog Pawar     WORD32 pred0_strd,
154*c83a76b0SSuyog Pawar     WORD32 pred1_strd,
155*c83a76b0SSuyog Pawar     WORD32 wd,
156*c83a76b0SSuyog Pawar     WORD32 ht,
157*c83a76b0SSuyog Pawar     UWORD8 *pu1_dst,
158*c83a76b0SSuyog Pawar     WORD32 dst_strd,
159*c83a76b0SSuyog Pawar     WORD32 w0,
160*c83a76b0SSuyog Pawar     WORD32 w1,
161*c83a76b0SSuyog Pawar     WORD32 o0,
162*c83a76b0SSuyog Pawar     WORD32 o1,
163*c83a76b0SSuyog Pawar     WORD32 log_wdc);
164*c83a76b0SSuyog Pawar 
165*c83a76b0SSuyog Pawar void ihevce_itrans_recon_dc(
166*c83a76b0SSuyog Pawar     UWORD8 *pu1_pred,
167*c83a76b0SSuyog Pawar     WORD32 pred_strd,
168*c83a76b0SSuyog Pawar     UWORD8 *pu1_dst,
169*c83a76b0SSuyog Pawar     WORD32 dst_strd,
170*c83a76b0SSuyog Pawar     WORD32 trans_size,
171*c83a76b0SSuyog Pawar     WORD16 i2_deq_value,
172*c83a76b0SSuyog Pawar     CHROMA_PLANE_ID_T e_chroma_plane);
173*c83a76b0SSuyog Pawar 
174*c83a76b0SSuyog Pawar WORD32 ihevce_find_num_clusters_of_identical_points_1D(
175*c83a76b0SSuyog Pawar     UWORD8 *pu1_inp_array,
176*c83a76b0SSuyog Pawar     UWORD8 *pu1_out_array,
177*c83a76b0SSuyog Pawar     UWORD8 *pu1_freq_of_out_data_in_inp,
178*c83a76b0SSuyog Pawar     WORD32 i4_num_inp_array_elements);
179*c83a76b0SSuyog Pawar 
180*c83a76b0SSuyog Pawar void ihevce_scale_mv(mv_t *ps_mv, WORD32 i4_poc_to, WORD32 i4_poc_from, WORD32 i4_curr_poc);
181*c83a76b0SSuyog Pawar 
182*c83a76b0SSuyog Pawar WORD32 ihevce_compare_pu_mv_t(
183*c83a76b0SSuyog Pawar     pu_mv_t *ps_1, pu_mv_t *ps_2, WORD32 i4_pred_mode_1, WORD32 i4_pred_mode_2);
184*c83a76b0SSuyog Pawar 
185*c83a76b0SSuyog Pawar void ihevce_set_pred_buf_as_free(UWORD32 *pu4_idx_array, UWORD8 u1_buf_id);
186*c83a76b0SSuyog Pawar 
187*c83a76b0SSuyog Pawar UWORD8 ihevce_get_free_pred_buf_indices(
188*c83a76b0SSuyog Pawar     UWORD8 *pu1_idx_array, UWORD32 *pu4_bitfield, UWORD8 u1_num_bufs_requested);
189*c83a76b0SSuyog Pawar 
190*c83a76b0SSuyog Pawar WORD32 ihevce_osal_init(void *pv_hle_ctxt);
191*c83a76b0SSuyog Pawar 
192*c83a76b0SSuyog Pawar WORD32 ihevce_osal_delete(void *pv_hle_ctxt);
193*c83a76b0SSuyog Pawar 
ihevce_num_ones_generic(UWORD32 bitfield)194*c83a76b0SSuyog Pawar static INLINE UWORD32 ihevce_num_ones_generic(UWORD32 bitfield)
195*c83a76b0SSuyog Pawar {
196*c83a76b0SSuyog Pawar     bitfield = bitfield - ((bitfield >> 1) & 0x55555555);
197*c83a76b0SSuyog Pawar     bitfield = (bitfield & 0x33333333) + ((bitfield >> 2) & 0x33333333);
198*c83a76b0SSuyog Pawar     return (((bitfield + (bitfield >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
199*c83a76b0SSuyog Pawar }
200*c83a76b0SSuyog Pawar 
ihevce_num_ones_popcnt(UWORD32 bitfield)201*c83a76b0SSuyog Pawar static INLINE UWORD32 ihevce_num_ones_popcnt(UWORD32 bitfield)
202*c83a76b0SSuyog Pawar {
203*c83a76b0SSuyog Pawar     return __builtin_popcount(bitfield);
204*c83a76b0SSuyog Pawar }
205*c83a76b0SSuyog Pawar 
206*c83a76b0SSuyog Pawar WORD32 ihevce_compute_area_of_valid_cus_in_ctb(cur_ctb_cu_tree_t *ps_cu_tree);
207*c83a76b0SSuyog Pawar 
208*c83a76b0SSuyog Pawar void ihevce_cu_tree_init(
209*c83a76b0SSuyog Pawar     cur_ctb_cu_tree_t *ps_cu_tree,
210*c83a76b0SSuyog Pawar     cur_ctb_cu_tree_t *ps_cu_tree_root,
211*c83a76b0SSuyog Pawar     WORD32 *pi4_nodes_created_in_cu_tree,
212*c83a76b0SSuyog Pawar     WORD32 tree_depth,
213*c83a76b0SSuyog Pawar     CU_POS_T e_grandparent_blk_pos,
214*c83a76b0SSuyog Pawar     CU_POS_T e_parent_blk_pos,
215*c83a76b0SSuyog Pawar     CU_POS_T e_cur_blk_pos);
216*c83a76b0SSuyog Pawar 
217*c83a76b0SSuyog Pawar #endif /* _IHEVCE_COMMON_UTILS_H_ */
218