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 */ 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 */ 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 */ 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 /** 599 ****************************************************************************** 600 * 601 * @brief Generates Buffering Period (Supplemental Enhancement Information ) 602 * 603 * @par Description 604 * Parse Supplemental Enhancement Information as per Section 7.3.2.4 605 * 606 * @param[in] ps_bitstrm 607 * pointer to bitstream context (handle) 608 * 609 * @param[in] ps_pt_sei 610 * pointer to structure containing buffering period SEI data 611 * 612 * @param[in] ps_vui_params 613 * pointer to structure containing VUI data 614 * 615 * @return success or failure error code 616 * 617 ****************************************************************************** 618 */ 619 WORD32 ihevce_put_buf_period_sei_params( 620 buf_period_sei_params_t *ps_bp_sei, vui_t *ps_vui_params, bitstrm_t *ps_bitstrm) 621 { 622 UWORD32 i; 623 WORD32 return_status = IHEVCE_SUCCESS; 624 UWORD8 u1_payload_size = 0; 625 UWORD8 u1_sub_pic_cpb_params_present_flag = 626 ps_vui_params->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag; 627 628 { 629 //UWORD32 range; 630 //UWORD32 sps_id = ps_bp_sei->u1_bp_seq_parameter_set_id; 631 632 //range = 0; 633 //GETRANGE(range, sps_id); 634 u1_payload_size += 1; //(((range - 1) << 1) + 1); 635 636 if(!u1_sub_pic_cpb_params_present_flag) 637 u1_payload_size += 1; 638 u1_payload_size += 1; 639 u1_payload_size += 640 ps_vui_params->s_vui_hrd_parameters.u1_au_cpb_removal_delay_length_minus1 + 1; 641 if(1 == ps_vui_params->s_vui_hrd_parameters.u1_nal_hrd_parameters_present_flag) 642 { 643 for(i = 0; i <= ps_bp_sei->u4_cpb_cnt; i++) 644 { 645 u1_payload_size += ps_bp_sei->u4_initial_cpb_removal_delay_length << 1; 646 if(u1_sub_pic_cpb_params_present_flag || ps_bp_sei->u1_rap_cpb_params_present_flag) 647 u1_payload_size += ps_bp_sei->u4_initial_cpb_removal_delay_length << 1; 648 } 649 } 650 if(1 == ps_vui_params->s_vui_hrd_parameters.u1_vcl_hrd_parameters_present_flag) 651 { 652 for(i = 0; i <= ps_bp_sei->u4_cpb_cnt; i++) 653 { 654 u1_payload_size += ps_bp_sei->u4_initial_cpb_removal_delay_length << 1; 655 if(u1_sub_pic_cpb_params_present_flag || ps_bp_sei->u1_rap_cpb_params_present_flag) 656 u1_payload_size += ps_bp_sei->u4_initial_cpb_removal_delay_length << 1; 657 } 658 } 659 } 660 661 u1_payload_size = (u1_payload_size + 7) >> 3; 662 663 /************************************************************************************************/ 664 /* Calculating the cbp removal delay and cbp removal delay offset based on the */ 665 /* buffer level information from Rate control */ 666 /* NOTE : Buffer fullness level for Rate control is updated using Approximate */ 667 /* number of bits from RDOPT stage rather than from accurate number of bits from ENTROPY coding */ 668 /************************************************************************************************/ 669 670 { 671 ULWORD64 u8_temp; 672 UWORD32 u4_buffer_size, u4_dbf; 673 674 u4_buffer_size = ps_bp_sei->u4_buffer_size_sei; 675 u4_dbf = ps_bp_sei->u4_dbf_sei; 676 for(i = 0; i <= ps_bp_sei->u4_cpb_cnt; i++) 677 { 678 u8_temp = ((ULWORD64)(u4_dbf)*90000); 679 u8_temp = u8_temp / ps_bp_sei->u4_target_bit_rate_sei; 680 ps_bp_sei->au4_nal_initial_cpb_removal_delay[i] = (UWORD32)u8_temp; 681 682 u8_temp = ((ULWORD64)(u4_buffer_size - u4_dbf) * 90000); 683 u8_temp = u8_temp / ps_bp_sei->u4_target_bit_rate_sei; 684 ps_bp_sei->au4_nal_initial_cpb_removal_delay_offset[i] = (UWORD32)u8_temp; 685 686 if(ps_bp_sei->au4_nal_initial_cpb_removal_delay[i] < 1) 687 ps_bp_sei->au4_nal_initial_cpb_removal_delay[i] = 688 1; /* ps_bp_sei->au4_nal_initial_cpb_removal_delay[i] should be always greater than 0 */ 689 } 690 } 691 692 /************************************************************************/ 693 /* PayloadSize : This is the size of the payload in bytes */ 694 /************************************************************************/ 695 PUT_BITS(ps_bitstrm, u1_payload_size, 8, return_status); 696 ENTROPY_TRACE("payload_size", u1_payload_size); 697 698 /************************************************************************/ 699 /* Put the buffering period SEI parameters into the bitstream. For */ 700 /* details refer to section D.1.1 of the standard */ 701 /************************************************************************/ 702 703 /* seq_parameter_set_id */ 704 PUT_BITS_UEV(ps_bitstrm, ps_bp_sei->u1_bp_seq_parameter_set_id, return_status); 705 ENTROPY_TRACE("seq_parameter_set_id", ps_bp_sei->u1_bp_seq_parameter_set_id); 706 707 //PUT_BITS(ps_bitstrm, u1_sub_pic_cpb_params_present_flag, 1, return_status); 708 //ENTROPY_TRACE("sub_pic_cpb_params_present_flag", u1_sub_pic_cpb_params_present_flag); 709 710 if(!u1_sub_pic_cpb_params_present_flag) 711 { 712 /* u1_rap_cpb_params_present_flag */ 713 PUT_BITS(ps_bitstrm, ps_bp_sei->u1_rap_cpb_params_present_flag, 1, return_status); 714 ENTROPY_TRACE("rap_cpb_params_present_flag", ps_bp_sei->u1_rap_cpb_params_present_flag); 715 } 716 717 if(ps_bp_sei->u1_rap_cpb_params_present_flag) 718 { 719 PUT_BITS( 720 ps_bitstrm, 721 ps_bp_sei->u4_cpb_delay_offset, 722 (ps_vui_params->s_vui_hrd_parameters.u1_au_cpb_removal_delay_length_minus1 + 1), 723 return_status); 724 ENTROPY_TRACE("cpb_delay_offset", ps_bp_sei->cpb_delay_offset); 725 726 PUT_BITS( 727 ps_bitstrm, 728 ps_bp_sei->u4_dpb_delay_offset, 729 (ps_vui_params->s_vui_hrd_parameters.u1_dpb_output_delay_length_minus1 + 1), 730 return_status); 731 ENTROPY_TRACE("dpb_delay_offset", ps_bp_sei->dpb_delay_offset); 732 } 733 734 PUT_BITS(ps_bitstrm, ps_bp_sei->u1_concatenation_flag, 1, return_status); 735 ENTROPY_TRACE("concatenation_flag", ps_bp_sei->concatenation_flag); 736 737 PUT_BITS( 738 ps_bitstrm, 739 ps_bp_sei->u4_au_cpb_removal_delay_delta_minus1, 740 (ps_vui_params->s_vui_hrd_parameters.u1_au_cpb_removal_delay_length_minus1 + 1), 741 return_status); 742 743 ENTROPY_TRACE( 744 "au_cpb_removal_delay_delta_minus1", ps_bp_sei->au_cpb_removal_delay_delta_minus1); 745 746 if(1 == ps_vui_params->s_vui_hrd_parameters.u1_nal_hrd_parameters_present_flag) 747 { 748 for(i = 0; i <= ps_bp_sei->u4_cpb_cnt; i++) 749 { 750 PUT_BITS( 751 ps_bitstrm, 752 ps_bp_sei->au4_nal_initial_cpb_removal_delay[i], 753 ps_bp_sei->u4_initial_cpb_removal_delay_length, 754 return_status); 755 ENTROPY_TRACE( 756 "nal_initial_cpb_removal_delay", ps_bp_sei->au4_nal_initial_cpb_removal_delay[i]); 757 758 PUT_BITS( 759 ps_bitstrm, 760 ps_bp_sei->au4_nal_initial_cpb_removal_delay_offset[i], 761 ps_bp_sei->u4_initial_cpb_removal_delay_length, 762 return_status); 763 ENTROPY_TRACE( 764 "nal_initial_cpb_removal_delay_offset", 765 ps_bp_sei->au4_nal_initial_cpb_removal_delay_offset[i]); 766 767 if(u1_sub_pic_cpb_params_present_flag || ps_bp_sei->u1_rap_cpb_params_present_flag) 768 { 769 PUT_BITS( 770 ps_bitstrm, 771 ps_bp_sei->au4_nal_initial_alt_cpb_removal_delay[i], 772 ps_bp_sei->u4_initial_cpb_removal_delay_length, 773 return_status); 774 ENTROPY_TRACE( 775 "nal_initial_alt_cpb_removal_delay", 776 ps_bp_sei->au4_nal_initial_alt_cpb_removal_delay[i]); 777 778 PUT_BITS( 779 ps_bitstrm, 780 ps_bp_sei->au4_nal_initial_alt_cpb_removal_delay_offset[i], 781 ps_bp_sei->u4_initial_cpb_removal_delay_length, 782 return_status); 783 ENTROPY_TRACE( 784 "nal_initial_alt_cpb_removal_delay_offset", 785 ps_bp_sei->au4_nal_initial_alt_cpb_removal_delay_offset[i]); 786 } 787 } 788 } 789 790 if(1 == ps_vui_params->s_vui_hrd_parameters.u1_vcl_hrd_parameters_present_flag) 791 { 792 for(i = 0; i <= ps_bp_sei->u4_cpb_cnt; i++) 793 { 794 PUT_BITS( 795 ps_bitstrm, 796 ps_bp_sei->au4_vcl_initial_cpb_removal_delay[i], 797 ps_bp_sei->u4_initial_cpb_removal_delay_length, 798 return_status); 799 ENTROPY_TRACE( 800 "vcl_initial_cpb_removal_delay", ps_bp_sei->au4_vcl_initial_cpb_removal_delay[i]); 801 802 PUT_BITS( 803 ps_bitstrm, 804 ps_bp_sei->au4_vcl_initial_cpb_removal_delay_offset[i], 805 ps_bp_sei->u4_initial_cpb_removal_delay_length, 806 return_status); 807 ENTROPY_TRACE( 808 "vcl_initial_cpb_removal_delay_offset", 809 ps_bp_sei->au4_vcl_initial_cpb_removal_delay_offset[i]); 810 811 if(u1_sub_pic_cpb_params_present_flag || ps_bp_sei->u1_rap_cpb_params_present_flag) 812 { 813 PUT_BITS( 814 ps_bitstrm, 815 ps_bp_sei->au4_vcl_initial_alt_cpb_removal_delay[i], 816 ps_bp_sei->u4_initial_cpb_removal_delay_length, 817 return_status); 818 ENTROPY_TRACE( 819 "vcl_initial_alt_cpb_removal_delay", 820 ps_bp_sei->au4_vcl_initial_alt_cpb_removal_delay[i]); 821 822 PUT_BITS( 823 ps_bitstrm, 824 ps_bp_sei->au4_vcl_initial_alt_cpb_removal_delay_offset[i], 825 ps_bp_sei->u4_initial_cpb_removal_delay_length, 826 return_status); 827 ENTROPY_TRACE( 828 "vcl_initial_alt_cpb_removal_delay_offset", 829 ps_bp_sei->au4_vcl_initial_alt_cpb_removal_delay_offset[i]); 830 } 831 } 832 } 833 834 return (return_status); 835 } 836 837 /** 838 ****************************************************************************** 839 * 840 * @brief Generates active parameter set (Supplemental Enhancement Information ) 841 * 842 * @par Description 843 * Parse Supplemental Enhancement Information as per Section 7.3.2.4 844 * 845 * @param[in] ps_bitstrm 846 * pointer to bitstream context (handle) 847 * 848 * @param[in] ps_act_sei 849 * pointer to structure containing active parameter set SEI data 850 * 851 * @return success or failure error code 852 * 853 ***************************************************************************** 854 */ 855 WORD32 ihevce_put_active_parameter_set_sei_params( 856 active_parameter_set_sei_param_t *ps_act_sei, bitstrm_t *ps_bitstrm) 857 858 { 859 UWORD8 u1_payload_size = 0, i; 860 UWORD8 u1_range = 0, u1_act_sps_id; 861 WORD32 return_status = IHEVCE_SUCCESS; 862 863 u1_payload_size += 4; 864 u1_payload_size += 1; 865 u1_payload_size += 1; 866 u1_payload_size += 1; // num_sps_ids_minus1 ahould be zero as per the standard 867 868 u1_act_sps_id = ps_act_sei->u1_active_video_parameter_set_id; 869 870 GETRANGE(u1_range, u1_act_sps_id); 871 872 u1_payload_size += (((u1_range - 1) << 1) + 1); 873 874 u1_payload_size = (u1_payload_size + 7) >> 3; 875 876 PUT_BITS(ps_bitstrm, u1_payload_size, 8, return_status); 877 ENTROPY_TRACE("payload_size", u1_payload_size); 878 879 PUT_BITS(ps_bitstrm, ps_act_sei->u1_active_video_parameter_set_id, 4, return_status); 880 ENTROPY_TRACE("active_video_parameter_set_id", ps_act_sei->u1_active_video_parameter_set_id); 881 882 PUT_BITS(ps_bitstrm, ps_act_sei->u1_self_contained_cvs_flag, 1, return_status); 883 ENTROPY_TRACE("self_contained_cvs_flag", ps_act_sei->u1_self_contained_cvs_flag); 884 885 PUT_BITS(ps_bitstrm, ps_act_sei->u1_no_parameter_set_update_flag, 1, return_status); 886 ENTROPY_TRACE("no_parameter_set_update_flag", ps_act_sei->u1_no_parameter_set_update_flag); 887 888 PUT_BITS_UEV(ps_bitstrm, ps_act_sei->u1_num_sps_ids_minus1, return_status); 889 890 ENTROPY_TRACE("num_sps_ids_minus1", ps_act_sei->u1_num_sps_ids_minus1); 891 892 for(i = 0; i <= ps_act_sei->u1_num_sps_ids_minus1; i++) 893 { 894 PUT_BITS_UEV(ps_bitstrm, ps_act_sei->au1_active_seq_parameter_set_id[i], return_status); 895 ENTROPY_TRACE( 896 "active_video_parameter_set_id", ps_act_sei->au1_active_seq_parameter_set_id[i]); 897 } 898 return (return_status); 899 } 900 901 /** 902 ****************************************************************************** 903 * 904 * @brief Generates Mastering Display Colour Volume (Supplemental Enhancement Information ) 905 * 906 * @par Description 907 * Parse Supplemental Enhancement Information as per Section 7.3.2.4 908 * 909 * @param[in] ps_bitstrm 910 * pointer to bitstream context (handle) 911 * 912 * @param[in] ps_rp_sei 913 * pointer to structure containing recovery point SEI data 914 * 915 * @param[in] ps_vui_params 916 * pointer to structure containing VUI data 917 * 918 * @return success or failure error code 919 * 920 ****************************************************************************** 921 */ 922 WORD32 ihevce_put_mastering_disp_col_vol_sei_params( 923 mastering_dis_col_vol_sei_params_t *ps_mdcl_sei, bitstrm_t *ps_bitstrm) 924 { 925 WORD32 return_status = IHEVCE_SUCCESS; 926 UWORD8 u1_payload_size = 0; 927 WORD32 c; 928 929 u1_payload_size += 6; /* display primaries x */ 930 u1_payload_size += 6; /* display primaries y */ 931 u1_payload_size += 2; /* white point x */ 932 u1_payload_size += 2; /* white point y */ 933 u1_payload_size += 4; /* max display mastering luminance */ 934 u1_payload_size += 4; /* min display mastering luminance */ 935 936 /************************************************************************/ 937 /* PayloadSize : This is the size of the payload in bytes */ 938 /************************************************************************/ 939 PUT_BITS(ps_bitstrm, u1_payload_size, 8, return_status); 940 ENTROPY_TRACE("u1_payload_size", u1_payload_size); 941 942 ASSERT(ps_mdcl_sei->u2_white_point_x <= 50000); 943 944 ASSERT(ps_mdcl_sei->u2_white_point_y <= 50000); 945 946 ASSERT( 947 ps_mdcl_sei->u4_max_display_mastering_luminance > 948 ps_mdcl_sei->u4_min_display_mastering_luminance); 949 950 /*******************************************************************************/ 951 /* Put the mastering display colour volume SEI parameters into the bitstream. */ 952 /* For details refer to section D.1.1 of the standard */ 953 /*******************************************************************************/ 954 955 /* display primaries x */ 956 for(c = 0; c < 3; c++) 957 { 958 ASSERT(ps_mdcl_sei->au2_display_primaries_x[c] <= 50000); 959 960 PUT_BITS(ps_bitstrm, ps_mdcl_sei->au2_display_primaries_x[c], 16, return_status); 961 ENTROPY_TRACE("u2_display_primaries_x", ps_mdcl_sei->au2_display_primaries_x[c]); 962 963 ASSERT(ps_mdcl_sei->au2_display_primaries_y[c] <= 50000); 964 965 PUT_BITS(ps_bitstrm, ps_mdcl_sei->au2_display_primaries_y[c], 16, return_status); 966 ENTROPY_TRACE("u2_display_primaries_y", ps_mdcl_sei->au2_display_primaries_y[c]); 967 } 968 969 /* white point x */ 970 PUT_BITS(ps_bitstrm, ps_mdcl_sei->u2_white_point_x, 16, return_status); 971 ENTROPY_TRACE("u2_white point x", ps_mdcl_sei->u2_white_point_x); 972 973 /* white point y */ 974 PUT_BITS(ps_bitstrm, ps_mdcl_sei->u2_white_point_y, 16, return_status); 975 ENTROPY_TRACE("u2_white point y", ps_mdcl_sei->u2_white_point_y); 976 977 /* max display mastering luminance */ 978 PUT_BITS(ps_bitstrm, ps_mdcl_sei->u4_max_display_mastering_luminance, 32, return_status); 979 ENTROPY_TRACE( 980 "u4_max_display_mastering_luminance", ps_mdcl_sei->u4_max_display_mastering_luminance); 981 982 /* min display mastering luminance */ 983 PUT_BITS(ps_bitstrm, ps_mdcl_sei->u4_min_display_mastering_luminance, 32, return_status); 984 ENTROPY_TRACE( 985 "u4_max_display_mastering_luminance", ps_mdcl_sei->u4_min_display_mastering_luminance); 986 987 return (return_status); 988 } 989 990 /** 991 ****************************************************************************** 992 * 993 * @brief Stores user data in bitstream 994 * 995 * @par Description 996 * Parse Supplemental Enhancement Information as per Section 7.3.2.4 997 * 998 * @param[in] ps_bitstrm 999 * pointer to bitstream context (handle) 1000 * 1001 * @param[in] u4_sei_payload_length 1002 * SEI Payload Length 1003 * 1004 * @param[in] pu1_sei_payload 1005 * pointer to SEI Payload 1006 * 1007 * @return success or failure error code 1008 * 1009 ****************************************************************************** 1010 */ 1011 WORD32 ihevce_put_sei_params( 1012 UWORD32 u4_sei_payload_length, UWORD8 *pu1_sei_payload, bitstrm_t *ps_bitstrm) 1013 { 1014 WORD32 return_status = IHEVCE_SUCCESS; 1015 UWORD32 i, u4_length = 0; 1016 1017 u4_length = u4_sei_payload_length; 1018 while(u4_sei_payload_length >= 0xFF) 1019 { 1020 PUT_BITS(ps_bitstrm, (UWORD32)0xFF, 8, return_status); 1021 u4_sei_payload_length -= 0xFF; 1022 } 1023 PUT_BITS(ps_bitstrm, (UWORD32)u4_sei_payload_length, 8, return_status); 1024 1025 for(i = 0; i < u4_length; i++) 1026 { 1027 PUT_BITS(ps_bitstrm, (UWORD32)*pu1_sei_payload, 8, return_status); 1028 pu1_sei_payload++; 1029 } 1030 1031 return (return_status); 1032 } 1033 1034 /** 1035 ****************************************************************************** 1036 * 1037 * @brief Stores content light level info in bitstream 1038 * 1039 * @par Description 1040 * Parse Supplemental Enhancement Information as per Section 7.3.2.4 1041 * 1042 * @param[in] ps_bitstrm 1043 * pointer to bitstream context (handle) 1044 * 1045 * @param[in] 1046 * 1047 * 1048 * @param[in] 1049 * 1050 * 1051 * @return success or failure error code 1052 * 1053 ****************************************************************************** 1054 */ 1055 WORD32 ihevce_put_cll_info_sei_params(UWORD16 u2_avg_cll, UWORD16 u2_max_cll, bitstrm_t *ps_bitstrm) 1056 { 1057 WORD32 return_status = IHEVCE_SUCCESS; 1058 UWORD8 u1_payload_size; 1059 1060 u1_payload_size = 4; 1061 /************************************************************************/ 1062 /* PayloadSize : This is the size of the payload in bytes */ 1063 /************************************************************************/ 1064 PUT_BITS(ps_bitstrm, u1_payload_size, 8, return_status); 1065 ENTROPY_TRACE("u1_payload_size", u1_payload_size); 1066 1067 PUT_BITS(ps_bitstrm, (UWORD32)u2_avg_cll, 16, return_status); 1068 PUT_BITS(ps_bitstrm, (UWORD32)u2_max_cll, 16, return_status); 1069 1070 return (return_status); 1071 } 1072 1073 /** 1074 ****************************************************************************** 1075 * 1076 * @brief Generates Recovery Point (Supplemental Enhancement Information ) 1077 * 1078 * @par Description 1079 * Parse Supplemental Enhancement Information as per Section 7.3.2.4 1080 * 1081 * @param[in] ps_bitstrm 1082 * pointer to bitstream context (handle) 1083 * 1084 * @param[in] ps_rp_sei 1085 * pointer to structure containing recovery point SEI data 1086 * 1087 * @param[in] ps_vui_params 1088 * pointer to structure containing VUI data 1089 * 1090 * @return success or failure error code 1091 * 1092 ****************************************************************************** 1093 */ 1094 WORD32 ihevce_put_recovery_point_sei_params( 1095 recovery_point_sei_params_t *ps_rp_sei, bitstrm_t *ps_bitstrm) 1096 { 1097 WORD32 return_status = IHEVCE_SUCCESS; 1098 UWORD8 u1_payload_size = 0; 1099 1100 { 1101 UWORD32 range, val; 1102 WORD32 recov_point = ps_rp_sei->i4_recovery_poc_cnt; 1103 val = 0; 1104 range = 0; 1105 1106 if(recov_point <= 0) 1107 val = ((-recov_point) << 1); 1108 else 1109 val = (recov_point << 1) - 1; 1110 1111 GETRANGE(range, val); 1112 1113 u1_payload_size += (((range - 1) << 1) + 1); 1114 1115 u1_payload_size += 1; 1116 u1_payload_size += 1; 1117 } 1118 1119 u1_payload_size = (u1_payload_size + 7) >> 3; 1120 /************************************************************************/ 1121 /* PayloadSize : This is the size of the payload in bytes */ 1122 /************************************************************************/ 1123 PUT_BITS(ps_bitstrm, u1_payload_size, 8, return_status); 1124 ENTROPY_TRACE("u1_payload_size", u1_payload_size); 1125 /************************************************************************/ 1126 /* Put the recovery point SEI parameters into the bitstream. For */ 1127 /* details refer to section D.1.1 of the standard */ 1128 /************************************************************************/ 1129 1130 /* i4_recovery_poc_cnt */ 1131 PUT_BITS_SEV(ps_bitstrm, ps_rp_sei->i4_recovery_poc_cnt, return_status); 1132 ENTROPY_TRACE("i4_recovery_poc_cnt", ps_rp_sei->i4_recovery_poc_cnt); 1133 1134 /* u1_exact_match_flag */ 1135 PUT_BITS(ps_bitstrm, ps_rp_sei->u1_exact_match_flag, 1, return_status); 1136 ENTROPY_TRACE("exact_match_flag", ps_rp_sei->u1_exact_match_flag); 1137 1138 /* u1_broken_link_flag */ 1139 PUT_BITS(ps_bitstrm, ps_rp_sei->u1_broken_link_flag, 1, return_status); 1140 ENTROPY_TRACE("broken_link_flag", ps_rp_sei->u1_broken_link_flag); 1141 1142 return (return_status); 1143 } 1144 1145 /** 1146 ****************************************************************************** 1147 * 1148 * @brief Generates Picture timing (Supplemental Enhancement Information ) 1149 * 1150 * @par Description 1151 * Parse Supplemental Enhancement Information as per Section 7.3.2.4 1152 * 1153 * @param[in] ps_bitstrm 1154 * pointer to bitstream context (handle) 1155 * 1156 * @param[in] ps_pt_sei 1157 * pointer to structure containing oicture timing SEI data 1158 * 1159 * @param[in] ps_vui_params 1160 * pointer to structure containing VUI data 1161 * 1162 * @return success or failure error code 1163 * 1164 ****************************************************************************** 1165 */ 1166 WORD32 ihevce_put_pic_timing_sei_params( 1167 pic_timing_sei_params_t *ps_pt_sei, vui_t *ps_vui_params, bitstrm_t *ps_bitstrm) 1168 { 1169 UWORD32 i; 1170 UWORD8 u1_payload_size = 0; 1171 WORD32 return_status = IHEVCE_SUCCESS; 1172 UWORD8 u1_au_cpb_removal_delay_length = 1173 ps_vui_params->s_vui_hrd_parameters.u1_au_cpb_removal_delay_length_minus1 + 1; 1174 1175 UWORD8 u1_dpb_output_delay_length = 1176 ps_vui_params->s_vui_hrd_parameters.u1_dpb_output_delay_length_minus1 + 1; 1177 1178 UWORD8 u1_du_cpb_removal_delay_increment_length = 1179 ps_vui_params->s_vui_hrd_parameters.u1_du_cpb_removal_delay_increment_length_minus1 + 1; 1180 1181 UWORD8 u1_sub_pic_cpb_params_present_flag = 1182 ps_vui_params->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag; 1183 1184 UWORD8 u1_sub_pic_cpb_params_in_pt_sei_flag = 1185 ps_vui_params->s_vui_hrd_parameters.u1_sub_pic_cpb_params_in_pic_timing_sei_flag; 1186 1187 { 1188 if(1 == ps_vui_params->u1_frame_field_info_present_flag) 1189 { 1190 u1_payload_size += 4; 1191 u1_payload_size += 2; 1192 u1_payload_size += 1; 1193 } 1194 1195 if(ps_vui_params->s_vui_hrd_parameters.u1_nal_hrd_parameters_present_flag || 1196 ps_vui_params->s_vui_hrd_parameters.u1_vcl_hrd_parameters_present_flag) 1197 { 1198 u1_payload_size += u1_au_cpb_removal_delay_length; 1199 u1_payload_size += u1_dpb_output_delay_length; 1200 } 1201 1202 if(u1_sub_pic_cpb_params_in_pt_sei_flag && u1_sub_pic_cpb_params_present_flag) 1203 { 1204 UWORD32 range, val = ps_pt_sei->u4_num_decoding_units_minus1; 1205 range = 0; 1206 1207 GETRANGE(range, val); 1208 u1_payload_size += (((range - 1) << 1) + 1); 1209 1210 u1_payload_size += 1; 1211 if(1 == ps_pt_sei->u1_du_common_cpb_removal_delay_flag) 1212 { 1213 u1_payload_size += u1_du_cpb_removal_delay_increment_length; 1214 1215 for(i = 0; i <= ps_pt_sei->u4_num_decoding_units_minus1; i++) 1216 { 1217 val = ps_pt_sei->au4_num_nalus_in_du_minus1[0]; 1218 range = 0; 1219 1220 GETRANGE(range, val); 1221 u1_payload_size += (((range - 1) << 1) + 1); 1222 1223 if((1 != ps_pt_sei->u1_du_common_cpb_removal_delay_flag) && 1224 (i < ps_pt_sei->u4_num_decoding_units_minus1)) 1225 { 1226 u1_payload_size += u1_du_cpb_removal_delay_increment_length; 1227 } 1228 } 1229 } 1230 } 1231 } 1232 1233 ASSERT((ps_pt_sei->u4_au_cpb_removal_delay_minus1 < (1 << u1_au_cpb_removal_delay_length))); 1234 1235 u1_payload_size = (u1_payload_size + 7) >> 3; 1236 /************************************************************************/ 1237 /* PayloadSize : This is the size of the payload in bytes */ 1238 /************************************************************************/ 1239 PUT_BITS(ps_bitstrm, u1_payload_size, 8, return_status); 1240 ENTROPY_TRACE("u1_payload_size", u1_payload_size); 1241 1242 /************************************************************************/ 1243 /* Put the picture timing SEI parameters into the bitstream. For */ 1244 /* details refer to section D.1.2 of the standard */ 1245 /************************************************************************/ 1246 1247 if(1 == ps_vui_params->u1_frame_field_info_present_flag) 1248 { 1249 PUT_BITS(ps_bitstrm, ps_pt_sei->u4_pic_struct, 4, return_status); 1250 ENTROPY_TRACE("pic_struct", ps_pt_sei->u4_pic_struct); 1251 1252 PUT_BITS(ps_bitstrm, ps_pt_sei->u4_source_scan_type, 2, return_status); 1253 ENTROPY_TRACE("source_scan_type", ps_pt_sei->u4_source_scan_type); 1254 1255 PUT_BITS(ps_bitstrm, ps_pt_sei->u1_duplicate_flag, 1, return_status); 1256 ENTROPY_TRACE("duplicate_flag", ps_pt_sei->u1_duplicate_flag); 1257 } 1258 1259 if(ps_vui_params->s_vui_hrd_parameters.u1_nal_hrd_parameters_present_flag || 1260 ps_vui_params->s_vui_hrd_parameters 1261 .u1_vcl_hrd_parameters_present_flag) // condition from standard when CpbDpbDelaysPresentFlag flag will be present 1262 { 1263 PUT_BITS( 1264 ps_bitstrm, 1265 ps_pt_sei->u4_au_cpb_removal_delay_minus1, 1266 u1_au_cpb_removal_delay_length, 1267 return_status); 1268 ENTROPY_TRACE("cpb_removal_delay_minus1", ps_pt_sei->u4_au_cpb_removal_delay_minus1); 1269 1270 PUT_BITS( 1271 ps_bitstrm, 1272 ps_pt_sei->u4_pic_dpb_output_delay, 1273 u1_dpb_output_delay_length, 1274 return_status); 1275 ENTROPY_TRACE("pic_dpb_output_delay", ps_pt_sei->u4_pic_dpb_output_delay); 1276 1277 if(u1_sub_pic_cpb_params_present_flag) 1278 { 1279 PUT_BITS( 1280 ps_bitstrm, 1281 ps_pt_sei->u4_pic_dpb_output_du_delay, 1282 ps_vui_params->s_vui_hrd_parameters.u1_dpb_output_delay_du_length_minus1, 1283 return_status); 1284 ENTROPY_TRACE("pic_dpb_output_du_delay", ps_pt_sei->u4_pic_dpb_output_delay); 1285 } 1286 1287 if(u1_sub_pic_cpb_params_in_pt_sei_flag && u1_sub_pic_cpb_params_present_flag) 1288 { 1289 PUT_BITS_UEV(ps_bitstrm, ps_pt_sei->u4_num_decoding_units_minus1, return_status); 1290 ENTROPY_TRACE("num_decoding_units_minus1", ps_pt_sei->u4_num_decoding_units_minus1); 1291 1292 PUT_BITS(ps_bitstrm, ps_pt_sei->u1_du_common_cpb_removal_delay_flag, 1, return_status); 1293 ENTROPY_TRACE( 1294 "du_common_cpb_removal_delay_flag", ps_pt_sei->u4_du_common_cpb_removal_delay_flag); 1295 1296 if(1 == ps_pt_sei->u1_du_common_cpb_removal_delay_flag) 1297 { 1298 PUT_BITS( 1299 ps_bitstrm, 1300 ps_pt_sei->u4_du_common_cpb_removal_delay_increment_minus1, 1301 u1_du_cpb_removal_delay_increment_length, 1302 return_status); 1303 ENTROPY_TRACE( 1304 "du_common_cpb_removal_delay_increment_minus1", 1305 ps_pt_sei->u4_du_common_cpb_removal_delay_increment_minus1); 1306 } 1307 1308 for(i = 0; i <= ps_pt_sei->u4_num_decoding_units_minus1; i++) 1309 { 1310 PUT_BITS_UEV(ps_bitstrm, ps_pt_sei->au4_num_nalus_in_du_minus1[0], return_status); 1311 ENTROPY_TRACE("num_nalus_in_du_minus1", ps_pt_sei->u4_num_nalus_in_du_minus1); 1312 1313 if((1 != ps_pt_sei->u1_du_common_cpb_removal_delay_flag) && 1314 (i < ps_pt_sei->u4_num_decoding_units_minus1)) 1315 { 1316 PUT_BITS( 1317 ps_bitstrm, 1318 ps_pt_sei->au4_du_cpb_removal_delay_increment_minus1[0], 1319 u1_du_cpb_removal_delay_increment_length, 1320 return_status); 1321 ENTROPY_TRACE( 1322 "du_cpb_removal_delay_increment_minus1", 1323 ps_pt_sei->u4_du_cpb_removal_delay_increment_minus1); 1324 } 1325 } 1326 } 1327 } 1328 1329 return (return_status); 1330 } 1331 1332 /** 1333 ****************************************************************************** 1334 * 1335 * @brief Generates Hash (Supplemental Enhancement Information ) 1336 * 1337 * @par Description 1338 * Put hash sei params 1339 * 1340 * @param[in] ps_hash_sei_params 1341 * pointer to structure containing hash SEI data 1342 * 1343 * @param[in] i1_decoded_pic_hash_sei_flag 1344 * flag saying the hash SEI type 1345 * 1346 * @param[in] ps_bitstrm 1347 * pointer to bitstream context (handle) 1348 * 1349 * @return success or failure error code 1350 * 1351 ****************************************************************************** 1352 */ 1353 WORD32 ihevce_put_hash_sei_params( 1354 hash_sei_param_t *ps_hash_sei_params, WORD8 i1_decoded_pic_hash_sei_flag, bitstrm_t *ps_bitstrm) 1355 { 1356 UWORD32 i, c_idx, val; 1357 WORD32 return_status = IHEVCE_SUCCESS; 1358 UWORD8 u1_payload_size = 0; 1359 1360 u1_payload_size += 1; /* hash_type */ 1361 1362 if(1 == i1_decoded_pic_hash_sei_flag) 1363 { 1364 /* MD5 : 3 color planes * 16 byte values */ 1365 u1_payload_size += (16 * 3); 1366 } 1367 else if(2 == i1_decoded_pic_hash_sei_flag) 1368 { 1369 /* CRC : 3 color planes * 2 byte values */ 1370 u1_payload_size += (2 * 3); 1371 } 1372 else if(3 == i1_decoded_pic_hash_sei_flag) 1373 { 1374 /* Checksum : 3 color planes * 4 byte values */ 1375 u1_payload_size += (4 * 3); 1376 } 1377 else 1378 { 1379 ASSERT(0); 1380 } 1381 1382 /************************************************************************/ 1383 /* PayloadSize : This is the size of the payload in bytes */ 1384 /************************************************************************/ 1385 PUT_BITS(ps_bitstrm, u1_payload_size, 8, return_status); 1386 ENTROPY_TRACE("payload_size", u1_payload_size); 1387 1388 /************************************************************************/ 1389 /* Put the hash SEI parameters into the bitstream. For */ 1390 /* details refer to section D.2.19 of the standard */ 1391 /************************************************************************/ 1392 1393 PUT_BITS(ps_bitstrm, (i1_decoded_pic_hash_sei_flag - 1), 8, return_status); 1394 ENTROPY_TRACE("hash_type", (i1_decoded_pic_hash_sei_flag - 1)); 1395 1396 if(1 == i1_decoded_pic_hash_sei_flag) 1397 { 1398 for(c_idx = 0; c_idx < 3; c_idx++) 1399 { 1400 for(i = 0; i < 16; i++) 1401 { 1402 PUT_BITS(ps_bitstrm, ps_hash_sei_params->au1_sei_hash[c_idx][i], 8, return_status); 1403 ENTROPY_TRACE("picture_md5", ps_hash_sei_params->au1_sei_hash[c_idx][i]); 1404 } 1405 } 1406 } 1407 else if(2 == i1_decoded_pic_hash_sei_flag) 1408 { 1409 for(c_idx = 0; c_idx < 3; c_idx++) 1410 { 1411 val = (ps_hash_sei_params->au1_sei_hash[c_idx][0] << 8) + 1412 ps_hash_sei_params->au1_sei_hash[c_idx][1]; 1413 PUT_BITS(ps_bitstrm, val, 16, return_status); 1414 ENTROPY_TRACE("picture_crc", val); 1415 } 1416 } 1417 else if(3 == i1_decoded_pic_hash_sei_flag) 1418 { 1419 for(c_idx = 0; c_idx < 3; c_idx++) 1420 { 1421 val = (ps_hash_sei_params->au1_sei_hash[c_idx][0] << 24) + 1422 (ps_hash_sei_params->au1_sei_hash[c_idx][1] << 16) + 1423 (ps_hash_sei_params->au1_sei_hash[c_idx][2] << 8) + 1424 (ps_hash_sei_params->au1_sei_hash[c_idx][3]); 1425 1426 PUT_BITS(ps_bitstrm, val, 32, return_status); 1427 ENTROPY_TRACE("picture_checksum", val); 1428 } 1429 } 1430 else 1431 { 1432 ASSERT(0); 1433 } 1434 1435 return (return_status); 1436 } 1437 1438 /** 1439 ****************************************************************************** 1440 * 1441 * @brief Generates SEI (Supplemental Enhancement Information ) 1442 * 1443 * @par Description 1444 * Parse Supplemental Enhancement Information as per Section 7.3.2.4 1445 * 1446 * @param[in] e_payload_type 1447 * Determines the type of SEI msg 1448 * 1449 * @param[in] ps_bitstrm 1450 * pointer to bitstream context (handle) 1451 * 1452 * @param[in] ps_sei_params 1453 * pointer to structure containing SEI data 1454 * buffer period, recovery point, picture timing 1455 * 1456 * @param[in] ps_vui_params 1457 * pointer to structure containing VUI data 1458 * 1459 * @return success or failure error code 1460 * 1461 ****************************************************************************** 1462 */ 1463 WORD32 ihevce_put_sei_msg( 1464 IHEVCE_SEI_TYPE e_payload_type, 1465 sei_params_t *ps_sei_params, 1466 vui_t *ps_vui_params, 1467 bitstrm_t *ps_bitstrm, 1468 UWORD32 i4_sei_payload_length, 1469 UWORD8 *pu1_sei_payload) 1470 { 1471 WORD32 return_status = IHEVCE_SUCCESS; 1472 /************************************************************************/ 1473 /* PayloadType : Send in the SEI type in the stream */ 1474 /************************************************************************/ 1475 UWORD32 u4_payload_type = e_payload_type; 1476 while(u4_payload_type > 0xFF) 1477 { 1478 PUT_BITS(ps_bitstrm, 0xFF, 8, return_status); 1479 u4_payload_type -= 0xFF; 1480 } 1481 PUT_BITS(ps_bitstrm, (UWORD32)u4_payload_type, 8, return_status); 1482 ENTROPY_TRACE("e_payload_type", e_payload_type); 1483 1484 /************************************************************************/ 1485 /* PayloadSize : This is sent from within the type specific functions */ 1486 /************************************************************************/ 1487 1488 switch(e_payload_type) 1489 { 1490 case IHEVCE_SEI_BUF_PERIOD_T: 1491 return_status |= ihevce_put_buf_period_sei_params( 1492 &(ps_sei_params->s_buf_period_sei_params), ps_vui_params, ps_bitstrm); 1493 break; 1494 1495 case IHEVCE_SEI_PIC_TIMING_T: 1496 return_status |= ihevce_put_pic_timing_sei_params( 1497 &(ps_sei_params->s_pic_timing_sei_params), ps_vui_params, ps_bitstrm); 1498 break; 1499 1500 case IHEVCE_SEI_RECOVERY_POINT_T: 1501 return_status |= ihevce_put_recovery_point_sei_params( 1502 &(ps_sei_params->s_recovery_point_params), ps_bitstrm); 1503 break; 1504 case IHEVCE_SEI_ACTIVE_PARAMETER_SETS_T: 1505 return_status |= ihevce_put_active_parameter_set_sei_params( 1506 &(ps_sei_params->s_active_parameter_set_sei_params), ps_bitstrm); 1507 break; 1508 case IHEVCE_SEI_DECODED_PICTURE_HASH_T: 1509 return_status |= ihevce_put_hash_sei_params( 1510 &(ps_sei_params->s_hash_sei_params), 1511 ps_sei_params->i1_decoded_pic_hash_sei_flag, 1512 ps_bitstrm); 1513 break; 1514 case IHEVCE_SEI_MASTERING_DISP_COL_VOL_T: 1515 return_status |= ihevce_put_mastering_disp_col_vol_sei_params( 1516 &(ps_sei_params->s_mastering_dis_col_vol_sei_params), ps_bitstrm); 1517 break; 1518 case IHEVCE_SEI_CONTENT_LIGHT_LEVEL_DATA_T: 1519 return_status |= ihevce_put_cll_info_sei_params( 1520 ps_sei_params->s_cll_info_sei_params.u2_sei_avg_cll, 1521 ps_sei_params->s_cll_info_sei_params.u2_sei_max_cll, 1522 ps_bitstrm); 1523 break; 1524 //case IHEVCE_SEI_USER_DATA_REGISTERED_ITU_T_T35_T: 1525 //return_status |= ihevce_put_sei_params(i4_sei_payload_length, pu1_sei_payload, ps_bitstrm); 1526 //break; 1527 default: 1528 //Any Payload type other than the above cases will entred hereand be added to the bitstream 1529 return_status |= ihevce_put_sei_params(i4_sei_payload_length, pu1_sei_payload, ps_bitstrm); 1530 //return_status = IHEVCE_FAIL; 1531 } 1532 1533 ASSERT(IHEVCE_SUCCESS == return_status); 1534 1535 /* rbsp trailing bits */ 1536 if((IHEVCE_SUCCESS == return_status) && (ps_bitstrm->i4_bits_left_in_cw & 0x7)) 1537 ihevce_put_rbsp_trailing_bits(ps_bitstrm); 1538 1539 return (return_status); 1540 } 1541 1542 /** 1543 ****************************************************************************** 1544 * 1545 * @brief Generates SEI (Supplemental Enhancement Information ) 1546 * 1547 * @par Description 1548 * Parse Supplemental Enhancement Information as per Section 7.3.2.4 1549 * 1550 * @param[in] ps_bitstrm 1551 * pointer to bitstream context (handle) 1552 * 1553 * @param[in] ps_sei_params 1554 * pointer to structure containing SEI data 1555 * buffer period, recovery point, picture timing 1556 * 1557 * @param[in] ps_vui_params 1558 * pointer to structure containing VUI data 1559 * 1560 * @param[in] nal_unit_header 1561 * NAL_PREFIX_SEI / NAL_SUFFIX_SEI 1562 * 1563 * @param[in] u4_num_sei_payloads 1564 * Number of SEI payloads 1565 * 1566 * @param[in] ps_sei_payload 1567 * pointer to structure containing SEI payload data 1568 * 1569 * @return success or failure error code 1570 * 1571 ****************************************************************************** 1572 */ 1573 WORD32 ihevce_generate_sei( 1574 bitstrm_t *ps_bitstrm, 1575 sei_params_t *ps_sei_params, 1576 vui_t *ps_vui_params, 1577 WORD32 insert_per_cra, 1578 WORD32 nal_unit_header, 1579 UWORD32 u4_num_sei_payloads, 1580 sei_payload_t *ps_sei_payload) 1581 { 1582 UWORD32 u4_i; 1583 WORD32 return_status = IHEVCE_SUCCESS; 1584 1585 (void)insert_per_cra; 1586 /* Insert Start Code */ 1587 return_status = ihevce_put_nal_start_code_prefix(ps_bitstrm, 1); 1588 1589 ASSERT((NAL_PREFIX_SEI == nal_unit_header) || (NAL_SUFFIX_SEI == nal_unit_header)); 1590 /* Insert Nal Unit Header */ 1591 return_status |= ihevce_generate_nal_unit_header(ps_bitstrm, nal_unit_header, 0); 1592 1593 if(NAL_PREFIX_SEI == nal_unit_header) 1594 { 1595 /* Active Parameter and Buffering period insertion */ 1596 1597 if(ps_sei_params->i1_buf_period_params_present_flag) 1598 { 1599 /* insert active_parameter_set SEI required if buffering period SEI messages are inserted */ 1600 return_status |= ihevce_put_sei_msg( 1601 IHEVCE_SEI_ACTIVE_PARAMETER_SETS_T, 1602 ps_sei_params, 1603 ps_vui_params, 1604 ps_bitstrm, 1605 0, 1606 NULL); 1607 1608 /*************************************************************************************************/ 1609 /* NOTE: Need to terminate and start new SEI message after active parameter set SEI */ 1610 /* Buffering period/pic timing SEI refering to active SPS cannot be embedded in same SEI message */ 1611 /* This is because SPS is activated in HM deocder after completely parsing full SEI message. */ 1612 /*************************************************************************************************/ 1613 if(1) /* Insert New SEI for buffering period after active parameter set SEI */ 1614 { 1615 ihevce_put_rbsp_trailing_bits(ps_bitstrm); 1616 1617 /* Insert Next SEI Start Code */ 1618 return_status = ihevce_put_nal_start_code_prefix(ps_bitstrm, 1); 1619 1620 /* Insert Next SEI Nal Unit Header */ 1621 return_status |= ihevce_generate_nal_unit_header(ps_bitstrm, nal_unit_header, 0); 1622 } 1623 1624 /* Buffering Period SEI meassage for all IDR, CRA pics */ 1625 return_status |= ihevce_put_sei_msg( 1626 IHEVCE_SEI_BUF_PERIOD_T, ps_sei_params, ps_vui_params, ps_bitstrm, 0, NULL); 1627 } 1628 1629 /* Pic timing SEI meassage for non IDR, non CRA pics */ 1630 if(ps_sei_params->i1_pic_timing_params_present_flag) 1631 { 1632 return_status |= ihevce_put_sei_msg( 1633 IHEVCE_SEI_PIC_TIMING_T, ps_sei_params, ps_vui_params, ps_bitstrm, 0, NULL); 1634 } 1635 1636 /* Recovery point SEI meassage for all IDR, CRA pics */ 1637 if(ps_sei_params->i1_recovery_point_params_present_flag) 1638 { 1639 return_status |= ihevce_put_sei_msg( 1640 IHEVCE_SEI_RECOVERY_POINT_T, ps_sei_params, ps_vui_params, ps_bitstrm, 0, NULL); 1641 } 1642 1643 /* Mastering Display Colour SEI for all IDR, CRA pics */ 1644 if(ps_sei_params->i4_sei_mastering_disp_colour_vol_params_present_flags) 1645 { 1646 return_status |= ihevce_put_sei_msg( 1647 IHEVCE_SEI_MASTERING_DISP_COL_VOL_T, 1648 ps_sei_params, 1649 ps_vui_params, 1650 ps_bitstrm, 1651 0, 1652 NULL); 1653 } 1654 /*Registered User Data*/ 1655 for(u4_i = 0; u4_i < u4_num_sei_payloads; u4_i++) 1656 { 1657 return_status |= ihevce_put_sei_msg( 1658 (IHEVCE_SEI_TYPE)(ps_sei_payload[u4_i].u4_payload_type), 1659 ps_sei_params, 1660 ps_vui_params, 1661 ps_bitstrm, 1662 ps_sei_payload[u4_i].u4_payload_length, 1663 ps_sei_payload[u4_i].pu1_sei_payload); 1664 } 1665 /* Content Light Level Information*/ 1666 if(ps_sei_params->i1_sei_cll_enable) 1667 { 1668 return_status |= ihevce_put_sei_msg( 1669 IHEVCE_SEI_CONTENT_LIGHT_LEVEL_DATA_T, 1670 ps_sei_params, 1671 ps_vui_params, 1672 ps_bitstrm, 1673 0, 1674 NULL); 1675 } 1676 } 1677 else if(NAL_SUFFIX_SEI == nal_unit_header) 1678 { 1679 /* Insert hash SEI */ 1680 if(ps_sei_params->i1_decoded_pic_hash_sei_flag) 1681 { 1682 return_status |= ihevce_put_sei_msg( 1683 IHEVCE_SEI_DECODED_PICTURE_HASH_T, 1684 ps_sei_params, 1685 ps_vui_params, 1686 ps_bitstrm, 1687 0, 1688 NULL); 1689 } 1690 } 1691 1692 /*put trailing bits to indicate end of sei*/ 1693 ihevce_put_rbsp_trailing_bits(ps_bitstrm); 1694 1695 return return_status; 1696 } 1697 1698 /** 1699 ****************************************************************************** 1700 * 1701 * @brief Populates ihevce_populate_mastering_disp_col_vol_sei of SEI structure 1702 * 1703 * @par Description 1704 * Populates mastering display colour volume sei structure 1705 * 1706 * @param[in] ps_sei 1707 * pointer to sei params that needs to be populated 1708 * 1709 * @param[in] ps_out_strm_prms 1710 * pointer to output stream params 1711 * 1712 * @return success or failure error code 1713 * 1714 ****************************************************************************** 1715 */ 1716 WORD32 ihevce_populate_mastering_disp_col_vol_sei( 1717 sei_params_t *ps_sei, ihevce_out_strm_params_t *ps_out_strm_prms) 1718 { 1719 WORD32 i; 1720 1721 mastering_dis_col_vol_sei_params_t *ps_mastering_dis_col_vol_sei_params = 1722 &ps_sei->s_mastering_dis_col_vol_sei_params; 1723 1724 for(i = 0; i < 3; i++) 1725 { 1726 ps_mastering_dis_col_vol_sei_params->au2_display_primaries_x[i] = 1727 ps_out_strm_prms->au2_display_primaries_x[i]; 1728 ps_mastering_dis_col_vol_sei_params->au2_display_primaries_y[i] = 1729 ps_out_strm_prms->au2_display_primaries_y[i]; 1730 } 1731 1732 ps_mastering_dis_col_vol_sei_params->u2_white_point_x = ps_out_strm_prms->u2_white_point_x; 1733 ps_mastering_dis_col_vol_sei_params->u2_white_point_y = ps_out_strm_prms->u2_white_point_y; 1734 1735 ps_mastering_dis_col_vol_sei_params->u4_max_display_mastering_luminance = 1736 ps_out_strm_prms->u4_max_display_mastering_luminance; 1737 ps_mastering_dis_col_vol_sei_params->u4_min_display_mastering_luminance = 1738 ps_out_strm_prms->u4_min_display_mastering_luminance; 1739 1740 return IHEVCE_SUCCESS; 1741 } 1742 1743 /** 1744 ****************************************************************************** 1745 * 1746 * @brief Populates ihevce_populate_recovery_point_sei of SEI structure 1747 * 1748 * @par Description 1749 * Populates vui structure for its use in header generation 1750 * 1751 * @param[out] ps_sei 1752 * pointer to sei params that needs to be populated 1753 * 1754 * @param[out] ps_vui 1755 * pointer to vui params referred by sei 1756 * 1757 * @param[out] ps_sps 1758 * pointer to sps params referred by sei 1759 * 1760 * @param[in] ps_src_params 1761 * pointer to source config params; resolution, frame rate etc 1762 * 1763 * @param[in] ps_config_prms 1764 * pointer to configuration params like bitrate, HRD buffer sizes, cu, tu sizes 1765 * 1766 * @return success or failure error code 1767 * 1768 ****************************************************************************** 1769 */ 1770 WORD32 ihevce_populate_recovery_point_sei( 1771 sei_params_t *ps_sei, ihevce_vui_sei_params_t *ps_vui_sei_prms) 1772 { 1773 recovery_point_sei_params_t *ps_rec_point_params = &ps_sei->s_recovery_point_params; 1774 1775 (void)ps_vui_sei_prms; 1776 ps_rec_point_params->i4_recovery_poc_cnt = 0; 1777 ps_rec_point_params->u1_broken_link_flag = 0; 1778 ps_rec_point_params->u1_exact_match_flag = 1; 1779 1780 return IHEVCE_SUCCESS; 1781 } 1782 1783 /** 1784 ****************************************************************************** 1785 * 1786 * @brief Populates picture timing of SEI structure 1787 * 1788 * @par Description 1789 * Populates vui structure for its use in header generation 1790 * 1791 * @param[out] ps_sei 1792 * pointer to sei params that needs to be populated 1793 * 1794 * @param[out] ps_vui 1795 * pointer to vui params referred by sei 1796 * 1797 * @param[in] ps_src_params 1798 * pointer to source config params; resolution, frame rate etc 1799 * 1800 * @param[in] u4_bottom_field_flag 1801 * Used only for interlaced field coding. 0:top field, 1:bottom field 1802 * 1803 * @return success or failure error code 1804 * 1805 ****************************************************************************** 1806 */ 1807 WORD32 ihevce_populate_picture_timing_sei( 1808 sei_params_t *ps_sei, 1809 vui_t *ps_vui, 1810 ihevce_src_params_t *ps_src_params, 1811 WORD32 u4_bottom_field_flag) 1812 { 1813 pic_timing_sei_params_t *ps_pic_timing_params = &ps_sei->s_pic_timing_sei_params; 1814 UWORD8 u1_prog_seq = !ps_src_params->i4_field_pic; 1815 UWORD8 u1_top_field_first = 1; //ps_curr_inp->s_input_buf.i4_topfield_first; 1816 1817 UWORD8 u1_repeat_first_field = 0; 1818 WORD32 field_seq_flag = ps_vui->u1_field_seq_flag; 1819 1820 if(ps_vui->u1_frame_field_info_present_flag) 1821 { 1822 /**************************************************************************/ 1823 /* Refer Table D-1 */ 1824 /**************************************************************************/ 1825 if(0 == u1_prog_seq) 1826 { 1827 if(field_seq_flag) 1828 { 1829 ASSERT((u4_bottom_field_flag == 0) || (u4_bottom_field_flag == 1)); 1830 1831 /* 1 => top field pic */ 1832 /* 2 => bottom field pic */ 1833 ps_pic_timing_params->u4_pic_struct = 1 + u4_bottom_field_flag; 1834 } 1835 else if(0 == u1_repeat_first_field) 1836 { 1837 /******************************************************************/ 1838 /* [PROGRESSIVE SEQ] = 0; */ 1839 /* [MPEG2 PIC STRUCT] = FIELD_PICTURE */ 1840 /* [REPEAT_FIRST_FIELD] = 0 */ 1841 /* u1_pic_struct = 3 => top - bottom field pic */ 1842 /* u1_pic_struct = 4 => bottom - top */ 1843 /******************************************************************/ 1844 ps_pic_timing_params->u4_pic_struct = 4 - u1_top_field_first; 1845 } 1846 else 1847 { 1848 /******************************************************************/ 1849 /* [PROGRESSIVE SEQ] = 0; */ 1850 /* [MPEG2 PIC STRUCT] = FIELD_PICTURE */ 1851 /* [REPEAT_FIRST_FIELD] = 1 */ 1852 /* u1_pic_struct = 5 => top - bottom - top */ 1853 /* u1_pic_struct = 6 => bottom - top - bottom */ 1854 /******************************************************************/ 1855 ps_pic_timing_params->u4_pic_struct = 6 - u1_top_field_first; 1856 } 1857 } 1858 else 1859 { 1860 if(0 == u1_repeat_first_field) 1861 { 1862 /******************************************************************/ 1863 /* [PROGRESSIVE SEQ] = 1; */ 1864 /* [MPEG2 PIC STRUCT] = FRAME_PICTURE */ 1865 /* u1_pic_struct = 0 => frame picture (no repeat) */ 1866 /******************************************************************/ 1867 ps_pic_timing_params->u4_pic_struct = 0; 1868 } 1869 else 1870 { 1871 /******************************************************************/ 1872 /* [PROGRESSIVE SEQ] = 1; */ 1873 /* [MPEG2 PIC STRUCT] = FRAME_PICTURE */ 1874 /* u1_pic_struct = 7 => frame picture (repeat once) */ 1875 /* u1_pic_struct = 8 => frame picture (repeat twice) */ 1876 /******************************************************************/ 1877 ps_pic_timing_params->u4_pic_struct = 7 + u1_top_field_first; 1878 } 1879 } 1880 /* Porogressive frame - 1 ; Interlace - 0 */ 1881 ps_pic_timing_params->u4_source_scan_type = !ps_src_params->i4_field_pic; 1882 1883 ps_pic_timing_params->u1_duplicate_flag = 0; 1884 } 1885 ps_pic_timing_params->u4_pic_dpb_output_du_delay = 0; 1886 1887 ps_pic_timing_params->u4_num_decoding_units_minus1 = 1; 1888 1889 ps_pic_timing_params->u1_du_common_cpb_removal_delay_flag = 1; 1890 1891 ps_pic_timing_params->u4_du_common_cpb_removal_delay_increment_minus1 = 1; 1892 1893 ps_pic_timing_params->au4_num_nalus_in_du_minus1[0] = 1; 1894 1895 ps_pic_timing_params->au4_du_cpb_removal_delay_increment_minus1[0] = 1; 1896 1897 return IHEVCE_SUCCESS; 1898 } 1899 1900 /** 1901 ****************************************************************************** 1902 * 1903 * @brief Populates buffer period of sei structure 1904 * 1905 * @par Description 1906 * Populates vui structure for its use in header generation 1907 * 1908 * @param[out] ps_sei 1909 * pointer to sei params that needs to be populated 1910 * 1911 * @param[out] ps_vui 1912 * pointer to vui params referred by sei 1913 * 1914 * @param[out] ps_sps 1915 * pointer to sps params referred by sei 1916 * 1917 * @param[out] ps_vui_sei_prms 1918 * pointer to sps params referred by application 1919 * 1920 * @return success or failure error code 1921 * 1922 ****************************************************************************** 1923 */ 1924 WORD32 ihevce_populate_buffering_period_sei( 1925 sei_params_t *ps_sei, vui_t *ps_vui, sps_t *ps_sps, ihevce_vui_sei_params_t *ps_vui_sei_prms) 1926 { 1927 WORD32 i; 1928 1929 buf_period_sei_params_t *ps_bp_sei = &ps_sei->s_buf_period_sei_params; 1930 1931 WORD32 i1_sps_max_sub_layersminus1 = ps_sps->i1_sps_max_sub_layers - 1; 1932 1933 hrd_params_t *ps_vui_hrd_parameters = &ps_vui->s_vui_hrd_parameters; 1934 1935 sub_lyr_hrd_params_t *ps_sub_layer_hrd_params = 1936 &ps_vui_hrd_parameters->as_sub_layer_hrd_params[i1_sps_max_sub_layersminus1]; 1937 1938 WORD32 cpb_cnt = ps_vui_hrd_parameters->au1_cpb_cnt_minus1[i1_sps_max_sub_layersminus1]; 1939 1940 WORD32 cpb_size, bit_rate; 1941 1942 (void)ps_vui_sei_prms; 1943 ps_bp_sei->u1_bp_seq_parameter_set_id = ps_sps->i1_sps_id; 1944 1945 ps_bp_sei->u4_initial_cpb_removal_delay_length = 1946 ps_vui->s_vui_hrd_parameters.u1_initial_cpb_removal_delay_length_minus1 + 1; 1947 1948 ps_bp_sei->u1_sub_pic_cpb_params_present_flag = 1949 ps_vui_hrd_parameters->u1_sub_pic_cpb_params_present_flag; 1950 1951 ps_bp_sei->u1_rap_cpb_params_present_flag = 0; //DEFAULT value 1952 1953 ps_bp_sei->u4_cpb_delay_offset = 0; //DEFAULT value 1954 ps_bp_sei->u4_dpb_delay_offset = 0; //DEFAULT value 1955 1956 ps_bp_sei->u1_concatenation_flag = 0; //DEFAULT value ??? 1957 ps_bp_sei->u4_au_cpb_removal_delay_delta_minus1 = 0; //DEFAULT value ??? 1958 1959 ps_bp_sei->u4_cpb_cnt = cpb_cnt; 1960 1961 if(ps_vui->s_vui_hrd_parameters.u1_nal_hrd_parameters_present_flag) 1962 { 1963 for(i = 0; i <= cpb_cnt; i++) 1964 { 1965 ULWORD64 u8_temp; 1966 if(1 == ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag) 1967 { 1968 ASSERT(1 == ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag); 1969 1970 cpb_size = (ps_sub_layer_hrd_params->au4_cpb_size_du_value_minus1[i] + 1) * 1971 (1 << (4 + ps_vui_hrd_parameters->u4_cpb_size_du_scale)); 1972 1973 bit_rate = (ps_sub_layer_hrd_params->au4_bit_rate_du_value_minus1[i] + 1) * 1974 (1 << (6 + ps_vui_hrd_parameters->u4_bit_rate_scale)); 1975 } 1976 else 1977 { 1978 cpb_size = (ps_sub_layer_hrd_params->au4_cpb_size_value_minus1[i] + 1) * 1979 (1 << (4 + ps_vui_hrd_parameters->u4_cpb_size_scale)); 1980 1981 bit_rate = (ps_sub_layer_hrd_params->au4_bit_rate_value_minus1[i] + 1) * 1982 (1 << (6 + ps_vui_hrd_parameters->u4_bit_rate_scale)); 1983 } 1984 1985 u8_temp = (ULWORD64)(90000 * (ULWORD64)cpb_size); 1986 ps_bp_sei->au4_nal_initial_cpb_removal_delay[i] = (UWORD32)(u8_temp / bit_rate); 1987 1988 ps_bp_sei->au4_nal_initial_cpb_removal_delay_offset[i] = 0; 1989 1990 if(ps_bp_sei->u1_rap_cpb_params_present_flag || 1991 ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag) 1992 { 1993 ps_bp_sei->au4_nal_initial_alt_cpb_removal_delay[i] = (UWORD32)(u8_temp / bit_rate); 1994 ps_bp_sei->au4_nal_initial_cpb_removal_delay_offset[i] = 0; 1995 } 1996 } 1997 } 1998 1999 if(ps_vui->s_vui_hrd_parameters.u1_vcl_hrd_parameters_present_flag) 2000 { 2001 for(i = 0; i <= cpb_cnt; i++) 2002 { 2003 if(1 == ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag) 2004 { 2005 ASSERT(1 == ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag); 2006 cpb_size = (ps_sub_layer_hrd_params->au4_cpb_size_du_value_minus1[i] + 1) * 2007 (1 << (4 + ps_vui_hrd_parameters->u4_cpb_size_du_scale)); 2008 2009 bit_rate = (ps_sub_layer_hrd_params->au4_bit_rate_du_value_minus1[i] + 1) * 2010 (1 << (6 + ps_vui_hrd_parameters->u4_bit_rate_scale)); 2011 } 2012 else 2013 { 2014 cpb_size = (ps_sub_layer_hrd_params->au4_cpb_size_value_minus1[i] + 1) * 2015 (1 << (4 + ps_vui_hrd_parameters->u4_cpb_size_scale)); 2016 2017 bit_rate = (ps_sub_layer_hrd_params->au4_bit_rate_value_minus1[i] + 1) * 2018 (1 << (6 + ps_vui_hrd_parameters->u4_bit_rate_scale)); 2019 } 2020 2021 ps_bp_sei->au4_vcl_initial_cpb_removal_delay[i] = 90000 * (cpb_size / bit_rate); 2022 2023 ps_bp_sei->au4_vcl_initial_cpb_removal_delay_offset[i] = 0; 2024 2025 if(ps_bp_sei->u1_rap_cpb_params_present_flag || 2026 ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag) 2027 { 2028 ps_bp_sei->au4_vcl_initial_alt_cpb_removal_delay[i] = 90000 * (cpb_size / bit_rate); 2029 ps_bp_sei->au4_vcl_initial_cpb_removal_delay_offset[i] = 0; 2030 } 2031 } 2032 } 2033 2034 /* Reset picture timing cbp removal delay at every insertion Buffering period SEI */ 2035 //ps_sei->s_pic_timing_sei_params.u4_au_cpb_removal_delay_minus1 = 0; 2036 2037 return IHEVCE_SUCCESS; 2038 } 2039 2040 /** 2041 ****************************************************************************** 2042 * 2043 * @brief Populates active parameter set sei structure 2044 * 2045 * @par Description 2046 * 2047 * @param[out] ps_sei 2048 * pointer to sei params that needs to be populated 2049 * 2050 * @param[in] ps_vps 2051 * pointer to configuration vps_t. 2052 * 2053 * @return success or failure error code 2054 * 2055 ***************************************************************************** 2056 */ 2057 WORD32 ihevce_populate_active_parameter_set_sei(sei_params_t *ps_sei, vps_t *ps_vps, sps_t *ps_sps) 2058 { 2059 UWORD8 i; 2060 active_parameter_set_sei_param_t *ps_act_sei = &ps_sei->s_active_parameter_set_sei_params; 2061 2062 (void)ps_sps; 2063 ps_act_sei->u1_active_video_parameter_set_id = ps_vps->i1_vps_id; 2064 ps_act_sei->u1_self_contained_cvs_flag = 0; 2065 ps_act_sei->u1_no_parameter_set_update_flag = 1; 2066 ps_act_sei->u1_num_sps_ids_minus1 = 0; 2067 for(i = 0; i <= ps_act_sei->u1_num_sps_ids_minus1; i++) 2068 { 2069 ps_act_sei->au1_active_seq_parameter_set_id[i] = 0; 2070 } 2071 2072 return IHEVCE_SUCCESS; 2073 } 2074 2075 /** 2076 ****************************************************************************** 2077 * 2078 * @brief Populates Hash SEI values for CRC Hash 2079 * 2080 * @par Description 2081 * 2082 * @param[out] ps_hash_sei_params 2083 * pointer to hash sei params that needs to be populated 2084 * 2085 * @param[in] bit_depth 2086 * i4_internal_bit_depth value. Assume same for Luma & Chroma 2087 * 2088 * @param[in] pv_y_buf 2089 * Pointer to decoded/recon Luma buffer 2090 * 2091 * @param[in] y_wd 2092 * pic width in luma samples 2093 * 2094 * @param[in] y_ht 2095 * pic height in luma samples 2096 * 2097 * @param[in] y_strd 2098 * Stride of luma buffer 2099 * 2100 * @param[in] pv_u_buf 2101 * Pointer to decoded/recon Chroma buffer 2102 * 2103 * @param[in] uv_wd 2104 * pic width in luma samples / SubWidthC 2105 * 2106 * @param[in] uv_ht 2107 * pic height in luma samples / SubHeightC 2108 * 2109 * @param[in] uv_strd 2110 * Stride of chroma buffer 2111 * 2112 * @return None 2113 * 2114 ***************************************************************************** 2115 */ 2116 static void ihevce_calc_CRC( 2117 hash_sei_param_t *ps_hash_sei_params, 2118 WORD32 bit_depth, 2119 void *pv_y_buf, 2120 WORD32 y_wd, 2121 WORD32 y_ht, 2122 WORD32 y_strd, 2123 void *pv_u_buf, 2124 WORD32 uv_wd, 2125 WORD32 uv_ht, 2126 WORD32 uv_strd) 2127 { 2128 WORD32 x, y, bit_idx, is_gt8bit = 0, gt8bit_mul; 2129 UWORD8 *pu_buf; 2130 2131 /* For this to work, assumes little endian in case of HBD */ 2132 if(bit_depth > 8) 2133 is_gt8bit = 1; 2134 gt8bit_mul = 1 + is_gt8bit; 2135 2136 /* Luma CRC */ 2137 { 2138 UWORD32 u4_crc_val = 0xffff; 2139 2140 pu_buf = (UWORD8 *)pv_y_buf; 2141 2142 for(y = 0; y < y_ht; y++) 2143 { 2144 for(x = 0; x < y_wd; x++) 2145 { 2146 // take CRC of first pictureData byte 2147 for(bit_idx = 0; bit_idx < 8; bit_idx++) 2148 { 2149 CALC_CRC_BIT_LEVEL( 2150 u4_crc_val, pu_buf[y * (y_strd * gt8bit_mul) + (x * gt8bit_mul)], bit_idx); 2151 } 2152 // take CRC of second pictureData byte if bit depth is greater than 8-bits 2153 if(bit_depth > 8) 2154 { 2155 for(bit_idx = 0; bit_idx < 8; bit_idx++) 2156 { 2157 CALC_CRC_BIT_LEVEL( 2158 u4_crc_val, 2159 pu_buf[y * (y_strd * gt8bit_mul) + (x * gt8bit_mul + 1)], 2160 bit_idx); 2161 } 2162 } 2163 } 2164 } 2165 2166 for(bit_idx = 0; bit_idx < 16; bit_idx++) 2167 { 2168 UWORD32 u4_crc_msb = (u4_crc_val >> 15) & 1; 2169 u4_crc_val = ((u4_crc_val << 1) & 0xffff) ^ (u4_crc_msb * 0x1021); 2170 } 2171 2172 ps_hash_sei_params->au1_sei_hash[0][0] = (u4_crc_val >> 8) & 0xff; 2173 ps_hash_sei_params->au1_sei_hash[0][1] = u4_crc_val & 0xff; 2174 } 2175 2176 /* Cb & Cr CRC */ 2177 { 2178 UWORD32 u4_crc_val_u = 0xffff, u4_crc_val_v = 0xffff; 2179 2180 pu_buf = (UWORD8 *)pv_u_buf; 2181 2182 for(y = 0; y < uv_ht; y++) 2183 { 2184 for(x = 0; x < uv_wd; x += 2) 2185 { 2186 // take CRC of first pictureData byte 2187 for(bit_idx = 0; bit_idx < 8; bit_idx++) 2188 { 2189 CALC_CRC_BIT_LEVEL( 2190 u4_crc_val_u, 2191 pu_buf[y * (uv_strd * gt8bit_mul) + (x * gt8bit_mul)], 2192 bit_idx); 2193 CALC_CRC_BIT_LEVEL( 2194 u4_crc_val_v, 2195 pu_buf[y * (uv_strd * gt8bit_mul) + ((x + 1) * gt8bit_mul)], 2196 bit_idx); 2197 } 2198 // take CRC of second pictureData byte if bit depth is greater than 8-bits 2199 if(bit_depth > 8) 2200 { 2201 for(bit_idx = 0; bit_idx < 8; bit_idx++) 2202 { 2203 CALC_CRC_BIT_LEVEL( 2204 u4_crc_val_u, 2205 pu_buf[y * (uv_strd * gt8bit_mul) + (x * gt8bit_mul) + 1], 2206 bit_idx); 2207 CALC_CRC_BIT_LEVEL( 2208 u4_crc_val_v, 2209 pu_buf[y * (uv_strd * gt8bit_mul) + ((x + 1) * gt8bit_mul) + 1], 2210 bit_idx); 2211 } 2212 } 2213 } 2214 } 2215 2216 for(bit_idx = 0; bit_idx < 16; bit_idx++) 2217 { 2218 UWORD32 u4_crc_msb = (u4_crc_val_u >> 15) & 1; 2219 u4_crc_val_u = ((u4_crc_val_u << 1) & 0xffff) ^ (u4_crc_msb * 0x1021); 2220 2221 u4_crc_msb = (u4_crc_val_v >> 15) & 1; 2222 u4_crc_val_v = ((u4_crc_val_v << 1) & 0xffff) ^ (u4_crc_msb * 0x1021); 2223 } 2224 2225 ps_hash_sei_params->au1_sei_hash[1][0] = (u4_crc_val_u >> 8) & 0xff; 2226 ps_hash_sei_params->au1_sei_hash[1][1] = u4_crc_val_u & 0xff; 2227 2228 ps_hash_sei_params->au1_sei_hash[2][0] = (u4_crc_val_v >> 8) & 0xff; 2229 ps_hash_sei_params->au1_sei_hash[2][1] = u4_crc_val_v & 0xff; 2230 } 2231 } 2232 2233 /** 2234 ****************************************************************************** 2235 * 2236 * @brief Populates Hash SEI values for Checksum Hash 2237 * 2238 * @par Description 2239 * 2240 * @param[out] ps_hash_sei_params 2241 * pointer to hash sei params that needs to be populated 2242 * 2243 * @param[in] bit_depth 2244 * i4_internal_bit_depth value. Assume same for Luma & Chroma 2245 * 2246 * @param[in] pv_y_buf 2247 * Pointer to decoded/recon Luma buffer 2248 * 2249 * @param[in] y_wd 2250 * pic width in luma samples 2251 * 2252 * @param[in] y_ht 2253 * pic height in luma samples 2254 * 2255 * @param[in] y_strd 2256 * Stride of luma buffer 2257 * 2258 * @param[in] pv_u_buf 2259 * Pointer to decoded/recon Chroma buffer 2260 * 2261 * @param[in] uv_wd 2262 * pic width in luma samples / SubWidthC 2263 * 2264 * @param[in] uv_ht 2265 * pic height in luma samples / SubHeightC 2266 * 2267 * @param[in] uv_strd 2268 * Stride of chroma buffer 2269 * 2270 * @return None 2271 * 2272 ***************************************************************************** 2273 */ 2274 static void ihevce_calc_checksum( 2275 hash_sei_param_t *ps_hash_sei_params, 2276 WORD32 bit_depth, 2277 void *pv_y_buf, 2278 WORD32 y_wd, 2279 WORD32 y_ht, 2280 WORD32 y_strd, 2281 void *pv_u_buf, 2282 WORD32 uv_wd, 2283 WORD32 uv_ht, 2284 WORD32 uv_strd, 2285 WORD32 i4_frame_pos_x, 2286 WORD32 i4_frame_pos_y) 2287 { 2288 WORD32 x, y; 2289 UWORD8 *pu_buf; 2290 WORD32 row, col; 2291 UWORD32 u4_xor_mask; 2292 UWORD32 gt8bit_mul = 1; 2293 2294 if(bit_depth > 8) 2295 gt8bit_mul++; 2296 2297 /* Luma Checksum */ 2298 { 2299 UWORD32 u4_sum_luma = 0; 2300 2301 pu_buf = (UWORD8 *)pv_y_buf; 2302 2303 for(y = i4_frame_pos_y, row = 0; row < y_ht; y++, row++) 2304 { 2305 for(x = i4_frame_pos_x, col = 0; col < y_wd; x++, col++) 2306 { 2307 // take checksum of first pictureData byte 2308 u4_xor_mask = (x & 0xFF) ^ (y & 0xFF) ^ (x >> 8) ^ (y >> 8); 2309 u4_sum_luma = 2310 (u4_sum_luma + ((pu_buf[(row * y_strd + col) * gt8bit_mul]) ^ u4_xor_mask)) & 2311 0xFFFFFFFF; 2312 2313 // take checksum of second pictureData byte if bit depth is greater than 8-bits 2314 if(bit_depth > 8) 2315 { 2316 u4_sum_luma = (u4_sum_luma + ((pu_buf[(row * y_strd + col) * gt8bit_mul + 1]) ^ 2317 u4_xor_mask)) & 2318 0xFFFFFFFF; 2319 } 2320 } 2321 } 2322 2323 ps_hash_sei_params->au1_sei_hash[0][0] = (u4_sum_luma >> 24) & 0xff; 2324 ps_hash_sei_params->au1_sei_hash[0][1] = (u4_sum_luma >> 16) & 0xff; 2325 ps_hash_sei_params->au1_sei_hash[0][2] = (u4_sum_luma >> 8) & 0xff; 2326 ps_hash_sei_params->au1_sei_hash[0][3] = (u4_sum_luma)&0xff; 2327 } 2328 2329 /* Cb & Cr checksum */ 2330 { 2331 UWORD32 u4_sum_cb = 0, u4_sum_cr = 0; 2332 pu_buf = (UWORD8 *)pv_u_buf; 2333 2334 for(y = (i4_frame_pos_y / 2), row = 0; row < uv_ht; y++, row++) 2335 { 2336 for(x = (i4_frame_pos_x / 2), col = 0; col < uv_wd; x++, col += 2) 2337 { 2338 // take checksum of first pictureData byte 2339 u4_xor_mask = (x & 0xFF) ^ (y & 0xFF) ^ (x >> 8) ^ (y >> 8); 2340 u4_sum_cb = 2341 (u4_sum_cb + ((pu_buf[(row * uv_strd + (col)) * gt8bit_mul]) ^ u4_xor_mask)) & 2342 0xFFFFFFFF; 2343 u4_sum_cr = (u4_sum_cr + 2344 ((pu_buf[(row * uv_strd + (col + 1)) * gt8bit_mul]) ^ u4_xor_mask)) & 2345 0xFFFFFFFF; 2346 2347 // take checksum of second pictureData byte if bit depth is greater than 8-bits 2348 if(bit_depth > 8) 2349 { 2350 u4_sum_cb = (u4_sum_cb + ((pu_buf[(row * uv_strd + (col)) * gt8bit_mul + 1]) ^ 2351 u4_xor_mask)) & 2352 0xFFFFFFFF; 2353 u4_sum_cr = 2354 (u4_sum_cr + 2355 ((pu_buf[(row * uv_strd + (col + 1)) * gt8bit_mul + 1]) ^ u4_xor_mask)) & 2356 0xFFFFFFFF; 2357 } 2358 } 2359 } 2360 2361 ps_hash_sei_params->au1_sei_hash[1][0] = (u4_sum_cb >> 24) & 0xff; 2362 ps_hash_sei_params->au1_sei_hash[1][1] = (u4_sum_cb >> 16) & 0xff; 2363 ps_hash_sei_params->au1_sei_hash[1][2] = (u4_sum_cb >> 8) & 0xff; 2364 ps_hash_sei_params->au1_sei_hash[1][3] = (u4_sum_cb)&0xff; 2365 2366 ps_hash_sei_params->au1_sei_hash[2][0] = (u4_sum_cr >> 24) & 0xff; 2367 ps_hash_sei_params->au1_sei_hash[2][1] = (u4_sum_cr >> 16) & 0xff; 2368 ps_hash_sei_params->au1_sei_hash[2][2] = (u4_sum_cr >> 8) & 0xff; 2369 ps_hash_sei_params->au1_sei_hash[2][3] = (u4_sum_cr)&0xff; 2370 } 2371 } 2372 2373 /** 2374 ****************************************************************************** 2375 * 2376 * @brief Populates Hash SEI values 2377 * 2378 * @par Description 2379 * 2380 * @param[out] ps_sei 2381 * pointer to sei params that needs to be populated 2382 * 2383 * @param[in] bit_depth 2384 * i4_internal_bit_depth value. Assume same for Luma & Chroma 2385 * 2386 * @param[in] pv_y_buf 2387 * Pointer to decoded/recon Luma buffer 2388 * 2389 * @param[in] y_wd 2390 * pic width in luma samples 2391 * 2392 * @param[in] y_ht 2393 * pic height in luma samples 2394 * 2395 * @param[in] y_strd 2396 * Stride of luma buffer 2397 * 2398 * @param[in] pv_u_buf 2399 * Pointer to decoded/recon Chroma buffer 2400 * 2401 * @param[in] uv_wd 2402 * pic width in luma samples / SubWidthC 2403 * 2404 * @param[in] uv_ht 2405 * pic height in luma samples / SubHeightC 2406 * 2407 * @param[in] uv_strd 2408 * Stride of chroma buffer 2409 * 2410 * @return success or failure error code 2411 * 2412 ***************************************************************************** 2413 */ 2414 WORD32 ihevce_populate_hash_sei( 2415 sei_params_t *ps_sei, 2416 WORD32 bit_depth, 2417 void *pv_y_buf, 2418 WORD32 y_wd, 2419 WORD32 y_ht, 2420 WORD32 y_strd, 2421 void *pv_u_buf, 2422 WORD32 uv_wd, 2423 WORD32 uv_ht, 2424 WORD32 uv_strd, 2425 WORD32 i4_frame_pos_x, 2426 WORD32 i4_frame_pos_y) 2427 { 2428 hash_sei_param_t *ps_hash_sei_params = &ps_sei->s_hash_sei_params; 2429 2430 if(1 == ps_sei->i1_decoded_pic_hash_sei_flag) 2431 { 2432 ASSERT(0); // Not supported now! 2433 } 2434 else if(2 == ps_sei->i1_decoded_pic_hash_sei_flag) 2435 { 2436 /* calculate CRC for entire reconstructed picture */ 2437 ihevce_calc_CRC( 2438 ps_hash_sei_params, 2439 bit_depth, 2440 pv_y_buf, 2441 y_wd, 2442 y_ht, 2443 y_strd, 2444 pv_u_buf, 2445 uv_wd, 2446 uv_ht, 2447 uv_strd); 2448 } 2449 else if(3 == ps_sei->i1_decoded_pic_hash_sei_flag) 2450 { 2451 /* calculate Checksum for entire reconstructed picture */ 2452 ihevce_calc_checksum( 2453 ps_hash_sei_params, 2454 bit_depth, 2455 pv_y_buf, 2456 y_wd, 2457 y_ht, 2458 y_strd, 2459 pv_u_buf, 2460 uv_wd, 2461 uv_ht, 2462 uv_strd, 2463 i4_frame_pos_x, 2464 i4_frame_pos_y); 2465 } 2466 else 2467 { 2468 ASSERT(0); 2469 } 2470 2471 return IHEVCE_SUCCESS; 2472 } 2473 2474 /** 2475 ****************************************************************************** 2476 * 2477 * @brief Populates vui structure 2478 * 2479 * @par Description 2480 * Populates vui structure for its use in header generation 2481 * 2482 * @param[out] ps_vui 2483 * pointer to vui params that needs to be populated 2484 * 2485 * @param[out] ps_sps 2486 * pointer to sps params referred by vui 2487 * 2488 * @param[in] ps_src_params 2489 * pointer to source config params; resolution, frame rate etc 2490 * 2491 * @param[out] ps_vui_sei_prms 2492 * pointer to sps params referred by application 2493 * 2494 * @return success or failure error code 2495 * 2496 ****************************************************************************** 2497 */ 2498 WORD32 ihevce_populate_vui( 2499 vui_t *ps_vui, 2500 sps_t *ps_sps, 2501 ihevce_src_params_t *ps_src_params, 2502 ihevce_vui_sei_params_t *ps_vui_sei_prms, 2503 WORD32 i4_resolution_id, 2504 ihevce_tgt_params_t *ps_tgt_params, 2505 ihevce_static_cfg_params_t *ps_stat_prms, 2506 WORD32 i4_bitrate_instance_id) 2507 { 2508 WORD32 i, j, i4_range_idr, i4_range_cdr; 2509 ULWORD64 max_vbv_size; 2510 2511 ps_vui->u1_aspect_ratio_info_present_flag = ps_vui_sei_prms->u1_aspect_ratio_info_present_flag; 2512 2513 ps_vui->u1_aspect_ratio_idc = ps_vui_sei_prms->au1_aspect_ratio_idc[i4_resolution_id]; 2514 2515 ps_vui->u2_sar_height = ps_vui_sei_prms->au2_sar_height[i4_resolution_id]; 2516 2517 ps_vui->u2_sar_width = ps_vui_sei_prms->au2_sar_width[i4_resolution_id]; 2518 2519 ps_vui->u1_overscan_info_present_flag = ps_vui_sei_prms->u1_overscan_info_present_flag; 2520 2521 ps_vui->u1_overscan_appropriate_flag = ps_vui_sei_prms->u1_overscan_appropriate_flag; 2522 2523 ps_vui->u1_video_signal_type_present_flag = ps_vui_sei_prms->u1_video_signal_type_present_flag; 2524 2525 ps_vui->u1_video_format = ps_vui_sei_prms->u1_video_format; 2526 2527 ps_vui->u1_video_full_range_flag = ps_vui_sei_prms->u1_video_full_range_flag; 2528 2529 ps_vui->u1_colour_description_present_flag = 2530 ps_vui_sei_prms->u1_colour_description_present_flag; 2531 2532 ps_vui->u1_colour_primaries = ps_vui_sei_prms->u1_colour_primaries; 2533 2534 ps_vui->u1_transfer_characteristics = ps_vui_sei_prms->u1_transfer_characteristics; 2535 2536 ps_vui->u1_matrix_coefficients = ps_vui_sei_prms->u1_matrix_coefficients; 2537 2538 ps_vui->u1_chroma_loc_info_present_flag = ps_vui_sei_prms->u1_chroma_loc_info_present_flag; 2539 2540 ps_vui->u1_chroma_sample_loc_type_top_field = 2541 ps_vui_sei_prms->u1_chroma_sample_loc_type_top_field; 2542 2543 ps_vui->u1_chroma_sample_loc_type_bottom_field = 2544 ps_vui_sei_prms->u1_chroma_sample_loc_type_bottom_field; 2545 2546 ps_vui->u1_neutral_chroma_indication_flag = 0; 2547 2548 ps_vui->u1_default_display_window_flag = 0; 2549 2550 /* Default Values for display offset added */ 2551 if(ps_vui->u1_default_display_window_flag) 2552 { 2553 ps_vui->u4_def_disp_win_bottom_offset = 0; 2554 2555 ps_vui->u4_def_disp_win_left_offset = 0; 2556 2557 ps_vui->u4_def_disp_win_right_offset = 0; 2558 2559 ps_vui->u4_def_disp_win_top_offset = 0; 2560 } 2561 2562 ps_vui->u1_vui_hrd_parameters_present_flag = 2563 ps_vui_sei_prms->u1_vui_hrd_parameters_present_flag; 2564 2565 ps_vui->u1_field_seq_flag = ps_src_params->i4_field_pic; 2566 2567 ps_vui->u1_frame_field_info_present_flag = 1; 2568 2569 ps_vui->u1_vui_timing_info_present_flag = ps_vui_sei_prms->u1_timing_info_present_flag; 2570 2571 //if(ps_vui->u1_vui_timing_info_present_flag) 2572 { 2573 /* NumUnits in tick is same as the frame rate denominator assuming delta poc as 1 */ 2574 ps_vui->u4_vui_num_units_in_tick = ps_src_params->i4_frm_rate_denom; 2575 2576 /* TimeScale is the same as the frame rate numerator assuming delta poc as 1 */ 2577 ps_vui->u4_vui_time_scale = 2578 (ps_src_params->i4_frm_rate_num / ps_tgt_params->i4_frm_rate_scale_factor); 2579 } 2580 2581 ps_vui->u1_poc_proportional_to_timing_flag = 1; 2582 2583 if(ps_vui->u1_poc_proportional_to_timing_flag && ps_vui->u1_vui_timing_info_present_flag) 2584 ps_vui->u4_num_ticks_poc_diff_one_minus1 = 0; 2585 2586 //if (ps_vui->u1_vui_hrd_parameters_present_flag) 2587 { 2588 ps_vui->s_vui_hrd_parameters.u1_initial_cpb_removal_delay_length_minus1 = 23; 2589 ps_vui->s_vui_hrd_parameters.u1_au_cpb_removal_delay_length_minus1 = 23; /* Default value */ 2590 2591 ps_vui->s_vui_hrd_parameters.u1_dpb_output_delay_length_minus1 = 2592 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. 2593 2594 ps_vui->s_vui_hrd_parameters.u1_nal_hrd_parameters_present_flag = 2595 ps_vui_sei_prms->u1_nal_hrd_parameters_present_flag; 2596 2597 ps_vui->s_vui_hrd_parameters.u1_vcl_hrd_parameters_present_flag = 2598 0; //ps_vui_sei_prms->u1_vcl_hrd_parameters_present_flag; 2599 ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag = 0; 2600 2601 if(ps_vui->s_vui_hrd_parameters.u1_nal_hrd_parameters_present_flag || 2602 ps_vui->s_vui_hrd_parameters.u1_vcl_hrd_parameters_present_flag) 2603 { 2604 /* Initialize u1_au_cpb_removal_delay_length_minus1 based on configured intra periods */ 2605 ps_vui->s_vui_hrd_parameters.u1_au_cpb_removal_delay_length_minus1 = 2606 8; /* Default value when HRD params are enabled */ 2607 if(ps_stat_prms->s_coding_tools_prms.i4_max_cra_open_gop_period || 2608 ps_stat_prms->s_coding_tools_prms.i4_max_closed_gop_period) 2609 { 2610 GETRANGE( 2611 i4_range_cdr, ps_stat_prms->s_coding_tools_prms.i4_max_cra_open_gop_period); 2612 2613 GETRANGE(i4_range_idr, ps_stat_prms->s_coding_tools_prms.i4_max_closed_gop_period); 2614 2615 ps_vui->s_vui_hrd_parameters.u1_au_cpb_removal_delay_length_minus1 = 2616 MAX(i4_range_cdr, i4_range_idr); 2617 } 2618 /*BLU_RAY Default set to 0 */ 2619 ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag = 0; 2620 if(ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag) 2621 { 2622 ps_vui->s_vui_hrd_parameters.u1_tick_divisor_minus2 = 1; 2623 ps_vui->s_vui_hrd_parameters.u1_du_cpb_removal_delay_increment_length_minus1 = 23; 2624 ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_in_pic_timing_sei_flag = 1; 2625 ps_vui->s_vui_hrd_parameters.u1_dpb_output_delay_du_length_minus1 = 0; 2626 } 2627 } 2628 2629 ps_vui->s_vui_hrd_parameters.u4_bit_rate_scale = VUI_BIT_RATE_SCALE; 2630 ps_vui->s_vui_hrd_parameters.u4_cpb_size_scale = VUI_CPB_SIZE_SCALE; 2631 if(ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag) 2632 { 2633 ps_vui->s_vui_hrd_parameters.u4_cpb_size_du_scale = 0; 2634 } 2635 2636 for(i = 0; i <= (ps_sps->i1_sps_max_sub_layers - 1); i++) 2637 { 2638 ps_vui->s_vui_hrd_parameters.au1_fixed_pic_rate_general_flag[i] = 2639 1; /*BLU_RAY specific change already done */ 2640 ps_vui->s_vui_hrd_parameters.au1_fixed_pic_rate_within_cvs_flag[i] = 1; 2641 ps_vui->s_vui_hrd_parameters.au2_elemental_duration_in_tc_minus1[i] = 0; 2642 2643 /*BLU_RAY low_delay_hrd_flag is always set to 0*/ 2644 ps_vui->s_vui_hrd_parameters.au1_low_delay_hrd_flag[i] = 0; 2645 2646 /************************************************************************/ 2647 /* cpb_cnt_minus1 is set to zero because we assume that the decoder */ 2648 /* can work with just one CPB specification */ 2649 /************************************************************************/ 2650 ps_vui->s_vui_hrd_parameters.au1_cpb_cnt_minus1[i] = 0; 2651 2652 max_vbv_size = ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id] 2653 .ai4_max_vbv_buffer_size[i4_bitrate_instance_id]; 2654 for(j = 0; j <= ps_vui->s_vui_hrd_parameters.au1_cpb_cnt_minus1[i]; j++) 2655 { 2656 ULWORD64 u8_bit_rate_val = 2657 (ULWORD64)ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id] 2658 .ai4_tgt_bitrate[i4_bitrate_instance_id]; 2659 ULWORD64 u8_max_cpb_size; 2660 if((ps_stat_prms->s_config_prms.i4_rate_control_mode == 2) || 2661 (ps_stat_prms->s_config_prms.i4_rate_control_mode == 2662 1)) // VBR/Capped VBR rate control mode 2663 u8_bit_rate_val = 2664 (ULWORD64)(ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id] 2665 .ai4_peak_bitrate[i4_bitrate_instance_id]); 2666 u8_max_cpb_size = 2667 max_vbv_size; //((ULWORD64)(max_vbv_size * u8_bit_rate_val)/1000); 2668 2669 if(3 == ps_stat_prms->s_config_prms.i4_rate_control_mode) 2670 { 2671 /* For CQP mode, assume Level specified max rate and buffer size */ 2672 WORD32 codec_level_index = ihevce_get_level_index( 2673 ps_stat_prms->s_tgt_lyr_prms.as_tgt_params[i4_resolution_id].i4_codec_level); 2674 WORD32 codec_tier = ps_stat_prms->s_out_strm_prms.i4_codec_tier; 2675 2676 /* Bitrate as per level and tier limits */ 2677 u8_bit_rate_val = 2678 g_as_level_data[codec_level_index].i4_max_bit_rate[codec_tier]; 2679 u8_max_cpb_size = g_as_level_data[codec_level_index].i4_max_cpb[codec_tier]; 2680 } 2681 2682 u8_bit_rate_val >>= (6 + ps_vui->s_vui_hrd_parameters.u4_bit_rate_scale); 2683 u8_max_cpb_size >>= (4 + ps_vui->s_vui_hrd_parameters.u4_cpb_size_scale); 2684 2685 ps_vui->s_vui_hrd_parameters.as_sub_layer_hrd_params[i] 2686 .au4_bit_rate_value_minus1[j] = (UWORD32)(u8_bit_rate_val - 1); 2687 ps_vui->s_vui_hrd_parameters.as_sub_layer_hrd_params[i] 2688 .au4_cpb_size_value_minus1[j] = (UWORD32)(u8_max_cpb_size - 1); 2689 2690 if(ps_vui->s_vui_hrd_parameters.u1_sub_pic_cpb_params_present_flag) 2691 { 2692 ps_vui->s_vui_hrd_parameters.as_sub_layer_hrd_params[i] 2693 .au4_cpb_size_value_minus1[j] = 0; 2694 } 2695 2696 /************************************************************************/ 2697 /* CBR flag is set as per the RATE_CONTROL macro */ 2698 /************************************************************************/ 2699 2700 /* Default cbr falg setting. will discard Decoder buffer overflows ( No stuffing required)*/ 2701 2702 ps_vui->s_vui_hrd_parameters.as_sub_layer_hrd_params[i].au1_cbr_flag[j] = 0; 2703 } 2704 } 2705 } 2706 2707 ps_vui->u1_bitstream_restriction_flag = 0; 2708 2709 if(ps_vui->u1_bitstream_restriction_flag) 2710 { 2711 ps_vui->u1_tiles_fixed_structure_flag = 1; 2712 2713 ps_vui->u1_motion_vectors_over_pic_boundaries_flag = 1; 2714 2715 ps_vui->u4_min_spatial_segmentation_idc = 0; 2716 2717 ps_vui->u1_restricted_ref_pic_lists_flag = 0; 2718 2719 ps_vui->u1_max_bytes_per_pic_denom = 2; 2720 2721 ps_vui->u1_max_bits_per_mincu_denom = 1; 2722 2723 ps_vui->u1_log2_max_mv_length_horizontal = 15; 2724 2725 ps_vui->u1_log2_max_mv_length_vertical = 15; 2726 } 2727 2728 return IHEVCE_SUCCESS; 2729 } 2730