xref: /aosp_15_r20/external/libhevc/encoder/ihevce_encode_header_sei_vui.c (revision c83a76b084498d55f252f48b2e3786804cdf24b7)
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