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_error_checks.c
24 *
25 * \brief
26 * This file contains all the functions which checks the validity of the
27 * parameters passed to the encoder.
28 *
29 * \date
30 * 18/09/2012
31 *
32 * \author
33 * Ittiam
34 *
35 * List of Functions
36 * ihevce_get_level_index()
37 * ihevce_hle_validate_static_params()
38 * ihevce_validate_tile_config_params()
39 *
40 ******************************************************************************
41 */
42
43 /*****************************************************************************/
44 /* File Includes */
45 /*****************************************************************************/
46 /* System include files */
47 #include <stdio.h>
48 #include <string.h>
49 #include <stdlib.h>
50 #include <assert.h>
51 #include <stdarg.h>
52 #include <math.h>
53
54 /* User include files */
55 #include "ihevc_typedefs.h"
56 #include "itt_video_api.h"
57 #include "ihevce_api.h"
58
59 #include "rc_cntrl_param.h"
60 #include "rc_frame_info_collector.h"
61 #include "rc_look_ahead_params.h"
62
63 #include "ihevc_defs.h"
64 #include "ihevc_macros.h"
65 #include "ihevc_debug.h"
66 #include "ihevc_structs.h"
67 #include "ihevc_platform_macros.h"
68 #include "ihevc_deblk.h"
69 #include "ihevc_itrans_recon.h"
70 #include "ihevc_chroma_itrans_recon.h"
71 #include "ihevc_chroma_intra_pred.h"
72 #include "ihevc_intra_pred.h"
73 #include "ihevc_inter_pred.h"
74 #include "ihevc_mem_fns.h"
75 #include "ihevc_padding.h"
76 #include "ihevc_weighted_pred.h"
77 #include "ihevc_sao.h"
78 #include "ihevc_resi_trans.h"
79 #include "ihevc_quant_iquant_ssd.h"
80 #include "ihevc_cabac_tables.h"
81 #include "ihevc_trans_tables.h"
82 #include "ihevc_trans_macros.h"
83
84 #include "ihevce_defs.h"
85 #include "ihevce_lap_enc_structs.h"
86 #include "ihevce_hle_interface.h"
87 #include "ihevce_multi_thrd_structs.h"
88 #include "ihevce_multi_thrd_funcs.h"
89 #include "ihevce_me_common_defs.h"
90 #include "ihevce_had_satd.h"
91 #include "ihevce_error_codes.h"
92 #include "ihevce_error_checks.h"
93 #include "ihevce_bitstream.h"
94 #include "ihevce_cabac.h"
95 #include "ihevce_rdoq_macros.h"
96 #include "ihevce_function_selector.h"
97 #include "ihevce_enc_structs.h"
98 #include "ihevce_global_tables.h"
99 #include "ihevce_trace.h"
100
101 /*****************************************************************************/
102 /* Function Definitions */
103 /*****************************************************************************/
104
105 /*!
106 ******************************************************************************
107 * \if Function name : ihevce_validate_tile_config_params \endif
108 *
109 * \brief
110 * This function validates the static parameters related to tiles
111 *
112 * \param[in] Encoder static config prms pointer
113 *
114 * \return
115 * None
116 *
117 * \author
118 * Ittiam
119 *
120 *****************************************************************************
121 */
ihevce_validate_tile_config_params(ihevce_static_cfg_params_t * ps_static_cfg_prms)122 WORD32 ihevce_validate_tile_config_params(ihevce_static_cfg_params_t *ps_static_cfg_prms)
123 {
124 WORD32 error_code = IHEVCE_SUCCESS;
125 ihevce_sys_api_t *ps_sys_api = &ps_static_cfg_prms->s_sys_api;
126 void *pv_cb_handle = ps_sys_api->pv_cb_handle;
127
128 /* As of now tiles are not supported */
129 if(ps_static_cfg_prms->s_app_tile_params.i4_tiles_enabled_flag != 0)
130 {
131 error_code = IHEVCE_BAD_TILE_CONFIGURATION;
132 ps_sys_api->ihevce_printf(
133 pv_cb_handle, "IHEVCE ERROR: i4_tiles_enabled_flag should be set to 0 \n");
134 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
135 }
136
137 return error_code;
138 }
139
140 /*!
141 ******************************************************************************
142 * \if Function name : ihevce_hle_validate_static_params \endif
143 *
144 * \brief
145 * This function validates the static parameters before creating the encoder
146 * instance.
147 *
148 * \param[in] Encoder context pointer
149 *
150 * \return
151 * Error code
152 *
153 * \author
154 * Ittiam
155 *
156 *****************************************************************************
157 */
ihevce_hle_validate_static_params(ihevce_static_cfg_params_t * ps_static_cfg_prms)158 WORD32 ihevce_hle_validate_static_params(ihevce_static_cfg_params_t *ps_static_cfg_prms)
159 {
160 WORD32 error_code;
161 WORD32 i4_resolution_id;
162 WORD32 ai4_num_bitrate_instances[IHEVCE_MAX_NUM_RESOLUTIONS] = { 1 };
163 WORD32 i4_num_resolutions;
164 ihevce_sys_api_t *ps_sys_api = &ps_static_cfg_prms->s_sys_api;
165 void *pv_cb_handle = ps_sys_api->pv_cb_handle;
166
167 /* derive local variables */
168 i4_num_resolutions = ps_static_cfg_prms->s_tgt_lyr_prms.i4_num_res_layers;
169 for(i4_resolution_id = 0; i4_resolution_id < i4_num_resolutions; i4_resolution_id++)
170 {
171 ai4_num_bitrate_instances[i4_resolution_id] =
172 ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
173 .i4_num_bitrate_instances;
174 }
175 // clang-format off
176 if(0 != ps_static_cfg_prms->i4_log_dump_level)
177 {
178 /* Print all the config params */
179 if((0 == ps_static_cfg_prms->i4_res_id) && (0 == ps_static_cfg_prms->i4_br_id))
180 {
181 WORD32 i4_resolution_id_loop, i4_i;
182 WORD32 i4_num_res_layers = ps_static_cfg_prms->s_tgt_lyr_prms.i4_num_res_layers;
183
184 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "**********************************************\n");
185 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "*********** STATIC PARAMS CONFIG *************\n");
186 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "**********************************************\n");
187
188 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : ps_static_cfg_prms->s_src_prms \n");
189 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_width %d \n", ps_static_cfg_prms->s_src_prms.i4_width);
190 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_height %d \n", ps_static_cfg_prms->s_src_prms.i4_height);
191 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_frm_rate_num %d \n", ps_static_cfg_prms->s_src_prms.i4_frm_rate_num);
192 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_frm_rate_denom %d \n", ps_static_cfg_prms->s_src_prms.i4_frm_rate_denom);
193 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_field_pic %d \n", ps_static_cfg_prms->s_src_prms.i4_field_pic);
194 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_chr_format %d \n", ps_static_cfg_prms->s_src_prms.i4_chr_format);
195 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_input_bit_depth %d \n", ps_static_cfg_prms->s_src_prms.i4_input_bit_depth);
196 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_topfield_first %d \n\n", ps_static_cfg_prms->s_src_prms.i4_topfield_first);
197
198 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : ps_static_cfg_prms->s_tgt_lyr_prms \n");
199 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_num_res_layers %d \n", i4_num_res_layers);
200 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_multi_res_layer_reuse %d \n", ps_static_cfg_prms->s_tgt_lyr_prms.i4_multi_res_layer_reuse);
201 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_mbr_quality_setting %d \n", ps_static_cfg_prms->s_tgt_lyr_prms.i4_mbr_quality_setting);
202
203 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : For Each resolution,");
204 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\nIHEVCE : i4_target_width ");
205 for(i4_resolution_id_loop = 0; i4_resolution_id_loop < i4_num_res_layers; i4_resolution_id_loop++)
206 {
207 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "res_id %d %d ", i4_resolution_id_loop, ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id_loop].i4_width);
208 }
209
210 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\nIHEVCE : i4_target_width ");
211 for(i4_resolution_id_loop = 0; i4_resolution_id_loop < i4_num_res_layers; i4_resolution_id_loop++)
212 {
213 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "res_id %d %d ", i4_resolution_id_loop, ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id_loop].i4_height);
214 }
215
216 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\nIHEVCE : i4_frm_rate_scale_factor ");
217 for(i4_resolution_id_loop = 0; i4_resolution_id_loop < i4_num_res_layers; i4_resolution_id_loop++)
218 {
219 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "res_id %d %d ", i4_resolution_id_loop,
220 ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id_loop].i4_frm_rate_scale_factor);
221 }
222
223 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\nIHEVCE : i4_codec_level ");
224 for(i4_resolution_id_loop = 0; i4_resolution_id_loop < i4_num_res_layers; i4_resolution_id_loop++)
225 {
226 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "res_id %d %d ", i4_resolution_id_loop, ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id_loop].i4_codec_level);
227 }
228
229 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\nIHEVCE : i4_num_bitrate_instances ");
230 for(i4_resolution_id_loop = 0; i4_resolution_id_loop < i4_num_res_layers; i4_resolution_id_loop++)
231 {
232 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "res_id %d %d", i4_resolution_id_loop,
233 ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id_loop].i4_num_bitrate_instances);
234 }
235
236 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\n");
237 for(i4_resolution_id_loop = 0; i4_resolution_id_loop < i4_num_res_layers; i4_resolution_id_loop++)
238 {
239 WORD32 i4_num_bitrate_instances, i4_br_loop;
240 i4_num_bitrate_instances = ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id_loop].i4_num_bitrate_instances;
241 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_tgt_bitrate res_id %d ", i4_resolution_id_loop);
242 for(i4_br_loop = 0; i4_br_loop < i4_num_bitrate_instances; i4_br_loop++)
243 {
244 PRINTF(
245 ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "br_id %d %d ", i4_br_loop, ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id_loop].ai4_tgt_bitrate[i4_br_loop]);
246 }
247 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\n");
248 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_peak_bitrate res_id %d ", i4_resolution_id_loop);
249 for(i4_br_loop = 0; i4_br_loop < i4_num_bitrate_instances; i4_br_loop++)
250 {
251 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "br_id %d %d ", i4_br_loop,
252 ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id_loop].ai4_peak_bitrate[i4_br_loop]);
253 }
254 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\n");
255 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : vbv_buffer_size res_id %d ", i4_resolution_id_loop);
256 for(i4_br_loop = 0; i4_br_loop < i4_num_bitrate_instances; i4_br_loop++)
257 {
258 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "br_id %d %d ", i4_br_loop,
259 ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id_loop].ai4_max_vbv_buffer_size[i4_br_loop]);
260 }
261 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\n");
262 }
263
264 for(i4_resolution_id_loop = 0; i4_resolution_id_loop < i4_num_res_layers; i4_resolution_id_loop++)
265 {
266 WORD32 i4_num_bitrate_instances, i4_br_loop;
267
268 i4_num_bitrate_instances = ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id_loop].i4_num_bitrate_instances;
269 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_frame_qp res_id %d ", i4_resolution_id_loop);
270 for(i4_br_loop = 0; i4_br_loop < i4_num_bitrate_instances; i4_br_loop++)
271 {
272 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "br_id %d %d ", i4_br_loop, ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id_loop].ai4_frame_qp[i4_br_loop]);
273 }
274 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\n");
275 }
276
277 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_internal_bit_depth %d \n", ps_static_cfg_prms->s_tgt_lyr_prms.i4_internal_bit_depth);
278 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_enable_temporal_scalability %d \n", ps_static_cfg_prms->s_tgt_lyr_prms.i4_enable_temporal_scalability);
279
280 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_quality_preset ");
281 for(i4_resolution_id_loop = 0; i4_resolution_id_loop < i4_num_res_layers; i4_resolution_id_loop++)
282 {
283 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "res_id %d %d", i4_resolution_id_loop, ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id_loop].i4_quality_preset);
284 }
285 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\n");
286
287 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\nIHEVCE : ps_static_cfg_prms->s_coding_tools_prms \n");
288 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_max_idr_period %d \n", ps_static_cfg_prms->s_coding_tools_prms.i4_max_closed_gop_period);
289 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_min_idr_period %d \n", ps_static_cfg_prms->s_coding_tools_prms.i4_min_closed_gop_period);
290 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_max_cra_period %d \n", ps_static_cfg_prms->s_coding_tools_prms.i4_max_cra_open_gop_period);
291 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_i_cra_period %d \n", ps_static_cfg_prms->s_coding_tools_prms.i4_max_i_open_gop_period);
292 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_max_temporal_layers %d \n", ps_static_cfg_prms->s_coding_tools_prms.i4_max_temporal_layers);
293 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_max_reference_frames %d \n", ps_static_cfg_prms->s_coding_tools_prms.i4_max_reference_frames);
294 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_deblocking_type %d \n", ps_static_cfg_prms->s_coding_tools_prms.i4_deblocking_type);
295 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_use_default_sc_mtx %d \n", ps_static_cfg_prms->s_coding_tools_prms.i4_use_default_sc_mtx);
296 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_enable_entropy_sync %d \n", ps_static_cfg_prms->s_coding_tools_prms.i4_enable_entropy_sync);
297 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_cropping_mode %d \n", ps_static_cfg_prms->s_coding_tools_prms.i4_cropping_mode);
298 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_vqet %d \n", ps_static_cfg_prms->s_coding_tools_prms.i4_vqet);
299
300 switch(ps_static_cfg_prms->e_arch_type)
301 {
302 case ARCH_NA:
303 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : archType %d \n", 0);
304 break;
305 #ifdef ARM
306 case ARCH_ARM_NONEON:
307 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : archType %d \n", 4);
308 break;
309 #endif
310 default:
311 break;
312 }
313
314 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\nIHEVCE : ps_static_cfg_prms->s_config_prms \n");
315 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_num_frms_to_encode %d \n", ps_static_cfg_prms->s_config_prms.i4_num_frms_to_encode);
316 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_max_log2_cu_size %d \n", ps_static_cfg_prms->s_config_prms.i4_max_log2_cu_size);
317 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_max_log2_cu_size %d \n", ps_static_cfg_prms->s_config_prms.i4_min_log2_cu_size);
318 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_max_log2_cu_size %d \n", ps_static_cfg_prms->s_config_prms.i4_max_log2_tu_size);
319 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_max_log2_cu_size %d \n", ps_static_cfg_prms->s_config_prms.i4_min_log2_cu_size);
320 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_max_tr_tree_depth_I %d \n", ps_static_cfg_prms->s_config_prms.i4_max_tr_tree_depth_I);
321 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_max_tr_tree_depth_nI %d \n", ps_static_cfg_prms->s_config_prms.i4_max_tr_tree_depth_nI);
322 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_max_search_range_horz %d \n", ps_static_cfg_prms->s_config_prms.i4_max_search_range_horz);
323 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_max_search_range_vert %d \n", ps_static_cfg_prms->s_config_prms.i4_max_search_range_vert);
324
325 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\nIHEVCE : ps_static_cfg_prms->s_multi_thrd_prms \n");
326 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_max_num_cores %d \n", ps_static_cfg_prms->s_multi_thrd_prms.i4_max_num_cores);
327 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_use_thrd_affinity %d \n", ps_static_cfg_prms->s_multi_thrd_prms.i4_use_thrd_affinity);
328
329 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\nIHEVCE : rate control params \n");
330 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_rate_control_mode %d \n", ps_static_cfg_prms->s_config_prms.i4_rate_control_mode);
331 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_cu_level_rc %d \n", ps_static_cfg_prms->s_config_prms.i4_cu_level_rc);
332 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_pass %d \n", ps_static_cfg_prms->s_pass_prms.i4_pass);
333 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_rate_factor %d \n", ps_static_cfg_prms->s_config_prms.i4_rate_factor);
334 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_vbr_max_peak_rate_dur %d \n", ps_static_cfg_prms->s_config_prms.i4_vbr_max_peak_rate_dur);
335 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_init_vbv_fullness %d \n", ps_static_cfg_prms->s_config_prms.i4_init_vbv_fullness);
336 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_stuffing_enable %d \n", ps_static_cfg_prms->s_config_prms.i4_stuffing_enable);
337 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_max_frame_qp %d \n", ps_static_cfg_prms->s_config_prms.i4_max_frame_qp);
338 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_min_frame_qp %d \n", ps_static_cfg_prms->s_config_prms.i4_min_frame_qp);
339
340 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\n");
341
342 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\nIHEVCE : ps_static_cfg_prms->s_lap_prms\n");
343 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_rc_look_ahead_pics %d \n", ps_static_cfg_prms->s_lap_prms.i4_rc_look_ahead_pics);
344 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_enable_wts_ofsts %d \n", ps_static_cfg_prms->s_lap_prms.i4_enable_wts_ofsts);
345
346 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\nIHEVCE : ps_static_cfg_prms->s_out_strm_prms\n");
347 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_codec_type %d \n", ps_static_cfg_prms->s_out_strm_prms.i4_codec_type);
348 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_codec_profile %d \n", ps_static_cfg_prms->s_out_strm_prms.i4_codec_profile);
349 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_codec_tier %d \n", ps_static_cfg_prms->s_out_strm_prms.i4_codec_tier);
350 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_aud_enable_flags %d \n", ps_static_cfg_prms->s_out_strm_prms.i4_aud_enable_flags);
351 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_interop_flags %d \n", ps_static_cfg_prms->s_out_strm_prms.i4_interop_flags);
352 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_sps_at_cdr_enable %d \n", ps_static_cfg_prms->s_out_strm_prms.i4_sps_at_cdr_enable);
353 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_vui_enable %d \n", ps_static_cfg_prms->s_out_strm_prms.i4_vui_enable);
354 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_sei_enable_flag %d \n", ps_static_cfg_prms->s_out_strm_prms.i4_sei_enable_flag);
355 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_sei_payload_enable_flag %d \n", ps_static_cfg_prms->s_out_strm_prms.i4_sei_payload_enable_flag);
356 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_sei_buffer_period_flags %d \n", ps_static_cfg_prms->s_out_strm_prms.i4_sei_buffer_period_flags);
357 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_sei_pic_timing_flags %d \n", ps_static_cfg_prms->s_out_strm_prms.i4_sei_pic_timing_flags);
358 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_sei_cll_enable %d \n", ps_static_cfg_prms->s_out_strm_prms.i4_sei_cll_enable);
359 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : u2_sei_avg_cll %d \n", ps_static_cfg_prms->s_out_strm_prms.u2_sei_avg_cll);
360 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : u2_sei_max_cll %d \n", ps_static_cfg_prms->s_out_strm_prms.u2_sei_max_cll);
361 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_sei_recovery_point_flags %d \n", ps_static_cfg_prms->s_out_strm_prms.i4_sei_recovery_point_flags);
362 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_sei_mastering_disp_colour_vol_flags %d \n", ps_static_cfg_prms->s_out_strm_prms.i4_sei_mastering_disp_colour_vol_flags);
363 for(i4_i = 0; i4_i < 3; i4_i++)
364 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : u2_display_primaries_x[i4_i] %d \n", ps_static_cfg_prms->s_out_strm_prms.au2_display_primaries_x[i4_i]);
365 for(i4_i = 0; i4_i < 3; i4_i++)
366 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : u2_display_primaries_y[i4_i] %d \n", ps_static_cfg_prms->s_out_strm_prms.au2_display_primaries_y[i4_i]);
367 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : u2_white_point_x %d \n", ps_static_cfg_prms->s_out_strm_prms.u2_white_point_x);
368 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : u2_white_point_y %d \n", ps_static_cfg_prms->s_out_strm_prms.u2_white_point_y);
369 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : u4_max_display_mastering_luminance %d \n", ps_static_cfg_prms->s_out_strm_prms.u4_max_display_mastering_luminance);
370 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : u4_min_display_mastering_luminance %d \n", ps_static_cfg_prms->s_out_strm_prms.u4_min_display_mastering_luminance);
371 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_sei_hash_flags %d \n", ps_static_cfg_prms->s_out_strm_prms.i4_decoded_pic_hash_sei_flag);
372
373 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\nIHEVCE : ps_static_cfg_prms->s_app_tile_params\n");
374 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_tiles_enabled_flag %d \n", ps_static_cfg_prms->s_app_tile_params.i4_tiles_enabled_flag);
375 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_uniform_spacing_flag %d \n", ps_static_cfg_prms->s_app_tile_params.i4_uniform_spacing_flag);
376 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_num_tile_cols %d \n", ps_static_cfg_prms->s_app_tile_params.i4_num_tile_cols);
377 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_num_tile_rows %d \n", ps_static_cfg_prms->s_app_tile_params.i4_num_tile_rows);
378
379 for(i4_i = 0; i4_i < ps_static_cfg_prms->s_app_tile_params.i4_num_tile_cols; i4_i++)
380 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_column_width[i4_i] %d \n", ps_static_cfg_prms->s_app_tile_params.ai4_column_width[i4_i]);
381
382 for(i4_i = 0; i4_i < ps_static_cfg_prms->s_app_tile_params.i4_num_tile_rows; i4_i++)
383 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_row_height[i4_i] %d \n", ps_static_cfg_prms->s_app_tile_params.ai4_row_height[i4_i]);
384
385 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\nIHEVCE : ps_static_cfg_prms->s_slice_params\n");
386 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_slice_segment_mode %d \n", ps_static_cfg_prms->s_slice_params.i4_slice_segment_mode);
387 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_slice_segment_argument %d \n", ps_static_cfg_prms->s_slice_params.i4_slice_segment_argument);
388
389 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\nIHEVCE : ps_static_cfg_prms->s_vui_sei_prms\n");
390 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : u1_aspect_ratio_info_present_flag %d \n", ps_static_cfg_prms->s_vui_sei_prms.u1_aspect_ratio_info_present_flag);
391
392 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : u1_aspect_ratio_idc ");
393 for(i4_resolution_id_loop = 0; i4_resolution_id_loop < i4_num_res_layers; i4_resolution_id_loop++)
394 {
395 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "res_id %d %d ", i4_resolution_id_loop, ps_static_cfg_prms->s_vui_sei_prms.au1_aspect_ratio_idc[i4_resolution_id_loop]);
396 }
397
398 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\nIHEVCE : au2_sar_width ");
399 for(i4_resolution_id_loop = 0; i4_resolution_id_loop < i4_num_res_layers; i4_resolution_id_loop++)
400 {
401 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "res_id %d %d ", i4_resolution_id_loop, ps_static_cfg_prms->s_vui_sei_prms.au2_sar_width[i4_resolution_id_loop]);
402 }
403 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\nIHEVCE : au2_sar_width ");
404 for(i4_resolution_id_loop = 0; i4_resolution_id_loop < i4_num_res_layers; i4_resolution_id_loop++)
405 {
406 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "res_id %d %d ", i4_resolution_id_loop, ps_static_cfg_prms->s_vui_sei_prms.au2_sar_height[i4_resolution_id_loop]);
407 }
408 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\nIHEVCE : u1_overscan_info_present_flag %d \n", ps_static_cfg_prms->s_vui_sei_prms.u1_overscan_info_present_flag);
409 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : u1_overscan_appropriate_flag %d \n", ps_static_cfg_prms->s_vui_sei_prms.u1_overscan_appropriate_flag);
410 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : u1_video_signal_type_present_flag %d \n", ps_static_cfg_prms->s_vui_sei_prms.u1_video_signal_type_present_flag);
411 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : u1_video_format %d \n", ps_static_cfg_prms->s_vui_sei_prms.u1_video_format);
412 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : u1_video_full_range_flag %d \n", ps_static_cfg_prms->s_vui_sei_prms.u1_video_full_range_flag);
413 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : u1_colour_description_present_flag %d \n", ps_static_cfg_prms->s_vui_sei_prms.u1_colour_description_present_flag);
414 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : u1_colour_primaries %d \n", ps_static_cfg_prms->s_vui_sei_prms.u1_colour_primaries);
415 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : u1_transfer_characteristics %d \n", ps_static_cfg_prms->s_vui_sei_prms.u1_transfer_characteristics);
416 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : u1_matrix_coefficients %d \n", ps_static_cfg_prms->s_vui_sei_prms.u1_matrix_coefficients);
417 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : u1_chroma_loc_info_present_flag %d \n", ps_static_cfg_prms->s_vui_sei_prms.u1_chroma_loc_info_present_flag);
418 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : u1_chroma_sample_loc_type_top_field %d \n", ps_static_cfg_prms->s_vui_sei_prms.u1_chroma_sample_loc_type_top_field);
419 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : u1_chroma_sample_loc_type_bottom_field %d \n", ps_static_cfg_prms->s_vui_sei_prms.u1_chroma_sample_loc_type_bottom_field);
420 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : u1_timing_info_present_flag %d \n", ps_static_cfg_prms->s_vui_sei_prms.u1_timing_info_present_flag);
421 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : u1_vui_hrd_parameters_present_flag %d \n", ps_static_cfg_prms->s_vui_sei_prms.u1_vui_hrd_parameters_present_flag);
422 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : u1_nal_hrd_parameters_present_flag %d \n", ps_static_cfg_prms->s_vui_sei_prms.u1_nal_hrd_parameters_present_flag);
423 }
424
425 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "\nIHEVCE : ps_static_cfg_prms \n");
426 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_enable_logo %d \n", ps_static_cfg_prms->i4_enable_logo);
427 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_log_dump_level %d \n", ps_static_cfg_prms->i4_log_dump_level);
428 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "IHEVCE : i4_save_recon %d \n", ps_static_cfg_prms->i4_save_recon);
429
430 PRINTF(ps_sys_api->pv_cb_handle, i4_res_id, i4_br_id, "**********************************************\n");
431 }
432 // clang-format on
433
434 if(ps_static_cfg_prms->s_multi_thrd_prms.i4_num_proc_groups > MAX_NUMBER_PROC_GRPS)
435 {
436 error_code = IHEVCE_UNSUPPORTED_PROC_CONFIG;
437 ps_sys_api->ihevce_printf(
438 pv_cb_handle, "IHEVCE ERROR: Number of Processor Groups not supported \n");
439 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
440 }
441
442 /* Error check for system-api callback functions */
443 if(NULL == ps_sys_api->ihevce_printf)
444 {
445 error_code = IHEVCE_SYSTEM_APIS_NOT_INITIALLIZED;
446 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
447 }
448 if(NULL == ps_sys_api->s_file_io_api.ihevce_fopen)
449 {
450 error_code = IHEVCE_SYSTEM_APIS_NOT_INITIALLIZED;
451 ps_sys_api->ihevce_printf(
452 pv_cb_handle, "IHEVCE ERROR: ihevce_fopen callback function not initiallized\n");
453 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
454 }
455 if(NULL == ps_sys_api->s_file_io_api.ihevce_fclose)
456 {
457 error_code = IHEVCE_SYSTEM_APIS_NOT_INITIALLIZED;
458 ps_sys_api->ihevce_printf(
459 pv_cb_handle, "IHEVCE ERROR: ihevce_fclose callback function not initiallized\n");
460 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
461 }
462 if(NULL == ps_sys_api->s_file_io_api.ihevce_fflush)
463 {
464 error_code = IHEVCE_SYSTEM_APIS_NOT_INITIALLIZED;
465 ps_sys_api->ihevce_printf(
466 pv_cb_handle, "IHEVCE ERROR: ihevce_fflush callback function not initiallized\n");
467 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
468 }
469 if(NULL == ps_sys_api->s_file_io_api.ihevce_fseek)
470 {
471 error_code = IHEVCE_SYSTEM_APIS_NOT_INITIALLIZED;
472 ps_sys_api->ihevce_printf(
473 pv_cb_handle, "IHEVCE ERROR: ihevce_fseek callback function not initiallized\n");
474 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
475 }
476 if(NULL == ps_sys_api->s_file_io_api.ihevce_fread)
477 {
478 error_code = IHEVCE_SYSTEM_APIS_NOT_INITIALLIZED;
479 ps_sys_api->ihevce_printf(
480 pv_cb_handle, "IHEVCE ERROR: ihevce_fread callback function not initiallized\n");
481 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
482 }
483 if(NULL == ps_sys_api->s_file_io_api.ihevce_fscanf)
484 {
485 error_code = IHEVCE_SYSTEM_APIS_NOT_INITIALLIZED;
486 ps_sys_api->ihevce_printf(
487 pv_cb_handle, "IHEVCE ERROR: ihevce_fscanf callback function not initiallized\n");
488 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
489 }
490 if(NULL == ps_sys_api->ihevce_sscanf)
491 {
492 error_code = IHEVCE_SYSTEM_APIS_NOT_INITIALLIZED;
493 ps_sys_api->ihevce_printf(
494 pv_cb_handle, "IHEVCE ERROR: ihevce_sscanf callback function not initiallized\n");
495 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
496 }
497 if(NULL == ps_sys_api->s_file_io_api.ihevce_fprintf)
498 {
499 error_code = IHEVCE_SYSTEM_APIS_NOT_INITIALLIZED;
500 ps_sys_api->ihevce_printf(
501 pv_cb_handle, "IHEVCE ERROR: ihevce_fprintf callback function not initiallized\n");
502 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
503 }
504 if(NULL == ps_sys_api->s_file_io_api.ihevce_fwrite)
505 {
506 error_code = IHEVCE_SYSTEM_APIS_NOT_INITIALLIZED;
507 ps_sys_api->ihevce_printf(
508 pv_cb_handle, "IHEVCE ERROR: ihevce_fwrite callback function not initiallized\n");
509 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
510 }
511 if(NULL == ps_sys_api->ihevce_sprintf)
512 {
513 error_code = IHEVCE_SYSTEM_APIS_NOT_INITIALLIZED;
514 ps_sys_api->ihevce_printf(
515 pv_cb_handle, "IHEVCE ERROR: ihevce_sprintf callback function not initiallized\n");
516 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
517 }
518
519 /* Error check for static source parameters */
520 if((ps_static_cfg_prms->s_src_prms.i4_orig_width > HEVCE_MAX_WIDTH) ||
521 (ps_static_cfg_prms->s_src_prms.i4_orig_width < 2))
522 {
523 error_code = IHEVCE_WIDTH_NOT_SUPPORTED;
524 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: i4_src_width out of range \n");
525 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
526 }
527
528 if((ps_static_cfg_prms->s_src_prms.i4_orig_height > HEVCE_MAX_HEIGHT) ||
529 (ps_static_cfg_prms->s_src_prms.i4_orig_height < 2))
530 {
531 error_code = IHEVCE_HEIGHT_NOT_SUPPORTED;
532 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: i4_src_height out of range \n");
533 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
534 }
535 /*check for odd resolution*/
536 if(0 != (ps_static_cfg_prms->s_src_prms.i4_width & 1))
537 {
538 error_code = IHEVCE_WIDTH_NOT_SUPPORTED;
539 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: i4_src_width not supported \n");
540 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
541 }
542 if(0 != (ps_static_cfg_prms->s_src_prms.i4_height & 1))
543 {
544 error_code = IHEVCE_HEIGHT_NOT_SUPPORTED;
545 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: i4_src_height not supported \n");
546 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
547 }
548
549 if((ps_static_cfg_prms->s_src_prms.i4_frm_rate_denom != 1000) &&
550 (ps_static_cfg_prms->s_src_prms.i4_frm_rate_denom != 1001))
551 {
552 error_code = IHEVCE_FRAME_RATE_NOT_SUPPORTED;
553 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: frame rate denom not supported \n");
554 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
555 }
556
557 if((((ps_static_cfg_prms->s_src_prms.i4_frm_rate_num * 1.0) /
558 ps_static_cfg_prms->s_src_prms.i4_frm_rate_denom) > MAX_FRAME_RATE) ||
559 (((ps_static_cfg_prms->s_src_prms.i4_frm_rate_num * 1.0) /
560 ps_static_cfg_prms->s_src_prms.i4_frm_rate_denom) < MIN_FRAME_RATE))
561 {
562 error_code = IHEVCE_FRAME_RATE_NOT_SUPPORTED;
563 ps_sys_api->ihevce_printf(
564 pv_cb_handle,
565 "IHEVCE ERROR: Frame rate (%d / %d) is out of range [%.1f - %.1f]\n",
566 ps_static_cfg_prms->s_src_prms.i4_frm_rate_num,
567 ps_static_cfg_prms->s_src_prms.i4_frm_rate_denom,
568 MIN_FRAME_RATE, MAX_FRAME_RATE);
569 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
570 }
571
572 if(ps_static_cfg_prms->s_src_prms.i4_field_pic != 0)
573 {
574 error_code = IHEVCE_CONTENT_TYPE_NOT_SUPPORTED;
575 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: Field encoding not supported \n");
576 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
577 }
578
579 if(ps_static_cfg_prms->s_src_prms.inp_chr_format != IV_YUV_420SP_UV &&
580 ps_static_cfg_prms->s_src_prms.inp_chr_format != IV_YUV_420P)
581 {
582 error_code = IHEVCE_CHROMA_FORMAT_NOT_SUPPORTED;
583 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: i4_input_chroma_format Invalid \n");
584 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
585 }
586
587 if(ps_static_cfg_prms->s_src_prms.i4_chr_format != IV_YUV_420SP_UV)
588 {
589 error_code = IHEVCE_CHROMA_FORMAT_NOT_SUPPORTED;
590 ps_sys_api->ihevce_printf(
591 pv_cb_handle, "IHEVCE ERROR: i4_internal_chroma_format Invalid \n");
592 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
593 }
594
595 /* Check error for interoperability flags */
596 if(ps_static_cfg_prms->s_out_strm_prms.i4_interop_flags != 0)
597 {
598 error_code = IHEVCE_INTEROPERABILITY_FLAG_SUPPORTED;
599 ps_sys_api->ihevce_printf(
600 pv_cb_handle, "IHEVCE ERROR: i4_interop_flags out of range, to be set to 0\n");
601 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
602 }
603
604 /* Error check for static output stream parameters */
605 if(ps_static_cfg_prms->s_out_strm_prms.i4_codec_type != 0)
606 {
607 error_code = IHEVCE_CODEC_NOT_SUPPORTED;
608 ps_sys_api->ihevce_printf(
609 pv_cb_handle, "IHEVCE ERROR: i4_codec_type should be set to 0 \n");
610 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
611 }
612
613 if(ps_static_cfg_prms->s_out_strm_prms.i4_codec_profile != 1)
614 {
615 error_code = IHEVCE_CODEC_PROFILE_NOT_SUPPORTED;
616 ps_sys_api->ihevce_printf(
617 pv_cb_handle, "IHEVCE ERROR: i4_codec_profile should be set to 1 \n");
618 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
619 }
620
621 if(ps_static_cfg_prms->s_tgt_lyr_prms.i4_internal_bit_depth != 8)
622 {
623 error_code = IHEVCE_OUTPUT_BIT_DEPTH_OUT_OF_RANGE;
624 ps_sys_api->ihevce_printf(
625 pv_cb_handle,
626 "IHEVCE ERROR: (output_bit_depth = %d) not supported \n",
627 ps_static_cfg_prms->s_tgt_lyr_prms.i4_internal_bit_depth);
628 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
629 }
630
631 if(ps_static_cfg_prms->s_src_prms.i4_input_bit_depth != 8)
632 {
633 error_code = IHEVCE_INPUT_BIT_DEPTH_OUT_OF_RANGE;
634 ps_sys_api->ihevce_printf(
635 pv_cb_handle, "IHEVCE ERROR: i4_input_bit_depth value not supported \n");
636 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
637 }
638
639 if((ps_static_cfg_prms->s_out_strm_prms.i4_vui_enable > 1) ||
640 (ps_static_cfg_prms->s_out_strm_prms.i4_vui_enable < 0))
641 {
642 error_code = IHEVCE_VUI_ENABLE_OUT_OF_RANGE;
643 ps_sys_api->ihevce_printf(
644 pv_cb_handle, "IHEVCE ERROR: i4_vui_enable should be set to 1 or 0 \n");
645 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
646 }
647
648 if((ps_static_cfg_prms->s_out_strm_prms.i4_sei_enable_flag > 1) ||
649 (ps_static_cfg_prms->s_out_strm_prms.i4_sei_enable_flag < 0))
650 {
651 error_code = IHEVCE_SEI_ENABLE_OUT_OF_RANGE;
652 ps_sys_api->ihevce_printf(
653 pv_cb_handle, "IHEVCE ERROR: i4_sei_enable_flags should be set to 1 or 0 \n");
654 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
655 }
656
657 if((ps_static_cfg_prms->s_out_strm_prms.i4_sei_payload_enable_flag > 1) ||
658 (ps_static_cfg_prms->s_out_strm_prms.i4_sei_payload_enable_flag < 0))
659 {
660 error_code = IHEVCE_SEI_PAYLOAD_ENABLE_OUT_OF_RANGE;
661 ps_sys_api->ihevce_printf(
662 pv_cb_handle, "IHEVCE ERROR: i4_sei_payload_enable_flag should be set to 1 or 0 \n");
663 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
664 }
665 if((ps_static_cfg_prms->s_multi_thrd_prms.i4_max_num_cores > MAX_NUM_CORES) ||
666 (ps_static_cfg_prms->s_multi_thrd_prms.i4_max_num_cores < 1))
667 {
668 error_code = IHEVCE_INVALID_CORE_CONFIG;
669 ps_sys_api->ihevce_printf(
670 pv_cb_handle, "IHEVCE ERROR: Invalid Number of Cores configured\n");
671 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
672 }
673
674 if((ps_static_cfg_prms->e_arch_type != ARCH_NA) &&
675 (ps_static_cfg_prms->e_arch_type != ARCH_ARM_NONEON))
676 {
677 error_code = IHEVCE_ARCHITECTURE_TYPE_UNSUPPORTED;
678 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: unsupported archType \n");
679 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
680 }
681
682 if(ps_static_cfg_prms->s_coding_tools_prms.i4_vqet != 0)
683 {
684 error_code = IHEVCE_VISUAL_QUALITY_ENHANCEMENTS_TOGGLER_VALUE_UNSUPPORTED;
685 ps_sys_api->ihevce_printf(
686 pv_cb_handle,
687 "IHEVCE ERROR: visual_quality_enhancements_toggler should be set to 0 \n");
688 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
689 }
690
691 if(ps_static_cfg_prms->s_coding_tools_prms.i4_max_temporal_layers < 0 ||
692 ps_static_cfg_prms->s_coding_tools_prms.i4_max_temporal_layers > 3)
693 {
694 error_code = IHEVCE_TEMPORAL_LAYERS_NOT_SUPPORTED;
695 ps_sys_api->ihevce_printf(
696 pv_cb_handle, "IHEVCE ERROR: i4_max_temporal_layers out of range \n");
697 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
698 }
699
700 if((ps_static_cfg_prms->s_coding_tools_prms.i4_max_closed_gop_period < 0) ||
701 (ps_static_cfg_prms->s_coding_tools_prms.i4_max_cra_open_gop_period < 0) ||
702 (ps_static_cfg_prms->s_coding_tools_prms.i4_max_i_open_gop_period < 0))
703 {
704 error_code = IHEVCE_INVALID_GOP_PERIOD;
705 ps_sys_api->ihevce_printf(
706 pv_cb_handle,
707 "IHEVCE ERROR: gop period is not valid for the configured temporal layers\n");
708 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
709 }
710
711 {
712 WORD32 sub_gop_size = (1 << ps_static_cfg_prms->s_coding_tools_prms.i4_max_temporal_layers)
713 << ps_static_cfg_prms->s_src_prms.i4_field_pic;
714 WORD32 i4_max_idr_period, i4_min_idr_period, i4_max_cra_period, i4_max_i_period;
715 WORD32 i4_max_i_distance;
716 WORD32 i4_min_i_distance = 0, i4_non_zero_idr_period = 0x7FFFFFFF,
717 i4_non_zero_cra_period = 0x7FFFFFFF, i4_non_zero_i_period = 0x7FFFFFFF;
718 i4_max_idr_period = ps_static_cfg_prms->s_coding_tools_prms.i4_max_closed_gop_period;
719 i4_min_idr_period = ps_static_cfg_prms->s_coding_tools_prms.i4_min_closed_gop_period;
720 i4_max_cra_period = ps_static_cfg_prms->s_coding_tools_prms.i4_max_cra_open_gop_period;
721 i4_max_i_period = ps_static_cfg_prms->s_coding_tools_prms.i4_max_i_open_gop_period;
722 i4_max_i_distance = MAX(MAX(i4_max_idr_period, i4_max_cra_period), i4_max_i_period);
723
724 if(sub_gop_size > 1)
725 {
726 switch(sub_gop_size)
727 {
728 case 2:
729 ps_static_cfg_prms->s_coding_tools_prms.i4_max_closed_gop_period =
730 ALIGN2(i4_max_idr_period);
731
732 if(i4_max_idr_period > 1)
733 ps_static_cfg_prms->s_coding_tools_prms.i4_max_closed_gop_period =
734 ps_static_cfg_prms->s_coding_tools_prms.i4_max_closed_gop_period + 1;
735
736 ps_static_cfg_prms->s_coding_tools_prms.i4_max_cra_open_gop_period =
737 ALIGN2(i4_max_cra_period);
738 ps_static_cfg_prms->s_coding_tools_prms.i4_max_i_open_gop_period =
739 ALIGN2(i4_max_i_period);
740 break;
741 case 4:
742 ps_static_cfg_prms->s_coding_tools_prms.i4_max_closed_gop_period =
743 ALIGN4(i4_max_idr_period);
744
745 if(i4_max_idr_period > 1)
746 ps_static_cfg_prms->s_coding_tools_prms.i4_max_closed_gop_period =
747 ps_static_cfg_prms->s_coding_tools_prms.i4_max_closed_gop_period + 1;
748
749 ps_static_cfg_prms->s_coding_tools_prms.i4_max_cra_open_gop_period =
750 ALIGN4(i4_max_cra_period);
751 ps_static_cfg_prms->s_coding_tools_prms.i4_max_i_open_gop_period =
752 ALIGN4(i4_max_i_period);
753 break;
754 case 8:
755 ps_static_cfg_prms->s_coding_tools_prms.i4_max_closed_gop_period =
756 ALIGN8(i4_max_idr_period);
757
758 if(i4_max_idr_period > 1)
759 ps_static_cfg_prms->s_coding_tools_prms.i4_max_closed_gop_period =
760 ps_static_cfg_prms->s_coding_tools_prms.i4_max_closed_gop_period + 1;
761
762 ps_static_cfg_prms->s_coding_tools_prms.i4_max_cra_open_gop_period =
763 ALIGN8(i4_max_cra_period);
764 ps_static_cfg_prms->s_coding_tools_prms.i4_max_i_open_gop_period =
765 ALIGN8(i4_max_i_period);
766 break;
767 }
768 }
769
770 if(0 != i4_max_idr_period)
771 {
772 i4_non_zero_idr_period = i4_max_idr_period;
773 }
774 if(0 != i4_max_cra_period)
775 {
776 i4_non_zero_cra_period = i4_max_cra_period;
777 }
778 if(0 != i4_max_i_period)
779 {
780 i4_non_zero_i_period = i4_max_i_period;
781 }
782 i4_min_i_distance =
783 MIN(MIN(i4_non_zero_idr_period, i4_non_zero_cra_period), i4_non_zero_i_period);
784 if(i4_min_i_distance < sub_gop_size && i4_min_i_distance)
785 {
786 error_code = IHEVCE_INVALID_GOP_PERIOD;
787 ps_sys_api->ihevce_printf(
788 pv_cb_handle,
789 "IHEVCE ERROR: gop period is not valid for the configured temporal layers\n");
790 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
791 }
792
793 if((i4_min_idr_period > i4_max_idr_period) || (i4_min_idr_period < 0))
794 {
795 error_code = IHEVCE_INVALID_GOP_PERIOD;
796 ps_sys_api->ihevce_printf(
797 pv_cb_handle,
798 "IHEVCE ERROR: gop period is not valid => min closed gop > max closed gop\n");
799 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
800 }
801 if(ps_static_cfg_prms->s_coding_tools_prms.i4_max_temporal_layers && i4_max_i_distance == 1)
802 {
803 error_code = IHEVCE_TEMPORAL_LAYERS_NOT_SUPPORTED;
804 ps_sys_api->ihevce_printf(
805 pv_cb_handle, "IHEVCE ERROR: Invalid max temporal layer for I only encoding\n");
806 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
807 }
808 if((i4_max_idr_period < i4_max_cra_period || i4_max_idr_period < i4_max_i_period) &&
809 i4_max_idr_period)
810 {
811 error_code = IHEVCE_INVALID_GOP_PERIOD;
812 ps_sys_api->ihevce_printf(
813 pv_cb_handle,
814 "IHEVCE ERROR: MAX IDR period can't be less than Max CRA or I period\n");
815 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
816 }
817 if((i4_max_cra_period < i4_max_i_period) && i4_max_cra_period)
818 {
819 error_code = IHEVCE_INVALID_GOP_PERIOD;
820 ps_sys_api->ihevce_printf(
821 pv_cb_handle, "IHEVCE ERROR: MAX CRA period can't be less than Max I period\n");
822 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
823 }
824 }
825 if(0 != ps_static_cfg_prms->s_tgt_lyr_prms.i4_enable_temporal_scalability)
826 {
827 error_code = IHEVCE_INVALID_TEMPORAL_SCALABILITY;
828 ps_sys_api->ihevce_printf(
829 pv_cb_handle, "IHEVCE ERROR: Temporal scalability is not supported \n");
830 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
831 }
832
833 if(ps_static_cfg_prms->s_coding_tools_prms.i4_max_reference_frames != -1)
834 {
835 error_code = IHEVCE_REF_FRAMES_NOT_SUPPORTED;
836 ps_sys_api->ihevce_printf(
837 pv_cb_handle, "IHEVCE ERROR: only supported value for i4_max_reference_frames is -1\n");
838 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
839 }
840
841 if(ps_static_cfg_prms->s_coding_tools_prms.i4_weighted_pred_enable != 0 &&
842 ps_static_cfg_prms->s_coding_tools_prms.i4_weighted_pred_enable != 1)
843 {
844 error_code = IHEVCE_INVALID_WEIGHTED_PREDICTION_INPUT;
845 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: i4_weighted_pred_enable invalid \n");
846 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
847 }
848
849 if(ps_static_cfg_prms->s_coding_tools_prms.i4_deblocking_type != 0 &&
850 ps_static_cfg_prms->s_coding_tools_prms.i4_deblocking_type != 1 &&
851 ps_static_cfg_prms->s_coding_tools_prms.i4_deblocking_type != 2)
852 {
853 error_code = IHEVCE_INVALID_DEBLOCKING_TYPE_INPUT;
854 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: i4_deblocking_type invalid\n");
855 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
856 }
857
858 if(ps_static_cfg_prms->s_coding_tools_prms.i4_use_default_sc_mtx != 0 &&
859 ps_static_cfg_prms->s_coding_tools_prms.i4_use_default_sc_mtx != 1)
860 {
861 error_code = IHEVCE_INVALID_DEFAULT_SC_MATRIX_ENABLE_INPUT;
862 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: i4_use_default_sc_mtx invalid \n");
863 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
864 }
865
866 if(ps_static_cfg_prms->s_coding_tools_prms.i4_cropping_mode != 0 &&
867 ps_static_cfg_prms->s_coding_tools_prms.i4_cropping_mode != 1)
868 {
869 error_code = IHEVCE_INVALID_CROPPING_MODE;
870 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: i4_cropping_mode invalid \n");
871 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
872 }
873
874 /* Error checks for Static Config Parameters */
875 if(ps_static_cfg_prms->s_config_prms.i4_min_log2_cu_size != 3)
876 {
877 error_code = IHEVCE_MIN_CU_SIZE_INPUT_NOT_SUPPORTED;
878 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: i4_min_log2_cu_size invalid \n");
879 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
880 }
881
882 if(ps_static_cfg_prms->s_config_prms.i4_min_log2_tu_size != 2)
883 {
884 error_code = IHEVCE_MIN_TU_SIZE_INPUT_NOT_SUPPORTED;
885 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: i4_min_log2_tu_size invalid \n");
886 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
887 }
888
889 if(ps_static_cfg_prms->s_config_prms.i4_max_log2_cu_size < 4 ||
890 ps_static_cfg_prms->s_config_prms.i4_max_log2_cu_size > 6)
891 {
892 error_code = IHEVCE_MAX_CU_SIZE_INPUT_NOT_SUPPORTED;
893 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: i4_max_log2_cu_size invalid \n");
894 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
895 }
896
897 if(ps_static_cfg_prms->s_config_prms.i4_max_log2_tu_size < 2 ||
898 ps_static_cfg_prms->s_config_prms.i4_max_log2_tu_size > 5)
899 {
900 error_code = IHEVCE_MAX_TU_SIZE_INPUT_NOT_SUPPORTED;
901 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: i4_max_log2_tu_size invalid \n");
902 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
903 }
904
905 if(ps_static_cfg_prms->s_config_prms.i4_min_log2_cu_size == 4 &&
906 ps_static_cfg_prms->s_config_prms.i4_max_log2_tu_size == 5)
907 {
908 /* Because tu size should always be lesser than the cu size */
909 error_code = IHEVCE_INVALID_MAX_TU_SIZE;
910 ps_sys_api->ihevce_printf(
911 pv_cb_handle,
912 "IHEVCE ERROR: Invalid combination of i4_min_log2_cu_size and i4_max_log2_tu_size\n");
913 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
914 }
915
916 if(ps_static_cfg_prms->s_config_prms.i4_max_tr_tree_depth_I < 1 ||
917 ps_static_cfg_prms->s_config_prms.i4_max_tr_tree_depth_I > 3)
918 {
919 error_code = IHEVCE_INVALID_TR_TREE_DEPTH_FOR_I_FRAME;
920 ps_sys_api->ihevce_printf(
921 pv_cb_handle, "IHEVCE ERROR: i4_max_tr_tree_depth_I out of range\n");
922 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
923 }
924
925 if(ps_static_cfg_prms->s_config_prms.i4_max_tr_tree_depth_nI < 1 ||
926 ps_static_cfg_prms->s_config_prms.i4_max_tr_tree_depth_nI > 4)
927 {
928 error_code = IHEVCE_INVALID_TR_TREE_DEPTH;
929 ps_sys_api->ihevce_printf(
930 pv_cb_handle, "IHEVCE ERROR: i4_max_tr_tree_depth_nI out of range\n");
931 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
932 }
933
934 if(ps_static_cfg_prms->s_config_prms.i4_max_search_range_horz < 64 ||
935 ps_static_cfg_prms->s_config_prms.i4_max_search_range_horz > 512)
936 {
937 error_code = IHEVCE_UNSUPPORTED_HORIZONTAL_SEARCH_RANGE;
938 ps_sys_api->ihevce_printf(
939 pv_cb_handle, "IHEVCE ERROR: i4_max_search_range_horz out of range\n");
940 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
941 }
942
943 if(ps_static_cfg_prms->s_config_prms.i4_max_search_range_vert < 32 ||
944 ps_static_cfg_prms->s_config_prms.i4_max_search_range_vert > 256)
945 {
946 error_code = IHEVCE_UNSUPPORTED_VERTICAL_SEARCH_RANGE;
947 ps_sys_api->ihevce_printf(
948 pv_cb_handle, "IHEVCE ERROR: i4_max_search_range_vert out of range\n");
949 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
950 }
951
952 if(ps_static_cfg_prms->s_lap_prms.i4_rc_look_ahead_pics > NUM_LAP2_LOOK_AHEAD ||
953 ps_static_cfg_prms->s_lap_prms.i4_rc_look_ahead_pics < 0)
954 {
955 error_code = IHEVCE_UNSUPPORTED_LOOK_AHEAD;
956 ps_sys_api->ihevce_printf(
957 pv_cb_handle,
958 "IHEVCE ERROR: rc look ahead pc must be in range of 0 to NUM_LAP2_LOOK_AHEAD\n");
959 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
960 }
961
962 /* Num res instances should be less than equal to IHEVCE_MAX_NUM_RESOLUTIONS */
963 if((i4_num_resolutions < 1) || (i4_num_resolutions > IHEVCE_MAX_NUM_RESOLUTIONS))
964 {
965 error_code = IHEVCE_NUM_MAX_RESOLUTIONS_NOT_SUPPORTED;
966 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: invalid i4_num_resolutions \n");
967 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
968 }
969
970 if((ps_static_cfg_prms->i4_res_id < 0) || (ps_static_cfg_prms->i4_res_id >= i4_num_resolutions))
971 {
972 error_code = IHEVCE_NUM_MAX_RESOLUTIONS_NOT_SUPPORTED;
973 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: invalid i4_num_resolutions \n");
974 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
975 }
976
977 if((ps_static_cfg_prms->s_tgt_lyr_prms.i4_mres_single_out < 0) ||
978 (ps_static_cfg_prms->s_tgt_lyr_prms.i4_mres_single_out > 1))
979 {
980 error_code = IHEVCE_INVALID_MRES_SINGLE_OUT;
981 ps_sys_api->ihevce_printf(
982 pv_cb_handle, "IHEVCE ERROR: invalid i4_mres_single_out value \n");
983 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
984 }
985
986 if((ps_static_cfg_prms->i4_save_recon) &&
987 (1 == ps_static_cfg_prms->s_tgt_lyr_prms.i4_mres_single_out))
988 {
989 ps_sys_api->ihevce_printf(
990 pv_cb_handle,
991 "IHEVCE WARNING: i4_save_recon not supported for mres single out case \n");
992 ps_static_cfg_prms->i4_save_recon = 0;
993 }
994
995 if((1 == i4_num_resolutions) && (1 == ps_static_cfg_prms->s_tgt_lyr_prms.i4_mres_single_out))
996 {
997 ps_sys_api->ihevce_printf(
998 pv_cb_handle,
999 "IHEVCE WARNING: i4_mres_single_out value changed to 0 for single resolution case \n");
1000 ps_static_cfg_prms->s_tgt_lyr_prms.i4_mres_single_out = 0;
1001 }
1002
1003 if(ps_static_cfg_prms->s_tgt_lyr_prms.i4_mbr_quality_setting < 0 ||
1004 ps_static_cfg_prms->s_tgt_lyr_prms.i4_mbr_quality_setting > 3)
1005 {
1006 error_code = IHEVCE_INVALID_MBR_QUALITY_SETTING;
1007 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: invalid mbr quality setting\n");
1008 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1009 }
1010
1011 if(ps_static_cfg_prms->s_tgt_lyr_prms.i4_multi_res_layer_reuse != 0)
1012 {
1013 error_code = IHEVCE_MULTI_RES_LAYER_REUSE_NOT_SUPPORTED;
1014 ps_sys_api->ihevce_printf(
1015 pv_cb_handle,
1016 "IHEVCE ERROR: reuse of info across resolution is not currently supported \n");
1017 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
1018 }
1019
1020 for(i4_resolution_id = 0; i4_resolution_id < i4_num_resolutions; i4_resolution_id++)
1021 {
1022 WORD32 codec_level_index, quality_preset, height, width, frm_rate_scale_factor;
1023 WORD32 br_ctr;
1024 UWORD32 u4_luma_sample_rate;
1025 WORD32 max_dpb_size;
1026 WORD32 i4_field_pic = ps_static_cfg_prms->s_src_prms.i4_field_pic;
1027
1028 codec_level_index = ihevce_get_level_index(
1029 ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_codec_level);
1030 quality_preset =
1031 ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_quality_preset;
1032 height = ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_height;
1033 width = ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_width;
1034 frm_rate_scale_factor = ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
1035 .i4_frm_rate_scale_factor;
1036 /* Check error for max picture size(luma) for the given level */
1037 if((width * height) > g_as_level_data[codec_level_index].i4_max_luma_picture_size)
1038 {
1039 error_code = IHEVCE_PIC_SIZE_NOT_SUPPORTED;
1040 ps_sys_api->ihevce_printf(
1041 pv_cb_handle,
1042 "IHEVCE ERROR: (i4_tgt_width * i4_tgt_height) out of range for resolution number "
1043 "'%d' codec level %d "
1044 "\n",
1045 i4_resolution_id,
1046 codec_level_index);
1047 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1048 }
1049
1050 if((width * height) <= (g_as_level_data[codec_level_index].i4_max_luma_picture_size >> 2))
1051 {
1052 max_dpb_size = 16;
1053 }
1054 else if((width * height) <= (g_as_level_data[codec_level_index].i4_max_luma_picture_size >> 1))
1055 {
1056 max_dpb_size = 12;
1057 }
1058 else if(
1059 (width * height) <=
1060 (3 * g_as_level_data[codec_level_index].i4_max_luma_picture_size >> 2))
1061 {
1062 max_dpb_size = 8;
1063 }
1064 else
1065 {
1066 max_dpb_size = 6;
1067 }
1068
1069 /* DPB check */
1070 if((((DEFAULT_MAX_REFERENCE_PICS - i4_field_pic) /*max reference*/ + 2) << i4_field_pic) >
1071 max_dpb_size)
1072 {
1073 error_code = IHEVCE_CODEC_LEVEL_NOT_SUPPORTED;
1074 ps_sys_api->ihevce_printf(
1075 pv_cb_handle, "IHEVCE ERROR: i4_codec_level should be set correct \n");
1076 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
1077 }
1078
1079 if((quality_preset > IHEVCE_QUALITY_P7) || (quality_preset < 0) || (quality_preset == 1))
1080 {
1081 error_code = IHEVCE_INVALID_QUALITY_PRESET_INPUT;
1082 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: i4_quality_preset invalid \n");
1083 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
1084 }
1085
1086 /* Error checks for target width and height */
1087 if((height > HEVCE_MAX_HEIGHT) || (height < HEVCE_MIN_HEIGHT) ||
1088 (height != ps_static_cfg_prms->s_src_prms.i4_height))
1089 {
1090 error_code = IHEVCE_TGT_HEIGHT_NOT_SUPPORTED;
1091 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: Target height not supported\n");
1092 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
1093 }
1094
1095 if((width > HEVCE_MAX_WIDTH) || (width < HEVCE_MIN_WIDTH) ||
1096 (width != ps_static_cfg_prms->s_src_prms.i4_width))
1097 {
1098 error_code = IHEVCE_TGT_WIDTH_NOT_SUPPORTED;
1099 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: Target width not supported\n");
1100 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
1101 }
1102
1103 /* Error checks for the codec level */
1104 if(ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_codec_level >
1105 LEVEL6)
1106 {
1107 error_code = IHEVCE_CODEC_LEVEL_NOT_SUPPORTED;
1108 ps_sys_api->ihevce_printf(
1109 pv_cb_handle,
1110 "IHEVCE ERROR: i4_codec_level should be set to a max value of 153 \n");
1111 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
1112 }
1113
1114 if(frm_rate_scale_factor != 1)
1115 {
1116 error_code = IHEVCE_TGT_FRAME_RATE_SCALING_NOT_SUPPORTED;
1117 ps_sys_api->ihevce_printf(
1118 pv_cb_handle, "IHEVCE ERROR: Target frame rate scaler should be 1 \n");
1119 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
1120 }
1121
1122 u4_luma_sample_rate = (UWORD32)(width * height);
1123 u4_luma_sample_rate *= (UWORD32)(
1124 ps_static_cfg_prms->s_src_prms.i4_frm_rate_num /
1125 (ps_static_cfg_prms->s_src_prms.i4_frm_rate_denom * frm_rate_scale_factor));
1126 /* Check error for max samples rate (frame rate * luma picture size) for the given level */
1127 if(u4_luma_sample_rate > g_as_level_data[codec_level_index].u4_max_luma_sample_rate)
1128 {
1129 error_code = IHEVCE_LUMA_SAMPLE_RATE_NOT_SUPPORTED;
1130 ps_sys_api->ihevce_printf(
1131 pv_cb_handle,
1132 "IHEVCE ERROR: input sample rate (i4_src_width * i4_src_height * i4_frm_rate_num / "
1133 "i4_frm_rate_denom ) "
1134 "exceeds u4_max_luma_sample_rate\n");
1135 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1136 }
1137
1138 /* Num instances should be less than equal to IHEVCE_MAX_NUM_BITRATES */
1139 if((ai4_num_bitrate_instances[i4_resolution_id] < 1) ||
1140 (ai4_num_bitrate_instances[i4_resolution_id] > IHEVCE_MAX_NUM_BITRATES))
1141 {
1142 error_code = IHEVCE_INVALID_NUM_BR_INSTANCES;
1143 ps_sys_api->ihevce_printf(
1144 pv_cb_handle, "IHEVCE ERROR: invalid i4_num_bitrate_instances \n");
1145 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1146 }
1147
1148 /* check for codec tier */
1149 if((ps_static_cfg_prms->s_out_strm_prms.i4_codec_tier > HIGH_TIER) ||
1150 (ps_static_cfg_prms->s_out_strm_prms.i4_codec_tier < MAIN_TIER))
1151 {
1152 error_code = IHEVC_CODEC_TIER_NOT_SUPPORTED;
1153 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: Codec tier out of range\n");
1154 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
1155 }
1156
1157 if((ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_codec_level <
1158 120) &&
1159 (ps_static_cfg_prms->s_out_strm_prms.i4_codec_tier == HIGH_TIER))
1160 {
1161 error_code = IHEVC_CODEC_TIER_NOT_SUPPORTED;
1162 ps_sys_api->ihevce_printf(
1163 pv_cb_handle, "IHEVCE ERROR: Codec tier = HIGH TIER Not supported below Level 4\n");
1164 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
1165 }
1166
1167 /* Check error for max bitrate for the given level */
1168 for(br_ctr = 0; br_ctr < ai4_num_bitrate_instances[i4_resolution_id]; br_ctr++)
1169 {
1170 WORD32 frame_qp = ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
1171 .ai4_frame_qp[br_ctr];
1172 WORD32 tgt_bitrate = ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
1173 .ai4_tgt_bitrate[br_ctr];
1174 WORD32 peak_bitrate;
1175
1176 if(frame_qp > 51 || frame_qp <= 0)
1177 {
1178 error_code = IHEVCE_UNSUPPORTED_FRAME_QP;
1179 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: i4_frame_qp out of range\n");
1180 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
1181 }
1182 if((frame_qp < ps_static_cfg_prms->s_config_prms.i4_min_frame_qp) ||
1183 ((frame_qp + ps_static_cfg_prms->s_coding_tools_prms.i4_max_temporal_layers + 1) >
1184 ps_static_cfg_prms->s_config_prms.i4_max_frame_qp))
1185 {
1186 error_code = IHEVCE_UNSUPPORTED_FRAME_QP;
1187 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: i4_frame_qp out of range\n");
1188 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
1189 }
1190
1191 if(tgt_bitrate >
1192 g_as_level_data[codec_level_index]
1193 .i4_max_bit_rate[ps_static_cfg_prms->s_out_strm_prms.i4_codec_tier] *
1194 1000 ||
1195 tgt_bitrate <= 0)
1196 {
1197 error_code = IHEVCE_BITRATE_NOT_SUPPORTED;
1198 ps_sys_api->ihevce_printf(
1199 pv_cb_handle,
1200 "IHEVCE ERROR: i4_tgt_bitrate out of range for resoltuion number %d bitrate "
1201 "number %d\n",
1202 i4_resolution_id,
1203 br_ctr);
1204 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1205 }
1206
1207 peak_bitrate = tgt_bitrate << 1;
1208 peak_bitrate =
1209 MIN(peak_bitrate,
1210 g_as_level_data[codec_level_index]
1211 .i4_max_bit_rate[ps_static_cfg_prms->s_out_strm_prms.i4_codec_tier] *
1212 1000);
1213 ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
1214 .ai4_peak_bitrate[br_ctr] = peak_bitrate;
1215 ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
1216 .ai4_max_vbv_buffer_size[br_ctr] = peak_bitrate;
1217 }
1218 }
1219
1220 if((ps_static_cfg_prms->i4_br_id < 0) ||
1221 (ps_static_cfg_prms->i4_br_id >= ai4_num_bitrate_instances[ps_static_cfg_prms->i4_res_id]))
1222 {
1223 error_code = IHEVCE_INVALID_NUM_BR_INSTANCES;
1224 ps_sys_api->ihevce_printf(
1225 pv_cb_handle, "IHEVCE ERROR: invalid i4_num_bitrate_instances \n");
1226 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1227 }
1228
1229 /* Check error for rate control mode for the given level */
1230 if(ps_static_cfg_prms->s_config_prms.i4_rate_control_mode != 2 &&
1231 ps_static_cfg_prms->s_config_prms.i4_rate_control_mode != 3 &&
1232 ps_static_cfg_prms->s_config_prms.i4_rate_control_mode != 5)
1233 {
1234 error_code = IHEVCE_RATE_CONTROL_MDOE_NOT_SUPPORTED;
1235 ps_sys_api->ihevce_printf(
1236 pv_cb_handle, "IHEVCE ERROR: i4_rate_control_mode out of range\n");
1237 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1238 }
1239
1240 /* Check error for pass number */
1241 if(ps_static_cfg_prms->s_pass_prms.i4_pass != 0)
1242 {
1243 error_code = IHEVCE_RATE_CONTROL_PASS_INVALID;
1244 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: i4_pass out of range\n");
1245 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1246 }
1247
1248 /* Check error for cu level qp modultion for the given level */
1249 if(ps_static_cfg_prms->s_config_prms.i4_cu_level_rc != 0 &&
1250 ps_static_cfg_prms->s_config_prms.i4_cu_level_rc != 1)
1251 {
1252 error_code = IHEVCE_RATE_CONTROL_MDOE_NOT_SUPPORTED;
1253 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: i4_cu_level_rc out of range\n");
1254 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1255 }
1256
1257 /* size error checks for the api structures */
1258 if(ps_static_cfg_prms->i4_size != sizeof(ihevce_static_cfg_params_t))
1259 {
1260 error_code = IHEVCE_INVALID_SIZE;
1261 ps_sys_api->ihevce_printf(
1262 pv_cb_handle,
1263 "IHEVCE ERROR: Size element of ihevce_static_cfg_params_t is not matching with actual "
1264 "size");
1265 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1266 }
1267 if(ps_static_cfg_prms->s_src_prms.i4_size != sizeof(ihevce_src_params_t))
1268 {
1269 error_code = IHEVCE_INVALID_SIZE;
1270 ps_sys_api->ihevce_printf(
1271 pv_cb_handle,
1272 "IHEVCE ERROR: Size element of ihevce_src_params_t is not matching with actual size");
1273 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1274 }
1275 if(ps_static_cfg_prms->s_tgt_lyr_prms.i4_size != sizeof(ihevce_tgt_layer_params_t))
1276 {
1277 error_code = IHEVCE_INVALID_SIZE;
1278 ps_sys_api->ihevce_printf(
1279 pv_cb_handle,
1280 "IHEVCE ERROR: Size element of ihevce_tgt_layer_params_t is not matching with actual "
1281 "size");
1282 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1283 }
1284 if(ps_static_cfg_prms->s_out_strm_prms.i4_size != sizeof(ihevce_out_strm_params_t))
1285 {
1286 error_code = IHEVCE_INVALID_SIZE;
1287 ps_sys_api->ihevce_printf(
1288 pv_cb_handle,
1289 "IHEVCE ERROR: Size element of ihevce_out_strm_params_t is not matching with actual "
1290 "size");
1291 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1292 }
1293 if(ps_static_cfg_prms->s_coding_tools_prms.i4_size != sizeof(ihevce_coding_params_t))
1294 {
1295 error_code = IHEVCE_INVALID_SIZE;
1296 ps_sys_api->ihevce_printf(
1297 pv_cb_handle,
1298 "IHEVCE ERROR: Size element of ihevce_coding_params_t is not matching with actual "
1299 "size");
1300 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1301 }
1302 if(ps_static_cfg_prms->s_config_prms.i4_size != sizeof(ihevce_config_prms_t))
1303 {
1304 error_code = IHEVCE_INVALID_SIZE;
1305 ps_sys_api->ihevce_printf(
1306 pv_cb_handle,
1307 "IHEVCE ERROR: Size element of ihevce_config_prms_t is not matching with actual size");
1308 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1309 }
1310 if(ps_static_cfg_prms->s_multi_thrd_prms.i4_size != sizeof(ihevce_static_multi_thread_params_t))
1311 {
1312 error_code = IHEVCE_INVALID_SIZE;
1313 ps_sys_api->ihevce_printf(
1314 pv_cb_handle,
1315 "IHEVCE ERROR: Size element of ihevce_static_multi_thread_params_t is not matching "
1316 "with actual size");
1317 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1318 }
1319 for(i4_resolution_id = 0; i4_resolution_id < i4_num_resolutions; i4_resolution_id++)
1320 {
1321 if(ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_size !=
1322 sizeof(ihevce_tgt_params_t))
1323 {
1324 error_code = IHEVCE_INVALID_SIZE;
1325 ps_sys_api->ihevce_printf(
1326 pv_cb_handle,
1327 "IHEVCE ERROR: Size element of ihevce_tgt_params_t is not matching with actual "
1328 "size");
1329 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1330 }
1331 }
1332
1333 if(ps_static_cfg_prms->s_lap_prms.i4_size != sizeof(ihevce_lap_params_t))
1334 {
1335 error_code = IHEVCE_INVALID_SIZE;
1336 ps_sys_api->ihevce_printf(
1337 pv_cb_handle,
1338 "IHEVCE ERROR: Size element of ihevce_lap_params_t is not matching with actual size");
1339 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1340 }
1341
1342 for(i4_resolution_id = 0; i4_resolution_id < i4_num_resolutions; i4_resolution_id++)
1343 {
1344 if(ps_static_cfg_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_size !=
1345 sizeof(ihevce_tgt_params_t))
1346 {
1347 error_code = IHEVCE_INVALID_SIZE;
1348 ps_sys_api->ihevce_printf(
1349 pv_cb_handle,
1350 "IHEVCE ERROR: Size element of ihevce_tgt_params_t is not matching with actual "
1351 "size");
1352 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1353 }
1354 }
1355
1356 /* Check SEI related error checks */
1357 if(1 == ps_static_cfg_prms->s_out_strm_prms.i4_sei_enable_flag)
1358 {
1359 WORD32 i;
1360 /* Check values for i4_sei_hash_flags */
1361 if(!((ps_static_cfg_prms->s_out_strm_prms.i4_decoded_pic_hash_sei_flag == 2) ||
1362 (ps_static_cfg_prms->s_out_strm_prms.i4_decoded_pic_hash_sei_flag == 3) ||
1363 (ps_static_cfg_prms->s_out_strm_prms.i4_decoded_pic_hash_sei_flag == 0)))
1364 {
1365 error_code = IHEVCE_SEI_HASH_VALUE_NOT_SUPPORTED;
1366 ps_sys_api->ihevce_printf(
1367 pv_cb_handle, "IHEVCE ERROR: i4_sei_hash_flags out of range\n");
1368 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1369 }
1370
1371 /* Content Light Level Info error check */
1372 if((ps_static_cfg_prms->s_out_strm_prms.i4_sei_cll_enable > 1) ||
1373 (ps_static_cfg_prms->s_out_strm_prms.i4_sei_cll_enable < 0))
1374 {
1375 error_code = IHEVCE_SEI_CLL_ENABLE_OUT_OF_RANGE;
1376 ps_sys_api->ihevce_printf(
1377 pv_cb_handle, "IHEVCE ERROR: i4_sei_cll_enable out of range\n");
1378 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1379 }
1380
1381 if((ps_static_cfg_prms->s_out_strm_prms.i4_sei_buffer_period_flags ||
1382 ps_static_cfg_prms->s_out_strm_prms.i4_sei_pic_timing_flags) &&
1383 (!ps_static_cfg_prms->s_out_strm_prms.i4_vui_enable))
1384 {
1385 error_code = IHEVCE_SEI_ENABLED_VUI_DISABLED;
1386 ps_sys_api->ihevce_printf(
1387 pv_cb_handle,
1388 "IHEVCE ERROR: Both SEI and VUI ought to be enabled when either "
1389 "'i4_sei_buffer_period_flags' or "
1390 "'i4_sei_pic_timing_flags' are enabled\n");
1391 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1392 }
1393
1394 if((1 == ps_static_cfg_prms->s_out_strm_prms.i4_sei_buffer_period_flags) &&
1395 (3 == ps_static_cfg_prms->s_config_prms.i4_rate_control_mode))
1396 {
1397 error_code = IHEVCE_SEI_MESSAGES_DEPENDENCY;
1398 ps_sys_api->ihevce_printf(
1399 pv_cb_handle,
1400 "IHEVCE ERROR: i4_sei_buffer_period_flags should be disabled for CQP mode of Rate "
1401 "control \n");
1402 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1403 }
1404
1405 /* Check values for i4_sei_mastering_disp_colour_vol_flags */
1406 if((ps_static_cfg_prms->s_out_strm_prms.i4_sei_mastering_disp_colour_vol_flags != 0) &&
1407 (ps_static_cfg_prms->s_out_strm_prms.i4_sei_mastering_disp_colour_vol_flags != 1))
1408 {
1409 error_code = IHEVCE_MASTERING_DISP_COL_VOL_OUT_OF_RANGE;
1410 ps_sys_api->ihevce_printf(
1411 pv_cb_handle,
1412 "IHEVCE ERROR: i4_sei_mastering_disp_colour_vol_flags out of range\n");
1413 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1414 }
1415
1416 if(1 == ps_static_cfg_prms->s_out_strm_prms.i4_sei_mastering_disp_colour_vol_flags)
1417 {
1418 /* Check values for u2_display_primaries_x and u2_display_primaries_y */
1419 for(i = 0; i < 3; i++)
1420 {
1421 if((ps_static_cfg_prms->s_out_strm_prms.au2_display_primaries_x[i] > 50000))
1422 {
1423 error_code = IHEVCE_DISPLAY_PRIMARY_X_OUT_OF_RANGE;
1424 ps_sys_api->ihevce_printf(
1425 pv_cb_handle, "IHEVCE ERROR: au2_display_primaries_x out of range\n");
1426 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1427 }
1428
1429 if((ps_static_cfg_prms->s_out_strm_prms.au2_display_primaries_y[i] > 50000))
1430 {
1431 error_code = IHEVCE_DISPLAY_PRIMARY_Y_OUT_OF_RANGE;
1432 ps_sys_api->ihevce_printf(
1433 pv_cb_handle, "IHEVCE ERROR: au2_display_primaries_y out of range\n");
1434 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1435 }
1436 }
1437
1438 if((ps_static_cfg_prms->s_out_strm_prms.u2_white_point_x > 50000))
1439 {
1440 error_code = IHEVCE_WHITE_POINT_X_OUT_OF_RANGE;
1441 ps_sys_api->ihevce_printf(
1442 pv_cb_handle, "IHEVCE ERROR: u2_white_point_x out of range\n");
1443 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1444 }
1445
1446 if((ps_static_cfg_prms->s_out_strm_prms.u2_white_point_y > 50000))
1447 {
1448 error_code = IHEVCE_WHITE_POINT_Y_OUT_OF_RANGE;
1449 ps_sys_api->ihevce_printf(
1450 pv_cb_handle, "IHEVCE ERROR: u2_white_point_y out of range\n");
1451 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1452 }
1453
1454 if(ps_static_cfg_prms->s_out_strm_prms.u4_max_display_mastering_luminance <=
1455 ps_static_cfg_prms->s_out_strm_prms.u4_min_display_mastering_luminance)
1456 {
1457 error_code = IHEVCE_MAX_DISP_MATERING_LUM_OUT_OF_RANGE;
1458 ps_sys_api->ihevce_printf(
1459 pv_cb_handle,
1460 "IHEVCE ERROR: u4_max_display_mastering_luminance should be greater then "
1461 "u4_min_display_mastering_luminance \n");
1462 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1463 }
1464 }
1465 }
1466
1467 if(1 == ps_static_cfg_prms->s_out_strm_prms.i4_vui_enable)
1468 {
1469 /* validate static vui parameters */
1470 if(((ps_static_cfg_prms->s_vui_sei_prms.u1_aspect_ratio_info_present_flag & 0xFE) > 0))
1471 {
1472 error_code = IHEVC_INVALID_ASPECT_RATIO_PARAMS;
1473 ps_sys_api->ihevce_printf(
1474 pv_cb_handle, "IHEVCE ERROR: invalid aspect ratio parameters\n");
1475 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1476 }
1477
1478 if(((ps_static_cfg_prms->s_vui_sei_prms.u1_overscan_info_present_flag & 0xFE) > 0) ||
1479 ((ps_static_cfg_prms->s_vui_sei_prms.u1_overscan_appropriate_flag & 0xFE) > 0))
1480 {
1481 error_code = IHEVC_INVALID_OVERSCAN_PARAMS;
1482 ps_sys_api->ihevce_printf(pv_cb_handle, "IHEVCE ERROR: invalid overscan parameters\n");
1483 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1484 }
1485
1486 if(((ps_static_cfg_prms->s_vui_sei_prms.u1_video_signal_type_present_flag & 0xFE) > 0) ||
1487 (ps_static_cfg_prms->s_vui_sei_prms.u1_video_format > 5) ||
1488 ((ps_static_cfg_prms->s_vui_sei_prms.u1_video_full_range_flag & 0xFE) > 0))
1489 {
1490 error_code = IHEVC_INVALID_VIDEO_PARAMS;
1491 ps_sys_api->ihevce_printf(
1492 pv_cb_handle, "IHEVCE ERROR: invalid video signal type parameters\n");
1493 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1494 }
1495
1496 if(((ps_static_cfg_prms->s_vui_sei_prms.u1_colour_description_present_flag & 0xFE) > 0))
1497 {
1498 error_code = IHEVC_INVALID_COLOUR_PARAMS;
1499 ps_sys_api->ihevce_printf(
1500 pv_cb_handle, "IHEVCE ERROR: invalid colour description parameters\n");
1501 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1502 }
1503
1504 if(((ps_static_cfg_prms->s_vui_sei_prms.u1_chroma_loc_info_present_flag & 0xFE) > 0) ||
1505 (ps_static_cfg_prms->s_vui_sei_prms.u1_chroma_sample_loc_type_top_field > 5) ||
1506 (ps_static_cfg_prms->s_vui_sei_prms.u1_chroma_sample_loc_type_bottom_field > 5))
1507 {
1508 error_code = IHEVC_INVALID_CHROMA_PARAMS;
1509 ps_sys_api->ihevce_printf(
1510 pv_cb_handle, "IHEVCE ERROR: invalid chroma info parameters\n");
1511 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1512 }
1513
1514 if((ps_static_cfg_prms->s_vui_sei_prms.u1_timing_info_present_flag & 0xFE) > 0)
1515 {
1516 error_code = IHEVC_INVALID_TIMING_INFO_PARAM;
1517 ps_sys_api->ihevce_printf(
1518 pv_cb_handle, "IHEVCE ERROR: invalid timing info present flag\n");
1519 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1520 }
1521
1522 if(((ps_static_cfg_prms->s_vui_sei_prms.u1_vui_hrd_parameters_present_flag & 0xFE) > 0) ||
1523 ((ps_static_cfg_prms->s_vui_sei_prms.u1_nal_hrd_parameters_present_flag & 0xFE) > 0))
1524 {
1525 error_code = IHEVC_INVALID_HRD_PRESENT_PARAMS;
1526 ps_sys_api->ihevce_printf(
1527 pv_cb_handle, "IHEVCE ERROR: invalid vui or vcl hrd parameters present flag\n");
1528 return (IHEVCE_SETUNSUPPORTEDINPUT(error_code));
1529 }
1530 }
1531
1532 error_code = ihevce_validate_tile_config_params(ps_static_cfg_prms);
1533 if(IHEVCE_SUCCESS != error_code)
1534 {
1535 return error_code;
1536 }
1537
1538 if(ps_static_cfg_prms->s_slice_params.i4_slice_segment_mode != 0)
1539 {
1540 error_code = IHEVCE_BAD_SLICE_PARAMS;
1541 ps_sys_api->ihevce_printf(
1542 pv_cb_handle, "IHEVCE ERROR: i4_slice_segment_mode should be 0 \n");
1543 return IHEVCE_SETUNSUPPORTEDINPUT(error_code);
1544 }
1545
1546 return IHEVCE_SUCCESS;
1547 }
1548
1549 /*!
1550 ******************************************************************************
1551 * \if Function name : ihevce_get_level_index \endif
1552 *
1553 * \brief
1554 * This function returns the index of level based on codec_level value
1555 * Please see the LEVEL_T enum def
1556 *
1557 * \param[in] Codec Level
1558 *
1559 * \return
1560 * Index of Codec level
1561 *
1562 * \author
1563 * Ittiam
1564 *
1565 *****************************************************************************
1566 */
ihevce_get_level_index(WORD32 i4_codec_level)1567 WORD32 ihevce_get_level_index(WORD32 i4_codec_level)
1568 {
1569 switch(i4_codec_level)
1570 {
1571 case LEVEL1:
1572 return 0;
1573 case LEVEL2:
1574 return 1;
1575 case LEVEL2_1:
1576 return 2;
1577 case LEVEL3:
1578 return 3;
1579 case LEVEL3_1:
1580 return 4;
1581 case LEVEL4:
1582 return 5;
1583 case LEVEL4_1:
1584 return 6;
1585 case LEVEL5:
1586 return 7;
1587 case LEVEL5_1:
1588 return 8;
1589 case LEVEL5_2:
1590 return 9;
1591 case LEVEL6:
1592 return 10;
1593 case LEVEL6_1:
1594 return 11;
1595 case LEVEL6_2:
1596 return 12;
1597 default:
1598 return 0;
1599 }
1600 }
1601