1 /******************************************************************************
2 *
3 * Copyright (C) 2018 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *****************************************************************************
18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19 */
20
21 /**
22 ******************************************************************************
23 * @file ihevce_common_utils.h
24 *
25 * @brief
26 * Contains the declarations and definitions of common utils for encoder
27 *
28 * @author
29 * ittiam
30 *
31 ******************************************************************************
32 */
33
34 #ifndef _IHEVCE_COMMON_UTILS_H_
35 #define _IHEVCE_COMMON_UTILS_H_
36
37 #include <math.h>
38 #include <limits.h>
39
40 /*****************************************************************************/
41 /* Constant Macros */
42 /*****************************************************************************/
43
44 /*****************************************************************************/
45 /* Function Macros */
46 /*****************************************************************************/
47
48 /**
49 ******************************************************************************
50 * @macro IHEVCE_WT_PRED
51 * @brief Implements wt pred formula as per spec
52 ******************************************************************************
53 */
54 #define IHEVCE_WT_PRED(p0, p1, w0, w1, rnd, shift) \
55 (((((WORD32)w0) * ((WORD32)p0) + ((WORD32)w1) * ((WORD32)p1)) >> shift) + rnd)
56
57 #define SORT_PRIMARY_INTTYPE_ARRAY_AND_REORDER_GENERIC_COMPANION_ARRAY( \
58 primary_array, companion_array, array_length, type_companion) \
59 { \
60 WORD32 i, j; \
61 \
62 for(i = 0; i < (array_length - 1); i++) \
63 { \
64 for(j = (i + 1); j < array_length; j++) \
65 { \
66 if(primary_array[i] > primary_array[j]) \
67 { \
68 type_companion t; \
69 \
70 SWAP(primary_array[i], primary_array[j]); \
71 \
72 t = companion_array[i]; \
73 companion_array[i] = companion_array[j]; \
74 companion_array[j] = t; \
75 } \
76 } \
77 } \
78 }
79
80 #define SORT_PRIMARY_INTTYPE_ARRAY_AND_REORDER_INTTYPE_COMPANION_ARRAY( \
81 primary_array, companion_array, array_length) \
82 { \
83 WORD32 i, j; \
84 \
85 for(i = 0; i < (array_length - 1); i++) \
86 { \
87 for(j = (i + 1); j < array_length; j++) \
88 { \
89 if(primary_array[i] > primary_array[j]) \
90 { \
91 type_companion t; \
92 \
93 SWAP(primary_array[i], primary_array[j]); \
94 SWAP(companion_array[i], companion_array[j]); \
95 } \
96 } \
97 } \
98 }
99
100 #define SORT_INTTYPE_ARRAY(primary_array, array_length) \
101 { \
102 WORD32 i, j; \
103 \
104 for(i = 0; i < (array_length - 1); i++) \
105 { \
106 for(j = (i + 1); j < array_length; j++) \
107 { \
108 if(primary_array[i] > primary_array[j]) \
109 { \
110 SWAP(primary_array[i], primary_array[j]); \
111 } \
112 } \
113 } \
114 }
115
116 #define SET_BIT(x, bitpos) ((x) | (1 << (bitpos)))
117
118 #define CLEAR_BIT(x, bitpos) ((x) & (~(1 << (bitpos))))
119
120 #define CU_TREE_NODE_FILL(ps_node, valid_flag, posx, posy, size, inter_eval_enable) \
121 { \
122 ps_node->is_node_valid = valid_flag; \
123 ps_node->u1_cu_size = size; \
124 ps_node->u1_intra_eval_enable = 0; \
125 ps_node->b3_cu_pos_x = posx; \
126 ps_node->b3_cu_pos_y = posy; \
127 ps_node->u1_inter_eval_enable = inter_eval_enable; \
128 }
129
130 /*****************************************************************************/
131 /* Extern Function Declarations */
132 /*****************************************************************************/
133
134 void ihevce_copy_2d(
135 UWORD8 *pu1_dst,
136 WORD32 dst_stride,
137 UWORD8 *pu1_src,
138 WORD32 src_stride,
139 WORD32 blk_wd,
140 WORD32 blk_ht);
141
142 void ihevce_2d_square_copy_luma(
143 void *p_dst,
144 WORD32 dst_strd,
145 void *p_src,
146 WORD32 src_strd,
147 WORD32 num_cols_to_copy,
148 WORD32 unit_size);
149
150 void ihevce_wt_avg_2d(
151 UWORD8 *pu1_pred0,
152 UWORD8 *pu1_pred1,
153 WORD32 pred0_strd,
154 WORD32 pred1_strd,
155 WORD32 wd,
156 WORD32 ht,
157 UWORD8 *pu1_dst,
158 WORD32 dst_strd,
159 WORD32 w0,
160 WORD32 w1,
161 WORD32 o0,
162 WORD32 o1,
163 WORD32 log_wdc);
164
165 void ihevce_itrans_recon_dc(
166 UWORD8 *pu1_pred,
167 WORD32 pred_strd,
168 UWORD8 *pu1_dst,
169 WORD32 dst_strd,
170 WORD32 trans_size,
171 WORD16 i2_deq_value,
172 CHROMA_PLANE_ID_T e_chroma_plane);
173
174 WORD32 ihevce_find_num_clusters_of_identical_points_1D(
175 UWORD8 *pu1_inp_array,
176 UWORD8 *pu1_out_array,
177 UWORD8 *pu1_freq_of_out_data_in_inp,
178 WORD32 i4_num_inp_array_elements);
179
180 void ihevce_scale_mv(mv_t *ps_mv, WORD32 i4_poc_to, WORD32 i4_poc_from, WORD32 i4_curr_poc);
181
182 WORD32 ihevce_compare_pu_mv_t(
183 pu_mv_t *ps_1, pu_mv_t *ps_2, WORD32 i4_pred_mode_1, WORD32 i4_pred_mode_2);
184
185 void ihevce_set_pred_buf_as_free(UWORD32 *pu4_idx_array, UWORD8 u1_buf_id);
186
187 UWORD8 ihevce_get_free_pred_buf_indices(
188 UWORD8 *pu1_idx_array, UWORD32 *pu4_bitfield, UWORD8 u1_num_bufs_requested);
189
190 WORD32 ihevce_osal_init(void *pv_hle_ctxt);
191
192 WORD32 ihevce_osal_delete(void *pv_hle_ctxt);
193
ihevce_num_ones_generic(UWORD32 bitfield)194 static INLINE UWORD32 ihevce_num_ones_generic(UWORD32 bitfield)
195 {
196 bitfield = bitfield - ((bitfield >> 1) & 0x55555555);
197 bitfield = (bitfield & 0x33333333) + ((bitfield >> 2) & 0x33333333);
198 return (((bitfield + (bitfield >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
199 }
200
ihevce_num_ones_popcnt(UWORD32 bitfield)201 static INLINE UWORD32 ihevce_num_ones_popcnt(UWORD32 bitfield)
202 {
203 return __builtin_popcount(bitfield);
204 }
205
206 WORD32 ihevce_compute_area_of_valid_cus_in_ctb(cur_ctb_cu_tree_t *ps_cu_tree);
207
208 void ihevce_cu_tree_init(
209 cur_ctb_cu_tree_t *ps_cu_tree,
210 cur_ctb_cu_tree_t *ps_cu_tree_root,
211 WORD32 *pi4_nodes_created_in_cu_tree,
212 WORD32 tree_depth,
213 CU_POS_T e_grandparent_blk_pos,
214 CU_POS_T e_parent_blk_pos,
215 CU_POS_T e_cur_blk_pos);
216
217 #endif /* _IHEVCE_COMMON_UTILS_H_ */
218