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_encode_header_sei_vui.c
24 *
25 * @brief
26 * This file contains function definitions related to header vui/sei encoding
27 *
28 * @author
29 * ittiam
30 *
31 * List of Functions
32 * ihevce_generate_sub_layer_hrd_params()
33 * ihevce_generate_hrd_params()
34 * ihevce_generate_vui()
35 * ihevce_put_buf_period_sei_params()
36 * ihevce_put_active_parameter_set_sei_params()
37 * ihevce_put_mastering_disp_col_vol_sei_params()
38 * ihevce_put_mastering_disp_col_vol_sei_params()
39 * ihevce_put_sei_params()
40 * ihevce_put_cll_info_sei_params()
41 * ihevce_put_recovery_point_sei_params()
42 * ihevce_put_pic_timing_sei_params()
43 * ihevce_put_hash_sei_params()
44 * ihevce_put_sei_msg()
45 * ihevce_generate_sei()
46 * ihevce_populate_mastering_disp_col_vol_sei()
47 * ihevce_populate_recovery_point_sei()
48 * ihevce_populate_picture_timing_sei()
49 * ihevce_populate_buffering_period_sei()
50 * ihevce_populate_active_parameter_set_sei()
51 * ihevce_calc_CRC()
52 * ihevce_calc_checksum()
53 * ihevce_populate_hash_sei()
54 * ihevce_populate_vui()
55 *
56 ******************************************************************************
57 */
58
59 /*****************************************************************************/
60 /* File Includes */
61 /*****************************************************************************/
62 /* System include files */
63 #include <stdio.h>
64 #include <string.h>
65 #include <stdlib.h>
66 #include <assert.h>
67 #include <stdarg.h>
68 #include <math.h>
69
70 /* User include files */
71 #include "ihevc_typedefs.h"
72 #include "itt_video_api.h"
73 #include "ihevce_api.h"
74
75 #include "rc_cntrl_param.h"
76 #include "rc_frame_info_collector.h"
77 #include "rc_look_ahead_params.h"
78
79 #include "ihevc_defs.h"
80 #include "ihevc_macros.h"
81 #include "ihevc_debug.h"
82 #include "ihevc_structs.h"
83 #include "ihevc_platform_macros.h"
84 #include "ihevc_deblk.h"
85 #include "ihevc_itrans_recon.h"
86 #include "ihevc_chroma_itrans_recon.h"
87 #include "ihevc_chroma_intra_pred.h"
88 #include "ihevc_intra_pred.h"
89 #include "ihevc_inter_pred.h"
90 #include "ihevc_mem_fns.h"
91 #include "ihevc_padding.h"
92 #include "ihevc_weighted_pred.h"
93 #include "ihevc_sao.h"
94 #include "ihevc_resi_trans.h"
95 #include "ihevc_quant_iquant_ssd.h"
96 #include "ihevc_cabac_tables.h"
97 #include "ihevc_trans_tables.h"
98 #include "ihevc_trans_macros.h"
99
100 #include "ihevce_defs.h"
101 #include "ihevce_lap_enc_structs.h"
102 #include "ihevce_multi_thrd_structs.h"
103 #include "ihevce_multi_thrd_funcs.h"
104 #include "ihevce_me_common_defs.h"
105 #include "ihevce_had_satd.h"
106 #include "ihevce_error_codes.h"
107 #include "ihevce_error_checks.h"
108 #include "ihevce_bitstream.h"
109 #include "ihevce_cabac.h"
110 #include "ihevce_rdoq_macros.h"
111 #include "ihevce_function_selector.h"
112 #include "ihevce_enc_structs.h"
113 #include "ihevce_global_tables.h"
114 #include "ihevce_encode_header.h"
115 #include "ihevce_encode_header_sei_vui.h"
116 #include "ihevce_trace.h"
117
118 /*****************************************************************************/
119 /* Function Definitions */
120 /*****************************************************************************/
121
122 /**
123 ******************************************************************************
124 *
125 * @brief Generates sub-layer hrd parameters of VUI (Video Usability Info Set)
126 *
127 * @par Description
128 * Parse Video Usability Info as per ANNEX E.2
129 *
130 * @param[in] ps_bitstrm
131 * pointer to bitstream context (handle)
132 *
133 * @param[in] ps_hrd_params
134 * pointer to structure containing sub-layer hrd params of VUI data
135 *
136 * @return success or failure error code
137 *
138 ******************************************************************************
139 */
ihevce_generate_sub_layer_hrd_params(bitstrm_t * ps_bitstrm,sub_lyr_hrd_params_t * ps_sub_lyr_hrd_params,hrd_params_t * ps_hrd_params,WORD32 cpb_cnt_minus1)140 WORD32 ihevce_generate_sub_layer_hrd_params(
141 bitstrm_t *ps_bitstrm,
142 sub_lyr_hrd_params_t *ps_sub_lyr_hrd_params,
143 hrd_params_t *ps_hrd_params,
144 WORD32 cpb_cnt_minus1)
145 {
146 WORD32 j;
147 WORD32 return_status = IHEVCE_SUCCESS;
148
149 for(j = 0; j <= cpb_cnt_minus1; j++)
150 {
151 /* au4_bit_rate_value_minus1 */
152 PUT_BITS_UEV(
153 ps_bitstrm, ps_sub_lyr_hrd_params->au4_bit_rate_value_minus1[j], return_status);
154 ENTROPY_TRACE("bit_rate_value_minus1", ps_sub_lyr_hrd_params->au4_bit_rate_value_minus1[j]);
155
156 /* au4_cpb_size_value_minus1 */
157 PUT_BITS_UEV(
158 ps_bitstrm, ps_sub_lyr_hrd_params->au4_cpb_size_value_minus1[j], return_status);
159 ENTROPY_TRACE("cpb_size_value_minus1", ps_sub_lyr_hrd_params->au4_cpb_size_value_minus1[j]);
160
161 if(ps_hrd_params->u1_sub_pic_cpb_params_present_flag)
162 {
163 /* au4_cpb_size_du_value_minus1 */
164 PUT_BITS_UEV(
165 ps_bitstrm, ps_sub_lyr_hrd_params->au4_cpb_size_du_value_minus1[j], return_status);
166 ENTROPY_TRACE(
167 "cpb_size_du_value_minus1", ps_sub_lyr_hrd_params->au4_cpb_size_du_value_minus1[j]);
168
169 /* au4_bit_rate_du_value_minus1 */
170 PUT_BITS_UEV(
171 ps_bitstrm, ps_sub_lyr_hrd_params->au4_bit_rate_du_value_minus1[j], return_status);
172 ENTROPY_TRACE(
173 "bit_rate_du_value_minus1", ps_sub_lyr_hrd_params->au4_bit_rate_du_value_minus1[j]);
174 }
175
176 /* au1_cbr_flag */
177 PUT_BITS(ps_bitstrm, ps_sub_lyr_hrd_params->au1_cbr_flag[j], 1, return_status);
178 ENTROPY_TRACE("cbr_flag", ps_sub_lyr_hrd_params->au1_cbr_flag[j]);
179 }
180 return return_status;
181 }
182
183 /**
184 ******************************************************************************
185 *
186 * @brief Generates hrd parameters of VUI (Video Usability Info Set)
187 *
188 * @par Description
189 * Parse Video Usability Info as per ANNEX E.2
190 *
191 * @param[in] ps_bitstrm
192 * pointer to bitstream context (handle)
193 *
194 * @param[in] ps_sps
195 * pointer to structure containing SPS data
196 *
197 * @param[in] ps_hrd_params
198 * pointer to structure containing hrd params of VUI data
199 *
200 * @return success or failure error code
201 *
202 ******************************************************************************
203 */
ihevce_generate_hrd_params(bitstrm_t * ps_bitstrm,hrd_params_t * ps_hrd_params,sps_t * ps_sps)204 WORD32 ihevce_generate_hrd_params(bitstrm_t *ps_bitstrm, hrd_params_t *ps_hrd_params, sps_t *ps_sps)
205 {
206 WORD32 i;
207 WORD32 return_status = IHEVCE_SUCCESS;
208 UWORD8 u1_common_info_present_flag = 1;
209
210 if(u1_common_info_present_flag)
211 {
212 /* u1_nal_hrd_parameters_present_flag */
213 PUT_BITS(ps_bitstrm, ps_hrd_params->u1_nal_hrd_parameters_present_flag, 1, return_status);
214 ENTROPY_TRACE(
215 "nal_hrd_parameters_present_flag", ps_hrd_params->u1_nal_hrd_parameters_present_flag);
216
217 /* u1_vcl_hrd_parameters_present_flag */
218 PUT_BITS(ps_bitstrm, ps_hrd_params->u1_vcl_hrd_parameters_present_flag, 1, return_status);
219 ENTROPY_TRACE(
220 "vcl_hrd_parameters_present_flag", ps_hrd_params->u1_vcl_hrd_parameters_present_flag);
221
222 if(ps_hrd_params->u1_vcl_hrd_parameters_present_flag ||
223 ps_hrd_params->u1_nal_hrd_parameters_present_flag)
224 {
225 /* u1_sub_pic_cpb_params_present_flag */
226 PUT_BITS(
227 ps_bitstrm, ps_hrd_params->u1_sub_pic_cpb_params_present_flag, 1, return_status);
228 ENTROPY_TRACE(
229 "sub_pic_Cpb_params_present_flag",
230 ps_hrd_params->u1_sub_pic_cpb_params_present_flag);
231
232 if(ps_hrd_params->u1_sub_pic_cpb_params_present_flag)
233 {
234 /* u1_tick_divisor_minus2 */
235 PUT_BITS(ps_bitstrm, ps_hrd_params->u1_tick_divisor_minus2, 8, return_status);
236 ENTROPY_TRACE("tick_divisor_minus2", ps_hrd_params->u1_tick_divisor_minus2);
237
238 /* u1_du_cpb_removal_delay_increment_length_minus1 */
239 PUT_BITS(
240 ps_bitstrm,
241 ps_hrd_params->u1_du_cpb_removal_delay_increment_length_minus1,
242 5,
243 return_status);
244 ENTROPY_TRACE(
245 "du_cpb_removal_delay_increment_length_minus1",
246 ps_hrd_params->u1_du_cpb_removal_delay_increment_length_minus1);
247
248 /* u1_sub_pic_cpb_params_in_pic_timing_sei_flag */
249 PUT_BITS(
250 ps_bitstrm,
251 ps_hrd_params->u1_sub_pic_cpb_params_in_pic_timing_sei_flag,
252 1,
253 return_status);
254 ENTROPY_TRACE(
255 "sub_pic_cpb_params_in_pic_timing_sei_flag",
256 ps_hrd_params->u1_sub_pic_cpb_params_in_pic_timing_sei_flag);
257
258 /* u1_dpb_output_delay_du_length_minus1 */
259 PUT_BITS(
260 ps_bitstrm,
261 ps_hrd_params->u1_dpb_output_delay_du_length_minus1,
262 5,
263 return_status);
264 ENTROPY_TRACE(
265 "dpb_output_delay_du_length_minus1",
266 ps_hrd_params->u1_dpb_output_delay_du_length_minus1);
267 }
268
269 /* u4_bit_rate_scale */
270 PUT_BITS(ps_bitstrm, ps_hrd_params->u4_bit_rate_scale, 4, return_status);
271 ENTROPY_TRACE("bit_rate_scale", ps_hrd_params->u4_bit_rate_scale);
272
273 /* u4_cpb_size_scale */
274 PUT_BITS(ps_bitstrm, ps_hrd_params->u4_cpb_size_scale, 4, return_status);
275 ENTROPY_TRACE("cpb_size_scale", ps_hrd_params->u4_cpb_size_scale);
276
277 if(ps_hrd_params->u1_sub_pic_cpb_params_present_flag)
278 {
279 /* u4_cpb_size_du_scale */
280 PUT_BITS(ps_bitstrm, ps_hrd_params->u4_cpb_size_du_scale, 4, return_status);
281 ENTROPY_TRACE("cpb_size_du_scale", ps_hrd_params->u4_cpb_size_du_scale);
282 }
283
284 /* u1_initial_cpb_removal_delay_length_minus1 */
285 PUT_BITS(
286 ps_bitstrm,
287 ps_hrd_params->u1_initial_cpb_removal_delay_length_minus1,
288 5,
289 return_status);
290 ENTROPY_TRACE(
291 "initial_cpb_removal_delay_length_minus1",
292 ps_hrd_params->u1_initial_cpb_removal_delay_length_minus1);
293
294 /* u1_au_cpb_removal_delay_length_minus1 */
295 PUT_BITS(
296 ps_bitstrm, ps_hrd_params->u1_au_cpb_removal_delay_length_minus1, 5, return_status);
297 ENTROPY_TRACE(
298 "cpb_removal_delay_length_minus1",
299 ps_hrd_params->u1_au_cpb_removal_delay_length_minus1);
300
301 /* u1_dpb_output_delay_length_minus1 */
302 PUT_BITS(
303 ps_bitstrm, ps_hrd_params->u1_dpb_output_delay_length_minus1, 5, return_status);
304 ENTROPY_TRACE(
305 "dpb_output_delay_length_minus1", ps_hrd_params->u1_dpb_output_delay_length_minus1);
306 }
307 }
308
309 for(i = 0; i < (ps_sps->i1_sps_max_sub_layers); i++)
310 {
311 /* au1_fixed_pic_rate_general_flag */
312 PUT_BITS(ps_bitstrm, ps_hrd_params->au1_fixed_pic_rate_general_flag[i], 1, return_status);
313 ENTROPY_TRACE(
314 "fixed_pic_rate_general_flag", ps_hrd_params->au1_fixed_pic_rate_general_flag[i]);
315
316 if(!ps_hrd_params->au1_fixed_pic_rate_general_flag[i])
317 {
318 /* au1_fixed_pic_rate_within_cvs_flag */
319 PUT_BITS(
320 ps_bitstrm, ps_hrd_params->au1_fixed_pic_rate_within_cvs_flag[i], 1, return_status);
321 ENTROPY_TRACE(
322 "fixed_pic_rate_within_cvs_flag",
323 ps_hrd_params->au1_fixed_pic_rate_within_cvs_flag[i]);
324 }
325
326 if(ps_hrd_params->au1_fixed_pic_rate_within_cvs_flag[i])
327 {
328 /* au2_elemental_duration_in_tc_minus1 */
329 PUT_BITS_UEV(
330 ps_bitstrm, ps_hrd_params->au2_elemental_duration_in_tc_minus1[i], return_status);
331 ENTROPY_TRACE(
332 "elemental_duration_in_tc_minus1",
333 ps_hrd_params->au2_elemental_duration_in_tc_minus1[i]);
334 }
335 else
336 {
337 /* au1_low_delay_hrd_flag */
338 PUT_BITS(ps_bitstrm, ps_hrd_params->au1_low_delay_hrd_flag[i], 1, return_status);
339 ENTROPY_TRACE("low_delay_hrd_flag", ps_hrd_params->au1_low_delay_hrd_flag[i]);
340 }
341
342 if(!ps_hrd_params->au1_low_delay_hrd_flag[i])
343 {
344 /* au1_cpb_cnt_minus1 */
345 PUT_BITS_UEV(ps_bitstrm, ps_hrd_params->au1_cpb_cnt_minus1[i], return_status);
346 ENTROPY_TRACE("cpb_cnt_minus1", ps_hrd_params->au1_cpb_cnt_minus1[i]);
347 }
348
349 if(ps_hrd_params->u1_nal_hrd_parameters_present_flag)
350 {
351 sub_lyr_hrd_params_t *ps_sub_lyr_hrd_params =
352 &ps_hrd_params->as_sub_layer_hrd_params[i];
353 return_status |= ihevce_generate_sub_layer_hrd_params(
354 ps_bitstrm,
355 ps_sub_lyr_hrd_params,
356 ps_hrd_params,
357 ps_hrd_params->au1_cpb_cnt_minus1[i]);
358 }
359
360 if(ps_hrd_params->u1_vcl_hrd_parameters_present_flag)
361 {
362 sub_lyr_hrd_params_t *ps_sub_lyr_hrd_params =
363 &ps_hrd_params->as_sub_layer_hrd_params[i];
364 return_status |= ihevce_generate_sub_layer_hrd_params(
365 ps_bitstrm,
366 ps_sub_lyr_hrd_params,
367 ps_hrd_params,
368 ps_hrd_params->au1_cpb_cnt_minus1[i]);
369 }
370 }
371
372 return return_status;
373 }
374
375 /**
376 ******************************************************************************
377 *
378 * @brief Generates VUI (Video Usability Info Set)
379 *
380 * @par Description
381 * Parse Video Usability Info as per ANNEX E.2
382 *
383 * @param[in] ps_bitstrm
384 * pointer to bitstream context (handle)
385 *
386 * @param[in] ps_sps
387 * pointer to structure containing SPS data
388 *
389 * @param[in] ps_vui
390 * pointer to structure containing VUI data
391 *
392 * @return success or failure error code
393 *
394 ******************************************************************************
395 */
ihevce_generate_vui(bitstrm_t * ps_bitstrm,sps_t * ps_sps,vui_t s_vui)396 WORD32 ihevce_generate_vui(bitstrm_t *ps_bitstrm, sps_t *ps_sps, vui_t s_vui)
397 {
398 WORD32 return_status = IHEVCE_SUCCESS;
399
400 /* aspect_ratio_info_present_flag */
401 PUT_BITS(ps_bitstrm, s_vui.u1_aspect_ratio_info_present_flag, 1, return_status);
402 ENTROPY_TRACE("aspect_ratio_info_present_flag", s_vui.u1_aspect_ratio_info_present_flag);
403
404 if(s_vui.u1_aspect_ratio_info_present_flag)
405 {
406 /* aspect_ratio_idc */
407 PUT_BITS(ps_bitstrm, s_vui.u1_aspect_ratio_idc, 8, return_status);
408 ENTROPY_TRACE("aspect_ratio_idc", s_vui.u1_aspect_ratio_idc);
409 if(s_vui.u1_aspect_ratio_idc == IHEVCE_EXTENDED_SAR)
410 {
411 /* SAR_width */
412 PUT_BITS(ps_bitstrm, s_vui.u2_sar_width, 16, return_status);
413 ENTROPY_TRACE("sar_width", s_vui.u2_sar_width);
414
415 /* SAR_hieght */
416 PUT_BITS(ps_bitstrm, s_vui.u2_sar_height, 16, return_status);
417 ENTROPY_TRACE("sar_height", s_vui.u2_sar_height);
418 }
419 }
420
421 /* overscan_info_present_flag */
422 PUT_BITS(ps_bitstrm, s_vui.u1_overscan_info_present_flag, 1, return_status);
423 ENTROPY_TRACE("overscan_info_present_flag", s_vui.u1_overscan_info_present_flag);
424
425 if(s_vui.u1_overscan_info_present_flag)
426 {
427 /* u1_overscan_appropriate_flag */
428 PUT_BITS(ps_bitstrm, s_vui.u1_overscan_appropriate_flag, 1, return_status);
429 ENTROPY_TRACE("overscan_appropriate_flag", s_vui.u1_overscan_appropriate_flag);
430 }
431
432 /* video_signal_type_present_flag */
433 PUT_BITS(ps_bitstrm, s_vui.u1_video_signal_type_present_flag, 1, return_status);
434 ENTROPY_TRACE("video_signal_type_present_flag", s_vui.u1_video_signal_type_present_flag);
435
436 if(s_vui.u1_video_signal_type_present_flag)
437 {
438 /* u1_video_format */
439 PUT_BITS(ps_bitstrm, s_vui.u1_video_format, 3, return_status);
440 ENTROPY_TRACE("video_format", s_vui.u1_video_format);
441
442 /* u1_video_full_range_flag */
443 PUT_BITS(ps_bitstrm, s_vui.u1_video_full_range_flag, 1, return_status);
444 ENTROPY_TRACE("video_full_range_flag", s_vui.u1_video_full_range_flag);
445
446 /* u1_colour_description_present_flag */
447 PUT_BITS(ps_bitstrm, s_vui.u1_colour_description_present_flag, 1, return_status);
448 ENTROPY_TRACE("colour_description_present_flag", s_vui.u1_colour_description_present_flag);
449
450 if(s_vui.u1_colour_description_present_flag)
451 {
452 /* u1_colour_primaries */
453 PUT_BITS(ps_bitstrm, s_vui.u1_colour_primaries, 8, return_status);
454 ENTROPY_TRACE("colour_primaries", s_vui.u1_colour_primaries);
455
456 /* u1_transfer_characteristics */
457 PUT_BITS(ps_bitstrm, s_vui.u1_transfer_characteristics, 8, return_status);
458 ENTROPY_TRACE("transfer_characteristics", s_vui.u1_transfer_characteristics);
459
460 /* u1_matrix_coefficients */
461 PUT_BITS(ps_bitstrm, s_vui.u1_matrix_coefficients, 8, return_status);
462 ENTROPY_TRACE("matrix_coefficients", s_vui.u1_matrix_coefficients);
463 }
464 }
465
466 /* u1_chroma_loc_info_present_flag */
467 PUT_BITS(ps_bitstrm, s_vui.u1_chroma_loc_info_present_flag, 1, return_status);
468 ENTROPY_TRACE("chroma_loc_info_present_flag", s_vui.u1_chroma_loc_info_present_flag);
469
470 if(s_vui.u1_chroma_loc_info_present_flag)
471 {
472 /* u1_chroma_sample_loc_type_top_field */
473 PUT_BITS_UEV(ps_bitstrm, s_vui.u1_chroma_sample_loc_type_top_field, return_status);
474 ENTROPY_TRACE(
475 "chroma_sample_loc_type_top_field", s_vui.u1_chroma_sample_loc_type_top_field);
476
477 /* u1_chroma_sample_loc_type_bottom_field */
478 PUT_BITS_UEV(ps_bitstrm, s_vui.u1_chroma_sample_loc_type_bottom_field, return_status);
479 ENTROPY_TRACE(
480 "chroma_sample_loc_type_bottom_field", s_vui.u1_chroma_sample_loc_type_bottom_field);
481 }
482
483 /* u1_neutral_chroma_indication_flag */
484 PUT_BITS(ps_bitstrm, s_vui.u1_neutral_chroma_indication_flag, 1, return_status);
485 ENTROPY_TRACE("neutral_chroma_indication_flag", s_vui.u1_neutral_chroma_indication_flag);
486
487 /* u1_field_seq_flag */
488 PUT_BITS(ps_bitstrm, s_vui.u1_field_seq_flag, 1, return_status);
489 ENTROPY_TRACE("field_seq_flag", s_vui.u1_field_seq_flag);
490
491 /* HM CURRENTLY NOT SUPPOSTED */
492 /* u1_frame_field_info_present_flag */
493 PUT_BITS(ps_bitstrm, s_vui.u1_frame_field_info_present_flag, 1, return_status);
494 ENTROPY_TRACE("frame_field_info_present_flag", s_vui.u1_frame_field_info_present_flag);
495
496 /* u1_default_display_window_flag */
497 PUT_BITS(ps_bitstrm, s_vui.u1_default_display_window_flag, 1, return_status);
498 ENTROPY_TRACE("default_display_window_flag", s_vui.u1_default_display_window_flag);
499
500 if(s_vui.u1_default_display_window_flag)
501 {
502 /* u4_def_disp_win_left_offset */
503 PUT_BITS_UEV(ps_bitstrm, s_vui.u4_def_disp_win_left_offset, return_status);
504 ENTROPY_TRACE("def_disp_win_left_offset", s_vui.u4_def_disp_win_left_offset);
505
506 /* u4_def_disp_win_right_offset */
507 PUT_BITS_UEV(ps_bitstrm, s_vui.u4_def_disp_win_right_offset, return_status);
508 ENTROPY_TRACE("def_disp_win_right_offset", s_vui.u4_def_disp_win_right_offset);
509
510 /* u4_def_disp_win_top_offset */
511 PUT_BITS_UEV(ps_bitstrm, s_vui.u4_def_disp_win_top_offset, return_status);
512 ENTROPY_TRACE("def_disp_win_top_offset", s_vui.u4_def_disp_win_top_offset);
513
514 /* u4_def_disp_win_bottom_offset */
515 PUT_BITS_UEV(ps_bitstrm, s_vui.u4_def_disp_win_bottom_offset, return_status);
516 ENTROPY_TRACE("def_disp_win_bottom_offset", s_vui.u4_def_disp_win_bottom_offset);
517 }
518
519 /* u1_vui_timing_info_present_flag */
520 PUT_BITS(ps_bitstrm, s_vui.u1_vui_timing_info_present_flag, 1, return_status);
521 ENTROPY_TRACE("vui_timing_info_present_flag", s_vui.u1_vui_timing_info_present_flag);
522
523 if(s_vui.u1_vui_timing_info_present_flag)
524 {
525 /* u4_num_units_in_tick */
526 PUT_BITS(ps_bitstrm, s_vui.u4_vui_num_units_in_tick, 32, return_status);
527 ENTROPY_TRACE("num_units_in_tick", s_vui.u4_vui_num_units_in_tick);
528
529 /* u4_time_scale */
530 PUT_BITS(ps_bitstrm, s_vui.u4_vui_time_scale, 32, return_status);
531 ENTROPY_TRACE("time_scale", s_vui.u4_vui_time_scale);
532
533 /* u1_poc_proportional_to_timing_flag */
534 PUT_BITS(ps_bitstrm, s_vui.u1_poc_proportional_to_timing_flag, 1, return_status);
535 ENTROPY_TRACE("poc_proportional_to_timing_flag", s_vui.u1_poc_proportional_to_timing_flag);
536
537 /* u1_num_ticks_poc_diff_one_minus1 */
538 if(s_vui.u1_poc_proportional_to_timing_flag)
539 {
540 PUT_BITS_UEV(ps_bitstrm, s_vui.u4_num_ticks_poc_diff_one_minus1, return_status);
541 ENTROPY_TRACE("num_ticks_poc_diff_one_minus1", s_vui.u4_num_ticks_poc_diff_one_minus1);
542 }
543
544 /* u1_vui_hrd_parameters_present_flag */
545 PUT_BITS(ps_bitstrm, s_vui.u1_vui_hrd_parameters_present_flag, 1, return_status);
546 ENTROPY_TRACE("vui_hrd_parameters_present_flag", s_vui.u1_vui_hrd_parameters_present_flag);
547
548 if(s_vui.u1_vui_hrd_parameters_present_flag)
549 {
550 return_status |=
551 ihevce_generate_hrd_params(ps_bitstrm, &(s_vui.s_vui_hrd_parameters), ps_sps);
552 }
553 }
554
555 /* u1_bitstream_restriction_flag */
556 PUT_BITS(ps_bitstrm, s_vui.u1_bitstream_restriction_flag, 1, return_status);
557 ENTROPY_TRACE("bitstream_restriction_flag", s_vui.u1_bitstream_restriction_flag);
558
559 if(s_vui.u1_bitstream_restriction_flag)
560 {
561 /* u1_tiles_fixed_structure_flag */
562 PUT_BITS(ps_bitstrm, s_vui.u1_tiles_fixed_structure_flag, 1, return_status);
563 ENTROPY_TRACE("tiles_fixed_structure_flag", s_vui.u1_tiles_fixed_structure_flag);
564
565 /* u1_motion_vectors_over_pic_boundaries_flag */
566 PUT_BITS(ps_bitstrm, s_vui.u1_motion_vectors_over_pic_boundaries_flag, 1, return_status);
567 ENTROPY_TRACE(
568 "motion_vectors_over_pic_boundaries_flag",
569 s_vui.u1_motion_vectors_over_pic_boundaries_flag);
570
571 /* u1_restricted_ref_pic_lists_flag */
572 PUT_BITS(ps_bitstrm, s_vui.u1_restricted_ref_pic_lists_flag, 1, return_status);
573 ENTROPY_TRACE("restricted_ref_pic_lists_flag", s_vui.u1_restricted_ref_pic_lists_flag);
574
575 /* u4_min_spatial_segmentation_idc */
576 PUT_BITS_UEV(ps_bitstrm, s_vui.u4_min_spatial_segmentation_idc, return_status);
577 ENTROPY_TRACE("min_spatial_segmentation_idc", s_vui.u4_min_spatial_segmentation_idc);
578
579 /* u1_max_bytes_per_pic_denom */
580 PUT_BITS_UEV(ps_bitstrm, s_vui.u1_max_bytes_per_pic_denom, return_status);
581 ENTROPY_TRACE("max_bytes_per_pic_denom", s_vui.u1_max_bytes_per_pic_denom);
582
583 /* u1_max_bits_per_mincu_denom */
584 PUT_BITS_UEV(ps_bitstrm, s_vui.u1_max_bits_per_mincu_denom, return_status);
585 ENTROPY_TRACE("max_bits_per_mincu_denom", s_vui.u1_max_bits_per_mincu_denom);
586
587 /* u1_log2_max_mv_length_horizontal */
588 PUT_BITS_UEV(ps_bitstrm, s_vui.u1_log2_max_mv_length_horizontal, return_status);
589 ENTROPY_TRACE("log2_max_mv_length_horizontal", s_vui.u1_log2_max_mv_length_horizontal);
590
591 /* u1_log2_max_mv_length_vertical */
592 PUT_BITS_UEV(ps_bitstrm, s_vui.u1_log2_max_mv_length_vertical, return_status);
593 ENTROPY_TRACE("log2_max_mv_length_vertical", s_vui.u1_log2_max_mv_length_vertical);
594 }
595 return return_status;
596 }
597
598 #ifndef DISABLE_SEI
599 /**
600 ******************************************************************************
601 *
602 * @brief Generates Buffering Period (Supplemental Enhancement Information )
603 *
604 * @par Description
605 * Parse Supplemental Enhancement Information as per Section 7.3.2.4
606 *
607 * @param[in] ps_bitstrm
608 * pointer to bitstream context (handle)
609 *
610 * @param[in] ps_pt_sei
611 * pointer to structure containing buffering period SEI data
612 *
613 * @param[in] ps_vui_params
614 * pointer to structure containing VUI data
615 *
616 * @return success or failure error code
617 *
618 ******************************************************************************
619 */
ihevce_put_buf_period_sei_params(buf_period_sei_params_t * ps_bp_sei,vui_t * ps_vui_params,bitstrm_t * ps_bitstrm)620 WORD32 ihevce_put_buf_period_sei_params(
621 buf_period_sei_params_t *ps_bp_sei, vui_t *ps_vui_params, bitstrm_t *ps_bitstrm)
622 {
623 UWORD32 i;
624 WORD32 return_status = IHEVCE_SUCCESS;
625 UWORD8 u1_payload_size = 0;
626 UWORD8 u1_sub_pic_cpb_params_present_flag =
627 ps_vui_params->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag;
628
629 {
630 //UWORD32 range;
631 //UWORD32 sps_id = ps_bp_sei->u1_bp_seq_parameter_set_id;
632
633 //range = 0;
634 //GETRANGE(range, sps_id);
635 u1_payload_size += 1; //(((range - 1) << 1) + 1);
636
637 if(!u1_sub_pic_cpb_params_present_flag)
638 u1_payload_size += 1;
639 u1_payload_size += 1;
640 u1_payload_size +=
641 ps_vui_params->s_vui_hrd_parameters.u1_au_cpb_removal_delay_length_minus1 + 1;
642 if(1 == ps_vui_params->s_vui_hrd_parameters.u1_nal_hrd_parameters_present_flag)
643 {
644 for(i = 0; i <= ps_bp_sei->u4_cpb_cnt; i++)
645 {
646 u1_payload_size += ps_bp_sei->u4_initial_cpb_removal_delay_length << 1;
647 if(u1_sub_pic_cpb_params_present_flag || ps_bp_sei->u1_rap_cpb_params_present_flag)
648 u1_payload_size += ps_bp_sei->u4_initial_cpb_removal_delay_length << 1;
649 }
650 }
651 if(1 == ps_vui_params->s_vui_hrd_parameters.u1_vcl_hrd_parameters_present_flag)
652 {
653 for(i = 0; i <= ps_bp_sei->u4_cpb_cnt; i++)
654 {
655 u1_payload_size += ps_bp_sei->u4_initial_cpb_removal_delay_length << 1;
656 if(u1_sub_pic_cpb_params_present_flag || ps_bp_sei->u1_rap_cpb_params_present_flag)
657 u1_payload_size += ps_bp_sei->u4_initial_cpb_removal_delay_length << 1;
658 }
659 }
660 }
661
662 u1_payload_size = (u1_payload_size + 7) >> 3;
663
664 /************************************************************************************************/
665 /* Calculating the cbp removal delay and cbp removal delay offset based on the */
666 /* buffer level information from Rate control */
667 /* NOTE : Buffer fullness level for Rate control is updated using Approximate */
668 /* number of bits from RDOPT stage rather than from accurate number of bits from ENTROPY coding */
669 /************************************************************************************************/
670
671 {
672 ULWORD64 u8_temp;
673 UWORD32 u4_buffer_size, u4_dbf;
674
675 u4_buffer_size = ps_bp_sei->u4_buffer_size_sei;
676 u4_dbf = ps_bp_sei->u4_dbf_sei;
677 for(i = 0; i <= ps_bp_sei->u4_cpb_cnt; i++)
678 {
679 u8_temp = ((ULWORD64)(u4_dbf)*90000);
680 u8_temp = u8_temp / ps_bp_sei->u4_target_bit_rate_sei;
681 ps_bp_sei->au4_nal_initial_cpb_removal_delay[i] = (UWORD32)u8_temp;
682
683 u8_temp = ((ULWORD64)(u4_buffer_size - u4_dbf) * 90000);
684 u8_temp = u8_temp / ps_bp_sei->u4_target_bit_rate_sei;
685 ps_bp_sei->au4_nal_initial_cpb_removal_delay_offset[i] = (UWORD32)u8_temp;
686
687 if(ps_bp_sei->au4_nal_initial_cpb_removal_delay[i] < 1)
688 ps_bp_sei->au4_nal_initial_cpb_removal_delay[i] =
689 1; /* ps_bp_sei->au4_nal_initial_cpb_removal_delay[i] should be always greater than 0 */
690 }
691 }
692
693 /************************************************************************/
694 /* PayloadSize : This is the size of the payload in bytes */
695 /************************************************************************/
696 PUT_BITS(ps_bitstrm, u1_payload_size, 8, return_status);
697 ENTROPY_TRACE("payload_size", u1_payload_size);
698
699 /************************************************************************/
700 /* Put the buffering period SEI parameters into the bitstream. For */
701 /* details refer to section D.1.1 of the standard */
702 /************************************************************************/
703
704 /* seq_parameter_set_id */
705 PUT_BITS_UEV(ps_bitstrm, ps_bp_sei->u1_bp_seq_parameter_set_id, return_status);
706 ENTROPY_TRACE("seq_parameter_set_id", ps_bp_sei->u1_bp_seq_parameter_set_id);
707
708 //PUT_BITS(ps_bitstrm, u1_sub_pic_cpb_params_present_flag, 1, return_status);
709 //ENTROPY_TRACE("sub_pic_cpb_params_present_flag", u1_sub_pic_cpb_params_present_flag);
710
711 if(!u1_sub_pic_cpb_params_present_flag)
712 {
713 /* u1_rap_cpb_params_present_flag */
714 PUT_BITS(ps_bitstrm, ps_bp_sei->u1_rap_cpb_params_present_flag, 1, return_status);
715 ENTROPY_TRACE("rap_cpb_params_present_flag", ps_bp_sei->u1_rap_cpb_params_present_flag);
716 }
717
718 if(ps_bp_sei->u1_rap_cpb_params_present_flag)
719 {
720 PUT_BITS(
721 ps_bitstrm,
722 ps_bp_sei->u4_cpb_delay_offset,
723 (ps_vui_params->s_vui_hrd_parameters.u1_au_cpb_removal_delay_length_minus1 + 1),
724 return_status);
725 ENTROPY_TRACE("cpb_delay_offset", ps_bp_sei->cpb_delay_offset);
726
727 PUT_BITS(
728 ps_bitstrm,
729 ps_bp_sei->u4_dpb_delay_offset,
730 (ps_vui_params->s_vui_hrd_parameters.u1_dpb_output_delay_length_minus1 + 1),
731 return_status);
732 ENTROPY_TRACE("dpb_delay_offset", ps_bp_sei->dpb_delay_offset);
733 }
734
735 PUT_BITS(ps_bitstrm, ps_bp_sei->u1_concatenation_flag, 1, return_status);
736 ENTROPY_TRACE("concatenation_flag", ps_bp_sei->concatenation_flag);
737
738 PUT_BITS(
739 ps_bitstrm,
740 ps_bp_sei->u4_au_cpb_removal_delay_delta_minus1,
741 (ps_vui_params->s_vui_hrd_parameters.u1_au_cpb_removal_delay_length_minus1 + 1),
742 return_status);
743
744 ENTROPY_TRACE(
745 "au_cpb_removal_delay_delta_minus1", ps_bp_sei->au_cpb_removal_delay_delta_minus1);
746
747 if(1 == ps_vui_params->s_vui_hrd_parameters.u1_nal_hrd_parameters_present_flag)
748 {
749 for(i = 0; i <= ps_bp_sei->u4_cpb_cnt; i++)
750 {
751 PUT_BITS(
752 ps_bitstrm,
753 ps_bp_sei->au4_nal_initial_cpb_removal_delay[i],
754 ps_bp_sei->u4_initial_cpb_removal_delay_length,
755 return_status);
756 ENTROPY_TRACE(
757 "nal_initial_cpb_removal_delay", ps_bp_sei->au4_nal_initial_cpb_removal_delay[i]);
758
759 PUT_BITS(
760 ps_bitstrm,
761 ps_bp_sei->au4_nal_initial_cpb_removal_delay_offset[i],
762 ps_bp_sei->u4_initial_cpb_removal_delay_length,
763 return_status);
764 ENTROPY_TRACE(
765 "nal_initial_cpb_removal_delay_offset",
766 ps_bp_sei->au4_nal_initial_cpb_removal_delay_offset[i]);
767
768 if(u1_sub_pic_cpb_params_present_flag || ps_bp_sei->u1_rap_cpb_params_present_flag)
769 {
770 PUT_BITS(
771 ps_bitstrm,
772 ps_bp_sei->au4_nal_initial_alt_cpb_removal_delay[i],
773 ps_bp_sei->u4_initial_cpb_removal_delay_length,
774 return_status);
775 ENTROPY_TRACE(
776 "nal_initial_alt_cpb_removal_delay",
777 ps_bp_sei->au4_nal_initial_alt_cpb_removal_delay[i]);
778
779 PUT_BITS(
780 ps_bitstrm,
781 ps_bp_sei->au4_nal_initial_alt_cpb_removal_delay_offset[i],
782 ps_bp_sei->u4_initial_cpb_removal_delay_length,
783 return_status);
784 ENTROPY_TRACE(
785 "nal_initial_alt_cpb_removal_delay_offset",
786 ps_bp_sei->au4_nal_initial_alt_cpb_removal_delay_offset[i]);
787 }
788 }
789 }
790
791 if(1 == ps_vui_params->s_vui_hrd_parameters.u1_vcl_hrd_parameters_present_flag)
792 {
793 for(i = 0; i <= ps_bp_sei->u4_cpb_cnt; i++)
794 {
795 PUT_BITS(
796 ps_bitstrm,
797 ps_bp_sei->au4_vcl_initial_cpb_removal_delay[i],
798 ps_bp_sei->u4_initial_cpb_removal_delay_length,
799 return_status);
800 ENTROPY_TRACE(
801 "vcl_initial_cpb_removal_delay", ps_bp_sei->au4_vcl_initial_cpb_removal_delay[i]);
802
803 PUT_BITS(
804 ps_bitstrm,
805 ps_bp_sei->au4_vcl_initial_cpb_removal_delay_offset[i],
806 ps_bp_sei->u4_initial_cpb_removal_delay_length,
807 return_status);
808 ENTROPY_TRACE(
809 "vcl_initial_cpb_removal_delay_offset",
810 ps_bp_sei->au4_vcl_initial_cpb_removal_delay_offset[i]);
811
812 if(u1_sub_pic_cpb_params_present_flag || ps_bp_sei->u1_rap_cpb_params_present_flag)
813 {
814 PUT_BITS(
815 ps_bitstrm,
816 ps_bp_sei->au4_vcl_initial_alt_cpb_removal_delay[i],
817 ps_bp_sei->u4_initial_cpb_removal_delay_length,
818 return_status);
819 ENTROPY_TRACE(
820 "vcl_initial_alt_cpb_removal_delay",
821 ps_bp_sei->au4_vcl_initial_alt_cpb_removal_delay[i]);
822
823 PUT_BITS(
824 ps_bitstrm,
825 ps_bp_sei->au4_vcl_initial_alt_cpb_removal_delay_offset[i],
826 ps_bp_sei->u4_initial_cpb_removal_delay_length,
827 return_status);
828 ENTROPY_TRACE(
829 "vcl_initial_alt_cpb_removal_delay_offset",
830 ps_bp_sei->au4_vcl_initial_alt_cpb_removal_delay_offset[i]);
831 }
832 }
833 }
834
835 return (return_status);
836 }
837
838 /**
839 ******************************************************************************
840 *
841 * @brief Generates active parameter set (Supplemental Enhancement Information )
842 *
843 * @par Description
844 * Parse Supplemental Enhancement Information as per Section 7.3.2.4
845 *
846 * @param[in] ps_bitstrm
847 * pointer to bitstream context (handle)
848 *
849 * @param[in] ps_act_sei
850 * pointer to structure containing active parameter set SEI data
851 *
852 * @return success or failure error code
853 *
854 *****************************************************************************
855 */
ihevce_put_active_parameter_set_sei_params(active_parameter_set_sei_param_t * ps_act_sei,bitstrm_t * ps_bitstrm)856 WORD32 ihevce_put_active_parameter_set_sei_params(
857 active_parameter_set_sei_param_t *ps_act_sei, bitstrm_t *ps_bitstrm)
858
859 {
860 UWORD8 u1_payload_size = 0, i;
861 UWORD8 u1_range = 0, u1_act_sps_id;
862 WORD32 return_status = IHEVCE_SUCCESS;
863
864 u1_payload_size += 4;
865 u1_payload_size += 1;
866 u1_payload_size += 1;
867 u1_payload_size += 1; // num_sps_ids_minus1 ahould be zero as per the standard
868
869 u1_act_sps_id = ps_act_sei->u1_active_video_parameter_set_id;
870
871 GETRANGE(u1_range, u1_act_sps_id);
872
873 u1_payload_size += (((u1_range - 1) << 1) + 1);
874
875 u1_payload_size = (u1_payload_size + 7) >> 3;
876
877 PUT_BITS(ps_bitstrm, u1_payload_size, 8, return_status);
878 ENTROPY_TRACE("payload_size", u1_payload_size);
879
880 PUT_BITS(ps_bitstrm, ps_act_sei->u1_active_video_parameter_set_id, 4, return_status);
881 ENTROPY_TRACE("active_video_parameter_set_id", ps_act_sei->u1_active_video_parameter_set_id);
882
883 PUT_BITS(ps_bitstrm, ps_act_sei->u1_self_contained_cvs_flag, 1, return_status);
884 ENTROPY_TRACE("self_contained_cvs_flag", ps_act_sei->u1_self_contained_cvs_flag);
885
886 PUT_BITS(ps_bitstrm, ps_act_sei->u1_no_parameter_set_update_flag, 1, return_status);
887 ENTROPY_TRACE("no_parameter_set_update_flag", ps_act_sei->u1_no_parameter_set_update_flag);
888
889 PUT_BITS_UEV(ps_bitstrm, ps_act_sei->u1_num_sps_ids_minus1, return_status);
890
891 ENTROPY_TRACE("num_sps_ids_minus1", ps_act_sei->u1_num_sps_ids_minus1);
892
893 for(i = 0; i <= ps_act_sei->u1_num_sps_ids_minus1; i++)
894 {
895 PUT_BITS_UEV(ps_bitstrm, ps_act_sei->au1_active_seq_parameter_set_id[i], return_status);
896 ENTROPY_TRACE(
897 "active_video_parameter_set_id", ps_act_sei->au1_active_seq_parameter_set_id[i]);
898 }
899 return (return_status);
900 }
901
902 /**
903 ******************************************************************************
904 *
905 * @brief Generates Mastering Display Colour Volume (Supplemental Enhancement Information )
906 *
907 * @par Description
908 * Parse Supplemental Enhancement Information as per Section 7.3.2.4
909 *
910 * @param[in] ps_bitstrm
911 * pointer to bitstream context (handle)
912 *
913 * @param[in] ps_rp_sei
914 * pointer to structure containing recovery point SEI data
915 *
916 * @param[in] ps_vui_params
917 * pointer to structure containing VUI data
918 *
919 * @return success or failure error code
920 *
921 ******************************************************************************
922 */
ihevce_put_mastering_disp_col_vol_sei_params(mastering_dis_col_vol_sei_params_t * ps_mdcl_sei,bitstrm_t * ps_bitstrm)923 WORD32 ihevce_put_mastering_disp_col_vol_sei_params(
924 mastering_dis_col_vol_sei_params_t *ps_mdcl_sei, bitstrm_t *ps_bitstrm)
925 {
926 WORD32 return_status = IHEVCE_SUCCESS;
927 UWORD8 u1_payload_size = 0;
928 WORD32 c;
929
930 u1_payload_size += 6; /* display primaries x */
931 u1_payload_size += 6; /* display primaries y */
932 u1_payload_size += 2; /* white point x */
933 u1_payload_size += 2; /* white point y */
934 u1_payload_size += 4; /* max display mastering luminance */
935 u1_payload_size += 4; /* min display mastering luminance */
936
937 /************************************************************************/
938 /* PayloadSize : This is the size of the payload in bytes */
939 /************************************************************************/
940 PUT_BITS(ps_bitstrm, u1_payload_size, 8, return_status);
941 ENTROPY_TRACE("u1_payload_size", u1_payload_size);
942
943 ASSERT(ps_mdcl_sei->u2_white_point_x <= 50000);
944
945 ASSERT(ps_mdcl_sei->u2_white_point_y <= 50000);
946
947 ASSERT(
948 ps_mdcl_sei->u4_max_display_mastering_luminance >
949 ps_mdcl_sei->u4_min_display_mastering_luminance);
950
951 /*******************************************************************************/
952 /* Put the mastering display colour volume SEI parameters into the bitstream. */
953 /* For details refer to section D.1.1 of the standard */
954 /*******************************************************************************/
955
956 /* display primaries x */
957 for(c = 0; c < 3; c++)
958 {
959 ASSERT(ps_mdcl_sei->au2_display_primaries_x[c] <= 50000);
960
961 PUT_BITS(ps_bitstrm, ps_mdcl_sei->au2_display_primaries_x[c], 16, return_status);
962 ENTROPY_TRACE("u2_display_primaries_x", ps_mdcl_sei->au2_display_primaries_x[c]);
963
964 ASSERT(ps_mdcl_sei->au2_display_primaries_y[c] <= 50000);
965
966 PUT_BITS(ps_bitstrm, ps_mdcl_sei->au2_display_primaries_y[c], 16, return_status);
967 ENTROPY_TRACE("u2_display_primaries_y", ps_mdcl_sei->au2_display_primaries_y[c]);
968 }
969
970 /* white point x */
971 PUT_BITS(ps_bitstrm, ps_mdcl_sei->u2_white_point_x, 16, return_status);
972 ENTROPY_TRACE("u2_white point x", ps_mdcl_sei->u2_white_point_x);
973
974 /* white point y */
975 PUT_BITS(ps_bitstrm, ps_mdcl_sei->u2_white_point_y, 16, return_status);
976 ENTROPY_TRACE("u2_white point y", ps_mdcl_sei->u2_white_point_y);
977
978 /* max display mastering luminance */
979 PUT_BITS(ps_bitstrm, ps_mdcl_sei->u4_max_display_mastering_luminance, 32, return_status);
980 ENTROPY_TRACE(
981 "u4_max_display_mastering_luminance", ps_mdcl_sei->u4_max_display_mastering_luminance);
982
983 /* min display mastering luminance */
984 PUT_BITS(ps_bitstrm, ps_mdcl_sei->u4_min_display_mastering_luminance, 32, return_status);
985 ENTROPY_TRACE(
986 "u4_max_display_mastering_luminance", ps_mdcl_sei->u4_min_display_mastering_luminance);
987
988 return (return_status);
989 }
990
991 /**
992 ******************************************************************************
993 *
994 * @brief Stores user data in bitstream
995 *
996 * @par Description
997 * Parse Supplemental Enhancement Information as per Section 7.3.2.4
998 *
999 * @param[in] ps_bitstrm
1000 * pointer to bitstream context (handle)
1001 *
1002 * @param[in] u4_sei_payload_length
1003 * SEI Payload Length
1004 *
1005 * @param[in] pu1_sei_payload
1006 * pointer to SEI Payload
1007 *
1008 * @return success or failure error code
1009 *
1010 ******************************************************************************
1011 */
ihevce_put_sei_params(UWORD32 u4_sei_payload_length,UWORD8 * pu1_sei_payload,bitstrm_t * ps_bitstrm)1012 WORD32 ihevce_put_sei_params(
1013 UWORD32 u4_sei_payload_length, UWORD8 *pu1_sei_payload, bitstrm_t *ps_bitstrm)
1014 {
1015 WORD32 return_status = IHEVCE_SUCCESS;
1016 UWORD32 i, u4_length = 0;
1017
1018 u4_length = u4_sei_payload_length;
1019 while(u4_sei_payload_length >= 0xFF)
1020 {
1021 PUT_BITS(ps_bitstrm, (UWORD32)0xFF, 8, return_status);
1022 u4_sei_payload_length -= 0xFF;
1023 }
1024 PUT_BITS(ps_bitstrm, (UWORD32)u4_sei_payload_length, 8, return_status);
1025
1026 for(i = 0; i < u4_length; i++)
1027 {
1028 PUT_BITS(ps_bitstrm, (UWORD32)*pu1_sei_payload, 8, return_status);
1029 pu1_sei_payload++;
1030 }
1031
1032 return (return_status);
1033 }
1034
1035 /**
1036 ******************************************************************************
1037 *
1038 * @brief Stores content light level info in bitstream
1039 *
1040 * @par Description
1041 * Parse Supplemental Enhancement Information as per Section 7.3.2.4
1042 *
1043 * @param[in] ps_bitstrm
1044 * pointer to bitstream context (handle)
1045 *
1046 * @param[in]
1047 *
1048 *
1049 * @param[in]
1050 *
1051 *
1052 * @return success or failure error code
1053 *
1054 ******************************************************************************
1055 */
ihevce_put_cll_info_sei_params(UWORD16 u2_avg_cll,UWORD16 u2_max_cll,bitstrm_t * ps_bitstrm)1056 WORD32 ihevce_put_cll_info_sei_params(UWORD16 u2_avg_cll, UWORD16 u2_max_cll, bitstrm_t *ps_bitstrm)
1057 {
1058 WORD32 return_status = IHEVCE_SUCCESS;
1059 UWORD8 u1_payload_size;
1060
1061 u1_payload_size = 4;
1062 /************************************************************************/
1063 /* PayloadSize : This is the size of the payload in bytes */
1064 /************************************************************************/
1065 PUT_BITS(ps_bitstrm, u1_payload_size, 8, return_status);
1066 ENTROPY_TRACE("u1_payload_size", u1_payload_size);
1067
1068 PUT_BITS(ps_bitstrm, (UWORD32)u2_avg_cll, 16, return_status);
1069 PUT_BITS(ps_bitstrm, (UWORD32)u2_max_cll, 16, return_status);
1070
1071 return (return_status);
1072 }
1073
1074 /**
1075 ******************************************************************************
1076 *
1077 * @brief Generates Recovery Point (Supplemental Enhancement Information )
1078 *
1079 * @par Description
1080 * Parse Supplemental Enhancement Information as per Section 7.3.2.4
1081 *
1082 * @param[in] ps_bitstrm
1083 * pointer to bitstream context (handle)
1084 *
1085 * @param[in] ps_rp_sei
1086 * pointer to structure containing recovery point SEI data
1087 *
1088 * @param[in] ps_vui_params
1089 * pointer to structure containing VUI data
1090 *
1091 * @return success or failure error code
1092 *
1093 ******************************************************************************
1094 */
ihevce_put_recovery_point_sei_params(recovery_point_sei_params_t * ps_rp_sei,bitstrm_t * ps_bitstrm)1095 WORD32 ihevce_put_recovery_point_sei_params(
1096 recovery_point_sei_params_t *ps_rp_sei, bitstrm_t *ps_bitstrm)
1097 {
1098 WORD32 return_status = IHEVCE_SUCCESS;
1099 UWORD8 u1_payload_size = 0;
1100
1101 {
1102 UWORD32 range, val;
1103 WORD32 recov_point = ps_rp_sei->i4_recovery_poc_cnt;
1104 val = 0;
1105 range = 0;
1106
1107 if(recov_point <= 0)
1108 val = ((-recov_point) << 1);
1109 else
1110 val = (recov_point << 1) - 1;
1111
1112 GETRANGE(range, val);
1113
1114 u1_payload_size += (((range - 1) << 1) + 1);
1115
1116 u1_payload_size += 1;
1117 u1_payload_size += 1;
1118 }
1119
1120 u1_payload_size = (u1_payload_size + 7) >> 3;
1121 /************************************************************************/
1122 /* PayloadSize : This is the size of the payload in bytes */
1123 /************************************************************************/
1124 PUT_BITS(ps_bitstrm, u1_payload_size, 8, return_status);
1125 ENTROPY_TRACE("u1_payload_size", u1_payload_size);
1126 /************************************************************************/
1127 /* Put the recovery point SEI parameters into the bitstream. For */
1128 /* details refer to section D.1.1 of the standard */
1129 /************************************************************************/
1130
1131 /* i4_recovery_poc_cnt */
1132 PUT_BITS_SEV(ps_bitstrm, ps_rp_sei->i4_recovery_poc_cnt, return_status);
1133 ENTROPY_TRACE("i4_recovery_poc_cnt", ps_rp_sei->i4_recovery_poc_cnt);
1134
1135 /* u1_exact_match_flag */
1136 PUT_BITS(ps_bitstrm, ps_rp_sei->u1_exact_match_flag, 1, return_status);
1137 ENTROPY_TRACE("exact_match_flag", ps_rp_sei->u1_exact_match_flag);
1138
1139 /* u1_broken_link_flag */
1140 PUT_BITS(ps_bitstrm, ps_rp_sei->u1_broken_link_flag, 1, return_status);
1141 ENTROPY_TRACE("broken_link_flag", ps_rp_sei->u1_broken_link_flag);
1142
1143 return (return_status);
1144 }
1145
1146 /**
1147 ******************************************************************************
1148 *
1149 * @brief Generates Picture timing (Supplemental Enhancement Information )
1150 *
1151 * @par Description
1152 * Parse Supplemental Enhancement Information as per Section 7.3.2.4
1153 *
1154 * @param[in] ps_bitstrm
1155 * pointer to bitstream context (handle)
1156 *
1157 * @param[in] ps_pt_sei
1158 * pointer to structure containing oicture timing SEI data
1159 *
1160 * @param[in] ps_vui_params
1161 * pointer to structure containing VUI data
1162 *
1163 * @return success or failure error code
1164 *
1165 ******************************************************************************
1166 */
ihevce_put_pic_timing_sei_params(pic_timing_sei_params_t * ps_pt_sei,vui_t * ps_vui_params,bitstrm_t * ps_bitstrm)1167 WORD32 ihevce_put_pic_timing_sei_params(
1168 pic_timing_sei_params_t *ps_pt_sei, vui_t *ps_vui_params, bitstrm_t *ps_bitstrm)
1169 {
1170 UWORD32 i;
1171 UWORD8 u1_payload_size = 0;
1172 WORD32 return_status = IHEVCE_SUCCESS;
1173 UWORD8 u1_au_cpb_removal_delay_length =
1174 ps_vui_params->s_vui_hrd_parameters.u1_au_cpb_removal_delay_length_minus1 + 1;
1175
1176 UWORD8 u1_dpb_output_delay_length =
1177 ps_vui_params->s_vui_hrd_parameters.u1_dpb_output_delay_length_minus1 + 1;
1178
1179 UWORD8 u1_du_cpb_removal_delay_increment_length =
1180 ps_vui_params->s_vui_hrd_parameters.u1_du_cpb_removal_delay_increment_length_minus1 + 1;
1181
1182 UWORD8 u1_sub_pic_cpb_params_present_flag =
1183 ps_vui_params->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag;
1184
1185 UWORD8 u1_sub_pic_cpb_params_in_pt_sei_flag =
1186 ps_vui_params->s_vui_hrd_parameters.u1_sub_pic_cpb_params_in_pic_timing_sei_flag;
1187
1188 {
1189 if(1 == ps_vui_params->u1_frame_field_info_present_flag)
1190 {
1191 u1_payload_size += 4;
1192 u1_payload_size += 2;
1193 u1_payload_size += 1;
1194 }
1195
1196 if(ps_vui_params->s_vui_hrd_parameters.u1_nal_hrd_parameters_present_flag ||
1197 ps_vui_params->s_vui_hrd_parameters.u1_vcl_hrd_parameters_present_flag)
1198 {
1199 u1_payload_size += u1_au_cpb_removal_delay_length;
1200 u1_payload_size += u1_dpb_output_delay_length;
1201 }
1202
1203 if(u1_sub_pic_cpb_params_in_pt_sei_flag && u1_sub_pic_cpb_params_present_flag)
1204 {
1205 UWORD32 range, val = ps_pt_sei->u4_num_decoding_units_minus1;
1206 range = 0;
1207
1208 GETRANGE(range, val);
1209 u1_payload_size += (((range - 1) << 1) + 1);
1210
1211 u1_payload_size += 1;
1212 if(1 == ps_pt_sei->u1_du_common_cpb_removal_delay_flag)
1213 {
1214 u1_payload_size += u1_du_cpb_removal_delay_increment_length;
1215
1216 for(i = 0; i <= ps_pt_sei->u4_num_decoding_units_minus1; i++)
1217 {
1218 val = ps_pt_sei->au4_num_nalus_in_du_minus1[0];
1219 range = 0;
1220
1221 GETRANGE(range, val);
1222 u1_payload_size += (((range - 1) << 1) + 1);
1223
1224 if((1 != ps_pt_sei->u1_du_common_cpb_removal_delay_flag) &&
1225 (i < ps_pt_sei->u4_num_decoding_units_minus1))
1226 {
1227 u1_payload_size += u1_du_cpb_removal_delay_increment_length;
1228 }
1229 }
1230 }
1231 }
1232 }
1233
1234 ASSERT((ps_pt_sei->u4_au_cpb_removal_delay_minus1 < (1 << u1_au_cpb_removal_delay_length)));
1235
1236 u1_payload_size = (u1_payload_size + 7) >> 3;
1237 /************************************************************************/
1238 /* PayloadSize : This is the size of the payload in bytes */
1239 /************************************************************************/
1240 PUT_BITS(ps_bitstrm, u1_payload_size, 8, return_status);
1241 ENTROPY_TRACE("u1_payload_size", u1_payload_size);
1242
1243 /************************************************************************/
1244 /* Put the picture timing SEI parameters into the bitstream. For */
1245 /* details refer to section D.1.2 of the standard */
1246 /************************************************************************/
1247
1248 if(1 == ps_vui_params->u1_frame_field_info_present_flag)
1249 {
1250 PUT_BITS(ps_bitstrm, ps_pt_sei->u4_pic_struct, 4, return_status);
1251 ENTROPY_TRACE("pic_struct", ps_pt_sei->u4_pic_struct);
1252
1253 PUT_BITS(ps_bitstrm, ps_pt_sei->u4_source_scan_type, 2, return_status);
1254 ENTROPY_TRACE("source_scan_type", ps_pt_sei->u4_source_scan_type);
1255
1256 PUT_BITS(ps_bitstrm, ps_pt_sei->u1_duplicate_flag, 1, return_status);
1257 ENTROPY_TRACE("duplicate_flag", ps_pt_sei->u1_duplicate_flag);
1258 }
1259
1260 if(ps_vui_params->s_vui_hrd_parameters.u1_nal_hrd_parameters_present_flag ||
1261 ps_vui_params->s_vui_hrd_parameters
1262 .u1_vcl_hrd_parameters_present_flag) // condition from standard when CpbDpbDelaysPresentFlag flag will be present
1263 {
1264 PUT_BITS(
1265 ps_bitstrm,
1266 ps_pt_sei->u4_au_cpb_removal_delay_minus1,
1267 u1_au_cpb_removal_delay_length,
1268 return_status);
1269 ENTROPY_TRACE("cpb_removal_delay_minus1", ps_pt_sei->u4_au_cpb_removal_delay_minus1);
1270
1271 PUT_BITS(
1272 ps_bitstrm,
1273 ps_pt_sei->u4_pic_dpb_output_delay,
1274 u1_dpb_output_delay_length,
1275 return_status);
1276 ENTROPY_TRACE("pic_dpb_output_delay", ps_pt_sei->u4_pic_dpb_output_delay);
1277
1278 if(u1_sub_pic_cpb_params_present_flag)
1279 {
1280 PUT_BITS(
1281 ps_bitstrm,
1282 ps_pt_sei->u4_pic_dpb_output_du_delay,
1283 ps_vui_params->s_vui_hrd_parameters.u1_dpb_output_delay_du_length_minus1,
1284 return_status);
1285 ENTROPY_TRACE("pic_dpb_output_du_delay", ps_pt_sei->u4_pic_dpb_output_delay);
1286 }
1287
1288 if(u1_sub_pic_cpb_params_in_pt_sei_flag && u1_sub_pic_cpb_params_present_flag)
1289 {
1290 PUT_BITS_UEV(ps_bitstrm, ps_pt_sei->u4_num_decoding_units_minus1, return_status);
1291 ENTROPY_TRACE("num_decoding_units_minus1", ps_pt_sei->u4_num_decoding_units_minus1);
1292
1293 PUT_BITS(ps_bitstrm, ps_pt_sei->u1_du_common_cpb_removal_delay_flag, 1, return_status);
1294 ENTROPY_TRACE(
1295 "du_common_cpb_removal_delay_flag", ps_pt_sei->u4_du_common_cpb_removal_delay_flag);
1296
1297 if(1 == ps_pt_sei->u1_du_common_cpb_removal_delay_flag)
1298 {
1299 PUT_BITS(
1300 ps_bitstrm,
1301 ps_pt_sei->u4_du_common_cpb_removal_delay_increment_minus1,
1302 u1_du_cpb_removal_delay_increment_length,
1303 return_status);
1304 ENTROPY_TRACE(
1305 "du_common_cpb_removal_delay_increment_minus1",
1306 ps_pt_sei->u4_du_common_cpb_removal_delay_increment_minus1);
1307 }
1308
1309 for(i = 0; i <= ps_pt_sei->u4_num_decoding_units_minus1; i++)
1310 {
1311 PUT_BITS_UEV(ps_bitstrm, ps_pt_sei->au4_num_nalus_in_du_minus1[0], return_status);
1312 ENTROPY_TRACE("num_nalus_in_du_minus1", ps_pt_sei->u4_num_nalus_in_du_minus1);
1313
1314 if((1 != ps_pt_sei->u1_du_common_cpb_removal_delay_flag) &&
1315 (i < ps_pt_sei->u4_num_decoding_units_minus1))
1316 {
1317 PUT_BITS(
1318 ps_bitstrm,
1319 ps_pt_sei->au4_du_cpb_removal_delay_increment_minus1[0],
1320 u1_du_cpb_removal_delay_increment_length,
1321 return_status);
1322 ENTROPY_TRACE(
1323 "du_cpb_removal_delay_increment_minus1",
1324 ps_pt_sei->u4_du_cpb_removal_delay_increment_minus1);
1325 }
1326 }
1327 }
1328 }
1329
1330 return (return_status);
1331 }
1332
1333 /**
1334 ******************************************************************************
1335 *
1336 * @brief Generates Hash (Supplemental Enhancement Information )
1337 *
1338 * @par Description
1339 * Put hash sei params
1340 *
1341 * @param[in] ps_hash_sei_params
1342 * pointer to structure containing hash SEI data
1343 *
1344 * @param[in] i1_decoded_pic_hash_sei_flag
1345 * flag saying the hash SEI type
1346 *
1347 * @param[in] ps_bitstrm
1348 * pointer to bitstream context (handle)
1349 *
1350 * @return success or failure error code
1351 *
1352 ******************************************************************************
1353 */
ihevce_put_hash_sei_params(hash_sei_param_t * ps_hash_sei_params,WORD8 i1_decoded_pic_hash_sei_flag,bitstrm_t * ps_bitstrm)1354 WORD32 ihevce_put_hash_sei_params(
1355 hash_sei_param_t *ps_hash_sei_params, WORD8 i1_decoded_pic_hash_sei_flag, bitstrm_t *ps_bitstrm)
1356 {
1357 UWORD32 i, c_idx, val;
1358 WORD32 return_status = IHEVCE_SUCCESS;
1359 UWORD8 u1_payload_size = 0;
1360
1361 u1_payload_size += 1; /* hash_type */
1362
1363 if(1 == i1_decoded_pic_hash_sei_flag)
1364 {
1365 /* MD5 : 3 color planes * 16 byte values */
1366 u1_payload_size += (16 * 3);
1367 }
1368 else if(2 == i1_decoded_pic_hash_sei_flag)
1369 {
1370 /* CRC : 3 color planes * 2 byte values */
1371 u1_payload_size += (2 * 3);
1372 }
1373 else if(3 == i1_decoded_pic_hash_sei_flag)
1374 {
1375 /* Checksum : 3 color planes * 4 byte values */
1376 u1_payload_size += (4 * 3);
1377 }
1378 else
1379 {
1380 ASSERT(0);
1381 }
1382
1383 /************************************************************************/
1384 /* PayloadSize : This is the size of the payload in bytes */
1385 /************************************************************************/
1386 PUT_BITS(ps_bitstrm, u1_payload_size, 8, return_status);
1387 ENTROPY_TRACE("payload_size", u1_payload_size);
1388
1389 /************************************************************************/
1390 /* Put the hash SEI parameters into the bitstream. For */
1391 /* details refer to section D.2.19 of the standard */
1392 /************************************************************************/
1393
1394 PUT_BITS(ps_bitstrm, (i1_decoded_pic_hash_sei_flag - 1), 8, return_status);
1395 ENTROPY_TRACE("hash_type", (i1_decoded_pic_hash_sei_flag - 1));
1396
1397 if(1 == i1_decoded_pic_hash_sei_flag)
1398 {
1399 for(c_idx = 0; c_idx < 3; c_idx++)
1400 {
1401 for(i = 0; i < 16; i++)
1402 {
1403 PUT_BITS(ps_bitstrm, ps_hash_sei_params->au1_sei_hash[c_idx][i], 8, return_status);
1404 ENTROPY_TRACE("picture_md5", ps_hash_sei_params->au1_sei_hash[c_idx][i]);
1405 }
1406 }
1407 }
1408 else if(2 == i1_decoded_pic_hash_sei_flag)
1409 {
1410 for(c_idx = 0; c_idx < 3; c_idx++)
1411 {
1412 val = (ps_hash_sei_params->au1_sei_hash[c_idx][0] << 8) +
1413 ps_hash_sei_params->au1_sei_hash[c_idx][1];
1414 PUT_BITS(ps_bitstrm, val, 16, return_status);
1415 ENTROPY_TRACE("picture_crc", val);
1416 }
1417 }
1418 else if(3 == i1_decoded_pic_hash_sei_flag)
1419 {
1420 for(c_idx = 0; c_idx < 3; c_idx++)
1421 {
1422 val = (ps_hash_sei_params->au1_sei_hash[c_idx][0] << 24) +
1423 (ps_hash_sei_params->au1_sei_hash[c_idx][1] << 16) +
1424 (ps_hash_sei_params->au1_sei_hash[c_idx][2] << 8) +
1425 (ps_hash_sei_params->au1_sei_hash[c_idx][3]);
1426
1427 PUT_BITS(ps_bitstrm, val, 32, return_status);
1428 ENTROPY_TRACE("picture_checksum", val);
1429 }
1430 }
1431 else
1432 {
1433 ASSERT(0);
1434 }
1435
1436 return (return_status);
1437 }
1438
1439 /**
1440 ******************************************************************************
1441 *
1442 * @brief Generates SEI (Supplemental Enhancement Information )
1443 *
1444 * @par Description
1445 * Parse Supplemental Enhancement Information as per Section 7.3.2.4
1446 *
1447 * @param[in] e_payload_type
1448 * Determines the type of SEI msg
1449 *
1450 * @param[in] ps_bitstrm
1451 * pointer to bitstream context (handle)
1452 *
1453 * @param[in] ps_sei_params
1454 * pointer to structure containing SEI data
1455 * buffer period, recovery point, picture timing
1456 *
1457 * @param[in] ps_vui_params
1458 * pointer to structure containing VUI data
1459 *
1460 * @return success or failure error code
1461 *
1462 ******************************************************************************
1463 */
ihevce_put_sei_msg(IHEVCE_SEI_TYPE e_payload_type,sei_params_t * ps_sei_params,vui_t * ps_vui_params,bitstrm_t * ps_bitstrm,UWORD32 i4_sei_payload_length,UWORD8 * pu1_sei_payload)1464 WORD32 ihevce_put_sei_msg(
1465 IHEVCE_SEI_TYPE e_payload_type,
1466 sei_params_t *ps_sei_params,
1467 vui_t *ps_vui_params,
1468 bitstrm_t *ps_bitstrm,
1469 UWORD32 i4_sei_payload_length,
1470 UWORD8 *pu1_sei_payload)
1471 {
1472 WORD32 return_status = IHEVCE_SUCCESS;
1473 /************************************************************************/
1474 /* PayloadType : Send in the SEI type in the stream */
1475 /************************************************************************/
1476 UWORD32 u4_payload_type = e_payload_type;
1477 while(u4_payload_type > 0xFF)
1478 {
1479 PUT_BITS(ps_bitstrm, 0xFF, 8, return_status);
1480 u4_payload_type -= 0xFF;
1481 }
1482 PUT_BITS(ps_bitstrm, (UWORD32)u4_payload_type, 8, return_status);
1483 ENTROPY_TRACE("e_payload_type", e_payload_type);
1484
1485 /************************************************************************/
1486 /* PayloadSize : This is sent from within the type specific functions */
1487 /************************************************************************/
1488
1489 switch(e_payload_type)
1490 {
1491 case IHEVCE_SEI_BUF_PERIOD_T:
1492 return_status |= ihevce_put_buf_period_sei_params(
1493 &(ps_sei_params->s_buf_period_sei_params), ps_vui_params, ps_bitstrm);
1494 break;
1495
1496 case IHEVCE_SEI_PIC_TIMING_T:
1497 return_status |= ihevce_put_pic_timing_sei_params(
1498 &(ps_sei_params->s_pic_timing_sei_params), ps_vui_params, ps_bitstrm);
1499 break;
1500
1501 case IHEVCE_SEI_RECOVERY_POINT_T:
1502 return_status |= ihevce_put_recovery_point_sei_params(
1503 &(ps_sei_params->s_recovery_point_params), ps_bitstrm);
1504 break;
1505 case IHEVCE_SEI_ACTIVE_PARAMETER_SETS_T:
1506 return_status |= ihevce_put_active_parameter_set_sei_params(
1507 &(ps_sei_params->s_active_parameter_set_sei_params), ps_bitstrm);
1508 break;
1509 case IHEVCE_SEI_DECODED_PICTURE_HASH_T:
1510 return_status |= ihevce_put_hash_sei_params(
1511 &(ps_sei_params->s_hash_sei_params),
1512 ps_sei_params->i1_decoded_pic_hash_sei_flag,
1513 ps_bitstrm);
1514 break;
1515 case IHEVCE_SEI_MASTERING_DISP_COL_VOL_T:
1516 return_status |= ihevce_put_mastering_disp_col_vol_sei_params(
1517 &(ps_sei_params->s_mastering_dis_col_vol_sei_params), ps_bitstrm);
1518 break;
1519 case IHEVCE_SEI_CONTENT_LIGHT_LEVEL_DATA_T:
1520 return_status |= ihevce_put_cll_info_sei_params(
1521 ps_sei_params->s_cll_info_sei_params.u2_sei_avg_cll,
1522 ps_sei_params->s_cll_info_sei_params.u2_sei_max_cll,
1523 ps_bitstrm);
1524 break;
1525 //case IHEVCE_SEI_USER_DATA_REGISTERED_ITU_T_T35_T:
1526 //return_status |= ihevce_put_sei_params(i4_sei_payload_length, pu1_sei_payload, ps_bitstrm);
1527 //break;
1528 default:
1529 //Any Payload type other than the above cases will entred hereand be added to the bitstream
1530 return_status |= ihevce_put_sei_params(i4_sei_payload_length, pu1_sei_payload, ps_bitstrm);
1531 //return_status = IHEVCE_FAIL;
1532 }
1533
1534 ASSERT(IHEVCE_SUCCESS == return_status);
1535
1536 /* rbsp trailing bits */
1537 if((IHEVCE_SUCCESS == return_status) && (ps_bitstrm->i4_bits_left_in_cw & 0x7))
1538 ihevce_put_rbsp_trailing_bits(ps_bitstrm);
1539
1540 return (return_status);
1541 }
1542
1543 /**
1544 ******************************************************************************
1545 *
1546 * @brief Generates SEI (Supplemental Enhancement Information )
1547 *
1548 * @par Description
1549 * Parse Supplemental Enhancement Information as per Section 7.3.2.4
1550 *
1551 * @param[in] ps_bitstrm
1552 * pointer to bitstream context (handle)
1553 *
1554 * @param[in] ps_sei_params
1555 * pointer to structure containing SEI data
1556 * buffer period, recovery point, picture timing
1557 *
1558 * @param[in] ps_vui_params
1559 * pointer to structure containing VUI data
1560 *
1561 * @param[in] nal_unit_header
1562 * NAL_PREFIX_SEI / NAL_SUFFIX_SEI
1563 *
1564 * @param[in] u4_num_sei_payloads
1565 * Number of SEI payloads
1566 *
1567 * @param[in] ps_sei_payload
1568 * pointer to structure containing SEI payload data
1569 *
1570 * @return success or failure error code
1571 *
1572 ******************************************************************************
1573 */
ihevce_generate_sei(bitstrm_t * ps_bitstrm,sei_params_t * ps_sei_params,vui_t * ps_vui_params,WORD32 insert_per_cra,WORD32 nal_unit_header,UWORD32 u4_num_sei_payloads,sei_payload_t * ps_sei_payload)1574 WORD32 ihevce_generate_sei(
1575 bitstrm_t *ps_bitstrm,
1576 sei_params_t *ps_sei_params,
1577 vui_t *ps_vui_params,
1578 WORD32 insert_per_cra,
1579 WORD32 nal_unit_header,
1580 UWORD32 u4_num_sei_payloads,
1581 sei_payload_t *ps_sei_payload)
1582 {
1583 UWORD32 u4_i;
1584 WORD32 return_status = IHEVCE_SUCCESS;
1585
1586 (void)insert_per_cra;
1587 /* Insert Start Code */
1588 return_status = ihevce_put_nal_start_code_prefix(ps_bitstrm, 1);
1589
1590 ASSERT((NAL_PREFIX_SEI == nal_unit_header) || (NAL_SUFFIX_SEI == nal_unit_header));
1591 /* Insert Nal Unit Header */
1592 return_status |= ihevce_generate_nal_unit_header(ps_bitstrm, nal_unit_header, 0);
1593
1594 if(NAL_PREFIX_SEI == nal_unit_header)
1595 {
1596 /* Active Parameter and Buffering period insertion */
1597
1598 if(ps_sei_params->i1_buf_period_params_present_flag)
1599 {
1600 /* insert active_parameter_set SEI required if buffering period SEI messages are inserted */
1601 return_status |= ihevce_put_sei_msg(
1602 IHEVCE_SEI_ACTIVE_PARAMETER_SETS_T,
1603 ps_sei_params,
1604 ps_vui_params,
1605 ps_bitstrm,
1606 0,
1607 NULL);
1608
1609 /*************************************************************************************************/
1610 /* NOTE: Need to terminate and start new SEI message after active parameter set SEI */
1611 /* Buffering period/pic timing SEI refering to active SPS cannot be embedded in same SEI message */
1612 /* This is because SPS is activated in HM decoder after completely parsing full SEI message. */
1613 /*************************************************************************************************/
1614 if(1) /* Insert New SEI for buffering period after active parameter set SEI */
1615 {
1616 ihevce_put_rbsp_trailing_bits(ps_bitstrm);
1617
1618 /* Insert Next SEI Start Code */
1619 return_status = ihevce_put_nal_start_code_prefix(ps_bitstrm, 1);
1620
1621 /* Insert Next SEI Nal Unit Header */
1622 return_status |= ihevce_generate_nal_unit_header(ps_bitstrm, nal_unit_header, 0);
1623 }
1624
1625 /* Buffering Period SEI meassage for all IDR, CRA pics */
1626 return_status |= ihevce_put_sei_msg(
1627 IHEVCE_SEI_BUF_PERIOD_T, ps_sei_params, ps_vui_params, ps_bitstrm, 0, NULL);
1628 }
1629
1630 /* Pic timing SEI meassage for non IDR, non CRA pics */
1631 if(ps_sei_params->i1_pic_timing_params_present_flag)
1632 {
1633 return_status |= ihevce_put_sei_msg(
1634 IHEVCE_SEI_PIC_TIMING_T, ps_sei_params, ps_vui_params, ps_bitstrm, 0, NULL);
1635 }
1636
1637 /* Recovery point SEI meassage for all IDR, CRA pics */
1638 if(ps_sei_params->i1_recovery_point_params_present_flag)
1639 {
1640 return_status |= ihevce_put_sei_msg(
1641 IHEVCE_SEI_RECOVERY_POINT_T, ps_sei_params, ps_vui_params, ps_bitstrm, 0, NULL);
1642 }
1643
1644 /* Mastering Display Colour SEI for all IDR, CRA pics */
1645 if(ps_sei_params->i4_sei_mastering_disp_colour_vol_params_present_flags)
1646 {
1647 return_status |= ihevce_put_sei_msg(
1648 IHEVCE_SEI_MASTERING_DISP_COL_VOL_T,
1649 ps_sei_params,
1650 ps_vui_params,
1651 ps_bitstrm,
1652 0,
1653 NULL);
1654 }
1655 /*Registered User Data*/
1656 for(u4_i = 0; u4_i < u4_num_sei_payloads; u4_i++)
1657 {
1658 return_status |= ihevce_put_sei_msg(
1659 (IHEVCE_SEI_TYPE)(ps_sei_payload[u4_i].u4_payload_type),
1660 ps_sei_params,
1661 ps_vui_params,
1662 ps_bitstrm,
1663 ps_sei_payload[u4_i].u4_payload_length,
1664 ps_sei_payload[u4_i].pu1_sei_payload);
1665 }
1666 /* Content Light Level Information*/
1667 if(ps_sei_params->i1_sei_cll_enable)
1668 {
1669 return_status |= ihevce_put_sei_msg(
1670 IHEVCE_SEI_CONTENT_LIGHT_LEVEL_DATA_T,
1671 ps_sei_params,
1672 ps_vui_params,
1673 ps_bitstrm,
1674 0,
1675 NULL);
1676 }
1677 }
1678 else if(NAL_SUFFIX_SEI == nal_unit_header)
1679 {
1680 /* Insert hash SEI */
1681 if(ps_sei_params->i1_decoded_pic_hash_sei_flag)
1682 {
1683 return_status |= ihevce_put_sei_msg(
1684 IHEVCE_SEI_DECODED_PICTURE_HASH_T,
1685 ps_sei_params,
1686 ps_vui_params,
1687 ps_bitstrm,
1688 0,
1689 NULL);
1690 }
1691 }
1692
1693 /*put trailing bits to indicate end of sei*/
1694 ihevce_put_rbsp_trailing_bits(ps_bitstrm);
1695
1696 return return_status;
1697 }
1698
1699 /**
1700 ******************************************************************************
1701 *
1702 * @brief Populates ihevce_populate_mastering_disp_col_vol_sei of SEI structure
1703 *
1704 * @par Description
1705 * Populates mastering display colour volume sei structure
1706 *
1707 * @param[in] ps_sei
1708 * pointer to sei params that needs to be populated
1709 *
1710 * @param[in] ps_out_strm_prms
1711 * pointer to output stream params
1712 *
1713 * @return success or failure error code
1714 *
1715 ******************************************************************************
1716 */
ihevce_populate_mastering_disp_col_vol_sei(sei_params_t * ps_sei,ihevce_out_strm_params_t * ps_out_strm_prms)1717 WORD32 ihevce_populate_mastering_disp_col_vol_sei(
1718 sei_params_t *ps_sei, ihevce_out_strm_params_t *ps_out_strm_prms)
1719 {
1720 WORD32 i;
1721
1722 mastering_dis_col_vol_sei_params_t *ps_mastering_dis_col_vol_sei_params =
1723 &ps_sei->s_mastering_dis_col_vol_sei_params;
1724
1725 for(i = 0; i < 3; i++)
1726 {
1727 ps_mastering_dis_col_vol_sei_params->au2_display_primaries_x[i] =
1728 ps_out_strm_prms->au2_display_primaries_x[i];
1729 ps_mastering_dis_col_vol_sei_params->au2_display_primaries_y[i] =
1730 ps_out_strm_prms->au2_display_primaries_y[i];
1731 }
1732
1733 ps_mastering_dis_col_vol_sei_params->u2_white_point_x = ps_out_strm_prms->u2_white_point_x;
1734 ps_mastering_dis_col_vol_sei_params->u2_white_point_y = ps_out_strm_prms->u2_white_point_y;
1735
1736 ps_mastering_dis_col_vol_sei_params->u4_max_display_mastering_luminance =
1737 ps_out_strm_prms->u4_max_display_mastering_luminance;
1738 ps_mastering_dis_col_vol_sei_params->u4_min_display_mastering_luminance =
1739 ps_out_strm_prms->u4_min_display_mastering_luminance;
1740
1741 return IHEVCE_SUCCESS;
1742 }
1743
1744 /**
1745 ******************************************************************************
1746 *
1747 * @brief Populates ihevce_populate_recovery_point_sei of SEI structure
1748 *
1749 * @par Description
1750 * Populates vui structure for its use in header generation
1751 *
1752 * @param[out] ps_sei
1753 * pointer to sei params that needs to be populated
1754 *
1755 * @param[out] ps_vui
1756 * pointer to vui params referred by sei
1757 *
1758 * @param[out] ps_sps
1759 * pointer to sps params referred by sei
1760 *
1761 * @param[in] ps_src_params
1762 * pointer to source config params; resolution, frame rate etc
1763 *
1764 * @param[in] ps_config_prms
1765 * pointer to configuration params like bitrate, HRD buffer sizes, cu, tu sizes
1766 *
1767 * @return success or failure error code
1768 *
1769 ******************************************************************************
1770 */
ihevce_populate_recovery_point_sei(sei_params_t * ps_sei,ihevce_vui_sei_params_t * ps_vui_sei_prms)1771 WORD32 ihevce_populate_recovery_point_sei(
1772 sei_params_t *ps_sei, ihevce_vui_sei_params_t *ps_vui_sei_prms)
1773 {
1774 recovery_point_sei_params_t *ps_rec_point_params = &ps_sei->s_recovery_point_params;
1775
1776 (void)ps_vui_sei_prms;
1777 ps_rec_point_params->i4_recovery_poc_cnt = 0;
1778 ps_rec_point_params->u1_broken_link_flag = 0;
1779 ps_rec_point_params->u1_exact_match_flag = 1;
1780
1781 return IHEVCE_SUCCESS;
1782 }
1783
1784 /**
1785 ******************************************************************************
1786 *
1787 * @brief Populates picture timing of SEI structure
1788 *
1789 * @par Description
1790 * Populates vui structure for its use in header generation
1791 *
1792 * @param[out] ps_sei
1793 * pointer to sei params that needs to be populated
1794 *
1795 * @param[out] ps_vui
1796 * pointer to vui params referred by sei
1797 *
1798 * @param[in] ps_src_params
1799 * pointer to source config params; resolution, frame rate etc
1800 *
1801 * @param[in] u4_bottom_field_flag
1802 * Used only for interlaced field coding. 0:top field, 1:bottom field
1803 *
1804 * @return success or failure error code
1805 *
1806 ******************************************************************************
1807 */
ihevce_populate_picture_timing_sei(sei_params_t * ps_sei,vui_t * ps_vui,ihevce_src_params_t * ps_src_params,WORD32 u4_bottom_field_flag)1808 WORD32 ihevce_populate_picture_timing_sei(
1809 sei_params_t *ps_sei,
1810 vui_t *ps_vui,
1811 ihevce_src_params_t *ps_src_params,
1812 WORD32 u4_bottom_field_flag)
1813 {
1814 pic_timing_sei_params_t *ps_pic_timing_params = &ps_sei->s_pic_timing_sei_params;
1815 UWORD8 u1_prog_seq = !ps_src_params->i4_field_pic;
1816 UWORD8 u1_top_field_first = 1; //ps_curr_inp->s_input_buf.i4_topfield_first;
1817
1818 UWORD8 u1_repeat_first_field = 0;
1819 WORD32 field_seq_flag = ps_vui->u1_field_seq_flag;
1820
1821 if(ps_vui->u1_frame_field_info_present_flag)
1822 {
1823 /**************************************************************************/
1824 /* Refer Table D-1 */
1825 /**************************************************************************/
1826 if(0 == u1_prog_seq)
1827 {
1828 if(field_seq_flag)
1829 {
1830 ASSERT((u4_bottom_field_flag == 0) || (u4_bottom_field_flag == 1));
1831
1832 /* 1 => top field pic */
1833 /* 2 => bottom field pic */
1834 ps_pic_timing_params->u4_pic_struct = 1 + u4_bottom_field_flag;
1835 }
1836 else if(0 == u1_repeat_first_field)
1837 {
1838 /******************************************************************/
1839 /* [PROGRESSIVE SEQ] = 0; */
1840 /* [MPEG2 PIC STRUCT] = FIELD_PICTURE */
1841 /* [REPEAT_FIRST_FIELD] = 0 */
1842 /* u1_pic_struct = 3 => top - bottom field pic */
1843 /* u1_pic_struct = 4 => bottom - top */
1844 /******************************************************************/
1845 ps_pic_timing_params->u4_pic_struct = 4 - u1_top_field_first;
1846 }
1847 else
1848 {
1849 /******************************************************************/
1850 /* [PROGRESSIVE SEQ] = 0; */
1851 /* [MPEG2 PIC STRUCT] = FIELD_PICTURE */
1852 /* [REPEAT_FIRST_FIELD] = 1 */
1853 /* u1_pic_struct = 5 => top - bottom - top */
1854 /* u1_pic_struct = 6 => bottom - top - bottom */
1855 /******************************************************************/
1856 ps_pic_timing_params->u4_pic_struct = 6 - u1_top_field_first;
1857 }
1858 }
1859 else
1860 {
1861 if(0 == u1_repeat_first_field)
1862 {
1863 /******************************************************************/
1864 /* [PROGRESSIVE SEQ] = 1; */
1865 /* [MPEG2 PIC STRUCT] = FRAME_PICTURE */
1866 /* u1_pic_struct = 0 => frame picture (no repeat) */
1867 /******************************************************************/
1868 ps_pic_timing_params->u4_pic_struct = 0;
1869 }
1870 else
1871 {
1872 /******************************************************************/
1873 /* [PROGRESSIVE SEQ] = 1; */
1874 /* [MPEG2 PIC STRUCT] = FRAME_PICTURE */
1875 /* u1_pic_struct = 7 => frame picture (repeat once) */
1876 /* u1_pic_struct = 8 => frame picture (repeat twice) */
1877 /******************************************************************/
1878 ps_pic_timing_params->u4_pic_struct = 7 + u1_top_field_first;
1879 }
1880 }
1881 /* Porogressive frame - 1 ; Interlace - 0 */
1882 ps_pic_timing_params->u4_source_scan_type = !ps_src_params->i4_field_pic;
1883
1884 ps_pic_timing_params->u1_duplicate_flag = 0;
1885 }
1886 ps_pic_timing_params->u4_pic_dpb_output_du_delay = 0;
1887
1888 ps_pic_timing_params->u4_num_decoding_units_minus1 = 1;
1889
1890 ps_pic_timing_params->u1_du_common_cpb_removal_delay_flag = 1;
1891
1892 ps_pic_timing_params->u4_du_common_cpb_removal_delay_increment_minus1 = 1;
1893
1894 ps_pic_timing_params->au4_num_nalus_in_du_minus1[0] = 1;
1895
1896 ps_pic_timing_params->au4_du_cpb_removal_delay_increment_minus1[0] = 1;
1897
1898 return IHEVCE_SUCCESS;
1899 }
1900
1901 /**
1902 ******************************************************************************
1903 *
1904 * @brief Populates buffer period of sei structure
1905 *
1906 * @par Description
1907 * Populates vui structure for its use in header generation
1908 *
1909 * @param[out] ps_sei
1910 * pointer to sei params that needs to be populated
1911 *
1912 * @param[out] ps_vui
1913 * pointer to vui params referred by sei
1914 *
1915 * @param[out] ps_sps
1916 * pointer to sps params referred by sei
1917 *
1918 * @param[out] ps_vui_sei_prms
1919 * pointer to sps params referred by application
1920 *
1921 * @return success or failure error code
1922 *
1923 ******************************************************************************
1924 */
ihevce_populate_buffering_period_sei(sei_params_t * ps_sei,vui_t * ps_vui,sps_t * ps_sps,ihevce_vui_sei_params_t * ps_vui_sei_prms)1925 WORD32 ihevce_populate_buffering_period_sei(
1926 sei_params_t *ps_sei, vui_t *ps_vui, sps_t *ps_sps, ihevce_vui_sei_params_t *ps_vui_sei_prms)
1927 {
1928 WORD32 i;
1929
1930 buf_period_sei_params_t *ps_bp_sei = &ps_sei->s_buf_period_sei_params;
1931
1932 WORD32 i1_sps_max_sub_layersminus1 = ps_sps->i1_sps_max_sub_layers - 1;
1933
1934 hrd_params_t *ps_vui_hrd_parameters = &ps_vui->s_vui_hrd_parameters;
1935
1936 sub_lyr_hrd_params_t *ps_sub_layer_hrd_params =
1937 &ps_vui_hrd_parameters->as_sub_layer_hrd_params[i1_sps_max_sub_layersminus1];
1938
1939 WORD32 cpb_cnt = ps_vui_hrd_parameters->au1_cpb_cnt_minus1[i1_sps_max_sub_layersminus1];
1940
1941 WORD32 cpb_size, bit_rate;
1942
1943 (void)ps_vui_sei_prms;
1944 ps_bp_sei->u1_bp_seq_parameter_set_id = ps_sps->i1_sps_id;
1945
1946 ps_bp_sei->u4_initial_cpb_removal_delay_length =
1947 ps_vui->s_vui_hrd_parameters.u1_initial_cpb_removal_delay_length_minus1 + 1;
1948
1949 ps_bp_sei->u1_sub_pic_cpb_params_present_flag =
1950 ps_vui_hrd_parameters->u1_sub_pic_cpb_params_present_flag;
1951
1952 ps_bp_sei->u1_rap_cpb_params_present_flag = 0; //DEFAULT value
1953
1954 ps_bp_sei->u4_cpb_delay_offset = 0; //DEFAULT value
1955 ps_bp_sei->u4_dpb_delay_offset = 0; //DEFAULT value
1956
1957 ps_bp_sei->u1_concatenation_flag = 0; //DEFAULT value ???
1958 ps_bp_sei->u4_au_cpb_removal_delay_delta_minus1 = 0; //DEFAULT value ???
1959
1960 ps_bp_sei->u4_cpb_cnt = cpb_cnt;
1961
1962 if(ps_vui->s_vui_hrd_parameters.u1_nal_hrd_parameters_present_flag)
1963 {
1964 for(i = 0; i <= cpb_cnt; i++)
1965 {
1966 ULWORD64 u8_temp;
1967 if(1 == ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag)
1968 {
1969 ASSERT(1 == ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag);
1970
1971 cpb_size = (ps_sub_layer_hrd_params->au4_cpb_size_du_value_minus1[i] + 1) *
1972 (1 << (4 + ps_vui_hrd_parameters->u4_cpb_size_du_scale));
1973
1974 bit_rate = (ps_sub_layer_hrd_params->au4_bit_rate_du_value_minus1[i] + 1) *
1975 (1 << (6 + ps_vui_hrd_parameters->u4_bit_rate_scale));
1976 }
1977 else
1978 {
1979 cpb_size = (ps_sub_layer_hrd_params->au4_cpb_size_value_minus1[i] + 1) *
1980 (1 << (4 + ps_vui_hrd_parameters->u4_cpb_size_scale));
1981
1982 bit_rate = (ps_sub_layer_hrd_params->au4_bit_rate_value_minus1[i] + 1) *
1983 (1 << (6 + ps_vui_hrd_parameters->u4_bit_rate_scale));
1984 }
1985
1986 u8_temp = (ULWORD64)(90000 * (ULWORD64)cpb_size);
1987 ps_bp_sei->au4_nal_initial_cpb_removal_delay[i] = (UWORD32)(u8_temp / bit_rate);
1988
1989 ps_bp_sei->au4_nal_initial_cpb_removal_delay_offset[i] = 0;
1990
1991 if(ps_bp_sei->u1_rap_cpb_params_present_flag ||
1992 ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag)
1993 {
1994 ps_bp_sei->au4_nal_initial_alt_cpb_removal_delay[i] = (UWORD32)(u8_temp / bit_rate);
1995 ps_bp_sei->au4_nal_initial_cpb_removal_delay_offset[i] = 0;
1996 }
1997 }
1998 }
1999
2000 if(ps_vui->s_vui_hrd_parameters.u1_vcl_hrd_parameters_present_flag)
2001 {
2002 for(i = 0; i <= cpb_cnt; i++)
2003 {
2004 if(1 == ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag)
2005 {
2006 ASSERT(1 == ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag);
2007 cpb_size = (ps_sub_layer_hrd_params->au4_cpb_size_du_value_minus1[i] + 1) *
2008 (1 << (4 + ps_vui_hrd_parameters->u4_cpb_size_du_scale));
2009
2010 bit_rate = (ps_sub_layer_hrd_params->au4_bit_rate_du_value_minus1[i] + 1) *
2011 (1 << (6 + ps_vui_hrd_parameters->u4_bit_rate_scale));
2012 }
2013 else
2014 {
2015 cpb_size = (ps_sub_layer_hrd_params->au4_cpb_size_value_minus1[i] + 1) *
2016 (1 << (4 + ps_vui_hrd_parameters->u4_cpb_size_scale));
2017
2018 bit_rate = (ps_sub_layer_hrd_params->au4_bit_rate_value_minus1[i] + 1) *
2019 (1 << (6 + ps_vui_hrd_parameters->u4_bit_rate_scale));
2020 }
2021
2022 ps_bp_sei->au4_vcl_initial_cpb_removal_delay[i] = 90000 * (cpb_size / bit_rate);
2023
2024 ps_bp_sei->au4_vcl_initial_cpb_removal_delay_offset[i] = 0;
2025
2026 if(ps_bp_sei->u1_rap_cpb_params_present_flag ||
2027 ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag)
2028 {
2029 ps_bp_sei->au4_vcl_initial_alt_cpb_removal_delay[i] = 90000 * (cpb_size / bit_rate);
2030 ps_bp_sei->au4_vcl_initial_cpb_removal_delay_offset[i] = 0;
2031 }
2032 }
2033 }
2034
2035 /* Reset picture timing cbp removal delay at every insertion Buffering period SEI */
2036 //ps_sei->s_pic_timing_sei_params.u4_au_cpb_removal_delay_minus1 = 0;
2037
2038 return IHEVCE_SUCCESS;
2039 }
2040
2041 /**
2042 ******************************************************************************
2043 *
2044 * @brief Populates active parameter set sei structure
2045 *
2046 * @par Description
2047 *
2048 * @param[out] ps_sei
2049 * pointer to sei params that needs to be populated
2050 *
2051 * @param[in] ps_vps
2052 * pointer to configuration vps_t.
2053 *
2054 * @return success or failure error code
2055 *
2056 *****************************************************************************
2057 */
ihevce_populate_active_parameter_set_sei(sei_params_t * ps_sei,vps_t * ps_vps,sps_t * ps_sps)2058 WORD32 ihevce_populate_active_parameter_set_sei(sei_params_t *ps_sei, vps_t *ps_vps, sps_t *ps_sps)
2059 {
2060 UWORD8 i;
2061 active_parameter_set_sei_param_t *ps_act_sei = &ps_sei->s_active_parameter_set_sei_params;
2062
2063 (void)ps_sps;
2064 ps_act_sei->u1_active_video_parameter_set_id = ps_vps->i1_vps_id;
2065 ps_act_sei->u1_self_contained_cvs_flag = 0;
2066 ps_act_sei->u1_no_parameter_set_update_flag = 1;
2067 ps_act_sei->u1_num_sps_ids_minus1 = 0;
2068 for(i = 0; i <= ps_act_sei->u1_num_sps_ids_minus1; i++)
2069 {
2070 ps_act_sei->au1_active_seq_parameter_set_id[i] = 0;
2071 }
2072
2073 return IHEVCE_SUCCESS;
2074 }
2075
2076 /**
2077 ******************************************************************************
2078 *
2079 * @brief Populates Hash SEI values for CRC Hash
2080 *
2081 * @par Description
2082 *
2083 * @param[out] ps_hash_sei_params
2084 * pointer to hash sei params that needs to be populated
2085 *
2086 * @param[in] bit_depth
2087 * i4_internal_bit_depth value. Assume same for Luma & Chroma
2088 *
2089 * @param[in] pv_y_buf
2090 * Pointer to decoded/recon Luma buffer
2091 *
2092 * @param[in] y_wd
2093 * pic width in luma samples
2094 *
2095 * @param[in] y_ht
2096 * pic height in luma samples
2097 *
2098 * @param[in] y_strd
2099 * Stride of luma buffer
2100 *
2101 * @param[in] pv_u_buf
2102 * Pointer to decoded/recon Chroma buffer
2103 *
2104 * @param[in] uv_wd
2105 * pic width in luma samples / SubWidthC
2106 *
2107 * @param[in] uv_ht
2108 * pic height in luma samples / SubHeightC
2109 *
2110 * @param[in] uv_strd
2111 * Stride of chroma buffer
2112 *
2113 * @return None
2114 *
2115 *****************************************************************************
2116 */
ihevce_calc_CRC(hash_sei_param_t * ps_hash_sei_params,WORD32 bit_depth,void * pv_y_buf,WORD32 y_wd,WORD32 y_ht,WORD32 y_strd,void * pv_u_buf,WORD32 uv_wd,WORD32 uv_ht,WORD32 uv_strd)2117 static void ihevce_calc_CRC(
2118 hash_sei_param_t *ps_hash_sei_params,
2119 WORD32 bit_depth,
2120 void *pv_y_buf,
2121 WORD32 y_wd,
2122 WORD32 y_ht,
2123 WORD32 y_strd,
2124 void *pv_u_buf,
2125 WORD32 uv_wd,
2126 WORD32 uv_ht,
2127 WORD32 uv_strd)
2128 {
2129 WORD32 x, y, bit_idx, is_gt8bit = 0, gt8bit_mul;
2130 UWORD8 *pu_buf;
2131
2132 /* For this to work, assumes little endian in case of HBD */
2133 if(bit_depth > 8)
2134 is_gt8bit = 1;
2135 gt8bit_mul = 1 + is_gt8bit;
2136
2137 /* Luma CRC */
2138 {
2139 UWORD32 u4_crc_val = 0xffff;
2140
2141 pu_buf = (UWORD8 *)pv_y_buf;
2142
2143 for(y = 0; y < y_ht; y++)
2144 {
2145 for(x = 0; x < y_wd; x++)
2146 {
2147 // take CRC of first pictureData byte
2148 for(bit_idx = 0; bit_idx < 8; bit_idx++)
2149 {
2150 CALC_CRC_BIT_LEVEL(
2151 u4_crc_val, pu_buf[y * (y_strd * gt8bit_mul) + (x * gt8bit_mul)], bit_idx);
2152 }
2153 // take CRC of second pictureData byte if bit depth is greater than 8-bits
2154 if(bit_depth > 8)
2155 {
2156 for(bit_idx = 0; bit_idx < 8; bit_idx++)
2157 {
2158 CALC_CRC_BIT_LEVEL(
2159 u4_crc_val,
2160 pu_buf[y * (y_strd * gt8bit_mul) + (x * gt8bit_mul + 1)],
2161 bit_idx);
2162 }
2163 }
2164 }
2165 }
2166
2167 for(bit_idx = 0; bit_idx < 16; bit_idx++)
2168 {
2169 UWORD32 u4_crc_msb = (u4_crc_val >> 15) & 1;
2170 u4_crc_val = ((u4_crc_val << 1) & 0xffff) ^ (u4_crc_msb * 0x1021);
2171 }
2172
2173 ps_hash_sei_params->au1_sei_hash[0][0] = (u4_crc_val >> 8) & 0xff;
2174 ps_hash_sei_params->au1_sei_hash[0][1] = u4_crc_val & 0xff;
2175 }
2176
2177 /* Cb & Cr CRC */
2178 {
2179 UWORD32 u4_crc_val_u = 0xffff, u4_crc_val_v = 0xffff;
2180
2181 pu_buf = (UWORD8 *)pv_u_buf;
2182
2183 for(y = 0; y < uv_ht; y++)
2184 {
2185 for(x = 0; x < uv_wd; x += 2)
2186 {
2187 // take CRC of first pictureData byte
2188 for(bit_idx = 0; bit_idx < 8; bit_idx++)
2189 {
2190 CALC_CRC_BIT_LEVEL(
2191 u4_crc_val_u,
2192 pu_buf[y * (uv_strd * gt8bit_mul) + (x * gt8bit_mul)],
2193 bit_idx);
2194 CALC_CRC_BIT_LEVEL(
2195 u4_crc_val_v,
2196 pu_buf[y * (uv_strd * gt8bit_mul) + ((x + 1) * gt8bit_mul)],
2197 bit_idx);
2198 }
2199 // take CRC of second pictureData byte if bit depth is greater than 8-bits
2200 if(bit_depth > 8)
2201 {
2202 for(bit_idx = 0; bit_idx < 8; bit_idx++)
2203 {
2204 CALC_CRC_BIT_LEVEL(
2205 u4_crc_val_u,
2206 pu_buf[y * (uv_strd * gt8bit_mul) + (x * gt8bit_mul) + 1],
2207 bit_idx);
2208 CALC_CRC_BIT_LEVEL(
2209 u4_crc_val_v,
2210 pu_buf[y * (uv_strd * gt8bit_mul) + ((x + 1) * gt8bit_mul) + 1],
2211 bit_idx);
2212 }
2213 }
2214 }
2215 }
2216
2217 for(bit_idx = 0; bit_idx < 16; bit_idx++)
2218 {
2219 UWORD32 u4_crc_msb = (u4_crc_val_u >> 15) & 1;
2220 u4_crc_val_u = ((u4_crc_val_u << 1) & 0xffff) ^ (u4_crc_msb * 0x1021);
2221
2222 u4_crc_msb = (u4_crc_val_v >> 15) & 1;
2223 u4_crc_val_v = ((u4_crc_val_v << 1) & 0xffff) ^ (u4_crc_msb * 0x1021);
2224 }
2225
2226 ps_hash_sei_params->au1_sei_hash[1][0] = (u4_crc_val_u >> 8) & 0xff;
2227 ps_hash_sei_params->au1_sei_hash[1][1] = u4_crc_val_u & 0xff;
2228
2229 ps_hash_sei_params->au1_sei_hash[2][0] = (u4_crc_val_v >> 8) & 0xff;
2230 ps_hash_sei_params->au1_sei_hash[2][1] = u4_crc_val_v & 0xff;
2231 }
2232 }
2233
2234 /**
2235 ******************************************************************************
2236 *
2237 * @brief Populates Hash SEI values for Checksum Hash
2238 *
2239 * @par Description
2240 *
2241 * @param[out] ps_hash_sei_params
2242 * pointer to hash sei params that needs to be populated
2243 *
2244 * @param[in] bit_depth
2245 * i4_internal_bit_depth value. Assume same for Luma & Chroma
2246 *
2247 * @param[in] pv_y_buf
2248 * Pointer to decoded/recon Luma buffer
2249 *
2250 * @param[in] y_wd
2251 * pic width in luma samples
2252 *
2253 * @param[in] y_ht
2254 * pic height in luma samples
2255 *
2256 * @param[in] y_strd
2257 * Stride of luma buffer
2258 *
2259 * @param[in] pv_u_buf
2260 * Pointer to decoded/recon Chroma buffer
2261 *
2262 * @param[in] uv_wd
2263 * pic width in luma samples / SubWidthC
2264 *
2265 * @param[in] uv_ht
2266 * pic height in luma samples / SubHeightC
2267 *
2268 * @param[in] uv_strd
2269 * Stride of chroma buffer
2270 *
2271 * @return None
2272 *
2273 *****************************************************************************
2274 */
ihevce_calc_checksum(hash_sei_param_t * ps_hash_sei_params,WORD32 bit_depth,void * pv_y_buf,WORD32 y_wd,WORD32 y_ht,WORD32 y_strd,void * pv_u_buf,WORD32 uv_wd,WORD32 uv_ht,WORD32 uv_strd,WORD32 i4_frame_pos_x,WORD32 i4_frame_pos_y)2275 static void ihevce_calc_checksum(
2276 hash_sei_param_t *ps_hash_sei_params,
2277 WORD32 bit_depth,
2278 void *pv_y_buf,
2279 WORD32 y_wd,
2280 WORD32 y_ht,
2281 WORD32 y_strd,
2282 void *pv_u_buf,
2283 WORD32 uv_wd,
2284 WORD32 uv_ht,
2285 WORD32 uv_strd,
2286 WORD32 i4_frame_pos_x,
2287 WORD32 i4_frame_pos_y)
2288 {
2289 WORD32 x, y;
2290 UWORD8 *pu_buf;
2291 WORD32 row, col;
2292 UWORD32 u4_xor_mask;
2293 UWORD32 gt8bit_mul = 1;
2294
2295 if(bit_depth > 8)
2296 gt8bit_mul++;
2297
2298 /* Luma Checksum */
2299 {
2300 UWORD32 u4_sum_luma = 0;
2301
2302 pu_buf = (UWORD8 *)pv_y_buf;
2303
2304 for(y = i4_frame_pos_y, row = 0; row < y_ht; y++, row++)
2305 {
2306 for(x = i4_frame_pos_x, col = 0; col < y_wd; x++, col++)
2307 {
2308 // take checksum of first pictureData byte
2309 u4_xor_mask = (x & 0xFF) ^ (y & 0xFF) ^ (x >> 8) ^ (y >> 8);
2310 u4_sum_luma =
2311 (u4_sum_luma + ((pu_buf[(row * y_strd + col) * gt8bit_mul]) ^ u4_xor_mask)) &
2312 0xFFFFFFFF;
2313
2314 // take checksum of second pictureData byte if bit depth is greater than 8-bits
2315 if(bit_depth > 8)
2316 {
2317 u4_sum_luma = (u4_sum_luma + ((pu_buf[(row * y_strd + col) * gt8bit_mul + 1]) ^
2318 u4_xor_mask)) &
2319 0xFFFFFFFF;
2320 }
2321 }
2322 }
2323
2324 ps_hash_sei_params->au1_sei_hash[0][0] = (u4_sum_luma >> 24) & 0xff;
2325 ps_hash_sei_params->au1_sei_hash[0][1] = (u4_sum_luma >> 16) & 0xff;
2326 ps_hash_sei_params->au1_sei_hash[0][2] = (u4_sum_luma >> 8) & 0xff;
2327 ps_hash_sei_params->au1_sei_hash[0][3] = (u4_sum_luma)&0xff;
2328 }
2329
2330 /* Cb & Cr checksum */
2331 {
2332 UWORD32 u4_sum_cb = 0, u4_sum_cr = 0;
2333 pu_buf = (UWORD8 *)pv_u_buf;
2334
2335 for(y = (i4_frame_pos_y / 2), row = 0; row < uv_ht; y++, row++)
2336 {
2337 for(x = (i4_frame_pos_x / 2), col = 0; col < uv_wd; x++, col += 2)
2338 {
2339 // take checksum of first pictureData byte
2340 u4_xor_mask = (x & 0xFF) ^ (y & 0xFF) ^ (x >> 8) ^ (y >> 8);
2341 u4_sum_cb =
2342 (u4_sum_cb + ((pu_buf[(row * uv_strd + (col)) * gt8bit_mul]) ^ u4_xor_mask)) &
2343 0xFFFFFFFF;
2344 u4_sum_cr = (u4_sum_cr +
2345 ((pu_buf[(row * uv_strd + (col + 1)) * gt8bit_mul]) ^ u4_xor_mask)) &
2346 0xFFFFFFFF;
2347
2348 // take checksum of second pictureData byte if bit depth is greater than 8-bits
2349 if(bit_depth > 8)
2350 {
2351 u4_sum_cb = (u4_sum_cb + ((pu_buf[(row * uv_strd + (col)) * gt8bit_mul + 1]) ^
2352 u4_xor_mask)) &
2353 0xFFFFFFFF;
2354 u4_sum_cr =
2355 (u4_sum_cr +
2356 ((pu_buf[(row * uv_strd + (col + 1)) * gt8bit_mul + 1]) ^ u4_xor_mask)) &
2357 0xFFFFFFFF;
2358 }
2359 }
2360 }
2361
2362 ps_hash_sei_params->au1_sei_hash[1][0] = (u4_sum_cb >> 24) & 0xff;
2363 ps_hash_sei_params->au1_sei_hash[1][1] = (u4_sum_cb >> 16) & 0xff;
2364 ps_hash_sei_params->au1_sei_hash[1][2] = (u4_sum_cb >> 8) & 0xff;
2365 ps_hash_sei_params->au1_sei_hash[1][3] = (u4_sum_cb)&0xff;
2366
2367 ps_hash_sei_params->au1_sei_hash[2][0] = (u4_sum_cr >> 24) & 0xff;
2368 ps_hash_sei_params->au1_sei_hash[2][1] = (u4_sum_cr >> 16) & 0xff;
2369 ps_hash_sei_params->au1_sei_hash[2][2] = (u4_sum_cr >> 8) & 0xff;
2370 ps_hash_sei_params->au1_sei_hash[2][3] = (u4_sum_cr)&0xff;
2371 }
2372 }
2373
2374 /**
2375 ******************************************************************************
2376 *
2377 * @brief Populates Hash SEI values
2378 *
2379 * @par Description
2380 *
2381 * @param[out] ps_sei
2382 * pointer to sei params that needs to be populated
2383 *
2384 * @param[in] bit_depth
2385 * i4_internal_bit_depth value. Assume same for Luma & Chroma
2386 *
2387 * @param[in] pv_y_buf
2388 * Pointer to decoded/recon Luma buffer
2389 *
2390 * @param[in] y_wd
2391 * pic width in luma samples
2392 *
2393 * @param[in] y_ht
2394 * pic height in luma samples
2395 *
2396 * @param[in] y_strd
2397 * Stride of luma buffer
2398 *
2399 * @param[in] pv_u_buf
2400 * Pointer to decoded/recon Chroma buffer
2401 *
2402 * @param[in] uv_wd
2403 * pic width in luma samples / SubWidthC
2404 *
2405 * @param[in] uv_ht
2406 * pic height in luma samples / SubHeightC
2407 *
2408 * @param[in] uv_strd
2409 * Stride of chroma buffer
2410 *
2411 * @return success or failure error code
2412 *
2413 *****************************************************************************
2414 */
ihevce_populate_hash_sei(sei_params_t * ps_sei,WORD32 bit_depth,void * pv_y_buf,WORD32 y_wd,WORD32 y_ht,WORD32 y_strd,void * pv_u_buf,WORD32 uv_wd,WORD32 uv_ht,WORD32 uv_strd,WORD32 i4_frame_pos_x,WORD32 i4_frame_pos_y)2415 WORD32 ihevce_populate_hash_sei(
2416 sei_params_t *ps_sei,
2417 WORD32 bit_depth,
2418 void *pv_y_buf,
2419 WORD32 y_wd,
2420 WORD32 y_ht,
2421 WORD32 y_strd,
2422 void *pv_u_buf,
2423 WORD32 uv_wd,
2424 WORD32 uv_ht,
2425 WORD32 uv_strd,
2426 WORD32 i4_frame_pos_x,
2427 WORD32 i4_frame_pos_y)
2428 {
2429 hash_sei_param_t *ps_hash_sei_params = &ps_sei->s_hash_sei_params;
2430
2431 if(1 == ps_sei->i1_decoded_pic_hash_sei_flag)
2432 {
2433 ASSERT(0); // Not supported now!
2434 }
2435 else if(2 == ps_sei->i1_decoded_pic_hash_sei_flag)
2436 {
2437 /* calculate CRC for entire reconstructed picture */
2438 ihevce_calc_CRC(
2439 ps_hash_sei_params,
2440 bit_depth,
2441 pv_y_buf,
2442 y_wd,
2443 y_ht,
2444 y_strd,
2445 pv_u_buf,
2446 uv_wd,
2447 uv_ht,
2448 uv_strd);
2449 }
2450 else if(3 == ps_sei->i1_decoded_pic_hash_sei_flag)
2451 {
2452 /* calculate Checksum for entire reconstructed picture */
2453 ihevce_calc_checksum(
2454 ps_hash_sei_params,
2455 bit_depth,
2456 pv_y_buf,
2457 y_wd,
2458 y_ht,
2459 y_strd,
2460 pv_u_buf,
2461 uv_wd,
2462 uv_ht,
2463 uv_strd,
2464 i4_frame_pos_x,
2465 i4_frame_pos_y);
2466 }
2467 else
2468 {
2469 ASSERT(0);
2470 }
2471
2472 return IHEVCE_SUCCESS;
2473 }
2474 #endif
2475
2476 /**
2477 ******************************************************************************
2478 *
2479 * @brief Populates vui structure
2480 *
2481 * @par Description
2482 * Populates vui structure for its use in header generation
2483 *
2484 * @param[out] ps_vui
2485 * pointer to vui params that needs to be populated
2486 *
2487 * @param[out] ps_sps
2488 * pointer to sps params referred by vui
2489 *
2490 * @param[in] ps_src_params
2491 * pointer to source config params; resolution, frame rate etc
2492 *
2493 * @param[out] ps_vui_sei_prms
2494 * pointer to sps params referred by application
2495 *
2496 * @return success or failure error code
2497 *
2498 ******************************************************************************
2499 */
ihevce_populate_vui(vui_t * ps_vui,sps_t * ps_sps,ihevce_src_params_t * ps_src_params,ihevce_vui_sei_params_t * ps_vui_sei_prms,WORD32 i4_resolution_id,ihevce_tgt_params_t * ps_tgt_params,ihevce_static_cfg_params_t * ps_stat_prms,WORD32 i4_bitrate_instance_id)2500 WORD32 ihevce_populate_vui(
2501 vui_t *ps_vui,
2502 sps_t *ps_sps,
2503 ihevce_src_params_t *ps_src_params,
2504 ihevce_vui_sei_params_t *ps_vui_sei_prms,
2505 WORD32 i4_resolution_id,
2506 ihevce_tgt_params_t *ps_tgt_params,
2507 ihevce_static_cfg_params_t *ps_stat_prms,
2508 WORD32 i4_bitrate_instance_id)
2509 {
2510 WORD32 i, j, i4_range_idr, i4_range_cdr;
2511 ULWORD64 max_vbv_size;
2512
2513 ps_vui->u1_aspect_ratio_info_present_flag = ps_vui_sei_prms->u1_aspect_ratio_info_present_flag;
2514
2515 ps_vui->u1_aspect_ratio_idc = ps_vui_sei_prms->au1_aspect_ratio_idc[i4_resolution_id];
2516
2517 ps_vui->u2_sar_height = ps_vui_sei_prms->au2_sar_height[i4_resolution_id];
2518
2519 ps_vui->u2_sar_width = ps_vui_sei_prms->au2_sar_width[i4_resolution_id];
2520
2521 ps_vui->u1_overscan_info_present_flag = ps_vui_sei_prms->u1_overscan_info_present_flag;
2522
2523 ps_vui->u1_overscan_appropriate_flag = ps_vui_sei_prms->u1_overscan_appropriate_flag;
2524
2525 ps_vui->u1_video_signal_type_present_flag = ps_vui_sei_prms->u1_video_signal_type_present_flag;
2526
2527 ps_vui->u1_video_format = ps_vui_sei_prms->u1_video_format;
2528
2529 ps_vui->u1_video_full_range_flag = ps_vui_sei_prms->u1_video_full_range_flag;
2530
2531 ps_vui->u1_colour_description_present_flag =
2532 ps_vui_sei_prms->u1_colour_description_present_flag;
2533
2534 ps_vui->u1_colour_primaries = ps_vui_sei_prms->u1_colour_primaries;
2535
2536 ps_vui->u1_transfer_characteristics = ps_vui_sei_prms->u1_transfer_characteristics;
2537
2538 ps_vui->u1_matrix_coefficients = ps_vui_sei_prms->u1_matrix_coefficients;
2539
2540 ps_vui->u1_chroma_loc_info_present_flag = ps_vui_sei_prms->u1_chroma_loc_info_present_flag;
2541
2542 ps_vui->u1_chroma_sample_loc_type_top_field =
2543 ps_vui_sei_prms->u1_chroma_sample_loc_type_top_field;
2544
2545 ps_vui->u1_chroma_sample_loc_type_bottom_field =
2546 ps_vui_sei_prms->u1_chroma_sample_loc_type_bottom_field;
2547
2548 ps_vui->u1_neutral_chroma_indication_flag = 0;
2549
2550 ps_vui->u1_default_display_window_flag = 0;
2551
2552 /* Default Values for display offset added */
2553 if(ps_vui->u1_default_display_window_flag)
2554 {
2555 ps_vui->u4_def_disp_win_bottom_offset = 0;
2556
2557 ps_vui->u4_def_disp_win_left_offset = 0;
2558
2559 ps_vui->u4_def_disp_win_right_offset = 0;
2560
2561 ps_vui->u4_def_disp_win_top_offset = 0;
2562 }
2563
2564 ps_vui->u1_vui_hrd_parameters_present_flag =
2565 ps_vui_sei_prms->u1_vui_hrd_parameters_present_flag;
2566
2567 ps_vui->u1_field_seq_flag = ps_src_params->i4_field_pic;
2568
2569 ps_vui->u1_frame_field_info_present_flag = 1;
2570
2571 ps_vui->u1_vui_timing_info_present_flag = ps_vui_sei_prms->u1_timing_info_present_flag;
2572
2573 //if(ps_vui->u1_vui_timing_info_present_flag)
2574 {
2575 /* NumUnits in tick is same as the frame rate denominator assuming delta poc as 1 */
2576 ps_vui->u4_vui_num_units_in_tick = ps_src_params->i4_frm_rate_denom;
2577
2578 /* TimeScale is the same as the frame rate numerator assuming delta poc as 1 */
2579 ps_vui->u4_vui_time_scale =
2580 (ps_src_params->i4_frm_rate_num / ps_tgt_params->i4_frm_rate_scale_factor);
2581 }
2582
2583 ps_vui->u1_poc_proportional_to_timing_flag = 1;
2584
2585 if(ps_vui->u1_poc_proportional_to_timing_flag && ps_vui->u1_vui_timing_info_present_flag)
2586 ps_vui->u4_num_ticks_poc_diff_one_minus1 = 0;
2587
2588 //if (ps_vui->u1_vui_hrd_parameters_present_flag)
2589 {
2590 ps_vui->s_vui_hrd_parameters.u1_initial_cpb_removal_delay_length_minus1 = 23;
2591 ps_vui->s_vui_hrd_parameters.u1_au_cpb_removal_delay_length_minus1 = 23; /* Default value */
2592
2593 ps_vui->s_vui_hrd_parameters.u1_dpb_output_delay_length_minus1 =
2594 4; // max num of B pics are 7. So the max delay can go up to 5 and a maximun 10 is allowed for initial removal dalay.
2595
2596 ps_vui->s_vui_hrd_parameters.u1_nal_hrd_parameters_present_flag =
2597 ps_vui_sei_prms->u1_nal_hrd_parameters_present_flag;
2598
2599 ps_vui->s_vui_hrd_parameters.u1_vcl_hrd_parameters_present_flag =
2600 0; //ps_vui_sei_prms->u1_vcl_hrd_parameters_present_flag;
2601 ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag = 0;
2602
2603 if(ps_vui->s_vui_hrd_parameters.u1_nal_hrd_parameters_present_flag ||
2604 ps_vui->s_vui_hrd_parameters.u1_vcl_hrd_parameters_present_flag)
2605 {
2606 /* Initialize u1_au_cpb_removal_delay_length_minus1 based on configured intra periods */
2607 ps_vui->s_vui_hrd_parameters.u1_au_cpb_removal_delay_length_minus1 =
2608 8; /* Default value when HRD params are enabled */
2609 if(ps_stat_prms->s_coding_tools_prms.i4_max_cra_open_gop_period ||
2610 ps_stat_prms->s_coding_tools_prms.i4_max_closed_gop_period)
2611 {
2612 GETRANGE(
2613 i4_range_cdr, ps_stat_prms->s_coding_tools_prms.i4_max_cra_open_gop_period);
2614
2615 GETRANGE(i4_range_idr, ps_stat_prms->s_coding_tools_prms.i4_max_closed_gop_period);
2616
2617 ps_vui->s_vui_hrd_parameters.u1_au_cpb_removal_delay_length_minus1 =
2618 MAX(i4_range_cdr, i4_range_idr);
2619 }
2620 /*BLU_RAY Default set to 0 */
2621 ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag = 0;
2622 if(ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag)
2623 {
2624 ps_vui->s_vui_hrd_parameters.u1_tick_divisor_minus2 = 1;
2625 ps_vui->s_vui_hrd_parameters.u1_du_cpb_removal_delay_increment_length_minus1 = 23;
2626 ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_in_pic_timing_sei_flag = 1;
2627 ps_vui->s_vui_hrd_parameters.u1_dpb_output_delay_du_length_minus1 = 0;
2628 }
2629 }
2630
2631 ps_vui->s_vui_hrd_parameters.u4_bit_rate_scale = VUI_BIT_RATE_SCALE;
2632 ps_vui->s_vui_hrd_parameters.u4_cpb_size_scale = VUI_CPB_SIZE_SCALE;
2633 if(ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag)
2634 {
2635 ps_vui->s_vui_hrd_parameters.u4_cpb_size_du_scale = 0;
2636 }
2637
2638 for(i = 0; i <= (ps_sps->i1_sps_max_sub_layers - 1); i++)
2639 {
2640 ps_vui->s_vui_hrd_parameters.au1_fixed_pic_rate_general_flag[i] =
2641 1; /*BLU_RAY specific change already done */
2642 ps_vui->s_vui_hrd_parameters.au1_fixed_pic_rate_within_cvs_flag[i] = 1;
2643 ps_vui->s_vui_hrd_parameters.au2_elemental_duration_in_tc_minus1[i] = 0;
2644
2645 /*BLU_RAY low_delay_hrd_flag is always set to 0*/
2646 ps_vui->s_vui_hrd_parameters.au1_low_delay_hrd_flag[i] = 0;
2647
2648 /************************************************************************/
2649 /* cpb_cnt_minus1 is set to zero because we assume that the decoder */
2650 /* can work with just one CPB specification */
2651 /************************************************************************/
2652 ps_vui->s_vui_hrd_parameters.au1_cpb_cnt_minus1[i] = 0;
2653
2654 max_vbv_size = ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
2655 .ai4_max_vbv_buffer_size[i4_bitrate_instance_id];
2656 for(j = 0; j <= ps_vui->s_vui_hrd_parameters.au1_cpb_cnt_minus1[i]; j++)
2657 {
2658 ULWORD64 u8_bit_rate_val =
2659 (ULWORD64)ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
2660 .ai4_tgt_bitrate[i4_bitrate_instance_id];
2661 ULWORD64 u8_max_cpb_size;
2662 if((ps_stat_prms->s_config_prms.i4_rate_control_mode == 2) ||
2663 (ps_stat_prms->s_config_prms.i4_rate_control_mode ==
2664 1)) // VBR/Capped VBR rate control mode
2665 u8_bit_rate_val =
2666 (ULWORD64)(ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id]
2667 .ai4_peak_bitrate[i4_bitrate_instance_id]);
2668 u8_max_cpb_size =
2669 max_vbv_size; //((ULWORD64)(max_vbv_size * u8_bit_rate_val)/1000);
2670
2671 if(3 == ps_stat_prms->s_config_prms.i4_rate_control_mode)
2672 {
2673 /* For CQP mode, assume Level specified max rate and buffer size */
2674 WORD32 codec_level_index = ihevce_get_level_index(
2675 ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_codec_level);
2676 WORD32 codec_tier = ps_stat_prms->s_out_strm_prms.i4_codec_tier;
2677
2678 /* Bitrate as per level and tier limits */
2679 u8_bit_rate_val =
2680 g_as_level_data[codec_level_index].i4_max_bit_rate[codec_tier] *
2681 CBP_VCL_FACTOR;
2682 u8_max_cpb_size =
2683 g_as_level_data[codec_level_index].i4_max_cpb[codec_tier] * CBP_VCL_FACTOR;
2684 }
2685
2686 u8_bit_rate_val >>= (6 + ps_vui->s_vui_hrd_parameters.u4_bit_rate_scale);
2687 /************************************************************************/
2688 /* u8_bit_rate_value forced >= 4096 as the shift is always of 12 */
2689 /* because u4_bit_rate_scale = 6. */
2690 /************************************************************************/
2691 if (u8_bit_rate_val == 0)
2692 {
2693 return IHEVCE_BITRATE_NOT_SUPPORTED;
2694 }
2695
2696 u8_max_cpb_size >>= (4 + ps_vui->s_vui_hrd_parameters.u4_cpb_size_scale);
2697
2698 ps_vui->s_vui_hrd_parameters.as_sub_layer_hrd_params[i]
2699 .au4_bit_rate_value_minus1[j] = (UWORD32)(u8_bit_rate_val - 1);
2700 ps_vui->s_vui_hrd_parameters.as_sub_layer_hrd_params[i]
2701 .au4_cpb_size_value_minus1[j] = (UWORD32)(u8_max_cpb_size - 1);
2702
2703 if(ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag)
2704 {
2705 ps_vui->s_vui_hrd_parameters.as_sub_layer_hrd_params[i]
2706 .au4_cpb_size_value_minus1[j] = 0;
2707 }
2708
2709 /************************************************************************/
2710 /* CBR flag is set as per the RATE_CONTROL macro */
2711 /************************************************************************/
2712
2713 /* Default cbr falg setting. will discard Decoder buffer overflows ( No stuffing required)*/
2714
2715 ps_vui->s_vui_hrd_parameters.as_sub_layer_hrd_params[i].au1_cbr_flag[j] = 0;
2716 }
2717 }
2718 }
2719
2720 ps_vui->u1_bitstream_restriction_flag = 0;
2721
2722 if(ps_vui->u1_bitstream_restriction_flag)
2723 {
2724 ps_vui->u1_tiles_fixed_structure_flag = 1;
2725
2726 ps_vui->u1_motion_vectors_over_pic_boundaries_flag = 1;
2727
2728 ps_vui->u4_min_spatial_segmentation_idc = 0;
2729
2730 ps_vui->u1_restricted_ref_pic_lists_flag = 0;
2731
2732 ps_vui->u1_max_bytes_per_pic_denom = 2;
2733
2734 ps_vui->u1_max_bits_per_mincu_denom = 1;
2735
2736 ps_vui->u1_log2_max_mv_length_horizontal = 15;
2737
2738 ps_vui->u1_log2_max_mv_length_vertical = 15;
2739 }
2740
2741 return IHEVCE_SUCCESS;
2742 }
2743