1 /****************************************************************************** 2 * 3 * Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore 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 /** 19 ******************************************************************************* 20 * @file 21 * ihevcd_parse_headers.c 22 * 23 * @brief 24 * Contains functions for parsing headers 25 * 26 * @author 27 * Harish 28 * 29 * @par List of Functions: 30 * 31 * @remarks 32 * None 33 * 34 ******************************************************************************* 35 */ 36 37 /*****************************************************************************/ 38 /* File Includes */ 39 /*****************************************************************************/ 40 #include <stdio.h> 41 #include <stddef.h> 42 #include <stdlib.h> 43 #include <string.h> 44 #include <assert.h> 45 #include <limits.h> 46 #include <stdint.h> 47 48 #include "ihevc_typedefs.h" 49 #include "iv.h" 50 #include "ivd.h" 51 #include "ihevcd_cxa.h" 52 53 #include "ihevc_defs.h" 54 #include "ihevc_debug.h" 55 #include "ihevc_defs.h" 56 #include "ihevc_structs.h" 57 #include "ihevc_buf_mgr.h" 58 #include "ihevc_dpb_mgr.h" 59 #include "ihevc_macros.h" 60 #include "ihevc_platform_macros.h" 61 #include "ihevc_cabac_tables.h" 62 #include "ihevc_common_tables.h" 63 #include "ihevc_quant_tables.h" 64 65 #include "ihevcd_trace.h" 66 #include "ihevcd_defs.h" 67 #include "ihevcd_function_selector.h" 68 #include "ihevcd_structs.h" 69 #include "ihevcd_error.h" 70 #include "ihevcd_debug.h" 71 #include "ihevcd_nal.h" 72 #include "ihevcd_bitstream.h" 73 #include "ihevcd_parse_headers.h" 74 #include "ihevcd_ref_list.h" 75 76 #define COPY_DEFAULT_SCALING_LIST(pi2_scaling_mat) \ 77 { \ 78 WORD32 scaling_mat_offset[]={0, 16, 32, 48, 64, 80, 96, 160, 224, 288, 352, 416, 480, 736, 992, 1248, 1504, 1760, 2016, 3040}; \ 79 \ 80 /* scaling matrix for 4x4 */ \ 81 memcpy(pi2_scaling_mat, gi2_flat_scale_mat_32x32, 6*16*sizeof(WORD16)); \ 82 /* scaling matrix for 8x8 */ \ 83 memcpy(pi2_scaling_mat + scaling_mat_offset[6], gi2_intra_default_scale_mat_8x8, 64*sizeof(WORD16)); \ 84 memcpy(pi2_scaling_mat + scaling_mat_offset[7], gi2_intra_default_scale_mat_8x8, 64*sizeof(WORD16)); \ 85 memcpy(pi2_scaling_mat + scaling_mat_offset[8], gi2_intra_default_scale_mat_8x8, 64*sizeof(WORD16)); \ 86 memcpy(pi2_scaling_mat + scaling_mat_offset[9], gi2_inter_default_scale_mat_8x8, 64*sizeof(WORD16)); \ 87 memcpy(pi2_scaling_mat + scaling_mat_offset[10], gi2_inter_default_scale_mat_8x8, 64*sizeof(WORD16)); \ 88 memcpy(pi2_scaling_mat + scaling_mat_offset[11], gi2_inter_default_scale_mat_8x8, 64*sizeof(WORD16)); \ 89 /* scaling matrix for 16x16 */ \ 90 memcpy(pi2_scaling_mat + scaling_mat_offset[12], gi2_intra_default_scale_mat_16x16, 256*sizeof(WORD16)); \ 91 memcpy(pi2_scaling_mat + scaling_mat_offset[13], gi2_intra_default_scale_mat_16x16, 256*sizeof(WORD16)); \ 92 memcpy(pi2_scaling_mat + scaling_mat_offset[14], gi2_intra_default_scale_mat_16x16, 256*sizeof(WORD16)); \ 93 memcpy(pi2_scaling_mat + scaling_mat_offset[15], gi2_inter_default_scale_mat_16x16, 256*sizeof(WORD16)); \ 94 memcpy(pi2_scaling_mat + scaling_mat_offset[16], gi2_inter_default_scale_mat_16x16, 256*sizeof(WORD16)); \ 95 memcpy(pi2_scaling_mat + scaling_mat_offset[17], gi2_inter_default_scale_mat_16x16, 256*sizeof(WORD16)); \ 96 /* scaling matrix for 32x32 */ \ 97 memcpy(pi2_scaling_mat + scaling_mat_offset[18], gi2_intra_default_scale_mat_32x32, 1024*sizeof(WORD16)); \ 98 memcpy(pi2_scaling_mat + scaling_mat_offset[19], gi2_inter_default_scale_mat_32x32, 1024*sizeof(WORD16)); \ 99 } 100 101 #define COPY_FLAT_SCALING_LIST(pi2_scaling_mat) \ 102 { \ 103 WORD32 scaling_mat_offset[]={0, 16, 32, 48, 64, 80, 96, 160, 224, 288, 352, 416, 480, 736, 992, 1248, 1504, 1760, 2016, 3040}; \ 104 \ 105 /* scaling matrix for 4x4 */ \ 106 memcpy(pi2_scaling_mat, gi2_flat_scale_mat_32x32, 6*16*sizeof(WORD16)); \ 107 /* scaling matrix for 8x8 */ \ 108 memcpy(pi2_scaling_mat + scaling_mat_offset[6], gi2_flat_scale_mat_32x32, 6*64*sizeof(WORD16)); \ 109 /* scaling matrix for 16x16 */ \ 110 memcpy(pi2_scaling_mat + scaling_mat_offset[12], gi2_flat_scale_mat_32x32, 3*256*sizeof(WORD16)); \ 111 memcpy(pi2_scaling_mat + scaling_mat_offset[15], gi2_flat_scale_mat_32x32, 3*256*sizeof(WORD16)); \ 112 /* scaling matrix for 32x32 */ \ 113 memcpy(pi2_scaling_mat + scaling_mat_offset[18], gi2_flat_scale_mat_32x32, 1024*sizeof(WORD16)); \ 114 memcpy(pi2_scaling_mat + scaling_mat_offset[19], gi2_flat_scale_mat_32x32, 1024*sizeof(WORD16)); \ 115 } 116 117 /* Function declarations */ 118 119 /** 120 ******************************************************************************* 121 * 122 * @brief 123 * Parses Prediction weight table syntax 124 * 125 * @par Description: 126 * Parse Prediction weight table syntax as per Section: 7.3.8.4 127 * 128 * @param[in] ps_bitstrm 129 * Pointer to bitstream context 130 * 131 * @param[in] ps_sps 132 * Current SPS 133 * 134 * @param[in] ps_pps 135 * Current PPS 136 * 137 * @param[in] ps_slice_hdr 138 * Current Slice header 139 * 140 * @returns Error code from IHEVCD_ERROR_T 141 * 142 * @remarks 143 * 144 * 145 ******************************************************************************* 146 */ 147 148 WORD32 ihevcd_parse_pred_wt_ofst(bitstrm_t *ps_bitstrm, 149 sps_t *ps_sps, 150 pps_t *ps_pps, 151 slice_header_t *ps_slice_hdr) 152 { 153 IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS; 154 WORD32 value; 155 UWORD32 u4_value; 156 WORD32 i; 157 158 pred_wt_ofst_t *ps_wt_ofst = &ps_slice_hdr->s_wt_ofst; 159 UNUSED(ps_pps); 160 161 UEV_PARSE("luma_log2_weight_denom", u4_value, ps_bitstrm); 162 if(u4_value > 7) 163 { 164 return IHEVCD_INVALID_PARAMETER; 165 } 166 ps_wt_ofst->i1_luma_log2_weight_denom = u4_value; 167 168 if(ps_sps->i1_chroma_format_idc != 0) 169 { 170 SEV_PARSE("delta_chroma_log2_weight_denom", value, ps_bitstrm); 171 if(((ps_wt_ofst->i1_luma_log2_weight_denom + value) < 0) || 172 ((ps_wt_ofst->i1_luma_log2_weight_denom + value) > 7)) 173 { 174 return IHEVCD_INVALID_PARAMETER; 175 } 176 ps_wt_ofst->i1_chroma_log2_weight_denom = ps_wt_ofst->i1_luma_log2_weight_denom + value; 177 } 178 179 for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l0_active; i++) 180 { 181 BITS_PARSE("luma_weight_l0_flag[ i ]", value, ps_bitstrm, 1); 182 ps_wt_ofst->i1_luma_weight_l0_flag[i] = value; 183 } 184 185 186 187 if(ps_sps->i1_chroma_format_idc != 0) 188 { 189 for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l0_active; i++) 190 { 191 BITS_PARSE("chroma_weight_l0_flag[ i ]", value, ps_bitstrm, 1); 192 ps_wt_ofst->i1_chroma_weight_l0_flag[i] = value; 193 } 194 } 195 else 196 { 197 for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l0_active; i++) 198 { 199 ps_wt_ofst->i1_chroma_weight_l0_flag[i] = 0; 200 } 201 } 202 203 204 for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l0_active; i++) 205 { 206 if(ps_wt_ofst->i1_luma_weight_l0_flag[i]) 207 { 208 SEV_PARSE("delta_luma_weight_l0[ i ]", value, ps_bitstrm); 209 if( value < -128 || value > 127 ) 210 { 211 return IHEVCD_INVALID_PARAMETER; 212 } 213 214 ps_wt_ofst->i2_luma_weight_l0[i] = (1 << ps_wt_ofst->i1_luma_log2_weight_denom) + value; 215 216 SEV_PARSE("luma_offset_l0[ i ]", value, ps_bitstrm); 217 if( value < -128 || value > 127 ) 218 { 219 return IHEVCD_INVALID_PARAMETER; 220 } 221 ps_wt_ofst->i2_luma_offset_l0[i] = value; 222 223 } 224 else 225 { 226 ps_wt_ofst->i2_luma_weight_l0[i] = (1 << ps_wt_ofst->i1_luma_log2_weight_denom); 227 ps_wt_ofst->i2_luma_offset_l0[i] = 0; 228 } 229 if(ps_wt_ofst->i1_chroma_weight_l0_flag[i]) 230 { 231 WORD32 ofst; 232 WORD32 shift = (1 << (BIT_DEPTH_CHROMA - 1)); 233 SEV_PARSE("delta_chroma_weight_l0[ i ][ j ]", value, ps_bitstrm); 234 if(value < -128 || value > 127) 235 { 236 return IHEVCD_INVALID_PARAMETER; 237 } 238 ps_wt_ofst->i2_chroma_weight_l0_cb[i] = (1 << ps_wt_ofst->i1_chroma_log2_weight_denom) + value; 239 240 241 SEV_PARSE("delta_chroma_offset_l0[ i ][ j ]", value, ps_bitstrm); 242 if( value < -512 || value > 511 ) 243 { 244 return IHEVCD_INVALID_PARAMETER; 245 } 246 ofst = ((shift * ps_wt_ofst->i2_chroma_weight_l0_cb[i]) >> ps_wt_ofst->i1_chroma_log2_weight_denom); 247 ofst = value - ofst + shift; 248 249 ps_wt_ofst->i2_chroma_offset_l0_cb[i] = CLIP_S8(ofst); 250 251 SEV_PARSE("delta_chroma_weight_l0[ i ][ j ]", value, ps_bitstrm); 252 if(value < -128 || value > 127) 253 { 254 return IHEVCD_INVALID_PARAMETER; 255 } 256 ps_wt_ofst->i2_chroma_weight_l0_cr[i] = (1 << ps_wt_ofst->i1_chroma_log2_weight_denom) + value; 257 258 259 SEV_PARSE("delta_chroma_offset_l0[ i ][ j ]", value, ps_bitstrm); 260 if( value < -512 || value > 511 ) 261 { 262 return IHEVCD_INVALID_PARAMETER; 263 } 264 ofst = ((shift * ps_wt_ofst->i2_chroma_weight_l0_cr[i]) >> ps_wt_ofst->i1_chroma_log2_weight_denom); 265 ofst = value - ofst + shift; 266 267 ps_wt_ofst->i2_chroma_offset_l0_cr[i] = CLIP_S8(ofst); 268 269 } 270 else 271 { 272 ps_wt_ofst->i2_chroma_weight_l0_cb[i] = (1 << ps_wt_ofst->i1_chroma_log2_weight_denom); 273 ps_wt_ofst->i2_chroma_weight_l0_cr[i] = (1 << ps_wt_ofst->i1_chroma_log2_weight_denom); 274 275 ps_wt_ofst->i2_chroma_offset_l0_cb[i] = 0; 276 ps_wt_ofst->i2_chroma_offset_l0_cr[i] = 0; 277 } 278 } 279 if(BSLICE == ps_slice_hdr->i1_slice_type) 280 { 281 for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l1_active; i++) 282 { 283 BITS_PARSE("luma_weight_l1_flag[ i ]", value, ps_bitstrm, 1); 284 ps_wt_ofst->i1_luma_weight_l1_flag[i] = value; 285 } 286 287 if(ps_sps->i1_chroma_format_idc != 0) 288 { 289 for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l1_active; i++) 290 { 291 BITS_PARSE("chroma_weight_l1_flag[ i ]", value, ps_bitstrm, 1); 292 ps_wt_ofst->i1_chroma_weight_l1_flag[i] = value; 293 } 294 } 295 else 296 { 297 for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l1_active; i++) 298 { 299 ps_wt_ofst->i1_chroma_weight_l1_flag[i] = 0; 300 } 301 } 302 303 for(i = 0; i < ps_slice_hdr->i1_num_ref_idx_l1_active; i++) 304 { 305 if(ps_wt_ofst->i1_luma_weight_l1_flag[i]) 306 { 307 SEV_PARSE("delta_luma_weight_l1[ i ]", value, ps_bitstrm); 308 if( value < -128 || value > 127 ) 309 { 310 return IHEVCD_INVALID_PARAMETER; 311 } 312 313 ps_wt_ofst->i2_luma_weight_l1[i] = (1 << ps_wt_ofst->i1_luma_log2_weight_denom) + value; 314 315 SEV_PARSE("luma_offset_l1[ i ]", value, ps_bitstrm); 316 if( value < -128 || value > 127 ) 317 { 318 return IHEVCD_INVALID_PARAMETER; 319 } 320 ps_wt_ofst->i2_luma_offset_l1[i] = value; 321 322 } 323 else 324 { 325 ps_wt_ofst->i2_luma_weight_l1[i] = (1 << ps_wt_ofst->i1_luma_log2_weight_denom); 326 ps_wt_ofst->i2_luma_offset_l1[i] = 0; 327 } 328 329 if(ps_wt_ofst->i1_chroma_weight_l1_flag[i]) 330 { 331 WORD32 ofst; 332 WORD32 shift = (1 << (BIT_DEPTH_CHROMA - 1)); 333 SEV_PARSE("delta_chroma_weight_l1[ i ][ j ]", value, ps_bitstrm); 334 if(value < -128 || value > 127) 335 { 336 return IHEVCD_INVALID_PARAMETER; 337 } 338 ps_wt_ofst->i2_chroma_weight_l1_cb[i] = (1 << ps_wt_ofst->i1_chroma_log2_weight_denom) + value;; 339 340 341 SEV_PARSE("delta_chroma_offset_l1[ i ][ j ]", value, ps_bitstrm); 342 if( value < -512 || value > 511 ) 343 { 344 return IHEVCD_INVALID_PARAMETER; 345 } 346 ofst = ((shift * ps_wt_ofst->i2_chroma_weight_l1_cb[i]) >> ps_wt_ofst->i1_chroma_log2_weight_denom); 347 ofst = value - ofst + shift; 348 349 ps_wt_ofst->i2_chroma_offset_l1_cb[i] = CLIP_S8(ofst);; 350 351 SEV_PARSE("delta_chroma_weight_l1[ i ][ j ]", value, ps_bitstrm); 352 if(value < -128 || value > 127) 353 { 354 return IHEVCD_INVALID_PARAMETER; 355 } 356 ps_wt_ofst->i2_chroma_weight_l1_cr[i] = (1 << ps_wt_ofst->i1_chroma_log2_weight_denom) + value; 357 358 359 SEV_PARSE("delta_chroma_offset_l1[ i ][ j ]", value, ps_bitstrm); 360 if( value < -512 || value > 511 ) 361 { 362 return IHEVCD_INVALID_PARAMETER; 363 } 364 ofst = ((shift * ps_wt_ofst->i2_chroma_weight_l1_cr[i]) >> ps_wt_ofst->i1_chroma_log2_weight_denom); 365 ofst = value - ofst + shift; 366 367 ps_wt_ofst->i2_chroma_offset_l1_cr[i] = CLIP_S8(ofst);; 368 369 } 370 else 371 { 372 ps_wt_ofst->i2_chroma_weight_l1_cb[i] = (1 << ps_wt_ofst->i1_chroma_log2_weight_denom); 373 ps_wt_ofst->i2_chroma_weight_l1_cr[i] = (1 << ps_wt_ofst->i1_chroma_log2_weight_denom); 374 375 ps_wt_ofst->i2_chroma_offset_l1_cb[i] = 0; 376 ps_wt_ofst->i2_chroma_offset_l1_cr[i] = 0; 377 378 } 379 } 380 } 381 return ret; 382 } 383 384 /** 385 ******************************************************************************* 386 * 387 * @brief 388 * Parses short term reference picture set 389 * 390 * @par Description 391 * Parses short term reference picture set as per section 7.3.8.2. 392 * Can be called by either SPS or Slice header parsing modules. 393 * 394 * @param[in] ps_bitstrm 395 * Pointer to bitstream structure 396 * 397 * @param[out] ps_stref_picset_base 398 * Pointer to first short term ref pic set structure 399 * 400 * @param[in] num_short_term_ref_pic_sets 401 * Number of short term reference pic sets 402 * 403 * @param[in] idx 404 * Current short term ref pic set id 405 * 406 * @returns Error code from IHEVCD_ERROR_T 407 * 408 * @remarks 409 * 410 ******************************************************************************* 411 */ 412 IHEVCD_ERROR_T ihevcd_short_term_ref_pic_set(bitstrm_t *ps_bitstrm, 413 stref_picset_t *ps_stref_picset_base, 414 WORD32 num_short_term_ref_pic_sets, 415 WORD32 idx, 416 stref_picset_t *ps_stref_picset) 417 { 418 IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS; 419 UWORD32 value; 420 stref_picset_t *ps_stref_picset_ref; 421 WORD32 delta_idx, delta_rps; 422 WORD32 r_idx; 423 WORD32 i; 424 WORD32 j, k, temp; 425 if(idx > 0) 426 { 427 BITS_PARSE("inter_ref_pic_set_prediction_flag", value, ps_bitstrm, 1); 428 ps_stref_picset->i1_inter_ref_pic_set_prediction_flag = value; 429 } 430 else 431 ps_stref_picset->i1_inter_ref_pic_set_prediction_flag = 0; 432 433 if(ps_stref_picset->i1_inter_ref_pic_set_prediction_flag) 434 { 435 WORD32 delta_rps_sign; 436 WORD32 abs_delta_rps; 437 WORD32 num_neg_pics = 0; 438 WORD32 num_pos_pics = 0; 439 WORD32 num_pics = 0; 440 441 if(idx == num_short_term_ref_pic_sets) 442 { 443 UEV_PARSE("delta_idx_minus1", value, ps_bitstrm); 444 if(value > num_short_term_ref_pic_sets - 1) 445 { 446 return IHEVCD_INVALID_PARAMETER; 447 } 448 delta_idx = value + 1; 449 } 450 else 451 { 452 delta_idx = 1; 453 } 454 r_idx = idx - delta_idx; 455 r_idx = CLIP3(r_idx, 0, idx - 1); 456 457 ps_stref_picset_ref = ps_stref_picset_base + r_idx; 458 459 BITS_PARSE("delta_rps_sign", value, ps_bitstrm, 1); 460 delta_rps_sign = value; 461 462 UEV_PARSE("abs_delta_rps_minus1", value, ps_bitstrm); 463 if(value > 32767) 464 { 465 return IHEVCD_INVALID_PARAMETER; 466 } 467 abs_delta_rps = value + 1; 468 469 delta_rps = (1 - 2 * delta_rps_sign) * (abs_delta_rps); 470 471 472 473 for(i = 0; i <= ps_stref_picset_ref->i1_num_delta_pocs; i++) 474 { 475 WORD32 ref_idc; 476 477 /*****************************************************************/ 478 /* ref_idc is parsed as below */ 479 /* bits "1" ref_idc 1 */ 480 /* bits "01" ref_idc 2 */ 481 /* bits "00" ref_idc 0 */ 482 /*****************************************************************/ 483 BITS_PARSE("used_by_curr_pic_flag", value, ps_bitstrm, 1); 484 ref_idc = value; 485 ps_stref_picset->ai1_used[num_pics] = value; 486 /* If ref_idc is zero check for next bit */ 487 if(0 == ref_idc) 488 { 489 BITS_PARSE("use_delta_flag", value, ps_bitstrm, 1); 490 ref_idc = value << 1; 491 } 492 if((ref_idc == 1) || (ref_idc == 2)) 493 { 494 WORD32 delta_poc; 495 delta_poc = delta_rps; 496 delta_poc += 497 ((i < ps_stref_picset_ref->i1_num_delta_pocs) ? 498 ps_stref_picset_ref->ai2_delta_poc[i] : 499 0); 500 501 ps_stref_picset->ai2_delta_poc[num_pics] = delta_poc; 502 503 if(delta_poc < 0) 504 { 505 num_neg_pics++; 506 } 507 else 508 { 509 num_pos_pics++; 510 } 511 num_pics++; 512 } 513 ps_stref_picset->ai1_ref_idc[i] = ref_idc; 514 } 515 516 num_neg_pics = CLIP3(num_neg_pics, 0, MAX_DPB_SIZE - 1); 517 num_pos_pics = CLIP3(num_pos_pics, 0, (MAX_DPB_SIZE - 1 - num_neg_pics)); 518 num_pics = num_neg_pics + num_pos_pics; 519 520 ps_stref_picset->i1_num_ref_idc = 521 ps_stref_picset_ref->i1_num_delta_pocs + 1; 522 ps_stref_picset->i1_num_delta_pocs = num_pics; 523 ps_stref_picset->i1_num_pos_pics = num_pos_pics; 524 ps_stref_picset->i1_num_neg_pics = num_neg_pics; 525 526 527 for(j = 1; j < num_pics; j++) 528 { 529 WORD32 delta_poc = ps_stref_picset->ai2_delta_poc[j]; 530 WORD8 i1_used = ps_stref_picset->ai1_used[j]; 531 for(k = j - 1; k >= 0; k--) 532 { 533 temp = ps_stref_picset->ai2_delta_poc[k]; 534 if(delta_poc < temp) 535 { 536 ps_stref_picset->ai2_delta_poc[k + 1] = temp; 537 ps_stref_picset->ai1_used[k + 1] = ps_stref_picset->ai1_used[k]; 538 ps_stref_picset->ai2_delta_poc[k] = delta_poc; 539 ps_stref_picset->ai1_used[k] = i1_used; 540 } 541 } 542 } 543 // flip the negative values to largest first 544 for(j = 0, k = num_neg_pics - 1; j < num_neg_pics >> 1; j++, k--) 545 { 546 WORD32 delta_poc = ps_stref_picset->ai2_delta_poc[j]; 547 WORD8 i1_used = ps_stref_picset->ai1_used[j]; 548 ps_stref_picset->ai2_delta_poc[j] = ps_stref_picset->ai2_delta_poc[k]; 549 ps_stref_picset->ai1_used[j] = ps_stref_picset->ai1_used[k]; 550 ps_stref_picset->ai2_delta_poc[k] = delta_poc; 551 ps_stref_picset->ai1_used[k] = i1_used; 552 } 553 554 } 555 else 556 { 557 WORD32 prev_poc = 0; 558 WORD32 poc; 559 560 UEV_PARSE("num_negative_pics", value, ps_bitstrm); 561 if(value > MAX_DPB_SIZE - 1) 562 { 563 return IHEVCD_INVALID_PARAMETER; 564 } 565 ps_stref_picset->i1_num_neg_pics = value; 566 567 UEV_PARSE("num_positive_pics", value, ps_bitstrm); 568 if(value > (MAX_DPB_SIZE - 1 - ps_stref_picset->i1_num_neg_pics)) 569 { 570 return IHEVCD_INVALID_PARAMETER; 571 } 572 ps_stref_picset->i1_num_pos_pics = value; 573 574 ps_stref_picset->i1_num_delta_pocs = 575 ps_stref_picset->i1_num_neg_pics + 576 ps_stref_picset->i1_num_pos_pics; 577 578 579 for(i = 0; i < ps_stref_picset->i1_num_neg_pics; i++) 580 { 581 UEV_PARSE("delta_poc_s0_minus1", value, ps_bitstrm); 582 if(value > 32767) 583 { 584 return IHEVCD_INVALID_PARAMETER; 585 } 586 poc = prev_poc - ((WORD32)(value + 1)); 587 prev_poc = poc; 588 ps_stref_picset->ai2_delta_poc[i] = poc; 589 590 BITS_PARSE("used_by_curr_pic_s0_flag", value, ps_bitstrm, 1); 591 ps_stref_picset->ai1_used[i] = value; 592 593 } 594 prev_poc = 0; 595 for(i = ps_stref_picset->i1_num_neg_pics; 596 i < ps_stref_picset->i1_num_delta_pocs; 597 i++) 598 { 599 UEV_PARSE("delta_poc_s1_minus1", value, ps_bitstrm); 600 if(value > 32767) 601 { 602 return IHEVCD_INVALID_PARAMETER; 603 } 604 poc = prev_poc + (value + 1); 605 prev_poc = poc; 606 ps_stref_picset->ai2_delta_poc[i] = poc; 607 608 BITS_PARSE("used_by_curr_pic_s1_flag", value, ps_bitstrm, 1); 609 ps_stref_picset->ai1_used[i] = value; 610 611 } 612 613 } 614 615 return ret; 616 } 617 618 619 static WORD32 ihevcd_parse_sub_layer_hrd_parameters(bitstrm_t *ps_bitstrm, 620 sub_lyr_hrd_params_t *ps_sub_layer_hrd_params, 621 WORD32 cpb_cnt, 622 WORD32 sub_pic_cpb_params_present_flag) 623 { 624 WORD32 ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS; 625 WORD32 i; 626 627 for(i = 0; i <= cpb_cnt; i++) 628 { 629 UEV_PARSE("bit_rate_value_minus1[ i ]", ps_sub_layer_hrd_params->au4_bit_rate_value_minus1[i], ps_bitstrm); 630 if(ps_sub_layer_hrd_params->au4_bit_rate_value_minus1[i] > UINT_MAX - 1) 631 { 632 return IHEVCD_INVALID_PARAMETER; 633 } 634 UEV_PARSE("cpb_size_value_minus1[ i ]", ps_sub_layer_hrd_params->au4_cpb_size_value_minus1[i], ps_bitstrm); 635 if(ps_sub_layer_hrd_params->au4_cpb_size_value_minus1[i] > UINT_MAX - 1) 636 { 637 return IHEVCD_INVALID_PARAMETER; 638 } 639 if(sub_pic_cpb_params_present_flag) 640 { 641 UEV_PARSE("cpb_size_du_value_minus1[ i ]", ps_sub_layer_hrd_params->au4_cpb_size_du_value_minus1[i], ps_bitstrm); 642 if(ps_sub_layer_hrd_params->au4_cpb_size_du_value_minus1[i] > UINT_MAX - 1) 643 { 644 return IHEVCD_INVALID_PARAMETER; 645 } 646 UEV_PARSE("bit_rate_du_value_minus1[ i ]", ps_sub_layer_hrd_params->au4_bit_rate_du_value_minus1[i], ps_bitstrm); 647 if(ps_sub_layer_hrd_params->au4_bit_rate_du_value_minus1[i] > UINT_MAX - 1) 648 { 649 return IHEVCD_INVALID_PARAMETER; 650 } 651 } 652 BITS_PARSE("cbr_flag[ i ]", ps_sub_layer_hrd_params->au1_cbr_flag[i], ps_bitstrm, 1); 653 } 654 655 return ret; 656 } 657 658 659 static WORD32 ihevcd_parse_hrd_parameters(bitstrm_t *ps_bitstrm, 660 hrd_params_t *ps_hrd, 661 WORD32 common_info_present_flag, 662 WORD32 max_num_sub_layers_minus1) 663 { 664 WORD32 ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS; 665 WORD32 i; 666 667 ps_hrd->u1_nal_hrd_parameters_present_flag = 0; 668 ps_hrd->u1_vcl_hrd_parameters_present_flag = 0; 669 670 ps_hrd->u1_sub_pic_cpb_params_present_flag = 0; 671 672 ps_hrd->u1_tick_divisor_minus2 = 0; 673 ps_hrd->u1_du_cpb_removal_delay_increment_length_minus1 = 0; 674 ps_hrd->u1_sub_pic_cpb_params_in_pic_timing_sei_flag = 0; 675 ps_hrd->u1_dpb_output_delay_du_length_minus1 = 0; 676 677 ps_hrd->u4_bit_rate_scale = 0; 678 ps_hrd->u4_cpb_size_scale = 0; 679 ps_hrd->u4_cpb_size_du_scale = 0; 680 681 ps_hrd->u1_initial_cpb_removal_delay_length_minus1 = 23; 682 ps_hrd->u1_au_cpb_removal_delay_length_minus1 = 23; 683 ps_hrd->u1_dpb_output_delay_length_minus1 = 23; 684 685 if(common_info_present_flag) 686 { 687 BITS_PARSE("nal_hrd_parameters_present_flag", ps_hrd->u1_nal_hrd_parameters_present_flag, ps_bitstrm, 1); 688 BITS_PARSE("vcl_hrd_parameters_present_flag", ps_hrd->u1_vcl_hrd_parameters_present_flag, ps_bitstrm, 1); 689 690 if(ps_hrd->u1_nal_hrd_parameters_present_flag || ps_hrd->u1_vcl_hrd_parameters_present_flag) 691 { 692 BITS_PARSE("sub_pic_cpb_params_present_flag", ps_hrd->u1_sub_pic_cpb_params_present_flag, ps_bitstrm, 1); 693 if(ps_hrd->u1_sub_pic_cpb_params_present_flag) 694 { 695 BITS_PARSE("tick_divisor_minus2", ps_hrd->u1_tick_divisor_minus2, ps_bitstrm, 8); 696 BITS_PARSE("du_cpb_removal_delay_increment_length_minus1", ps_hrd->u1_du_cpb_removal_delay_increment_length_minus1, ps_bitstrm, 5); 697 BITS_PARSE("sub_pic_cpb_params_in_pic_timing_sei_flag", ps_hrd->u1_sub_pic_cpb_params_in_pic_timing_sei_flag, ps_bitstrm, 1); 698 BITS_PARSE("dpb_output_delay_du_length_minus1", ps_hrd->u1_dpb_output_delay_du_length_minus1, ps_bitstrm, 5); 699 } 700 701 BITS_PARSE("bit_rate_scale", ps_hrd->u4_bit_rate_scale, ps_bitstrm, 4); 702 BITS_PARSE("cpb_size_scale", ps_hrd->u4_cpb_size_scale, ps_bitstrm, 4); 703 if(ps_hrd->u1_sub_pic_cpb_params_present_flag) 704 BITS_PARSE("cpb_size_du_scale", ps_hrd->u4_cpb_size_du_scale, ps_bitstrm, 4); 705 706 BITS_PARSE("initial_cpb_removal_delay_length_minus1", ps_hrd->u1_initial_cpb_removal_delay_length_minus1, ps_bitstrm, 5); 707 BITS_PARSE("au_cpb_removal_delay_length_minus1", ps_hrd->u1_au_cpb_removal_delay_length_minus1, ps_bitstrm, 5); 708 BITS_PARSE("dpb_output_delay_length_minus1", ps_hrd->u1_dpb_output_delay_length_minus1, ps_bitstrm, 5); 709 } 710 } 711 712 713 for(i = 0; i <= max_num_sub_layers_minus1; i++) 714 { 715 BITS_PARSE("fixed_pic_rate_general_flag[ i ]", ps_hrd->au1_fixed_pic_rate_general_flag[i], ps_bitstrm, 1); 716 717 ps_hrd->au1_fixed_pic_rate_within_cvs_flag[i] = 1; 718 ps_hrd->au2_elemental_duration_in_tc_minus1[i] = 0; 719 ps_hrd->au1_low_delay_hrd_flag[i] = 0; 720 ps_hrd->au1_cpb_cnt_minus1[i] = 0; 721 722 if(!ps_hrd->au1_fixed_pic_rate_general_flag[i]) 723 BITS_PARSE("fixed_pic_rate_within_cvs_flag[ i ]", ps_hrd->au1_fixed_pic_rate_within_cvs_flag[i], ps_bitstrm, 1); 724 725 if(ps_hrd->au1_fixed_pic_rate_within_cvs_flag[i]) 726 { 727 UEV_PARSE("elemental_duration_in_tc_minus1[ i ]", ps_hrd->au2_elemental_duration_in_tc_minus1[i], ps_bitstrm); 728 if(ps_hrd->au2_elemental_duration_in_tc_minus1[i] > 2047) 729 { 730 return IHEVCD_INVALID_PARAMETER; 731 } 732 } 733 else 734 { 735 BITS_PARSE("low_delay_hrd_flag[ i ]", ps_hrd->au1_low_delay_hrd_flag[i], ps_bitstrm, 1); 736 } 737 738 if(!ps_hrd->au1_low_delay_hrd_flag[i]) 739 { 740 UEV_PARSE("cpb_cnt_minus1[ i ]", ps_hrd->au1_cpb_cnt_minus1[i], ps_bitstrm); 741 if(ps_hrd->au1_cpb_cnt_minus1[i] > (MAX_CPB_CNT - 1)) 742 { 743 return IHEVCD_INVALID_PARAMETER; 744 } 745 } 746 747 if(ps_hrd->u1_nal_hrd_parameters_present_flag) 748 ihevcd_parse_sub_layer_hrd_parameters(ps_bitstrm, 749 &ps_hrd->as_sub_layer_hrd_params[i], 750 ps_hrd->au1_cpb_cnt_minus1[i], 751 ps_hrd->u1_sub_pic_cpb_params_present_flag); 752 753 if(ps_hrd->u1_vcl_hrd_parameters_present_flag) 754 ihevcd_parse_sub_layer_hrd_parameters(ps_bitstrm, 755 &ps_hrd->as_sub_layer_hrd_params[i], 756 ps_hrd->au1_cpb_cnt_minus1[i], 757 ps_hrd->u1_sub_pic_cpb_params_present_flag); 758 } 759 760 return ret; 761 } 762 763 764 static WORD32 ihevcd_parse_vui_parameters(bitstrm_t *ps_bitstrm, 765 vui_t *ps_vui, 766 WORD32 sps_max_sub_layers_minus1) 767 { 768 WORD32 ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS; 769 UWORD16 u2_sar_width = 0; 770 UWORD16 u2_sar_height = 0; 771 772 BITS_PARSE("aspect_ratio_info_present_flag", ps_vui->u1_aspect_ratio_info_present_flag, ps_bitstrm, 1); 773 774 ps_vui->u1_aspect_ratio_idc = SAR_UNUSED; 775 u2_sar_width = 0; 776 u2_sar_height = 0; 777 if(ps_vui->u1_aspect_ratio_info_present_flag) 778 { 779 BITS_PARSE("aspect_ratio_idc", ps_vui->u1_aspect_ratio_idc, ps_bitstrm, 8); 780 switch(ps_vui->u1_aspect_ratio_idc) 781 { 782 case SAR_1_1: 783 u2_sar_width = 1; 784 u2_sar_height = 1; 785 break; 786 case SAR_12_11: 787 u2_sar_width = 12; 788 u2_sar_height = 11; 789 break; 790 case SAR_10_11: 791 u2_sar_width = 10; 792 u2_sar_height = 11; 793 break; 794 case SAR_16_11: 795 u2_sar_width = 16; 796 u2_sar_height = 11; 797 break; 798 case SAR_40_33: 799 u2_sar_width = 40; 800 u2_sar_height = 33; 801 break; 802 case SAR_24_11: 803 u2_sar_width = 24; 804 u2_sar_height = 11; 805 break; 806 case SAR_20_11: 807 u2_sar_width = 20; 808 u2_sar_height = 11; 809 break; 810 case SAR_32_11: 811 u2_sar_width = 32; 812 u2_sar_height = 11; 813 break; 814 case SAR_80_33: 815 u2_sar_width = 80; 816 u2_sar_height = 33; 817 break; 818 case SAR_18_11: 819 u2_sar_width = 18; 820 u2_sar_height = 11; 821 break; 822 case SAR_15_11: 823 u2_sar_width = 15; 824 u2_sar_height = 11; 825 break; 826 case SAR_64_33: 827 u2_sar_width = 64; 828 u2_sar_height = 33; 829 break; 830 case SAR_160_99: 831 u2_sar_width = 160; 832 u2_sar_height = 99; 833 break; 834 case SAR_4_3: 835 u2_sar_width = 4; 836 u2_sar_height = 3; 837 break; 838 case SAR_3_2: 839 u2_sar_width = 3; 840 u2_sar_height = 2; 841 break; 842 case SAR_2_1: 843 u2_sar_width = 2; 844 u2_sar_height = 1; 845 break; 846 case EXTENDED_SAR: 847 BITS_PARSE("sar_width", u2_sar_width, ps_bitstrm, 16); 848 BITS_PARSE("sar_height", u2_sar_height, ps_bitstrm, 16); 849 break; 850 default: 851 u2_sar_width = 0; 852 u2_sar_height = 0; 853 break; 854 } 855 } 856 857 ps_vui->u2_sar_width = u2_sar_width; 858 ps_vui->u2_sar_height = u2_sar_height; 859 860 BITS_PARSE("overscan_info_present_flag", ps_vui->u1_overscan_info_present_flag, ps_bitstrm, 1); 861 ps_vui->u1_overscan_appropriate_flag = 0; 862 if(ps_vui->u1_overscan_info_present_flag) 863 BITS_PARSE("overscan_appropriate_flag", ps_vui->u1_overscan_appropriate_flag, ps_bitstrm, 1); 864 865 BITS_PARSE("video_signal_type_present_flag", ps_vui->u1_video_signal_type_present_flag, ps_bitstrm, 1); 866 ps_vui->u1_video_format = VID_FMT_UNSPECIFIED; 867 ps_vui->u1_video_full_range_flag = 0; 868 ps_vui->u1_colour_description_present_flag = 0; 869 ps_vui->u1_colour_primaries = 2; 870 ps_vui->u1_transfer_characteristics = 2; 871 ps_vui->u1_matrix_coefficients = 2; 872 873 if(ps_vui->u1_video_signal_type_present_flag) 874 { 875 BITS_PARSE("video_format", ps_vui->u1_video_format, ps_bitstrm, 3); 876 BITS_PARSE("video_full_range_flag", ps_vui->u1_video_full_range_flag, ps_bitstrm, 1); 877 BITS_PARSE("colour_description_present_flag", ps_vui->u1_colour_description_present_flag, ps_bitstrm, 1); 878 if(ps_vui->u1_colour_description_present_flag) 879 { 880 BITS_PARSE("colour_primaries", ps_vui->u1_colour_primaries, ps_bitstrm, 8); 881 BITS_PARSE("transfer_characteristics", ps_vui->u1_transfer_characteristics, ps_bitstrm, 8); 882 BITS_PARSE("matrix_coeffs", ps_vui->u1_matrix_coefficients, ps_bitstrm, 8); 883 } 884 } 885 886 BITS_PARSE("chroma_loc_info_present_flag", ps_vui->u1_chroma_loc_info_present_flag, ps_bitstrm, 1); 887 ps_vui->u1_chroma_sample_loc_type_top_field = 0; 888 ps_vui->u1_chroma_sample_loc_type_bottom_field = 0; 889 if(ps_vui->u1_chroma_loc_info_present_flag) 890 { 891 UEV_PARSE("chroma_sample_loc_type_top_field", ps_vui->u1_chroma_sample_loc_type_top_field, ps_bitstrm); 892 if(ps_vui->u1_chroma_sample_loc_type_top_field > CHROMA_FMT_IDC_YUV444_PLANES + 1) 893 { 894 return IHEVCD_INVALID_PARAMETER; 895 } 896 UEV_PARSE("chroma_sample_loc_type_bottom_field", ps_vui->u1_chroma_sample_loc_type_bottom_field, ps_bitstrm); 897 if(ps_vui->u1_chroma_sample_loc_type_bottom_field > CHROMA_FMT_IDC_YUV444_PLANES + 1) 898 { 899 return IHEVCD_INVALID_PARAMETER; 900 } 901 } 902 903 BITS_PARSE("neutral_chroma_indication_flag", ps_vui->u1_neutral_chroma_indication_flag, ps_bitstrm, 1); 904 BITS_PARSE("field_seq_flag", ps_vui->u1_field_seq_flag, ps_bitstrm, 1); 905 BITS_PARSE("frame_field_info_present_flag", ps_vui->u1_frame_field_info_present_flag, ps_bitstrm, 1); 906 BITS_PARSE("default_display_window_flag", ps_vui->u1_default_display_window_flag, ps_bitstrm, 1); 907 ps_vui->u4_def_disp_win_left_offset = 0; 908 ps_vui->u4_def_disp_win_right_offset = 0; 909 ps_vui->u4_def_disp_win_top_offset = 0; 910 ps_vui->u4_def_disp_win_bottom_offset = 0; 911 if(ps_vui->u1_default_display_window_flag) 912 { 913 UEV_PARSE("def_disp_win_left_offset", ps_vui->u4_def_disp_win_left_offset, ps_bitstrm); 914 UEV_PARSE("def_disp_win_right_offset", ps_vui->u4_def_disp_win_right_offset, ps_bitstrm); 915 UEV_PARSE("def_disp_win_top_offset", ps_vui->u4_def_disp_win_top_offset, ps_bitstrm); 916 UEV_PARSE("def_disp_win_bottom_offset", ps_vui->u4_def_disp_win_bottom_offset, ps_bitstrm); 917 } 918 919 BITS_PARSE("vui_timing_info_present_flag", ps_vui->u1_vui_timing_info_present_flag, ps_bitstrm, 1); 920 if(ps_vui->u1_vui_timing_info_present_flag) 921 { 922 BITS_PARSE("vui_num_units_in_tick", ps_vui->u4_vui_num_units_in_tick, ps_bitstrm, 32); 923 BITS_PARSE("vui_time_scale", ps_vui->u4_vui_time_scale, ps_bitstrm, 32); 924 BITS_PARSE("vui_poc_proportional_to_timing_flag", ps_vui->u1_poc_proportional_to_timing_flag, ps_bitstrm, 1); 925 if(ps_vui->u1_poc_proportional_to_timing_flag) 926 { 927 UEV_PARSE("vui_num_ticks_poc_diff_one_minus1", ps_vui->u4_num_ticks_poc_diff_one_minus1, ps_bitstrm); 928 if(ps_vui->u4_num_ticks_poc_diff_one_minus1 > UINT_MAX - 1) 929 { 930 return IHEVCD_INVALID_PARAMETER; 931 } 932 } 933 BITS_PARSE("vui_hrd_parameters_present_flag", ps_vui->u1_vui_hrd_parameters_present_flag, ps_bitstrm, 1); 934 if(ps_vui->u1_vui_hrd_parameters_present_flag) 935 { 936 ret = ihevcd_parse_hrd_parameters(ps_bitstrm, &ps_vui->s_vui_hrd_parameters, 1, sps_max_sub_layers_minus1); 937 RETURN_IF((ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), ret); 938 } 939 } 940 941 BITS_PARSE("bitstream_restriction_flag", ps_vui->u1_bitstream_restriction_flag, ps_bitstrm, 1); 942 ps_vui->u1_tiles_fixed_structure_flag = 0; 943 ps_vui->u1_motion_vectors_over_pic_boundaries_flag = 1; 944 ps_vui->u1_restricted_ref_pic_lists_flag = 0; 945 ps_vui->u4_min_spatial_segmentation_idc = 0; 946 ps_vui->u1_max_bytes_per_pic_denom = 2; 947 ps_vui->u1_max_bits_per_mincu_denom = 1; 948 ps_vui->u1_log2_max_mv_length_horizontal = 15; 949 ps_vui->u1_log2_max_mv_length_vertical = 15; 950 if(ps_vui->u1_bitstream_restriction_flag) 951 { 952 BITS_PARSE("tiles_fixed_structure_flag", ps_vui->u1_tiles_fixed_structure_flag, ps_bitstrm, 1); 953 BITS_PARSE("motion_vectors_over_pic_boundaries_flag", ps_vui->u1_motion_vectors_over_pic_boundaries_flag, ps_bitstrm, 1); 954 BITS_PARSE("restricted_ref_pic_lists_flag", ps_vui->u1_restricted_ref_pic_lists_flag, ps_bitstrm, 1); 955 956 UEV_PARSE("min_spatial_segmentation_idc", ps_vui->u4_min_spatial_segmentation_idc, ps_bitstrm); 957 if(ps_vui->u4_min_spatial_segmentation_idc > 4095) 958 { 959 return IHEVCD_INVALID_PARAMETER; 960 } 961 UEV_PARSE("max_bytes_per_pic_denom", ps_vui->u1_max_bytes_per_pic_denom, ps_bitstrm); 962 if(ps_vui->u1_max_bytes_per_pic_denom > 16) 963 { 964 return IHEVCD_INVALID_PARAMETER; 965 } 966 UEV_PARSE("max_bits_per_min_cu_denom", ps_vui->u1_max_bits_per_mincu_denom, ps_bitstrm); 967 if(ps_vui->u1_max_bits_per_mincu_denom > 16) 968 { 969 return IHEVCD_INVALID_PARAMETER; 970 } 971 UEV_PARSE("log2_max_mv_length_horizontal", ps_vui->u1_log2_max_mv_length_horizontal, ps_bitstrm); 972 if(ps_vui->u1_max_bits_per_mincu_denom > 16) 973 { 974 return IHEVCD_INVALID_PARAMETER; 975 } 976 UEV_PARSE("log2_max_mv_length_vertical", ps_vui->u1_log2_max_mv_length_vertical, ps_bitstrm); 977 if(ps_vui->u1_max_bits_per_mincu_denom > 15) 978 { 979 return IHEVCD_INVALID_PARAMETER; 980 } 981 } 982 983 return ret; 984 } 985 986 /** 987 ******************************************************************************* 988 * 989 * @brief 990 * Parses profile tier and level info for either general layer of sub_layer 991 * 992 * @par Description 993 * Parses profile tier and level info for either general layer of sub_layer 994 * as per section 7.3.3 995 * 996 * Since the same function is called for parsing general_profile and 997 * sub_layer_profile etc, variables do not specify whether the syntax is 998 * for general or sub_layer. Similarly trace functions also do not differentiate 999 * 1000 * @param[in] ps_bitstrm 1001 * Pointer to bitstream structure 1002 * 1003 * @param[out] ps_ptl 1004 * Pointer to profile, tier level structure 1005 * 1006 * @returns Error code from IHEVCD_ERROR_T 1007 * 1008 * @remarks 1009 * 1010 ******************************************************************************* 1011 */ 1012 1013 static IHEVCD_ERROR_T ihevcd_parse_profile_tier_level_layer(bitstrm_t *ps_bitstrm, 1014 profile_tier_lvl_t *ps_ptl) 1015 { 1016 WORD32 value; 1017 WORD32 i; 1018 IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS; 1019 1020 BITS_PARSE("XXX_profile_space[]", value, ps_bitstrm, 2); 1021 ps_ptl->i1_profile_space = value; 1022 1023 BITS_PARSE("XXX_tier_flag[]", value, ps_bitstrm, 1); 1024 ps_ptl->i1_tier_flag = value; 1025 1026 BITS_PARSE("XXX_profile_idc[]", value, ps_bitstrm, 5); 1027 ps_ptl->i1_profile_idc = value; 1028 1029 for(i = 0; i < MAX_PROFILE_COMPATBLTY; i++) 1030 { 1031 BITS_PARSE("XXX_profile_compatibility_flag[][j]", value, ps_bitstrm, 1); 1032 ps_ptl->ai1_profile_compatibility_flag[i] = value; 1033 } 1034 1035 BITS_PARSE("general_progressive_source_flag", value, ps_bitstrm, 1); 1036 ps_ptl->i1_general_progressive_source_flag = value; 1037 1038 BITS_PARSE("general_interlaced_source_flag", value, ps_bitstrm, 1); 1039 ps_ptl->i1_general_interlaced_source_flag = value; 1040 1041 BITS_PARSE("general_non_packed_constraint_flag", value, ps_bitstrm, 1); 1042 ps_ptl->i1_general_non_packed_constraint_flag = value; 1043 1044 BITS_PARSE("general_frame_only_constraint_flag", value, ps_bitstrm, 1); 1045 ps_ptl->i1_frame_only_constraint_flag = value; 1046 1047 BITS_PARSE("XXX_reserved_zero_44bits[0..15]", value, ps_bitstrm, 16); 1048 1049 BITS_PARSE("XXX_reserved_zero_44bits[16..31]", value, ps_bitstrm, 16); 1050 1051 BITS_PARSE("XXX_reserved_zero_44bits[32..43]", value, ps_bitstrm, 12); 1052 return ret; 1053 } 1054 1055 1056 /** 1057 ******************************************************************************* 1058 * 1059 * @brief 1060 * Parses profile tier and level info 1061 * 1062 * @par Description 1063 * Parses profile tier and level info as per section 7.3.3 1064 * Called during VPS and SPS parsing 1065 * calls ihevcd_parse_profile_tier_level() for general layer and each sub_layers 1066 * 1067 * @param[in] ps_bitstrm 1068 * Pointer to bitstream structure 1069 * 1070 * @param[out] ps_ptl 1071 * Pointer to structure that contains profile, tier level for each layers 1072 * 1073 * @param[in] profile_present 1074 * Flag to indicate if profile data is present 1075 * 1076 * @param[in] max_num_sub_layers 1077 * Number of sub layers present 1078 * 1079 * @returns Error code from IHEVCD_ERROR_T 1080 * 1081 * @remarks 1082 * 1083 ******************************************************************************* 1084 */ 1085 1086 static IHEVCD_ERROR_T ihevcd_profile_tier_level(bitstrm_t *ps_bitstrm, 1087 profile_tier_lvl_info_t *ps_ptl, 1088 WORD32 profile_present, 1089 WORD32 max_num_sub_layers) 1090 { 1091 WORD32 value; 1092 IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS; 1093 WORD32 i; 1094 1095 if(profile_present) 1096 { 1097 ret = ihevcd_parse_profile_tier_level_layer(ps_bitstrm, &ps_ptl->s_ptl_gen); 1098 if((IHEVCD_ERROR_T)IHEVCD_SUCCESS != ret) 1099 { 1100 return ret; 1101 } 1102 } 1103 1104 BITS_PARSE("general_level_idc", value, ps_bitstrm, 8); 1105 ps_ptl->s_ptl_gen.u1_level_idc = value; 1106 1107 1108 for(i = 0; i < max_num_sub_layers; i++) 1109 { 1110 BITS_PARSE("sub_layer_profile_present_flag[i]", value, ps_bitstrm, 1); 1111 ps_ptl->ai1_sub_layer_profile_present_flag[i] = value; 1112 1113 BITS_PARSE("sub_layer_level_present_flag[i]", value, ps_bitstrm, 1); 1114 ps_ptl->ai1_sub_layer_level_present_flag[i] = value; 1115 } 1116 1117 if(max_num_sub_layers > 0) 1118 { 1119 for(i = max_num_sub_layers; i < 8; i++) 1120 { 1121 BITS_PARSE("reserved_zero_2bits", value, ps_bitstrm, 2); 1122 } 1123 } 1124 1125 for(i = 0; i < max_num_sub_layers; i++) 1126 { 1127 if(ps_ptl->ai1_sub_layer_profile_present_flag[i]) 1128 { 1129 ret = ihevcd_parse_profile_tier_level_layer(ps_bitstrm, 1130 &ps_ptl->as_ptl_sub[i]); 1131 } 1132 if(ps_ptl->ai1_sub_layer_level_present_flag[i]) 1133 { 1134 BITS_PARSE("sub_layer_level_idc[i]", value, ps_bitstrm, 8); 1135 ps_ptl->as_ptl_sub[i].u1_level_idc = value; 1136 1137 } 1138 } 1139 1140 1141 1142 return ret; 1143 } 1144 1145 /** 1146 ******************************************************************************* 1147 * 1148 * @brief 1149 * Parses Scaling List Data syntax 1150 * 1151 * @par Description: 1152 * Parses Scaling List Data syntax as per Section: 7.3.6 1153 * 1154 * @param[in] ps_codec 1155 * Pointer to codec context 1156 * 1157 * @returns Error code from IHEVCD_ERROR_T 1158 * 1159 * @remarks 1160 * 1161 * 1162 ******************************************************************************* 1163 */ 1164 IHEVCD_ERROR_T ihevcd_scaling_list_data(codec_t *ps_codec, WORD16 *pi2_scaling_mat) 1165 { 1166 IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS; 1167 WORD32 size_id; 1168 WORD32 matrix_id; 1169 WORD32 value, dc_value = 0; 1170 UWORD32 u4_value; 1171 WORD32 next_coef; 1172 WORD32 coef_num; 1173 WORD32 i, j, offset; 1174 bitstrm_t *ps_bitstrm = &ps_codec->s_parse.s_bitstrm; 1175 WORD16 *pi2_scaling_mat_offset; 1176 WORD32 scaling_mat_offset[] = { 0, 16, 32, 48, 64, 80, 96, 160, 224, 288, 352, 416, 480, 736, 992, 1248, 1504, 1760, 2016, 3040 }; 1177 UWORD8 *scan_table; 1178 1179 for(size_id = 0; size_id < 4; size_id++) 1180 { 1181 for(matrix_id = 0; matrix_id < ((size_id == 3) ? 2 : 6); matrix_id++) 1182 { 1183 WORD32 scaling_list_pred_mode_flag; 1184 WORD32 scaling_list_delta_coef; 1185 BITS_PARSE("scaling_list_pred_mode_flag", scaling_list_pred_mode_flag, ps_bitstrm, 1); 1186 1187 offset = size_id * 6 + matrix_id; 1188 pi2_scaling_mat_offset = pi2_scaling_mat + scaling_mat_offset[offset]; 1189 1190 if(!scaling_list_pred_mode_flag) 1191 { 1192 WORD32 num_elements; 1193 UEV_PARSE("scaling_list_pred_matrix_id_delta", u4_value, 1194 ps_bitstrm); 1195 if(u4_value > matrix_id) 1196 { 1197 return IHEVCD_INVALID_PARAMETER; 1198 } 1199 1200 num_elements = (1 << (4 + (size_id << 1))); 1201 if(0 != u4_value) 1202 memmove(pi2_scaling_mat_offset, pi2_scaling_mat_offset - u4_value * num_elements, num_elements * sizeof(WORD16)); 1203 } 1204 else 1205 { 1206 next_coef = 8; 1207 coef_num = MIN(64, (1 << (4 + (size_id << 1)))); 1208 1209 if(size_id > 1) 1210 { 1211 SEV_PARSE("scaling_list_dc_coef_minus8", value, 1212 ps_bitstrm); 1213 if(value < -7 || value > 247) 1214 { 1215 return IHEVCD_INVALID_PARAMETER; 1216 } 1217 next_coef = value + 8; 1218 dc_value = next_coef; 1219 } 1220 if(size_id < 2) 1221 { 1222 scan_table = (UWORD8 *)gapv_ihevc_invscan[size_id + 1]; 1223 1224 for(i = 0; i < coef_num; i++) 1225 { 1226 SEV_PARSE("scaling_list_delta_coef", 1227 scaling_list_delta_coef, ps_bitstrm); 1228 if((scaling_list_delta_coef < -256) || (scaling_list_delta_coef > 255)) 1229 { 1230 return IHEVCD_INVALID_PARAMETER; 1231 } 1232 next_coef = (next_coef + scaling_list_delta_coef + 256) 1233 % 256; 1234 pi2_scaling_mat_offset[scan_table[i]] = next_coef; 1235 } 1236 } 1237 else if(size_id == 2) 1238 { 1239 scan_table = (UWORD8 *)gapv_ihevc_invscan[2]; 1240 1241 for(i = 0; i < coef_num; i++) 1242 { 1243 SEV_PARSE("scaling_list_delta_coef", 1244 scaling_list_delta_coef, ps_bitstrm); 1245 if((scaling_list_delta_coef < -256) || (scaling_list_delta_coef > 255)) 1246 { 1247 return IHEVCD_INVALID_PARAMETER; 1248 } 1249 next_coef = (next_coef + scaling_list_delta_coef + 256) 1250 % 256; 1251 1252 offset = scan_table[i]; 1253 offset = (offset >> 3) * 16 * 2 + (offset & 0x7) * 2; 1254 pi2_scaling_mat_offset[offset] = next_coef; 1255 pi2_scaling_mat_offset[offset + 1] = next_coef; 1256 pi2_scaling_mat_offset[offset + 16] = next_coef; 1257 pi2_scaling_mat_offset[offset + 16 + 1] = next_coef; 1258 } 1259 pi2_scaling_mat_offset[0] = dc_value; 1260 } 1261 else 1262 { 1263 scan_table = (UWORD8 *)gapv_ihevc_invscan[2]; 1264 1265 for(i = 0; i < coef_num; i++) 1266 { 1267 SEV_PARSE("scaling_list_delta_coef", 1268 scaling_list_delta_coef, ps_bitstrm); 1269 if((scaling_list_delta_coef < -256) || (scaling_list_delta_coef > 255)) 1270 { 1271 return IHEVCD_INVALID_PARAMETER; 1272 } 1273 next_coef = (next_coef + scaling_list_delta_coef + 256) 1274 % 256; 1275 1276 offset = scan_table[i]; 1277 offset = (offset >> 3) * 32 * 4 + (offset & 0x7) * 4; 1278 1279 for(j = 0; j < 4; j++) 1280 { 1281 pi2_scaling_mat_offset[offset + j * 32] = next_coef; 1282 pi2_scaling_mat_offset[offset + 1 + j * 32] = next_coef; 1283 pi2_scaling_mat_offset[offset + 2 + j * 32] = next_coef; 1284 pi2_scaling_mat_offset[offset + 3 + j * 32] = next_coef; 1285 } 1286 pi2_scaling_mat_offset[0] = dc_value; 1287 } 1288 } 1289 } 1290 } 1291 } 1292 1293 return ret; 1294 } 1295 1296 /** 1297 ******************************************************************************* 1298 * 1299 * @brief 1300 * Parses VPS (Video Parameter Set) 1301 * 1302 * @par Description: 1303 * Parse Video Parameter Set as per Section 7.3.2.1 1304 * update vps structure corresponding to vps ID 1305 * Till parsing VPS id, the elements are stored in local variables and are copied 1306 * later 1307 * 1308 * @param[in] ps_codec 1309 * Pointer to codec context. 1310 * 1311 * @returns Error code from IHEVCD_ERROR_T 1312 * 1313 * @remarks 1314 * 1315 * 1316 ******************************************************************************* 1317 */ 1318 IHEVCD_ERROR_T ihevcd_parse_vps(codec_t *ps_codec) 1319 { 1320 IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS; 1321 WORD32 i; 1322 UWORD32 value; 1323 WORD32 vps_id; 1324 vps_t *ps_vps; 1325 bitstrm_t *ps_bitstrm = &ps_codec->s_parse.s_bitstrm; 1326 BITS_PARSE("vps_video_parameter_set_id", value, ps_bitstrm, 4); 1327 vps_id = value; 1328 1329 if(vps_id >= MAX_VPS_CNT) 1330 { 1331 ps_codec->s_parse.i4_error_code = IHEVCD_UNSUPPORTED_VPS_ID; 1332 return IHEVCD_UNSUPPORTED_VPS_ID; 1333 } 1334 1335 1336 ps_vps = (ps_codec->s_parse.ps_vps_base + vps_id); 1337 1338 ps_vps->i1_vps_id = vps_id; 1339 1340 BITS_PARSE("vps_reserved_three_2bits", value, ps_bitstrm, 2); 1341 ASSERT(value == 3); 1342 1343 BITS_PARSE("vps_max_layers_minus1", value, ps_bitstrm, 6); 1344 //ps_vps->i1_vps_max_layers = value + 1; 1345 1346 1347 1348 BITS_PARSE("vps_max_sub_layers_minus1", value, ps_bitstrm, 3); 1349 if(value > SPS_MAX_SUB_LAYERS - 1) 1350 { 1351 return IHEVCD_INVALID_PARAMETER; 1352 } 1353 ps_vps->i1_vps_max_sub_layers = value + 1; 1354 1355 ASSERT(ps_vps->i1_vps_max_sub_layers < VPS_MAX_SUB_LAYERS); 1356 1357 BITS_PARSE("vps_temporal_id_nesting_flag", value, ps_bitstrm, 1); 1358 ps_vps->i1_vps_temporal_id_nesting_flag = value; 1359 1360 BITS_PARSE("vps_reserved_ffff_16bits", value, ps_bitstrm, 16); 1361 ASSERT(value == 0xFFFF); 1362 // profile_and_level( 1, vps_max_sub_layers_minus1 ) 1363 ret = ihevcd_profile_tier_level(ps_bitstrm, &(ps_vps->s_ptl), 1364 1, (ps_vps->i1_vps_max_sub_layers - 1)); 1365 1366 BITS_PARSE("vps_sub_layer_ordering_info_present_flag", value, ps_bitstrm, 1); 1367 ps_vps->i1_sub_layer_ordering_info_present_flag = value; 1368 i = (ps_vps->i1_sub_layer_ordering_info_present_flag ? 1369 0 : (ps_vps->i1_vps_max_sub_layers - 1)); 1370 for(; i < ps_vps->i1_vps_max_sub_layers; i++) 1371 { 1372 UEV_PARSE("vps_max_dec_pic_buffering[i]", value, ps_bitstrm); 1373 if(value > MAX_DPB_SIZE) 1374 { 1375 return IHEVCD_INVALID_PARAMETER; 1376 } 1377 ps_vps->ai1_vps_max_dec_pic_buffering[i] = value; 1378 1379 /* vps_num_reorder_pics (no max) used in print in order to match with HM */ 1380 UEV_PARSE("vps_num_reorder_pics[i]", value, ps_bitstrm); 1381 if(value >= ps_vps->ai1_vps_max_dec_pic_buffering[i]) 1382 { 1383 return IHEVCD_INVALID_PARAMETER; 1384 } 1385 ps_vps->ai1_vps_max_num_reorder_pics[i] = value; 1386 1387 UEV_PARSE("vps_max_latency_increase[i]", value, ps_bitstrm); 1388 if(value > UINT_MAX - 2) 1389 { 1390 return IHEVCD_INVALID_PARAMETER; 1391 } 1392 ps_vps->ai1_vps_max_latency_increase[i] = value; 1393 } 1394 1395 1396 1397 BITS_PARSE("vps_max_layer_id", value, ps_bitstrm, 6); 1398 //ps_vps->i1_vps_max_layer_id = value; 1399 1400 UEV_PARSE("vps_num_layer_sets_minus1", value, ps_bitstrm); 1401 if(value > 1023) 1402 { 1403 return IHEVCD_INVALID_PARAMETER; 1404 } 1405 //ps_vps->i1_vps_num_layer_sets = value + 1; 1406 1407 BITS_PARSE("vps_timing_info_present_flag", value, ps_bitstrm, 1); 1408 //ps_vps->i1_vps_timing_info_present_flag = value; 1409 1410 1411 1412 return ret; 1413 } 1414 1415 /** 1416 ******************************************************************************* 1417 * 1418 * @brief 1419 * Parses SPS (Sequence Parameter Set) 1420 * sequence_parameter_set_rbsp() 1421 * 1422 * @par Description: 1423 * Parse Sequence Parameter Set as per section Section: 7.3.2.2 1424 * The sps is written to a temporary buffer and copied later to the 1425 * appropriate location 1426 * 1427 * @param[in] ps_codec 1428 * Pointer to codec context 1429 * 1430 * @returns Error code from IHEVCD_ERROR_T 1431 * 1432 * @remarks 1433 * 1434 * 1435 ******************************************************************************* 1436 */ 1437 IHEVCD_ERROR_T ihevcd_parse_sps(codec_t *ps_codec) 1438 { 1439 IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS; 1440 UWORD32 value; 1441 1442 WORD32 i; 1443 WORD32 vps_id; 1444 WORD32 sps_max_sub_layers; 1445 WORD32 sps_id; 1446 WORD32 sps_temporal_id_nesting_flag; 1447 sps_t *ps_sps; 1448 profile_tier_lvl_info_t s_ptl; 1449 bitstrm_t *ps_bitstrm = &ps_codec->s_parse.s_bitstrm; 1450 WORD32 ctb_log2_size_y = 0; 1451 1452 1453 BITS_PARSE("video_parameter_set_id", value, ps_bitstrm, 4); 1454 if(value > MAX_VPS_CNT - 1) 1455 { 1456 return IHEVCD_INVALID_PARAMETER; 1457 } 1458 vps_id = value; 1459 1460 BITS_PARSE("sps_max_sub_layers_minus1", value, ps_bitstrm, 3); 1461 if(value > SPS_MAX_SUB_LAYERS - 1) 1462 { 1463 return IHEVCD_INVALID_PARAMETER; 1464 } 1465 sps_max_sub_layers = value + 1; 1466 1467 BITS_PARSE("sps_temporal_id_nesting_flag", value, ps_bitstrm, 1); 1468 sps_temporal_id_nesting_flag = value; 1469 1470 //profile_and_level( 1, sps_max_sub_layers_minus1 ) 1471 ret = ihevcd_profile_tier_level(ps_bitstrm, &(s_ptl), 1, 1472 (sps_max_sub_layers - 1)); 1473 1474 UEV_PARSE("seq_parameter_set_id", value, ps_bitstrm); 1475 sps_id = value; 1476 if((sps_id >= MAX_SPS_CNT) || (sps_id < 0)) 1477 { 1478 if(ps_codec->i4_sps_done) 1479 return IHEVCD_UNSUPPORTED_SPS_ID; 1480 else 1481 sps_id = 0; 1482 } 1483 1484 1485 ps_sps = (ps_codec->s_parse.ps_sps_base + MAX_SPS_CNT - 1); 1486 /* Reset SPS to zero */ 1487 { 1488 WORD16 *pi2_scaling_mat = ps_sps->pi2_scaling_mat; 1489 memset(ps_sps, 0, sizeof(sps_t)); 1490 ps_sps->pi2_scaling_mat = pi2_scaling_mat; 1491 } 1492 ps_sps->i1_sps_id = sps_id; 1493 ps_sps->i1_vps_id = vps_id; 1494 ps_sps->i1_sps_max_sub_layers = sps_max_sub_layers; 1495 ps_sps->i1_sps_temporal_id_nesting_flag = sps_temporal_id_nesting_flag; 1496 1497 memcpy(&ps_sps->s_ptl, &s_ptl, sizeof(profile_tier_lvl_info_t)); 1498 1499 UEV_PARSE("chroma_format_idc", value, ps_bitstrm); 1500 if(value > 3) 1501 { 1502 return IHEVCD_INVALID_PARAMETER; 1503 } 1504 ps_sps->i1_chroma_format_idc = value; 1505 1506 if(ps_sps->i1_chroma_format_idc != CHROMA_FMT_IDC_YUV420) 1507 { 1508 ps_codec->s_parse.i4_error_code = IHEVCD_UNSUPPORTED_CHROMA_FMT_IDC; 1509 return (IHEVCD_ERROR_T)IHEVCD_UNSUPPORTED_CHROMA_FMT_IDC; 1510 } 1511 1512 if(CHROMA_FMT_IDC_YUV444_PLANES == ps_sps->i1_chroma_format_idc) 1513 { 1514 BITS_PARSE("separate_colour_plane_flag", value, ps_bitstrm, 1); 1515 ps_sps->i1_separate_colour_plane_flag = value; 1516 } 1517 else 1518 { 1519 ps_sps->i1_separate_colour_plane_flag = 0; 1520 } 1521 1522 UEV_PARSE("pic_width_in_luma_samples", value, ps_bitstrm); 1523 if(value > INT16_MAX) 1524 { 1525 return (IHEVCD_ERROR_T)IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED; 1526 } 1527 ps_sps->i2_pic_width_in_luma_samples = value; 1528 1529 UEV_PARSE("pic_height_in_luma_samples", value, ps_bitstrm); 1530 if(value > INT16_MAX) 1531 { 1532 return (IHEVCD_ERROR_T)IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED; 1533 } 1534 ps_sps->i2_pic_height_in_luma_samples = value; 1535 1536 if((0 >= ps_sps->i2_pic_width_in_luma_samples) || (0 >= ps_sps->i2_pic_height_in_luma_samples)) 1537 return IHEVCD_INVALID_PARAMETER; 1538 1539 BITS_PARSE("pic_cropping_flag", value, ps_bitstrm, 1); 1540 ps_sps->i1_pic_cropping_flag = value; 1541 1542 if(ps_sps->i1_pic_cropping_flag) 1543 { 1544 1545 UEV_PARSE("pic_crop_left_offset", value, ps_bitstrm); 1546 if (value >= ps_sps->i2_pic_width_in_luma_samples) 1547 { 1548 return IHEVCD_INVALID_PARAMETER; 1549 } 1550 ps_sps->i2_pic_crop_left_offset = value; 1551 1552 UEV_PARSE("pic_crop_right_offset", value, ps_bitstrm); 1553 if (value >= ps_sps->i2_pic_width_in_luma_samples) 1554 { 1555 return IHEVCD_INVALID_PARAMETER; 1556 } 1557 ps_sps->i2_pic_crop_right_offset = value; 1558 1559 UEV_PARSE("pic_crop_top_offset", value, ps_bitstrm); 1560 if (value >= ps_sps->i2_pic_height_in_luma_samples) 1561 { 1562 return IHEVCD_INVALID_PARAMETER; 1563 } 1564 ps_sps->i2_pic_crop_top_offset = value; 1565 1566 UEV_PARSE("pic_crop_bottom_offset", value, ps_bitstrm); 1567 if (value >= ps_sps->i2_pic_height_in_luma_samples) 1568 { 1569 return IHEVCD_INVALID_PARAMETER; 1570 } 1571 ps_sps->i2_pic_crop_bottom_offset = value; 1572 } 1573 else 1574 { 1575 ps_sps->i2_pic_crop_left_offset = 0; 1576 ps_sps->i2_pic_crop_right_offset = 0; 1577 ps_sps->i2_pic_crop_top_offset = 0; 1578 ps_sps->i2_pic_crop_bottom_offset = 0; 1579 } 1580 1581 1582 UEV_PARSE("bit_depth_luma_minus8", value, ps_bitstrm); 1583 if(0 != value) 1584 return IHEVCD_UNSUPPORTED_BIT_DEPTH; 1585 1586 UEV_PARSE("bit_depth_chroma_minus8", value, ps_bitstrm); 1587 if(0 != value) 1588 return IHEVCD_UNSUPPORTED_BIT_DEPTH; 1589 1590 UEV_PARSE("log2_max_pic_order_cnt_lsb_minus4", value, ps_bitstrm); 1591 if(value > 12) 1592 return IHEVCD_INVALID_PARAMETER; 1593 ps_sps->i1_log2_max_pic_order_cnt_lsb = value + 4; 1594 1595 BITS_PARSE("sps_sub_layer_ordering_info_present_flag", value, ps_bitstrm, 1); 1596 1597 ps_sps->i1_sps_sub_layer_ordering_info_present_flag = value; 1598 1599 1600 i = (ps_sps->i1_sps_sub_layer_ordering_info_present_flag ? 0 : (ps_sps->i1_sps_max_sub_layers - 1)); 1601 for(; i < ps_sps->i1_sps_max_sub_layers; i++) 1602 { 1603 UEV_PARSE("max_dec_pic_buffering", value, ps_bitstrm); 1604 if(value > (MAX_DPB_SIZE - 1)) 1605 { 1606 return IHEVCD_INVALID_PARAMETER; 1607 } 1608 ps_sps->ai1_sps_max_dec_pic_buffering[i] = value + 1; 1609 1610 UEV_PARSE("num_reorder_pics", value, ps_bitstrm); 1611 if(value >= ps_sps->ai1_sps_max_dec_pic_buffering[i]) 1612 { 1613 return IHEVCD_INVALID_PARAMETER; 1614 } 1615 ps_sps->ai1_sps_max_num_reorder_pics[i] = value; 1616 1617 UEV_PARSE("max_latency_increase", value, ps_bitstrm); 1618 if(value > UINT_MAX - 2) 1619 { 1620 return IHEVCD_INVALID_PARAMETER; 1621 } 1622 ps_sps->ai1_sps_max_latency_increase[i] = value; 1623 } 1624 1625 /* Check if sps_max_dec_pic_buffering or sps_max_num_reorder_pics 1626 has changed */ 1627 if(0 != ps_codec->u4_allocate_dynamic_done) 1628 { 1629 sps_t *ps_sps_old = ps_codec->s_parse.ps_sps; 1630 if(ps_sps_old->ai1_sps_max_dec_pic_buffering[ps_sps_old->i1_sps_max_sub_layers - 1] != 1631 ps_sps->ai1_sps_max_dec_pic_buffering[ps_sps->i1_sps_max_sub_layers - 1]) 1632 { 1633 if(0 == ps_codec->i4_first_pic_done) 1634 { 1635 return IHEVCD_INVALID_PARAMETER; 1636 } 1637 ps_codec->i4_reset_flag = 1; 1638 return (IHEVCD_ERROR_T)IVD_RES_CHANGED; 1639 } 1640 1641 if(ps_sps_old->ai1_sps_max_num_reorder_pics[ps_sps_old->i1_sps_max_sub_layers - 1] != 1642 ps_sps->ai1_sps_max_num_reorder_pics[ps_sps->i1_sps_max_sub_layers - 1]) 1643 { 1644 if(0 == ps_codec->i4_first_pic_done) 1645 { 1646 return IHEVCD_INVALID_PARAMETER; 1647 } 1648 ps_codec->i4_reset_flag = 1; 1649 return (IHEVCD_ERROR_T)IVD_RES_CHANGED; 1650 } 1651 } 1652 1653 UEV_PARSE("log2_min_coding_block_size_minus3", value, ps_bitstrm); 1654 if(value > (LOG2_MAX_CU_SIZE - 3)) 1655 { 1656 return IHEVCD_INVALID_PARAMETER; 1657 } 1658 ps_sps->i1_log2_min_coding_block_size = value + 3; 1659 if((ps_sps->i2_pic_width_in_luma_samples % (1 << ps_sps->i1_log2_min_coding_block_size) != 0) || 1660 (ps_sps->i2_pic_height_in_luma_samples % (1 << ps_sps->i1_log2_min_coding_block_size) != 0)) 1661 { 1662 return IHEVCD_INVALID_PARAMETER; 1663 } 1664 1665 UEV_PARSE("log2_diff_max_min_coding_block_size", value, ps_bitstrm); 1666 if(value > (LOG2_MAX_CU_SIZE - ps_sps->i1_log2_min_coding_block_size)) 1667 { 1668 return IHEVCD_INVALID_PARAMETER; 1669 } 1670 ps_sps->i1_log2_diff_max_min_coding_block_size = value; 1671 1672 ctb_log2_size_y = ps_sps->i1_log2_min_coding_block_size + ps_sps->i1_log2_diff_max_min_coding_block_size; 1673 1674 if((ctb_log2_size_y < LOG2_MIN_CTB_SIZE) || (ctb_log2_size_y > LOG2_MAX_CTB_SIZE)) 1675 { 1676 return IHEVCD_INVALID_PARAMETER; 1677 } 1678 ps_sps->i1_log2_ctb_size = ctb_log2_size_y; 1679 1680 UEV_PARSE("log2_min_transform_block_size_minus2", value, ps_bitstrm); 1681 if(value > (LOG2_MAX_TU_SIZE - 2)) 1682 { 1683 return IHEVCD_INVALID_PARAMETER; 1684 } 1685 ps_sps->i1_log2_min_transform_block_size = value + 2; 1686 if(ps_sps->i1_log2_min_transform_block_size >= ps_sps->i1_log2_min_coding_block_size) 1687 { 1688 return IHEVCD_INVALID_PARAMETER; 1689 } 1690 1691 UEV_PARSE("log2_diff_max_min_transform_block_size", value, ps_bitstrm); 1692 if(value > (LOG2_MAX_TU_SIZE - ps_sps->i1_log2_min_transform_block_size)) 1693 { 1694 return IHEVCD_INVALID_PARAMETER; 1695 } 1696 ps_sps->i1_log2_diff_max_min_transform_block_size = value; 1697 1698 ps_sps->i1_log2_max_transform_block_size = ps_sps->i1_log2_min_transform_block_size + 1699 ps_sps->i1_log2_diff_max_min_transform_block_size; 1700 1701 if(ps_sps->i1_log2_max_transform_block_size > ps_sps->i1_log2_ctb_size) 1702 { 1703 return IHEVCD_INVALID_PARAMETER; 1704 } 1705 1706 ps_sps->i1_log2_min_pcm_coding_block_size = 0; 1707 ps_sps->i1_log2_diff_max_min_pcm_coding_block_size = 0; 1708 1709 UEV_PARSE("max_transform_hierarchy_depth_inter", value, ps_bitstrm); 1710 if(value > (ps_sps->i1_log2_ctb_size - ps_sps->i1_log2_min_transform_block_size)) 1711 { 1712 return IHEVCD_INVALID_PARAMETER; 1713 } 1714 ps_sps->i1_max_transform_hierarchy_depth_inter = value; 1715 1716 UEV_PARSE("max_transform_hierarchy_depth_intra", value, ps_bitstrm); 1717 if(value > (ps_sps->i1_log2_ctb_size - ps_sps->i1_log2_min_transform_block_size)) 1718 { 1719 return IHEVCD_INVALID_PARAMETER; 1720 } 1721 ps_sps->i1_max_transform_hierarchy_depth_intra = value; 1722 1723 /* String has a d (enabled) in order to match with HM */ 1724 BITS_PARSE("scaling_list_enabled_flag", value, ps_bitstrm, 1); 1725 ps_sps->i1_scaling_list_enable_flag = value; 1726 1727 if(ps_sps->i1_scaling_list_enable_flag) 1728 { 1729 COPY_DEFAULT_SCALING_LIST(ps_sps->pi2_scaling_mat); 1730 BITS_PARSE("sps_scaling_list_data_present_flag", value, ps_bitstrm, 1); 1731 ps_sps->i1_sps_scaling_list_data_present_flag = value; 1732 1733 if(ps_sps->i1_sps_scaling_list_data_present_flag) 1734 ihevcd_scaling_list_data(ps_codec, ps_sps->pi2_scaling_mat); 1735 } 1736 else 1737 { 1738 COPY_FLAT_SCALING_LIST(ps_sps->pi2_scaling_mat); 1739 } 1740 /* String is asymmetric_motion_partitions_enabled_flag instead of amp_enabled_flag in order to match with HM */ 1741 BITS_PARSE("asymmetric_motion_partitions_enabled_flag", value, ps_bitstrm, 1); 1742 ps_sps->i1_amp_enabled_flag = value; 1743 1744 BITS_PARSE("sample_adaptive_offset_enabled_flag", value, ps_bitstrm, 1); 1745 ps_sps->i1_sample_adaptive_offset_enabled_flag = value; 1746 1747 BITS_PARSE("pcm_enabled_flag", value, ps_bitstrm, 1); 1748 ps_sps->i1_pcm_enabled_flag = value; 1749 1750 if(ps_sps->i1_pcm_enabled_flag) 1751 { 1752 BITS_PARSE("pcm_sample_bit_depth_luma", value, ps_bitstrm, 4); 1753 ps_sps->i1_pcm_sample_bit_depth_luma = value + 1; 1754 1755 BITS_PARSE("pcm_sample_bit_depth_chroma", value, ps_bitstrm, 4); 1756 ps_sps->i1_pcm_sample_bit_depth_chroma = value + 1; 1757 1758 UEV_PARSE("log2_min_pcm_coding_block_size_minus3", value, ps_bitstrm); 1759 if(value < (ps_sps->i1_log2_min_coding_block_size - 3) || value > (MIN(ctb_log2_size_y, 5) - 3)) 1760 { 1761 return IHEVCD_INVALID_PARAMETER; 1762 } 1763 ps_sps->i1_log2_min_pcm_coding_block_size = value + 3; 1764 1765 UEV_PARSE("log2_diff_max_min_pcm_coding_block_size", value, ps_bitstrm); 1766 if(value > MIN(ctb_log2_size_y, 5) - ps_sps->i1_log2_min_pcm_coding_block_size) 1767 { 1768 return IHEVCD_INVALID_PARAMETER; 1769 } 1770 ps_sps->i1_log2_diff_max_min_pcm_coding_block_size = value; 1771 BITS_PARSE("pcm_loop_filter_disable_flag", value, ps_bitstrm, 1); 1772 ps_sps->i1_pcm_loop_filter_disable_flag = value; 1773 1774 } 1775 UEV_PARSE("num_short_term_ref_pic_sets", value, ps_bitstrm); 1776 if(value > MAX_STREF_PICS_SPS) 1777 { 1778 return IHEVCD_INVALID_PARAMETER; 1779 } 1780 ps_sps->i1_num_short_term_ref_pic_sets = value; 1781 1782 for(i = 0; i < ps_sps->i1_num_short_term_ref_pic_sets; i++) 1783 { 1784 ret = ihevcd_short_term_ref_pic_set(ps_bitstrm, &ps_sps->as_stref_picset[0], ps_sps->i1_num_short_term_ref_pic_sets, i, &ps_sps->as_stref_picset[i]); 1785 if (ret != IHEVCD_SUCCESS) 1786 { 1787 return ret; 1788 } 1789 } 1790 1791 BITS_PARSE("long_term_ref_pics_present_flag", value, ps_bitstrm, 1); 1792 ps_sps->i1_long_term_ref_pics_present_flag = value; 1793 1794 if(ps_sps->i1_long_term_ref_pics_present_flag) 1795 { 1796 UEV_PARSE("num_long_term_ref_pics_sps", value, ps_bitstrm); 1797 if(value > MAX_LTREF_PICS_SPS) 1798 { 1799 return IHEVCD_INVALID_PARAMETER; 1800 } 1801 ps_sps->i1_num_long_term_ref_pics_sps = value; 1802 1803 for(i = 0; i < ps_sps->i1_num_long_term_ref_pics_sps; i++) 1804 { 1805 BITS_PARSE("lt_ref_pic_poc_lsb_sps[ i ]", value, ps_bitstrm, ps_sps->i1_log2_max_pic_order_cnt_lsb); 1806 ps_sps->au2_lt_ref_pic_poc_lsb_sps[i] = value; 1807 1808 BITS_PARSE("used_by_curr_pic_lt_sps_flag[ i ]", value, ps_bitstrm, 1); 1809 ps_sps->ai1_used_by_curr_pic_lt_sps_flag[i] = value; 1810 } 1811 } 1812 1813 BITS_PARSE("sps_temporal_mvp_enable_flag", value, ps_bitstrm, 1); 1814 ps_sps->i1_sps_temporal_mvp_enable_flag = value; 1815 1816 /* Print matches HM 8-2 */ 1817 BITS_PARSE("sps_strong_intra_smoothing_enable_flag", value, ps_bitstrm, 1); 1818 ps_sps->i1_strong_intra_smoothing_enable_flag = value; 1819 1820 BITS_PARSE("vui_parameters_present_flag", value, ps_bitstrm, 1); 1821 ps_sps->i1_vui_parameters_present_flag = value; 1822 1823 if(ps_sps->i1_vui_parameters_present_flag) 1824 { 1825 ret = ihevcd_parse_vui_parameters(ps_bitstrm, 1826 &ps_sps->s_vui_parameters, 1827 ps_sps->i1_sps_max_sub_layers - 1); 1828 RETURN_IF((ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), ret); 1829 } 1830 1831 BITS_PARSE("sps_extension_flag", value, ps_bitstrm, 1); 1832 1833 if((UWORD8 *)ps_bitstrm->pu4_buf > ps_bitstrm->pu1_buf_max) 1834 { 1835 return IHEVCD_INVALID_PARAMETER; 1836 } 1837 1838 { 1839 WORD32 numerator; 1840 WORD32 ceil_offset; 1841 1842 ceil_offset = (1 << ps_sps->i1_log2_ctb_size) - 1; 1843 numerator = ps_sps->i2_pic_width_in_luma_samples; 1844 1845 ps_sps->i2_pic_wd_in_ctb = ((numerator + ceil_offset) / 1846 (1 << ps_sps->i1_log2_ctb_size)); 1847 1848 numerator = ps_sps->i2_pic_height_in_luma_samples; 1849 ps_sps->i2_pic_ht_in_ctb = ((numerator + ceil_offset) / 1850 (1 << ps_sps->i1_log2_ctb_size)); 1851 1852 ps_sps->i4_pic_size_in_ctb = ps_sps->i2_pic_ht_in_ctb * 1853 ps_sps->i2_pic_wd_in_ctb; 1854 1855 if(0 == ps_codec->i4_sps_done) 1856 ps_codec->s_parse.i4_next_ctb_indx = ps_sps->i4_pic_size_in_ctb; 1857 1858 numerator = ps_sps->i2_pic_width_in_luma_samples; 1859 ps_sps->i2_pic_wd_in_min_cb = numerator / 1860 (1 << ps_sps->i1_log2_min_coding_block_size); 1861 1862 numerator = ps_sps->i2_pic_height_in_luma_samples; 1863 ps_sps->i2_pic_ht_in_min_cb = numerator / 1864 (1 << ps_sps->i1_log2_min_coding_block_size); 1865 } 1866 if((0 != ps_codec->u4_allocate_dynamic_done) && 1867 ((ps_codec->i4_wd != ps_sps->i2_pic_width_in_luma_samples) || 1868 (ps_codec->i4_ht != ps_sps->i2_pic_height_in_luma_samples))) 1869 { 1870 if(0 == ps_codec->i4_first_pic_done) 1871 { 1872 return IHEVCD_INVALID_PARAMETER; 1873 } 1874 ps_codec->i4_reset_flag = 1; 1875 return (IHEVCD_ERROR_T)IVD_RES_CHANGED; 1876 } 1877 1878 if((ps_sps->i2_pic_width_in_luma_samples > MAX_WD) || 1879 ((ps_sps->i2_pic_width_in_luma_samples * ps_sps->i2_pic_height_in_luma_samples) > 1880 (MAX_WD * MAX_HT))) 1881 { 1882 return (IHEVCD_ERROR_T)IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED; 1883 } 1884 1885 /* Update display width and display height */ 1886 { 1887 WORD32 disp_wd, disp_ht; 1888 WORD32 crop_unit_x, crop_unit_y; 1889 crop_unit_x = 1; 1890 crop_unit_y = 1; 1891 1892 if(CHROMA_FMT_IDC_YUV420 == ps_sps->i1_chroma_format_idc) 1893 { 1894 crop_unit_x = 2; 1895 crop_unit_y = 2; 1896 } 1897 1898 disp_wd = ps_sps->i2_pic_width_in_luma_samples; 1899 disp_wd -= ps_sps->i2_pic_crop_left_offset * crop_unit_x; 1900 disp_wd -= ps_sps->i2_pic_crop_right_offset * crop_unit_x; 1901 1902 1903 disp_ht = ps_sps->i2_pic_height_in_luma_samples; 1904 disp_ht -= ps_sps->i2_pic_crop_top_offset * crop_unit_y; 1905 disp_ht -= ps_sps->i2_pic_crop_bottom_offset * crop_unit_y; 1906 1907 if((0 >= disp_wd) || (0 >= disp_ht)) 1908 return IHEVCD_INVALID_PARAMETER; 1909 1910 if((0 != ps_codec->u4_allocate_dynamic_done) && 1911 ((ps_codec->i4_disp_wd != disp_wd) || 1912 (ps_codec->i4_disp_ht != disp_ht))) 1913 { 1914 if(0 == ps_codec->i4_first_pic_done) 1915 { 1916 return IHEVCD_INVALID_PARAMETER; 1917 } 1918 ps_codec->i4_reset_flag = 1; 1919 return (IHEVCD_ERROR_T)IVD_RES_CHANGED; 1920 } 1921 1922 ps_codec->i4_disp_wd = disp_wd; 1923 ps_codec->i4_disp_ht = disp_ht; 1924 1925 1926 ps_codec->i4_wd = ps_sps->i2_pic_width_in_luma_samples; 1927 ps_codec->i4_ht = ps_sps->i2_pic_height_in_luma_samples; 1928 1929 { 1930 WORD32 ref_strd; 1931 ref_strd = ALIGN32(ps_sps->i2_pic_width_in_luma_samples + PAD_WD); 1932 if(ps_codec->i4_strd < ref_strd) 1933 { 1934 ps_codec->i4_strd = ref_strd; 1935 } 1936 } 1937 1938 if(0 == ps_codec->i4_share_disp_buf) 1939 { 1940 if(ps_codec->i4_disp_strd < ps_codec->i4_disp_wd) 1941 { 1942 ps_codec->i4_disp_strd = ps_codec->i4_disp_wd; 1943 } 1944 } 1945 else 1946 { 1947 if(ps_codec->i4_disp_strd < ps_codec->i4_strd) 1948 { 1949 ps_codec->i4_disp_strd = ps_codec->i4_strd; 1950 } 1951 } 1952 } 1953 1954 /* This is used only during initialization to get reorder count etc */ 1955 ps_codec->i4_sps_id = sps_id; 1956 1957 ps_codec->i4_sps_done = 1; 1958 return ret; 1959 } 1960 1961 1962 void ihevcd_unmark_pps(codec_t *ps_codec, WORD32 sps_id) 1963 { 1964 WORD32 pps_id = 0; 1965 pps_t *ps_pps = ps_codec->ps_pps_base; 1966 1967 for(pps_id = 0; pps_id < MAX_PPS_CNT - 1; pps_id++, ps_pps++) 1968 { 1969 if((ps_pps->i1_pps_valid) && 1970 (ps_pps->i1_sps_id == sps_id)) 1971 ps_pps->i1_pps_valid = 0; 1972 } 1973 } 1974 1975 1976 void ihevcd_copy_sps(codec_t *ps_codec, WORD32 sps_id, WORD32 sps_id_ref) 1977 { 1978 sps_t *ps_sps, *ps_sps_ref; 1979 WORD16 *pi2_scaling_mat_backup; 1980 WORD32 scaling_mat_size; 1981 1982 SCALING_MAT_SIZE(scaling_mat_size); 1983 ps_sps_ref = ps_codec->ps_sps_base + sps_id_ref; 1984 ps_sps = ps_codec->ps_sps_base + sps_id; 1985 1986 if(ps_sps->i1_sps_valid) 1987 { 1988 if((ps_sps->i1_log2_ctb_size != ps_sps_ref->i1_log2_ctb_size) || 1989 (ps_sps->i2_pic_wd_in_ctb != ps_sps_ref->i2_pic_wd_in_ctb) || 1990 (ps_sps->i2_pic_ht_in_ctb != ps_sps_ref->i2_pic_ht_in_ctb)) 1991 { 1992 ihevcd_unmark_pps(ps_codec, sps_id); 1993 } 1994 } 1995 1996 pi2_scaling_mat_backup = ps_sps->pi2_scaling_mat; 1997 1998 memcpy(ps_sps, ps_sps_ref, sizeof(sps_t)); 1999 ps_sps->pi2_scaling_mat = pi2_scaling_mat_backup; 2000 memcpy(ps_sps->pi2_scaling_mat, ps_sps_ref->pi2_scaling_mat, scaling_mat_size * sizeof(WORD16)); 2001 ps_sps->i1_sps_valid = 1; 2002 2003 ps_codec->s_parse.ps_sps = ps_sps; 2004 } 2005 2006 2007 /** 2008 ******************************************************************************* 2009 * 2010 * @brief 2011 * Parses PPS (Picture Parameter Set) 2012 * 2013 * @par Description: 2014 * Parse Picture Parameter Set as per section Section: 7.3.2.3 2015 * The pps is written to a temporary buffer and copied later to the 2016 * appropriate location 2017 * 2018 * @param[in] ps_codec 2019 * Pointer to codec context 2020 * 2021 * @returns Error code from IHEVCD_ERROR_T 2022 * 2023 * @remarks 2024 * 2025 * 2026 ******************************************************************************* 2027 */ 2028 IHEVCD_ERROR_T ihevcd_parse_pps(codec_t *ps_codec) 2029 { 2030 IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS; 2031 UWORD32 value; 2032 WORD32 i4_value; 2033 WORD32 pps_id; 2034 2035 pps_t *ps_pps; 2036 sps_t *ps_sps; 2037 bitstrm_t *ps_bitstrm = &ps_codec->s_parse.s_bitstrm; 2038 2039 2040 if(0 == ps_codec->i4_sps_done) 2041 return IHEVCD_INVALID_HEADER; 2042 2043 UEV_PARSE("pic_parameter_set_id", value, ps_bitstrm); 2044 2045 pps_id = value; 2046 if((pps_id >= MAX_PPS_CNT) || (pps_id < 0)) 2047 { 2048 if(ps_codec->i4_pps_done) 2049 return IHEVCD_UNSUPPORTED_PPS_ID; 2050 else 2051 pps_id = 0; 2052 } 2053 2054 2055 ps_pps = (ps_codec->s_parse.ps_pps_base + MAX_PPS_CNT - 1); 2056 2057 ps_pps->i1_pps_id = pps_id; 2058 2059 UEV_PARSE("seq_parameter_set_id", value, ps_bitstrm); 2060 if(value > MAX_SPS_CNT - 2) 2061 { 2062 return IHEVCD_INVALID_PARAMETER; 2063 } 2064 ps_pps->i1_sps_id = value; 2065 2066 ps_sps = (ps_codec->s_parse.ps_sps_base + ps_pps->i1_sps_id); 2067 2068 /* If the SPS that is being referred to has not been parsed, 2069 * copy an existing SPS to the current location */ 2070 if(0 == ps_sps->i1_sps_valid) 2071 { 2072 return IHEVCD_INVALID_HEADER; 2073 2074 /* 2075 sps_t *ps_sps_ref = ps_codec->ps_sps_base; 2076 while(0 == ps_sps_ref->i1_sps_valid) 2077 ps_sps_ref++; 2078 ihevcd_copy_sps(ps_codec, ps_pps->i1_sps_id, ps_sps_ref->i1_sps_id); 2079 */ 2080 } 2081 2082 BITS_PARSE("dependent_slices_enabled_flag", value, ps_bitstrm, 1); 2083 ps_pps->i1_dependent_slice_enabled_flag = value; 2084 2085 BITS_PARSE("output_flag_present_flag", value, ps_bitstrm, 1); 2086 ps_pps->i1_output_flag_present_flag = value; 2087 2088 BITS_PARSE("num_extra_slice_header_bits", value, ps_bitstrm, 3); 2089 ps_pps->i1_num_extra_slice_header_bits = value; 2090 2091 2092 BITS_PARSE("sign_data_hiding_flag", value, ps_bitstrm, 1); 2093 ps_pps->i1_sign_data_hiding_flag = value; 2094 2095 BITS_PARSE("cabac_init_present_flag", value, ps_bitstrm, 1); 2096 ps_pps->i1_cabac_init_present_flag = value; 2097 2098 UEV_PARSE("num_ref_idx_l0_default_active_minus1", value, ps_bitstrm); 2099 if(value > MAX_DPB_SIZE - 2) 2100 { 2101 return IHEVCD_INVALID_PARAMETER; 2102 } 2103 ps_pps->i1_num_ref_idx_l0_default_active = value + 1; 2104 2105 UEV_PARSE("num_ref_idx_l1_default_active_minus1", value, ps_bitstrm); 2106 if(value > MAX_DPB_SIZE - 2) 2107 { 2108 return IHEVCD_INVALID_PARAMETER; 2109 } 2110 ps_pps->i1_num_ref_idx_l1_default_active = value + 1; 2111 2112 SEV_PARSE("pic_init_qp_minus26", i4_value, ps_bitstrm); 2113 if(i4_value < -26 || i4_value > 25) 2114 { 2115 return IHEVCD_INVALID_PARAMETER; 2116 } 2117 ps_pps->i1_pic_init_qp = i4_value + 26; 2118 2119 BITS_PARSE("constrained_intra_pred_flag", value, ps_bitstrm, 1); 2120 ps_pps->i1_constrained_intra_pred_flag = value; 2121 2122 BITS_PARSE("transform_skip_enabled_flag", value, ps_bitstrm, 1); 2123 ps_pps->i1_transform_skip_enabled_flag = value; 2124 2125 BITS_PARSE("cu_qp_delta_enabled_flag", value, ps_bitstrm, 1); 2126 ps_pps->i1_cu_qp_delta_enabled_flag = value; 2127 2128 if(ps_pps->i1_cu_qp_delta_enabled_flag) 2129 { 2130 UEV_PARSE("diff_cu_qp_delta_depth", value, ps_bitstrm); 2131 if(value > ps_sps->i1_log2_diff_max_min_coding_block_size) 2132 { 2133 return IHEVCD_INVALID_PARAMETER; 2134 } 2135 ps_pps->i1_diff_cu_qp_delta_depth = value; 2136 } 2137 else 2138 { 2139 ps_pps->i1_diff_cu_qp_delta_depth = 0; 2140 } 2141 ps_pps->i1_log2_min_cu_qp_delta_size = ps_sps->i1_log2_ctb_size - ps_pps->i1_diff_cu_qp_delta_depth; 2142 /* Print different */ 2143 SEV_PARSE("cb_qp_offset", i4_value, ps_bitstrm); 2144 if(i4_value < -12 || i4_value > 12) 2145 { 2146 return IHEVCD_INVALID_PARAMETER; 2147 } 2148 ps_pps->i1_pic_cb_qp_offset = i4_value; 2149 2150 /* Print different */ 2151 SEV_PARSE("cr_qp_offset", i4_value, ps_bitstrm); 2152 if(i4_value < -12 || i4_value > 12) 2153 { 2154 return IHEVCD_INVALID_PARAMETER; 2155 } 2156 ps_pps->i1_pic_cr_qp_offset = i4_value; 2157 2158 /* Print different */ 2159 BITS_PARSE("slicelevel_chroma_qp_flag", value, ps_bitstrm, 1); 2160 ps_pps->i1_pic_slice_level_chroma_qp_offsets_present_flag = value; 2161 2162 BITS_PARSE("weighted_pred_flag", value, ps_bitstrm, 1); 2163 ps_pps->i1_weighted_pred_flag = value; 2164 2165 BITS_PARSE("weighted_bipred_flag", value, ps_bitstrm, 1); 2166 ps_pps->i1_weighted_bipred_flag = value; 2167 2168 BITS_PARSE("transquant_bypass_enable_flag", value, ps_bitstrm, 1); 2169 ps_pps->i1_transquant_bypass_enable_flag = value; 2170 2171 BITS_PARSE("tiles_enabled_flag", value, ps_bitstrm, 1); 2172 ps_pps->i1_tiles_enabled_flag = value; 2173 2174 /* When tiles are enabled and width or height is >= 4096, 2175 * CTB Size should at least be 32 while if width or height is >= 8192, 2176 * CTB Size should at least be 64 and so on. 16x16 CTBs can result 2177 * in tile position greater than 255 for 4096 while 32x32 CTBs can result 2178 * in tile position greater than 255 for 8192, 2179 * which decoder does not support. 2180 */ 2181 if (ps_pps->i1_tiles_enabled_flag) 2182 { 2183 if((ps_sps->i1_log2_ctb_size == 4) && 2184 ((ps_sps->i2_pic_width_in_luma_samples >= 4096) || 2185 (ps_sps->i2_pic_height_in_luma_samples >= 4096))) 2186 { 2187 return IHEVCD_INVALID_HEADER; 2188 } 2189 if((ps_sps->i1_log2_ctb_size == 5) && 2190 ((ps_sps->i2_pic_width_in_luma_samples >= 8192) || 2191 (ps_sps->i2_pic_height_in_luma_samples >= 8192))) 2192 { 2193 return IHEVCD_INVALID_HEADER; 2194 } 2195 if((ps_sps->i1_log2_ctb_size == 6) && 2196 ((ps_sps->i2_pic_width_in_luma_samples >= 16384) || 2197 (ps_sps->i2_pic_height_in_luma_samples >= 16384))) 2198 { 2199 return IHEVCD_INVALID_HEADER; 2200 } 2201 } 2202 2203 BITS_PARSE("entropy_coding_sync_enabled_flag", value, ps_bitstrm, 1); 2204 ps_pps->i1_entropy_coding_sync_enabled_flag = value; 2205 2206 ps_pps->i1_loop_filter_across_tiles_enabled_flag = 0; 2207 if(ps_pps->i1_tiles_enabled_flag) 2208 { 2209 WORD32 wd = ALIGN64(ps_codec->i4_wd); 2210 WORD32 ht = ALIGN64(ps_codec->i4_ht); 2211 2212 WORD32 max_tile_cols = (wd + MIN_TILE_WD - 1) / MIN_TILE_WD; 2213 WORD32 max_tile_rows = (ht + MIN_TILE_HT - 1) / MIN_TILE_HT; 2214 2215 UEV_PARSE("num_tile_columns_minus1", value, ps_bitstrm); 2216 ps_pps->i1_num_tile_columns = value + 1; 2217 2218 UEV_PARSE("num_tile_rows_minus1", value, ps_bitstrm); 2219 ps_pps->i1_num_tile_rows = value + 1; 2220 2221 if((ps_pps->i1_num_tile_columns < 1) || 2222 (ps_pps->i1_num_tile_columns > max_tile_cols) || 2223 (ps_pps->i1_num_tile_rows < 1) || 2224 (ps_pps->i1_num_tile_rows > max_tile_rows)) 2225 return IHEVCD_INVALID_HEADER; 2226 2227 BITS_PARSE("uniform_spacing_flag", value, ps_bitstrm, 1); 2228 ps_pps->i1_uniform_spacing_flag = value; 2229 2230 2231 { 2232 2233 UWORD32 start; 2234 WORD32 i, j; 2235 2236 2237 start = 0; 2238 for(i = 0; i < ps_pps->i1_num_tile_columns; i++) 2239 { 2240 tile_t *ps_tile; 2241 if(!ps_pps->i1_uniform_spacing_flag) 2242 { 2243 if(i < (ps_pps->i1_num_tile_columns - 1)) 2244 { 2245 UEV_PARSE("column_width_minus1[ i ]", value, ps_bitstrm); 2246 value += 1; 2247 if (value >= ps_sps->i2_pic_wd_in_ctb - start) 2248 { 2249 return IHEVCD_INVALID_HEADER; 2250 } 2251 } 2252 else 2253 { 2254 value = ps_sps->i2_pic_wd_in_ctb - start; 2255 } 2256 } 2257 else 2258 { 2259 value = ((i + 1) * ps_sps->i2_pic_wd_in_ctb) / ps_pps->i1_num_tile_columns - 2260 (i * ps_sps->i2_pic_wd_in_ctb) / ps_pps->i1_num_tile_columns; 2261 } 2262 2263 for(j = 0; j < ps_pps->i1_num_tile_rows; j++) 2264 { 2265 ps_tile = ps_pps->ps_tile + j * ps_pps->i1_num_tile_columns + i; 2266 ps_tile->u1_pos_x = start; 2267 ps_tile->u2_wd = value; 2268 } 2269 start += value; 2270 2271 if((start > ps_sps->i2_pic_wd_in_ctb) || 2272 (value == 0)) 2273 return IHEVCD_INVALID_HEADER; 2274 } 2275 2276 start = 0; 2277 for(i = 0; i < (ps_pps->i1_num_tile_rows); i++) 2278 { 2279 tile_t *ps_tile; 2280 if(!ps_pps->i1_uniform_spacing_flag) 2281 { 2282 if(i < (ps_pps->i1_num_tile_rows - 1)) 2283 { 2284 2285 UEV_PARSE("row_height_minus1[ i ]", value, ps_bitstrm); 2286 value += 1; 2287 if (value >= ps_sps->i2_pic_ht_in_ctb - start) 2288 { 2289 return IHEVCD_INVALID_HEADER; 2290 } 2291 } 2292 else 2293 { 2294 value = ps_sps->i2_pic_ht_in_ctb - start; 2295 } 2296 } 2297 else 2298 { 2299 value = ((i + 1) * ps_sps->i2_pic_ht_in_ctb) / ps_pps->i1_num_tile_rows - 2300 (i * ps_sps->i2_pic_ht_in_ctb) / ps_pps->i1_num_tile_rows; 2301 } 2302 2303 for(j = 0; j < ps_pps->i1_num_tile_columns; j++) 2304 { 2305 ps_tile = ps_pps->ps_tile + i * ps_pps->i1_num_tile_columns + j; 2306 ps_tile->u1_pos_y = start; 2307 ps_tile->u2_ht = value; 2308 } 2309 start += value; 2310 2311 if((start > ps_sps->i2_pic_ht_in_ctb) || 2312 (value == 0)) 2313 return IHEVCD_INVALID_HEADER; 2314 } 2315 } 2316 2317 2318 BITS_PARSE("loop_filter_across_tiles_enabled_flag", value, ps_bitstrm, 1); 2319 ps_pps->i1_loop_filter_across_tiles_enabled_flag = value; 2320 2321 } 2322 else 2323 { 2324 /* If tiles are not present, set first tile in each PPS to have tile 2325 width and height equal to picture width and height */ 2326 ps_pps->i1_num_tile_columns = 1; 2327 ps_pps->i1_num_tile_rows = 1; 2328 ps_pps->i1_uniform_spacing_flag = 1; 2329 2330 ps_pps->ps_tile->u1_pos_x = 0; 2331 ps_pps->ps_tile->u1_pos_y = 0; 2332 ps_pps->ps_tile->u2_wd = ps_sps->i2_pic_wd_in_ctb; 2333 ps_pps->ps_tile->u2_ht = ps_sps->i2_pic_ht_in_ctb; 2334 } 2335 2336 BITS_PARSE("loop_filter_across_slices_enabled_flag", value, ps_bitstrm, 1); 2337 ps_pps->i1_loop_filter_across_slices_enabled_flag = value; 2338 2339 BITS_PARSE("deblocking_filter_control_present_flag", value, ps_bitstrm, 1); 2340 ps_pps->i1_deblocking_filter_control_present_flag = value; 2341 2342 /* Default values */ 2343 ps_pps->i1_pic_disable_deblocking_filter_flag = 0; 2344 ps_pps->i1_deblocking_filter_override_enabled_flag = 0; 2345 ps_pps->i1_beta_offset_div2 = 0; 2346 ps_pps->i1_tc_offset_div2 = 0; 2347 2348 if(ps_pps->i1_deblocking_filter_control_present_flag) 2349 { 2350 2351 BITS_PARSE("deblocking_filter_override_enabled_flag", value, ps_bitstrm, 1); 2352 ps_pps->i1_deblocking_filter_override_enabled_flag = value; 2353 2354 BITS_PARSE("pic_disable_deblocking_filter_flag", value, ps_bitstrm, 1); 2355 ps_pps->i1_pic_disable_deblocking_filter_flag = value; 2356 2357 if(!ps_pps->i1_pic_disable_deblocking_filter_flag) 2358 { 2359 2360 SEV_PARSE("pps_beta_offset_div2", i4_value, ps_bitstrm); 2361 if(i4_value < -6 || i4_value > 6) 2362 { 2363 return IHEVCD_INVALID_PARAMETER; 2364 } 2365 ps_pps->i1_beta_offset_div2 = i4_value; 2366 2367 SEV_PARSE("pps_tc_offset_div2", i4_value, ps_bitstrm); 2368 if(i4_value < -6 || i4_value > 6) 2369 { 2370 return IHEVCD_INVALID_PARAMETER; 2371 } 2372 ps_pps->i1_tc_offset_div2 = i4_value; 2373 2374 } 2375 } 2376 2377 BITS_PARSE("pps_scaling_list_data_present_flag", value, ps_bitstrm, 1); 2378 ps_pps->i1_pps_scaling_list_data_present_flag = value; 2379 2380 if(ps_pps->i1_pps_scaling_list_data_present_flag) 2381 { 2382 COPY_DEFAULT_SCALING_LIST(ps_pps->pi2_scaling_mat); 2383 ihevcd_scaling_list_data(ps_codec, ps_pps->pi2_scaling_mat); 2384 } 2385 2386 BITS_PARSE("lists_modification_present_flag", value, ps_bitstrm, 1); 2387 ps_pps->i1_lists_modification_present_flag = value; 2388 UEV_PARSE("log2_parallel_merge_level_minus2", value, ps_bitstrm); 2389 if(value > (ps_sps->i1_log2_min_coding_block_size + ps_sps->i1_log2_diff_max_min_coding_block_size)) 2390 { 2391 return IHEVCD_INVALID_PARAMETER; 2392 } 2393 ps_pps->i1_log2_parallel_merge_level = value + 2; 2394 2395 BITS_PARSE("slice_header_extension_present_flag", value, ps_bitstrm, 1); 2396 ps_pps->i1_slice_header_extension_present_flag = value; 2397 /* Not present in HM */ 2398 BITS_PARSE("pps_extension_flag", value, ps_bitstrm, 1); 2399 2400 if((UWORD8 *)ps_bitstrm->pu4_buf > ps_bitstrm->pu1_buf_max) 2401 return IHEVCD_INVALID_PARAMETER; 2402 2403 ps_codec->i4_pps_done = 1; 2404 return ret; 2405 } 2406 2407 2408 void ihevcd_copy_pps(codec_t *ps_codec, WORD32 pps_id, WORD32 pps_id_ref) 2409 { 2410 pps_t *ps_pps, *ps_pps_ref; 2411 WORD16 *pi2_scaling_mat_backup; 2412 WORD32 scaling_mat_size; 2413 tile_t *ps_tile_backup; 2414 WORD32 max_tile_cols, max_tile_rows; 2415 WORD32 wd, ht; 2416 wd = ALIGN64(ps_codec->i4_wd); 2417 ht = ALIGN64(ps_codec->i4_ht); 2418 2419 SCALING_MAT_SIZE(scaling_mat_size); 2420 max_tile_cols = (wd + MIN_TILE_WD - 1) / MIN_TILE_WD; 2421 max_tile_rows = (ht + MIN_TILE_HT - 1) / MIN_TILE_HT; 2422 2423 ps_pps_ref = ps_codec->ps_pps_base + pps_id_ref; 2424 ps_pps = ps_codec->ps_pps_base + pps_id; 2425 2426 pi2_scaling_mat_backup = ps_pps->pi2_scaling_mat; 2427 ps_tile_backup = ps_pps->ps_tile; 2428 2429 memcpy(ps_pps, ps_pps_ref, sizeof(pps_t)); 2430 ps_pps->pi2_scaling_mat = pi2_scaling_mat_backup; 2431 ps_pps->ps_tile = ps_tile_backup; 2432 memcpy(ps_pps->pi2_scaling_mat, ps_pps_ref->pi2_scaling_mat, scaling_mat_size * sizeof(WORD16)); 2433 memcpy(ps_pps->ps_tile, ps_pps_ref->ps_tile, max_tile_cols * max_tile_rows * sizeof(tile_t)); 2434 2435 ps_pps->i1_pps_valid = 1; 2436 2437 ps_codec->s_parse.ps_pps = ps_pps; 2438 } 2439 2440 2441 IHEVCD_ERROR_T ihevcd_parse_buffering_period_sei(codec_t *ps_codec, 2442 sps_t *ps_sps) 2443 { 2444 parse_ctxt_t *ps_parse = &ps_codec->s_parse; 2445 bitstrm_t *ps_bitstrm = &ps_parse->s_bitstrm; 2446 UWORD32 value; 2447 vui_t *ps_vui; 2448 buf_period_sei_params_t *ps_buf_period_sei_params; 2449 UWORD32 i; 2450 hrd_params_t *ps_vui_hdr; 2451 UWORD32 u4_cpb_cnt; 2452 2453 ps_vui = &ps_sps->s_vui_parameters; 2454 ps_vui_hdr = &ps_vui->s_vui_hrd_parameters; 2455 2456 ps_buf_period_sei_params = &ps_parse->s_sei_params.s_buf_period_sei_params; 2457 2458 ps_parse->s_sei_params.i1_buf_period_params_present_flag = 1; 2459 2460 UEV_PARSE("bp_seq_parameter_set_id", value, ps_bitstrm); 2461 if(value > MAX_SPS_CNT - 2) 2462 { 2463 return IHEVCD_INVALID_PARAMETER; 2464 } 2465 ps_buf_period_sei_params->u1_bp_seq_parameter_set_id = value; 2466 2467 if(!ps_vui_hdr->u1_sub_pic_cpb_params_present_flag) 2468 { 2469 BITS_PARSE("irap_cpb_params_present_flag", value, ps_bitstrm, 1); 2470 ps_buf_period_sei_params->u1_rap_cpb_params_present_flag = value; 2471 } 2472 2473 if(ps_buf_period_sei_params->u1_rap_cpb_params_present_flag) 2474 { 2475 BITS_PARSE("cpb_delay_offset", 2476 value, 2477 ps_bitstrm, 2478 (ps_vui_hdr->u1_au_cpb_removal_delay_length_minus1 2479 + 1)); 2480 ps_buf_period_sei_params->u4_cpb_delay_offset = value; 2481 2482 BITS_PARSE("dpb_delay_offset", 2483 value, 2484 ps_bitstrm, 2485 (ps_vui_hdr->u1_dpb_output_delay_length_minus1 2486 + 1)); 2487 ps_buf_period_sei_params->u4_dpb_delay_offset = value; 2488 } 2489 else 2490 { 2491 ps_buf_period_sei_params->u4_cpb_delay_offset = 0; 2492 ps_buf_period_sei_params->u4_dpb_delay_offset = 0; 2493 } 2494 2495 BITS_PARSE("concatenation_flag", value, ps_bitstrm, 1); 2496 ps_buf_period_sei_params->u1_concatenation_flag = value; 2497 2498 BITS_PARSE("au_cpb_removal_delay_delta_minus1", 2499 value, 2500 ps_bitstrm, 2501 (ps_vui_hdr->u1_au_cpb_removal_delay_length_minus1 2502 + 1)); 2503 ps_buf_period_sei_params->u4_au_cpb_removal_delay_delta_minus1 = value; 2504 2505 if(ps_vui_hdr->u1_nal_hrd_parameters_present_flag) 2506 { 2507 u4_cpb_cnt = ps_vui_hdr->au1_cpb_cnt_minus1[0]; 2508 2509 for(i = 0; i <= u4_cpb_cnt; i++) 2510 { 2511 BITS_PARSE("nal_initial_cpb_removal_delay[i]", 2512 value, 2513 ps_bitstrm, 2514 (ps_vui_hdr->u1_initial_cpb_removal_delay_length_minus1 2515 + 1)); 2516 ps_buf_period_sei_params->au4_nal_initial_cpb_removal_delay[i] = 2517 value; 2518 2519 BITS_PARSE("nal_initial_cpb_removal_delay_offset", 2520 value, 2521 ps_bitstrm, 2522 (ps_vui_hdr->u1_initial_cpb_removal_delay_length_minus1 2523 + 1)); 2524 ps_buf_period_sei_params->au4_nal_initial_cpb_removal_delay_offset[i] = 2525 value; 2526 2527 if(ps_vui_hdr->u1_sub_pic_cpb_params_present_flag 2528 || ps_buf_period_sei_params->u1_rap_cpb_params_present_flag) 2529 { 2530 BITS_PARSE("nal_initial_alt_cpb_removal_delay[i]", 2531 value, 2532 ps_bitstrm, 2533 (ps_vui_hdr->u1_initial_cpb_removal_delay_length_minus1 2534 + 1)); 2535 ps_buf_period_sei_params->au4_nal_initial_alt_cpb_removal_delay[i] = 2536 value; 2537 2538 BITS_PARSE("nal_initial_alt_cpb_removal_delay_offset", 2539 value, 2540 ps_bitstrm, 2541 (ps_vui_hdr->u1_initial_cpb_removal_delay_length_minus1 2542 + 1)); 2543 ps_buf_period_sei_params->au4_nal_initial_alt_cpb_removal_delay_offset[i] = 2544 value; 2545 } 2546 } 2547 } 2548 2549 if(ps_vui_hdr->u1_vcl_hrd_parameters_present_flag) 2550 { 2551 u4_cpb_cnt = ps_vui_hdr->au1_cpb_cnt_minus1[0]; 2552 2553 for(i = 0; i <= u4_cpb_cnt; i++) 2554 { 2555 BITS_PARSE("vcl_initial_cpb_removal_delay[i]", 2556 value, 2557 ps_bitstrm, 2558 (ps_vui_hdr->u1_initial_cpb_removal_delay_length_minus1 2559 + 1)); 2560 ps_buf_period_sei_params->au4_vcl_initial_cpb_removal_delay[i] = 2561 value; 2562 2563 BITS_PARSE("vcl_initial_cpb_removal_delay_offset", 2564 value, 2565 ps_bitstrm, 2566 (ps_vui_hdr->u1_initial_cpb_removal_delay_length_minus1 2567 + 1)); 2568 ps_buf_period_sei_params->au4_vcl_initial_cpb_removal_delay_offset[i] = 2569 value; 2570 2571 if(ps_vui_hdr->u1_sub_pic_cpb_params_present_flag 2572 || ps_buf_period_sei_params->u1_rap_cpb_params_present_flag) 2573 { 2574 BITS_PARSE("vcl_initial_alt_cpb_removal_delay[i]", 2575 value, 2576 ps_bitstrm, 2577 (ps_vui_hdr->u1_initial_cpb_removal_delay_length_minus1 2578 + 1)); 2579 ps_buf_period_sei_params->au4_vcl_initial_alt_cpb_removal_delay[i] = 2580 value; 2581 2582 BITS_PARSE("vcl_initial_alt_cpb_removal_delay_offset", 2583 value, 2584 ps_bitstrm, 2585 (ps_vui_hdr->u1_initial_cpb_removal_delay_length_minus1 2586 + 1)); 2587 ps_buf_period_sei_params->au4_vcl_initial_alt_cpb_removal_delay_offset[i] = 2588 value; 2589 } 2590 } 2591 } 2592 2593 return (IHEVCD_ERROR_T)IHEVCD_SUCCESS; 2594 } 2595 2596 IHEVCD_ERROR_T ihevcd_parse_pic_timing_sei(codec_t *ps_codec, sps_t *ps_sps) 2597 { 2598 parse_ctxt_t *ps_parse = &ps_codec->s_parse; 2599 bitstrm_t *ps_bitstrm = &ps_parse->s_bitstrm; 2600 UWORD32 value; 2601 vui_t *ps_vui; 2602 UWORD32 i; 2603 hrd_params_t *ps_vui_hdr; 2604 UWORD32 u4_cpb_dpb_delays_present_flag = 0; 2605 pic_timing_sei_params_t *ps_pic_timing; 2606 2607 ps_pic_timing = &ps_parse->s_sei_params.s_pic_timing_sei_params; 2608 ps_vui = &ps_sps->s_vui_parameters; 2609 ps_vui_hdr = &ps_vui->s_vui_hrd_parameters; 2610 ps_parse->s_sei_params.i1_pic_timing_params_present_flag = 1; 2611 if(ps_vui->u1_frame_field_info_present_flag) 2612 { 2613 BITS_PARSE("pic_struct", value, ps_bitstrm, 4); 2614 ps_pic_timing->u4_pic_struct = value; 2615 2616 BITS_PARSE("source_scan_type", value, ps_bitstrm, 2); 2617 ps_pic_timing->u4_source_scan_type = value; 2618 2619 BITS_PARSE("duplicate_flag", value, ps_bitstrm, 1); 2620 ps_pic_timing->u1_duplicate_flag = value; 2621 } 2622 2623 if(ps_vui_hdr->u1_nal_hrd_parameters_present_flag 2624 || ps_vui_hdr->u1_vcl_hrd_parameters_present_flag) 2625 { 2626 u4_cpb_dpb_delays_present_flag = 1; 2627 } 2628 else 2629 { 2630 u4_cpb_dpb_delays_present_flag = 0; 2631 } 2632 2633 if(u4_cpb_dpb_delays_present_flag) 2634 { 2635 BITS_PARSE("au_cpb_removal_delay_minus1", value, ps_bitstrm, 2636 (ps_vui_hdr->u1_au_cpb_removal_delay_length_minus1 + 1)); 2637 ps_pic_timing->u4_au_cpb_removal_delay_minus1 = value; 2638 2639 BITS_PARSE("pic_dpb_output_delay", value, ps_bitstrm, 2640 (ps_vui_hdr->u1_dpb_output_delay_length_minus1 + 1)); 2641 ps_pic_timing->u4_pic_dpb_output_delay = value; 2642 2643 if(ps_vui_hdr->u1_sub_pic_cpb_params_present_flag) 2644 { 2645 BITS_PARSE("pic_dpb_output_du_delay", value, ps_bitstrm, 2646 (ps_vui_hdr->u1_dpb_output_delay_du_length_minus1 + 1)); 2647 ps_pic_timing->u4_pic_dpb_output_du_delay = value; 2648 } 2649 2650 if(ps_vui_hdr->u1_sub_pic_cpb_params_present_flag 2651 && ps_vui_hdr->u1_sub_pic_cpb_params_in_pic_timing_sei_flag) 2652 { 2653 UWORD32 num_units_minus1; 2654 UWORD32 array_size; 2655 2656 UEV_PARSE("num_decoding_units_minus1", value, ps_bitstrm); 2657 if(value > (ps_sps->i4_pic_size_in_ctb -1)) 2658 { 2659 return IHEVCD_INVALID_PARAMETER; 2660 } 2661 ps_pic_timing->u4_num_decoding_units_minus1 = value; 2662 2663 num_units_minus1 = ps_pic_timing->u4_num_decoding_units_minus1; 2664 array_size = (sizeof(ps_pic_timing->au4_num_nalus_in_du_minus1) 2665 / sizeof(ps_pic_timing->au4_num_nalus_in_du_minus1[0])); 2666 num_units_minus1 = CLIP3(num_units_minus1, 0,(array_size - 1)); 2667 ps_pic_timing->u4_num_decoding_units_minus1 = num_units_minus1; 2668 2669 BITS_PARSE("du_common_cpb_removal_delay_flag", value, ps_bitstrm, 1); 2670 ps_pic_timing->u1_du_common_cpb_removal_delay_flag = value; 2671 2672 if(ps_pic_timing->u1_du_common_cpb_removal_delay_flag) 2673 { 2674 BITS_PARSE("du_common_cpb_removal_delay_increment_minus1", 2675 value, 2676 ps_bitstrm, 2677 (ps_vui_hdr->u1_du_cpb_removal_delay_increment_length_minus1 2678 + 1)); 2679 ps_pic_timing->u4_du_common_cpb_removal_delay_increment_minus1 = 2680 value; 2681 } 2682 2683 for(i = 0; i <= ps_pic_timing->u4_num_decoding_units_minus1; i++) 2684 { 2685 UEV_PARSE("num_nalus_in_du_minus1", value, ps_bitstrm); 2686 if(value > (ps_sps->i4_pic_size_in_ctb -1)) 2687 { 2688 return IHEVCD_INVALID_PARAMETER; 2689 } 2690 ps_pic_timing->au4_num_nalus_in_du_minus1[i] = value; 2691 2692 if((!ps_pic_timing->u1_du_common_cpb_removal_delay_flag) 2693 && (i < ps_pic_timing->u4_num_decoding_units_minus1)) 2694 { 2695 BITS_PARSE("du_common_cpb_removal_delay_increment_minus1", 2696 value, 2697 ps_bitstrm, 2698 (ps_vui_hdr->u1_du_cpb_removal_delay_increment_length_minus1 2699 + 1)); 2700 ps_pic_timing->au4_du_cpb_removal_delay_increment_minus1[i] = 2701 value; 2702 } 2703 } 2704 } 2705 } 2706 2707 return (IHEVCD_ERROR_T)IHEVCD_SUCCESS; 2708 } 2709 2710 IHEVCD_ERROR_T ihevcd_parse_time_code_sei(codec_t *ps_codec) 2711 { 2712 parse_ctxt_t *ps_parse = &ps_codec->s_parse; 2713 bitstrm_t *ps_bitstrm = &ps_parse->s_bitstrm; 2714 UWORD32 value; 2715 time_code_t *ps_time_code; 2716 WORD32 i; 2717 2718 ps_parse->s_sei_params.i1_time_code_present_flag = 1; 2719 ps_time_code = &ps_parse->s_sei_params.s_time_code; 2720 2721 BITS_PARSE("num_clock_ts", value, ps_bitstrm, 2); 2722 ps_time_code->u1_num_clock_ts = value; 2723 2724 for(i = 0; i < ps_time_code->u1_num_clock_ts; i++) 2725 { 2726 BITS_PARSE("clock_timestamp_flag[i]", value, ps_bitstrm, 1); 2727 ps_time_code->au1_clock_timestamp_flag[i] = value; 2728 2729 if(ps_time_code->au1_clock_timestamp_flag[i]) 2730 { 2731 BITS_PARSE("units_field_based_flag[i]", value, ps_bitstrm, 1); 2732 ps_time_code->au1_units_field_based_flag[i] = value; 2733 2734 BITS_PARSE("counting_type[i]", value, ps_bitstrm, 5); 2735 ps_time_code->au1_counting_type[i] = value; 2736 2737 BITS_PARSE("full_timestamp_flag[i]", value, ps_bitstrm, 1); 2738 ps_time_code->au1_full_timestamp_flag[i] = value; 2739 2740 BITS_PARSE("discontinuity_flag[i]", value, ps_bitstrm, 1); 2741 ps_time_code->au1_discontinuity_flag[i] = value; 2742 2743 BITS_PARSE("cnt_dropped_flag[i]", value, ps_bitstrm, 1); 2744 ps_time_code->au1_cnt_dropped_flag[i] = value; 2745 2746 BITS_PARSE("n_frames[i]", value, ps_bitstrm, 9); 2747 ps_time_code->au2_n_frames[i] = value; 2748 2749 if(ps_time_code->au1_full_timestamp_flag[i]) 2750 { 2751 BITS_PARSE("seconds_value[i]", value, ps_bitstrm, 6); 2752 ps_time_code->au1_seconds_value[i] = value; 2753 2754 BITS_PARSE("minutes_value[i]", value, ps_bitstrm, 6); 2755 ps_time_code->au1_minutes_value[i] = value; 2756 2757 BITS_PARSE("hours_value[i]", value, ps_bitstrm, 5); 2758 ps_time_code->au1_hours_value[i] = value; 2759 } 2760 else 2761 { 2762 BITS_PARSE("seconds_flag[i]", value, ps_bitstrm, 1); 2763 ps_time_code->au1_seconds_flag[i] = value; 2764 2765 if(ps_time_code->au1_seconds_flag[i]) 2766 { 2767 BITS_PARSE("seconds_value[i]", value, ps_bitstrm, 6); 2768 ps_time_code->au1_seconds_value[i] = value; 2769 2770 BITS_PARSE("minutes_flag[i]", value, ps_bitstrm, 1); 2771 ps_time_code->au1_minutes_flag[i] = value; 2772 2773 if(ps_time_code->au1_minutes_flag[i]) 2774 { 2775 BITS_PARSE("minutes_value[i]", value, ps_bitstrm, 6); 2776 ps_time_code->au1_minutes_value[i] = value; 2777 2778 BITS_PARSE("hours_flag[i]", value, ps_bitstrm, 1); 2779 ps_time_code->au1_hours_flag[i] = value; 2780 2781 if(ps_time_code->au1_hours_flag[i]) 2782 { 2783 BITS_PARSE("hours_value[i]", value, ps_bitstrm, 5); 2784 ps_time_code->au1_hours_value[i] = value; 2785 } 2786 } 2787 } 2788 } 2789 2790 BITS_PARSE("time_offset_length[i]", value, ps_bitstrm, 5); 2791 ps_time_code->au1_time_offset_length[i] = value; 2792 2793 if(ps_time_code->au1_time_offset_length[i] > 0) 2794 { 2795 BITS_PARSE("time_offset_value[i]", value, ps_bitstrm, 2796 ps_time_code->au1_time_offset_length[i]); 2797 ps_time_code->au1_time_offset_value[i] = value; 2798 } 2799 else 2800 { 2801 ps_time_code->au1_time_offset_value[i] = 0; 2802 } 2803 } 2804 } 2805 2806 return (IHEVCD_ERROR_T)IHEVCD_SUCCESS; 2807 } 2808 2809 IHEVCD_ERROR_T ihevcd_parse_mastering_disp_params_sei(codec_t *ps_codec) 2810 { 2811 parse_ctxt_t *ps_parse = &ps_codec->s_parse; 2812 bitstrm_t *ps_bitstrm = &ps_parse->s_bitstrm; 2813 UWORD32 value; 2814 mastering_dis_col_vol_sei_params_t *ps_mastering_dis_col_vol; 2815 WORD32 i; 2816 2817 ps_parse->s_sei_params.i4_sei_mastering_disp_colour_vol_params_present_flags = 1; 2818 2819 ps_mastering_dis_col_vol = &ps_parse->s_sei_params.s_mastering_dis_col_vol_sei_params; 2820 2821 for(i = 0; i < 3; i++) 2822 { 2823 BITS_PARSE("display_primaries_x[c]", value, ps_bitstrm, 16); 2824 ps_mastering_dis_col_vol->au2_display_primaries_x[i] = value; 2825 2826 BITS_PARSE("display_primaries_y[c]", value, ps_bitstrm, 16); 2827 ps_mastering_dis_col_vol->au2_display_primaries_y[i] = value; 2828 } 2829 2830 BITS_PARSE("white_point_x", value, ps_bitstrm, 16); 2831 ps_mastering_dis_col_vol->u2_white_point_x = value; 2832 2833 BITS_PARSE("white_point_y", value, ps_bitstrm, 16); 2834 ps_mastering_dis_col_vol->u2_white_point_y = value; 2835 2836 BITS_PARSE("max_display_mastering_luminance", value, ps_bitstrm, 32); 2837 ps_mastering_dis_col_vol->u4_max_display_mastering_luminance = value; 2838 2839 BITS_PARSE("min_display_mastering_luminance", value, ps_bitstrm, 32); 2840 ps_mastering_dis_col_vol->u4_min_display_mastering_luminance = value; 2841 2842 return (IHEVCD_ERROR_T)IHEVCD_SUCCESS; 2843 } 2844 2845 IHEVCD_ERROR_T ihevcd_parse_user_data_registered_itu_t_t35(codec_t *ps_codec, 2846 UWORD32 u4_payload_size) 2847 { 2848 parse_ctxt_t *ps_parse = &ps_codec->s_parse; 2849 bitstrm_t *ps_bitstrm = &ps_parse->s_bitstrm; 2850 UWORD32 value; 2851 user_data_registered_itu_t_t35_t *ps_user_data_registered_itu_t_t35; 2852 UWORD32 i; 2853 UWORD32 j = 0; 2854 2855 ps_parse->s_sei_params.i1_user_data_registered_present_flag = 1; 2856 ps_user_data_registered_itu_t_t35 = 2857 &ps_parse->s_sei_params.as_user_data_registered_itu_t_t35[ps_parse->s_sei_params.i4_sei_user_data_cnt]; 2858 ps_parse->s_sei_params.i4_sei_user_data_cnt++; 2859 2860 ps_user_data_registered_itu_t_t35->i4_payload_size = u4_payload_size; 2861 2862 if(u4_payload_size > MAX_USERDATA_PAYLOAD) 2863 { 2864 u4_payload_size = MAX_USERDATA_PAYLOAD; 2865 } 2866 2867 ps_user_data_registered_itu_t_t35->i4_valid_payload_size = u4_payload_size; 2868 2869 BITS_PARSE("itu_t_t35_country_code", value, ps_bitstrm, 8); 2870 ps_user_data_registered_itu_t_t35->u1_itu_t_t35_country_code = value; 2871 2872 if(0xFF != ps_user_data_registered_itu_t_t35->u1_itu_t_t35_country_code) 2873 { 2874 i = 1; 2875 } 2876 else 2877 { 2878 BITS_PARSE("itu_t_t35_country_code_extension_byte", value, ps_bitstrm, 2879 8); 2880 ps_user_data_registered_itu_t_t35->u1_itu_t_t35_country_code_extension_byte = 2881 value; 2882 2883 i = 2; 2884 } 2885 2886 do 2887 { 2888 BITS_PARSE("itu_t_t35_payload_byte", value, ps_bitstrm, 8); 2889 ps_user_data_registered_itu_t_t35->u1_itu_t_t35_payload_byte[j++] = 2890 value; 2891 2892 i++; 2893 }while(i < u4_payload_size); 2894 2895 return (IHEVCD_ERROR_T)IHEVCD_SUCCESS; 2896 } 2897 2898 void ihevcd_parse_sei_payload(codec_t *ps_codec, 2899 UWORD32 u4_payload_type, 2900 UWORD32 u4_payload_size, 2901 WORD8 i1_nal_type) 2902 { 2903 parse_ctxt_t *ps_parse = &ps_codec->s_parse; 2904 bitstrm_t *ps_bitstrm = &ps_parse->s_bitstrm; 2905 WORD32 payload_bits_remaining = 0; 2906 sps_t *ps_sps; 2907 2908 UWORD32 i; 2909 2910 for(i = 0; i < MAX_SPS_CNT; i++) 2911 { 2912 ps_sps = ps_codec->ps_sps_base + i; 2913 if(ps_sps->i1_sps_valid) 2914 { 2915 break; 2916 } 2917 } 2918 if(!ps_sps->i1_sps_valid) 2919 { 2920 return; 2921 } 2922 2923 if(NAL_PREFIX_SEI == i1_nal_type) 2924 { 2925 switch(u4_payload_type) 2926 { 2927 case SEI_BUFFERING_PERIOD: 2928 ps_parse->s_sei_params.i1_sei_parameters_present_flag = 1; 2929 ihevcd_parse_buffering_period_sei(ps_codec, ps_sps); 2930 break; 2931 2932 case SEI_PICTURE_TIMING: 2933 ps_parse->s_sei_params.i1_sei_parameters_present_flag = 1; 2934 ihevcd_parse_pic_timing_sei(ps_codec, ps_sps); 2935 break; 2936 2937 case SEI_TIME_CODE: 2938 ps_parse->s_sei_params.i1_sei_parameters_present_flag = 1; 2939 ihevcd_parse_time_code_sei(ps_codec); 2940 break; 2941 2942 case SEI_MASTERING_DISPLAY_COLOUR_VOLUME: 2943 ps_parse->s_sei_params.i4_sei_mastering_disp_colour_vol_params_present_flags = 1; 2944 ihevcd_parse_mastering_disp_params_sei(ps_codec); 2945 break; 2946 2947 case SEI_USER_DATA_REGISTERED_ITU_T_T35: 2948 ps_parse->s_sei_params.i1_sei_parameters_present_flag = 1; 2949 if(ps_parse->s_sei_params.i4_sei_user_data_cnt >= USER_DATA_MAX) 2950 { 2951 for(i = 0; i < u4_payload_size / 4; i++) 2952 { 2953 ihevcd_bits_flush(ps_bitstrm, 4 * 8); 2954 } 2955 2956 ihevcd_bits_flush(ps_bitstrm, (u4_payload_size - i * 4) * 8); 2957 } 2958 else 2959 { 2960 ihevcd_parse_user_data_registered_itu_t_t35(ps_codec, 2961 u4_payload_size); 2962 } 2963 break; 2964 2965 default: 2966 for(i = 0; i < u4_payload_size; i++) 2967 { 2968 ihevcd_bits_flush(ps_bitstrm, 8); 2969 } 2970 break; 2971 } 2972 } 2973 else /* NAL_SUFFIX_SEI */ 2974 { 2975 switch(u4_payload_type) 2976 { 2977 case SEI_USER_DATA_REGISTERED_ITU_T_T35: 2978 ps_parse->s_sei_params.i1_sei_parameters_present_flag = 1; 2979 if(ps_parse->s_sei_params.i4_sei_user_data_cnt >= USER_DATA_MAX) 2980 { 2981 for(i = 0; i < u4_payload_size / 4; i++) 2982 { 2983 ihevcd_bits_flush(ps_bitstrm, 4 * 8); 2984 } 2985 2986 ihevcd_bits_flush(ps_bitstrm, (u4_payload_size - i * 4) * 8); 2987 } 2988 else 2989 { 2990 ihevcd_parse_user_data_registered_itu_t_t35(ps_codec, 2991 u4_payload_size); 2992 } 2993 break; 2994 2995 default: 2996 for(i = 0; i < u4_payload_size; i++) 2997 { 2998 ihevcd_bits_flush(ps_bitstrm, 8); 2999 } 3000 break; 3001 } 3002 } 3003 3004 /** 3005 * By definition the underlying bitstream terminates in a byte-aligned manner. 3006 * 1. Extract all bar the last MIN(bitsremaining,nine) bits as reserved_payload_extension_data 3007 * 2. Examine the final 8 bits to determine the payload_bit_equal_to_one marker 3008 * 3. Extract the remainingreserved_payload_extension_data bits. 3009 * 3010 * If there are fewer than 9 bits available, extract them. 3011 */ 3012 3013 payload_bits_remaining = ihevcd_bits_num_bits_remaining(ps_bitstrm); 3014 if(payload_bits_remaining) /* more_data_in_payload() */ 3015 { 3016 WORD32 final_bits; 3017 WORD32 final_payload_bits = 0; 3018 WORD32 mask = 0xFF; 3019 UWORD32 u4_dummy; 3020 UWORD32 u4_reserved_payload_extension_data; 3021 UNUSED(u4_dummy); 3022 UNUSED(u4_reserved_payload_extension_data); 3023 3024 while(payload_bits_remaining > 9) 3025 { 3026 BITS_PARSE("reserved_payload_extension_data", 3027 u4_reserved_payload_extension_data, ps_bitstrm, 1); 3028 payload_bits_remaining--; 3029 } 3030 3031 final_bits = ihevcd_bits_nxt(ps_bitstrm, payload_bits_remaining); 3032 3033 while(final_bits & (mask >> final_payload_bits)) 3034 { 3035 final_payload_bits++; 3036 continue; 3037 } 3038 3039 while(payload_bits_remaining > (9 - final_payload_bits)) 3040 { 3041 BITS_PARSE("reserved_payload_extension_data", 3042 u4_reserved_payload_extension_data, ps_bitstrm, 1); 3043 payload_bits_remaining--; 3044 } 3045 3046 BITS_PARSE("payload_bit_equal_to_one", u4_dummy, ps_bitstrm, 1); 3047 payload_bits_remaining--; 3048 while(payload_bits_remaining) 3049 { 3050 BITS_PARSE("payload_bit_equal_to_zero", u4_dummy, ps_bitstrm, 1); 3051 payload_bits_remaining--; 3052 } 3053 } 3054 3055 return; 3056 } 3057 3058 IHEVCD_ERROR_T ihevcd_read_rbsp_trailing_bits(codec_t *ps_codec, 3059 UWORD32 u4_bits_left) 3060 { 3061 parse_ctxt_t *ps_parse = &ps_codec->s_parse; 3062 UWORD32 value; 3063 WORD32 cnt = 0; 3064 BITS_PARSE("rbsp_stop_one_bit", value, &ps_parse->s_bitstrm, 1); 3065 u4_bits_left--; 3066 if(value != 1) 3067 { 3068 return (IHEVCD_ERROR_T)IHEVCD_FAIL; 3069 } 3070 while(u4_bits_left) 3071 { 3072 BITS_PARSE("rbsp_alignment_zero_bit", value, &ps_parse->s_bitstrm, 1); 3073 u4_bits_left--; 3074 cnt++; 3075 } 3076 ASSERT(cnt < 8); 3077 3078 return (IHEVCD_ERROR_T)IHEVCD_SUCCESS; 3079 } 3080 /** 3081 ******************************************************************************* 3082 * 3083 * @brief 3084 * Parses SEI (Supplemental Enhancement Information) 3085 * 3086 * @par Description: 3087 * Parses SEI (Supplemental Enhancement Information) as per Section: 7.3.7 3088 * 3089 * @param[in] ps_codec 3090 * Pointer to codec context 3091 * 3092 * @returns Error code from IHEVCD_ERROR_T 3093 * 3094 * @remarks 3095 * 3096 * 3097 ******************************************************************************* 3098 */ 3099 IHEVCD_ERROR_T ihevcd_parse_sei(codec_t *ps_codec, nal_header_t *ps_nal) 3100 { 3101 IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS; 3102 parse_ctxt_t *ps_parse = &ps_codec->s_parse; 3103 UWORD32 u4_payload_type = 0, u4_last_payload_type_byte = 0; 3104 UWORD32 u4_payload_size = 0, u4_last_payload_size_byte = 0; 3105 UWORD32 value; 3106 bitstrm_t *ps_bitstrm = &ps_parse->s_bitstrm; 3107 UWORD32 u4_bits_left; 3108 3109 u4_bits_left = ihevcd_bits_num_bits_remaining(ps_bitstrm); 3110 3111 while(u4_bits_left > 8) 3112 { 3113 while(ihevcd_bits_nxt(ps_bitstrm, 8) == 0xFF) 3114 { 3115 ihevcd_bits_flush(ps_bitstrm, 8); /* equal to 0xFF */ 3116 u4_payload_type += 255; 3117 } 3118 3119 BITS_PARSE("last_payload_type_byte", value, ps_bitstrm, 8); 3120 u4_last_payload_type_byte = value; 3121 3122 u4_payload_type += u4_last_payload_type_byte; 3123 3124 while(ihevcd_bits_nxt(ps_bitstrm, 8) == 0xFF) 3125 { 3126 ihevcd_bits_flush(ps_bitstrm, 8); /* equal to 0xFF */ 3127 u4_payload_size += 255; 3128 } 3129 3130 BITS_PARSE("last_payload_size_byte", value, ps_bitstrm, 8); 3131 u4_last_payload_size_byte = value; 3132 3133 u4_payload_size += u4_last_payload_size_byte; 3134 u4_bits_left = ihevcd_bits_num_bits_remaining(ps_bitstrm); 3135 u4_payload_size = MIN(u4_payload_size, u4_bits_left / 8); 3136 ihevcd_parse_sei_payload(ps_codec, u4_payload_type, u4_payload_size, 3137 ps_nal->i1_nal_unit_type); 3138 3139 /* Calculate the bits left in the current payload */ 3140 u4_bits_left = ihevcd_bits_num_bits_remaining(ps_bitstrm); 3141 } 3142 3143 // read rbsp_trailing_bits 3144 if(u4_bits_left) 3145 { 3146 ihevcd_read_rbsp_trailing_bits(ps_codec, u4_bits_left); 3147 } 3148 3149 return ret; 3150 } 3151 3152 /** 3153 ******************************************************************************* 3154 * 3155 * @brief 3156 * Parses Access unit delimiter 3157 * 3158 * @par Description: 3159 * Parses Access unit delimiter as per section Section: 7.3.2.5 3160 * 3161 * @param[in] ps_codec 3162 * Pointer to codec context 3163 * 3164 * @returns Error code from IHEVCD_ERROR_T 3165 * 3166 * @remarks 3167 * 3168 * 3169 ******************************************************************************* 3170 */ 3171 WORD32 ihevcd_parse_aud(codec_t *ps_codec) 3172 { 3173 IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS; 3174 UNUSED(ps_codec); 3175 return ret; 3176 } 3177 3178 WORD32 ihevcd_extend_sign_bit(WORD32 value, WORD32 num_bits) 3179 { 3180 WORD32 ret_value = value; 3181 if(value >> (num_bits - 1)) 3182 { 3183 ret_value |= (0xFFFFFFFF << num_bits); 3184 } 3185 return ret_value; 3186 } 3187 3188 /** 3189 ******************************************************************************* 3190 * 3191 * @brief 3192 * Calculate POC of the current slice 3193 * 3194 * @par Description: 3195 * Calculates the current POC using the previous POC lsb and previous POC msb 3196 * 3197 * @param[in] ps_codec 3198 * Pointer to codec context 3199 * 3200 * @param[in] i1_pic_order_cnt_lsb 3201 * Current POC lsb 3202 * 3203 * @returns Current absolute POC 3204 * 3205 * @remarks 3206 * 3207 * 3208 ******************************************************************************* 3209 */ 3210 3211 WORD32 ihevcd_calc_poc(codec_t *ps_codec, nal_header_t *ps_nal, WORD8 i1_log2_max_poc_lsb, WORD32 i2_poc_lsb) 3212 { 3213 WORD32 i4_abs_poc, i4_poc_msb; 3214 WORD32 max_poc_lsb; 3215 WORD8 i1_nal_unit_type = ps_nal->i1_nal_unit_type; 3216 max_poc_lsb = (1 << i1_log2_max_poc_lsb); 3217 3218 if((!ps_codec->i4_first_pic_done) && (!ps_codec->i4_pic_present)) 3219 ps_codec->i4_prev_poc_msb = -2 * max_poc_lsb; 3220 3221 if(NAL_IDR_N_LP == i1_nal_unit_type 3222 || NAL_IDR_W_LP == i1_nal_unit_type 3223 || NAL_BLA_N_LP == i1_nal_unit_type 3224 || NAL_BLA_W_DLP == i1_nal_unit_type 3225 || NAL_BLA_W_LP == i1_nal_unit_type 3226 || (NAL_CRA == i1_nal_unit_type && !ps_codec->i4_first_pic_done)) 3227 { 3228 i4_poc_msb = ps_codec->i4_prev_poc_msb + 2 * max_poc_lsb; 3229 ps_codec->i4_prev_poc_lsb = 0; 3230 ps_codec->i4_max_prev_poc_lsb = 0; 3231 // ps_codec->i4_prev_poc_msb = 0; 3232 } 3233 else 3234 { 3235 3236 if((i2_poc_lsb < ps_codec->i4_prev_poc_lsb) 3237 && ((ps_codec->i4_prev_poc_lsb - i2_poc_lsb) >= max_poc_lsb / 2)) 3238 { 3239 i4_poc_msb = ps_codec->i4_prev_poc_msb + max_poc_lsb; 3240 } 3241 else if((i2_poc_lsb > ps_codec->i4_prev_poc_lsb) 3242 && ((i2_poc_lsb - ps_codec->i4_prev_poc_lsb) > max_poc_lsb / 2)) 3243 { 3244 i4_poc_msb = ps_codec->i4_prev_poc_msb - max_poc_lsb; 3245 } 3246 else 3247 { 3248 i4_poc_msb = ps_codec->i4_prev_poc_msb; 3249 } 3250 3251 3252 } 3253 3254 i4_abs_poc = i4_poc_msb + i2_poc_lsb; 3255 ps_codec->i4_max_prev_poc_lsb = MAX(ps_codec->i4_max_prev_poc_lsb, i2_poc_lsb); 3256 3257 { 3258 WORD32 is_reference_nal = ((i1_nal_unit_type <= NAL_RSV_VCL_R15) && (i1_nal_unit_type % 2 != 0)) || ((i1_nal_unit_type >= NAL_BLA_W_LP) && (i1_nal_unit_type <= NAL_RSV_RAP_VCL23)); 3259 WORD32 update_prev_poc = ((is_reference_nal) && ((i1_nal_unit_type < NAL_RADL_N) || (i1_nal_unit_type > NAL_RASL_R))); 3260 3261 if((0 == ps_nal->i1_nuh_temporal_id) && 3262 (update_prev_poc)) 3263 { 3264 ps_codec->i4_prev_poc_lsb = i2_poc_lsb; 3265 ps_codec->i4_prev_poc_msb = i4_poc_msb; 3266 } 3267 } 3268 3269 return i4_abs_poc; 3270 } 3271 3272 3273 void ihevcd_copy_slice_hdr(codec_t *ps_codec, WORD32 slice_idx, WORD32 slice_idx_ref) 3274 { 3275 slice_header_t *ps_slice_hdr, *ps_slice_hdr_ref; 3276 WORD32 *pu4_entry_offset_backup; 3277 3278 ps_slice_hdr = ps_codec->s_parse.ps_slice_hdr_base + slice_idx; 3279 ps_slice_hdr_ref = ps_codec->s_parse.ps_slice_hdr_base + slice_idx_ref; 3280 3281 pu4_entry_offset_backup = ps_slice_hdr->pu4_entry_point_offset; 3282 memcpy(ps_slice_hdr, ps_slice_hdr_ref, sizeof(slice_header_t)); 3283 ps_slice_hdr->pu4_entry_point_offset = pu4_entry_offset_backup; 3284 } 3285 3286 3287 3288