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