xref: /aosp_15_r20/external/libavc/encoder/svc/isvce_utils.h (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1 /******************************************************************************
2  *
3  * Copyright (C) 2022 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
24 *  isvce_utils.h
25 *
26 * @brief
27 *  Contains function declarations for function declared in ih264e_svc_utils.c
28 *
29 * @author
30 *  ittiam
31 *
32 * @remarks
33 *  None
34 *
35 *******************************************************************************
36 */
37 
38 #ifndef _ISVCE_UTILS_H_
39 #define _ISVCE_UTILS_H_
40 
41 #include <stdio.h>
42 #include <stddef.h>
43 #include <stdlib.h>
44 #include <string.h>
45 #include <assert.h>
46 
47 #include "ih264_typedefs.h"
48 #include "ih264e_bitstream.h"
49 /* Dependencies of 'irc_picture_type.h' */
50 #include "irc_cntrl_param.h"
51 #include "irc_frame_info_collector.h"
52 #include "irc_mem_req_and_acq.h"
53 /* Dependencies of 'irc_rate_control_api_structs' */
54 #include "irc_picture_type.h"
55 #include "irc_rd_model.h"
56 #include "irc_vbr_storage_vbv.h"
57 #include "irc_est_sad.h"
58 #include "irc_bit_allocation.h"
59 #include "irc_mb_model_based.h"
60 #include "irc_cbr_buffer_control.h"
61 #include "irc_vbr_str_prms.h"
62 #include "irc_common.h"
63 #include "irc_rate_control_api_structs.h"
64 #include "isvc_macros.h"
65 #include "isvc_structs.h"
66 #include "isvce_defs.h"
67 #include "isvce_globals.h"
68 #include "isvce_interface_structs.h"
69 #include "isvce_structs.h"
70 
isvce_svc_au_buf_init(svc_au_buf_t * ps_svc_pic_buf,svc_params_t * ps_svc_params)71 static FORCEINLINE void isvce_svc_au_buf_init(svc_au_buf_t *ps_svc_pic_buf,
72                                               svc_params_t *ps_svc_params)
73 {
74     ps_svc_pic_buf->i1_temporal_id = -1;
75     ps_svc_pic_buf->u1_num_spatial_layers = ps_svc_params->u1_num_spatial_layers;
76     ps_svc_pic_buf->d_spatial_res_ratio = ps_svc_params->d_spatial_res_ratio;
77 }
78 
isvce_svc_temporal_id_compute(WORD32 i4_poc,UWORD8 u1_num_temporal_layers,PIC_TYPE_T e_pic_type)79 static FORCEINLINE WORD8 isvce_svc_temporal_id_compute(WORD32 i4_poc, UWORD8 u1_num_temporal_layers,
80                                                        PIC_TYPE_T e_pic_type)
81 {
82     if(e_pic_type == PIC_IDR)
83     {
84         return 0;
85     }
86     else
87     {
88         return i4_poc % u1_num_temporal_layers;
89     }
90 }
91 
isvcd_get_ceil_log2(WORD32 i4_input)92 static FORCEINLINE WORD32 isvcd_get_ceil_log2(WORD32 i4_input)
93 {
94     WORD32 i4_bits = 0;
95 
96     /* check for negative number */
97     ASSERT(i4_input >= 0);
98 
99     i4_input--;
100 
101     while(i4_input > 0)
102     {
103         i4_bits++;
104         i4_input >>= 1;
105     }
106 
107     return (i4_bits);
108 }
109 /**
110 *******************************************************************************
111 *
112 * @brief calculate coded subblock pattern from nnz
113 *
114 * @par Description:
115 *  calculate coded subblock pattern from nnz
116 *
117 * @param[in] ps_proc
118 *  process context
119 *
120 * @returns  csbp
121 *
122 * @remarks  none
123 *
124 *******************************************************************************
125 */
isvce_calculate_csbp(isvce_process_ctxt_t * ps_proc)126 static FORCEINLINE UWORD32 isvce_calculate_csbp(isvce_process_ctxt_t *ps_proc)
127 {
128     WORD32 i;
129 
130     UWORD8 *pu1_curr_nnz = ((UWORD8 *) ps_proc->au4_nnz) + 1;
131     UWORD32 u4_csbp = 0;
132 
133     for(i = 0; i < 16; i++)
134     {
135         UWORD8 u1_zscan_idx = gau1_raster_to_zscan_map[i];
136 
137         u4_csbp |= ((!!pu1_curr_nnz[i]) << u1_zscan_idx);
138     }
139 
140     return u4_csbp;
141 }
142 
isvce_check_identical_mv(isvce_enc_pu_mv_t * ps_mv1,isvce_enc_pu_mv_t * ps_mv2,PRED_MODE_T e_pred_mode)143 static FORCEINLINE UWORD8 isvce_check_identical_mv(isvce_enc_pu_mv_t *ps_mv1,
144                                                    isvce_enc_pu_mv_t *ps_mv2,
145                                                    PRED_MODE_T e_pred_mode)
146 {
147     if(e_pred_mode != L0)
148     {
149         if(!((ps_mv1[L1].i1_ref_idx == ps_mv2[L1].i1_ref_idx) &&
150              (ps_mv1[L1].s_mv.i2_mvx == ps_mv2[L1].s_mv.i2_mvx) &&
151              (ps_mv1[L1].s_mv.i2_mvy == ps_mv2[L1].s_mv.i2_mvy)))
152         {
153             return 0;
154         }
155     }
156 
157     if(e_pred_mode != L1)
158     {
159         if(!((ps_mv1[L0].i1_ref_idx == ps_mv2[L0].i1_ref_idx) &&
160              (ps_mv1[L0].s_mv.i2_mvx == ps_mv2[L0].s_mv.i2_mvx) &&
161              (ps_mv1[L0].s_mv.i2_mvy == ps_mv2[L0].s_mv.i2_mvy)))
162         {
163             return 0;
164         }
165     }
166 
167     return 1;
168 }
169 
isvce_get_num_bits(bitstrm_t * ps_bitstream)170 static FORCEINLINE WORD32 isvce_get_num_bits(bitstrm_t *ps_bitstream)
171 {
172     return GET_NUM_BITS(ps_bitstream);
173 }
174 
175 extern WORD32 ih264e_get_min_level(WORD32 wd, WORD32 ht);
176 
177 extern WORD32 isvce_svc_au_props_validate(svc_inp_params_t *ps_svc_inp_params, UWORD32 u4_inp_wd,
178                                           UWORD32 u4_inp_ht, UWORD32 u4_svc_comp_wd,
179                                           UWORD32 u4_svc_comp_ht);
180 
181 extern WORD32 isvce_svc_inp_params_validate(isvce_init_ip_t *ps_ip, isvce_cfg_params_t *ps_cfg);
182 
183 extern WORD32 isvce_svc_frame_params_validate(
184     rate_control_api_t *aps_rate_control_api[MAX_NUM_SPATIAL_LAYERS], UWORD8 u1_num_spatial_layers);
185 
186 extern WORD32 isvce_get_total_svc_au_buf_size(svc_inp_params_t *ps_svc_inp_params,
187                                               WORD32 i4_pic_size, WORD32 i4_level,
188                                               WORD32 i4_horz_pad, WORD32 i4_vert_pad,
189                                               WORD32 i4_num_ref_frames,
190                                               WORD32 i4_num_reorder_frames);
191 
192 extern UWORD32 isvce_get_total_svc_au_data_size(WORD32 i4_num_luma_samples,
193                                                 UWORD8 u1_num_spatial_layers,
194                                                 DOUBLE d_spatial_res_ratio);
195 
196 extern IH264E_ERROR_T isvce_svc_au_data_mgr_add_bufs(isvce_codec_t *ps_codec);
197 
198 extern IH264E_ERROR_T isvce_svc_au_buf_mgr_add_bufs(isvce_codec_t *ps_codec);
199 
200 extern UWORD32 isvce_get_svc_inp_buf_size(UWORD8 u1_num_spatial_layers, DOUBLE d_spatial_res_ratio,
201                                           UWORD32 u4_wd, UWORD32 u4_ht);
202 
203 extern void isvce_svc_inp_buf_init(isvce_codec_t *ps_codec, iv_mem_rec_t *ps_mem_rec);
204 
205 extern void isvce_init_svc_dimension(isvce_inp_buf_t *ps_inp);
206 
207 extern void isvce_svc_inp_buf_populate(isvce_codec_t *ps_codec, isvce_inp_buf_t *ps_inp);
208 
209 extern void isvce_get_svc_compliant_dimensions(UWORD8 u1_num_spatial_layers,
210                                                DOUBLE d_scaling_factor, UWORD32 u4_wd,
211                                                UWORD32 u4_ht, UWORD32 *pu4_svc_comp_wd,
212                                                UWORD32 *pu4_svc_comp_ht);
213 
214 extern UWORD32 isvce_get_svc_nbr_info_buf_size(UWORD8 u1_num_spatial_layers,
215                                                DOUBLE d_spatial_res_ratio, UWORD32 u4_wd,
216                                                UWORD32 u4_ht);
217 
218 extern void isvce_svc_nbr_info_buf_init(isvce_codec_t *ps_codec, iv_mem_rec_t *ps_mem_rec);
219 
220 extern IH264E_ERROR_T isvce_svc_au_init(isvce_codec_t *ps_codec, isvce_inp_buf_t *ps_inp_buf);
221 
222 extern IH264E_ERROR_T isvce_svc_layer_pic_init(isvce_codec_t *ps_codec, isvce_inp_buf_t *ps_inp_buf,
223                                                UWORD8 u1_spatial_layer_id);
224 
225 extern IH264E_ERROR_T isvce_init_layer_proc_ctxt(isvce_process_ctxt_t *ps_proc);
226 
227 extern UWORD32 isvce_get_svc_ilp_buf_size(UWORD8 u1_num_spatial_layers, DOUBLE d_spatial_res_ratio,
228                                           UWORD32 u4_wd, UWORD32 u4_ht);
229 
230 extern void isvce_svc_ilp_buf_init(isvce_codec_t *ps_codec, iv_mem_rec_t *ps_mem_rec);
231 
232 extern void isvce_svc_ilp_buf_update(isvce_process_ctxt_t *ps_proc);
233 
234 extern void isvce_svc_pad_frame(isvce_process_ctxt_t *ps_proc);
235 
236 extern IH264E_ERROR_T isvce_init_air_map(isvce_codec_t *ps_codec);
237 
238 extern void isvce_derive_nghbr_avbl_of_mbs(isvce_process_ctxt_t *ps_proc);
239 
240 extern void isvce_init_quant_params(isvce_process_ctxt_t *ps_proc, WORD32 qp);
241 
242 extern IH264E_ERROR_T isvce_codec_init(isvce_codec_t *ps_codec);
243 
244 extern IH264E_ERROR_T isvce_codec_update_config(isvce_codec_t *ps_codec,
245                                                 isvce_cfg_params_t *ps_cfg);
246 
247 extern WORD32 isvce_input_queue_update(isvce_codec_t *ps_codec, ive_video_encode_ip_t *ps_ive_ip,
248                                        isvce_inp_buf_t *ps_enc_buff, WORD8 i1_layer_id);
249 
250 extern void isvce_join_threads(isvce_codec_t *ps_codec);
251 
252 extern UWORD32 isvce_get_min_outbuf_size(UWORD32 u4_wd, UWORD32 u4_ht,
253                                          UWORD8 u1_num_spatial_layers);
254 
255 #endif
256