1 /* /////////////////////////////////////////////////////////////////////// 2 // 3 // INTEL CORPORATION PROPRIETARY INFORMATION 4 // This software is supplied under the terms of a license agreement or 5 // nondisclosure agreement with Intel Corporation and may not be copied 6 // or disclosed except in accordance with the terms of that agreement. 7 // Copyright (c) 2001-2006 Intel Corporation. All Rights Reserved. 8 // 9 // Description: h264 parser 10 // 11 ///////////////////////////////////////////////////////////////////////*/ 12 13 14 #include "h264.h" 15 #include "h264parse.h" 16 #include "h264parse_dpb.h" 17 18 19 /* ------------------------------------------------------------------------------------------ */ 20 /* ------------------------------------------------------------------------------------------ */ 21 /* ------------------------------------------------------------------------------------------ */ 22 23 24 25 h264_Status h264_Scaling_List(void *parent, uint8_t *scalingList, int32_t sizeOfScalingList, uint8_t *UseDefaultScalingMatrix, h264_Info* pInfo) 26 { 27 int32_t j, scanj; 28 int32_t delta_scale, lastScale, nextScale; 29 30 #if 0 31 const uint8_t ZZ_SCAN[16] = 32 { 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15 33 }; 34 35 const uint8_t ZZ_SCAN8[64] = 36 { 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 37 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 38 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 39 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63 40 }; 41 #endif 42 43 lastScale = 8; 44 nextScale = 8; 45 scanj = 0; 46 47 for(j=0; j<sizeOfScalingList; j++) 48 { 49 //scanj = (sizeOfScalingList==16)?ZZ_SCAN[j]:ZZ_SCAN8[j]; 50 51 if(nextScale!=0) 52 { 53 delta_scale = h264_GetVLCElement(parent, pInfo, true); 54 nextScale = (lastScale + delta_scale + 256) % 256; 55 *UseDefaultScalingMatrix = (uint8_t) (scanj==0 && nextScale==0); 56 } 57 58 scalingList[scanj] = (nextScale==0) ? lastScale:nextScale; 59 lastScale = scalingList[scanj]; 60 scanj ++; 61 } 62 63 return H264_STATUS_OK; 64 } 65 66 /* ------------------------------------------------------------------------------------------ */ 67 /* ------------------------------------------------------------------------------------------ */ 68 /* ------------------------------------------------------------------------------------------ */ 69 70 h264_Status h264_active_par_set(h264_Info*pInfo,h264_Slice_Header_t* SliceHeader) 71 { 72 //h264_Slice_Header_t* SliceHeader = &pInfo->SliceHeader; 73 74 /////////////////////////////////////////////////// 75 // Reload SPS/PPS while 76 // 1) Start of Frame (in case of context switch) 77 // 2) PPS id changed 78 /////////////////////////////////////////////////// 79 if((SliceHeader->first_mb_in_slice == 0) || (SliceHeader->pic_parameter_id != pInfo->active_PPS.pic_parameter_set_id)) 80 { 81 #ifndef WIN32 82 h264_Parse_Copy_Pps_From_DDR(pInfo, &pInfo->active_PPS, SliceHeader->pic_parameter_id); 83 84 if(pInfo->active_PPS.seq_parameter_set_id >= MAX_NUM_SPS) 85 { 86 return H264_PPS_INVALID_PIC_ID; /// Invalid PPS detected 87 } 88 89 if(pInfo->active_PPS.seq_parameter_set_id != pInfo->active_SPS.seq_parameter_set_id) 90 { 91 pInfo->Is_SPS_updated =1; 92 h264_Parse_Copy_Sps_From_DDR(pInfo, &pInfo->active_SPS, pInfo->active_PPS.seq_parameter_set_id); 93 h264_Parse_Clear_Sps_Updated_Flag(pInfo, pInfo->active_PPS.seq_parameter_set_id); 94 } 95 else 96 { 97 if(h264_Parse_Check_Sps_Updated_Flag(pInfo, pInfo->active_PPS.seq_parameter_set_id)) 98 { 99 pInfo->Is_SPS_updated =1; 100 h264_Parse_Copy_Sps_From_DDR(pInfo, &pInfo->active_SPS, pInfo->active_PPS.seq_parameter_set_id); 101 h264_Parse_Clear_Sps_Updated_Flag(pInfo, pInfo->active_PPS.seq_parameter_set_id); 102 } 103 } 104 105 #else 106 pInfo->active_PPS = PPS_GL[SliceHeader->pic_parameter_id]; 107 pInfo->active_SPS = SPS_GL[pInfo->active_PPS.seq_parameter_set_id]; 108 #endif 109 110 if(pInfo->active_SPS.seq_parameter_set_id >= MAX_NUM_SPS) 111 { 112 return H264_PPS_INVALID_PIC_ID; //// Invalid SPS detected 113 } 114 } 115 else { 116 if((pInfo->active_PPS.seq_parameter_set_id >= MAX_NUM_SPS) || (pInfo->active_SPS.seq_parameter_set_id >= MAX_NUM_SPS)) 117 { 118 return H264_PPS_INVALID_PIC_ID; /// Invalid PPS detected 119 } 120 } 121 122 123 pInfo->img.PicWidthInMbs = (pInfo->active_SPS.sps_disp.pic_width_in_mbs_minus1 + 1); 124 //pInfo->img.PicHeightInMapUnits = (pInfo->active_SPS.sps_disp.pic_height_in_map_units_minus1 + 1); 125 pInfo->img.FrameHeightInMbs = pInfo->active_SPS.sps_disp.frame_mbs_only_flag? \ 126 (pInfo->active_SPS.sps_disp.pic_height_in_map_units_minus1 + 1): \ 127 ((pInfo->active_SPS.sps_disp.pic_height_in_map_units_minus1 + 1)<<1); 128 129 130 return H264_STATUS_OK; 131 }; //// End of h264_active_par_set 132 133 /* ------------------------------------------------------------------------------------------ */ 134 /* ------------------------------------------------------------------------------------------ */ 135 /* ------------------------------------------------------------------------------------------ */ 136 137 ////////////////////////////////////////////////// 138 // Parse slice header info 139 ////////////////////////////////////////////////// 140 h264_Status h264_Parse_Slice_Layer_Without_Partitioning_RBSP(void *parent, h264_Info* pInfo, h264_Slice_Header_t *SliceHeader) 141 { 142 h264_Status retStatus = H264_STATUS_ERROR; 143 144 //////////////////////////////////////////////////// 145 //// Parse slice header info 146 //// Part1: not depend on the active PPS/SPS 147 //// Part2/3: depend on the active parset 148 ////////////////////////////////////////////////// 149 150 //retStatus = h264_Parse_Slice_Header_1(pInfo); 151 152 SliceHeader->sh_error = 0; 153 154 if(h264_Parse_Slice_Header_1(parent, pInfo, SliceHeader) == H264_STATUS_OK) 155 { 156 ////////////////////////////////////////// 157 //// Active parameter set for this slice 158 ////////////////////////////////////////// 159 retStatus = h264_active_par_set(pInfo, SliceHeader); 160 } 161 162 if(retStatus == H264_STATUS_OK) { 163 switch(pInfo->active_SPS.profile_idc) 164 { 165 case h264_ProfileBaseline: 166 case h264_ProfileMain: 167 case h264_ProfileExtended: 168 pInfo->active_PPS.transform_8x8_mode_flag=0; 169 pInfo->active_PPS.pic_scaling_matrix_present_flag =0; 170 pInfo->active_PPS.second_chroma_qp_index_offset = pInfo->active_PPS.chroma_qp_index_offset; 171 172 default: 173 break; 174 } 175 176 if( h264_Parse_Slice_Header_2(parent, pInfo, SliceHeader) != H264_STATUS_OK) 177 { 178 SliceHeader->sh_error |= 2; 179 } 180 else if( h264_Parse_Slice_Header_3(parent, pInfo, SliceHeader) != H264_STATUS_OK) 181 { 182 SliceHeader->sh_error |= 4; 183 } 184 185 } else { 186 SliceHeader->sh_error |= 1; 187 } 188 189 190 //if(SliceHeader->sh_error) { 191 //pInfo->wl_err_flag |= VIDDEC_FW_WORKLOAD_ERR_NOTDECODABLE; 192 //} 193 194 195 196 ////////////////////////////////// 197 //// Parse slice data (MB loop) 198 ////////////////////////////////// 199 //retStatus = h264_Parse_Slice_Data(pInfo); 200 { 201 //uint32_t data = 0; 202 //if( viddec_pm_peek_bits(parent, &data, 32) == -1) 203 //retStatus = H264_STATUS_ERROR; 204 } 205 //h264_Parse_rbsp_trailing_bits(pInfo); 206 207 return retStatus; 208 } 209 210 211 212 /* ------------------------------------------------------------------------------------------ */ 213 /* ------------------------------------------------------------------------------------------ */ 214 /* ------------------------------------------------------------------------------------------ */ 215 216 h264_Status h264_Parse_NAL_Unit(void *parent, h264_Info* pInfo, uint8_t *nal_ref_idc) 217 { 218 h264_Status ret = H264_STATUS_ERROR; 219 220 //h264_NAL_Unit_t* NAL = &pInfo->NAL; 221 uint32_t code; 222 #if 0 223 viddec_pm_get_bits(void * parent,uint32_t * data,uint32_t num_bits)(parent, &code, 24); 224 viddec_pm_get_bits(parent, &code, 1); //forbidden_zero_bit 225 226 viddec_pm_get_bits(parent, &code, 2); 227 SliceHeader->nal_ref_idc = (uint8_t)code; 228 229 viddec_pm_get_bits(parent, &code, 5); 230 pInfo->nal_unit_type = (uint8_t)code; 231 #else 232 #ifdef VBP 233 if( viddec_pm_get_bits(parent, &code, 8) != -1) 234 #else 235 //// 24bit SC, 1 bit: forbidden_zero_bit, 2 bitrs: nal_ref_idc, 5 bits: nal_unit_type 236 if( viddec_pm_get_bits(parent, &code, 32) != -1) 237 #endif 238 { 239 *nal_ref_idc = (uint8_t)((code>>5)&0x3); 240 pInfo->nal_unit_type = (uint8_t)((code>>0)&0x1f); 241 ret = H264_STATUS_OK; 242 } 243 #endif 244 245 return ret; 246 } 247 248 249 /* ------------------------------------------------------------------------------------------ */ 250 /* ------------------------------------------------------------------------------------------ */ 251 /* ------------------------------------------------------------------------------------------ */ 252 253 /*! 254 ************************************************************************ 255 * \brief 256 * set defaults for old_slice 257 * NAL unit of a picture" 258 ************************************************************************ 259 */ 260 #ifndef INT_MAX 261 #define INT_MAX 0xFFFFFFFF 262 #endif 263 264 #ifndef UINT_MAX 265 #define UINT_MAX 0x7FFFFFFF 266 #endif 267 268 void h264_init_old_slice(h264_Info* pInfo) 269 { 270 pInfo->SliceHeader.field_pic_flag = 0; 271 272 pInfo->SliceHeader.pic_parameter_id = 0xFF; 273 274 pInfo->SliceHeader.frame_num = INT_MAX; 275 276 pInfo->SliceHeader.nal_ref_idc = 0xFF; 277 278 pInfo->SliceHeader.idr_flag = 0; 279 280 pInfo->SliceHeader.pic_order_cnt_lsb = UINT_MAX; 281 pInfo->SliceHeader.delta_pic_order_cnt_bottom = INT_MAX; 282 283 pInfo->SliceHeader.delta_pic_order_cnt[0] = INT_MAX; 284 pInfo->SliceHeader.delta_pic_order_cnt[1] = INT_MAX; 285 286 return; 287 } 288 289 290 void h264_init_img(h264_Info* pInfo) 291 { 292 h264_memset(&(pInfo->img), 0x0, sizeof(h264_img_par) ); 293 294 295 return; 296 } 297 298 299 void h264_init_sps_pps(struct h264_viddec_parser* parser, uint32_t *persist_mem) 300 { 301 int32_t i; 302 303 h264_Info * pInfo = &(parser->info); 304 305 parser->sps_pps_ddr_paddr = (uint32_t)persist_mem; 306 307 pInfo->SPS_PADDR_GL = parser->sps_pps_ddr_paddr; 308 pInfo->PPS_PADDR_GL = pInfo->SPS_PADDR_GL + MAX_NUM_SPS * sizeof(seq_param_set_all); 309 pInfo->OFFSET_REF_FRAME_PADDR_GL = pInfo->PPS_PADDR_GL + MAX_NUM_PPS * sizeof(pic_param_set); 310 pInfo->TMP_OFFSET_REFFRM_PADDR_GL = pInfo->OFFSET_REF_FRAME_PADDR_GL + 311 MAX_NUM_SPS * sizeof(int32_t) * MAX_NUM_REF_FRAMES_IN_PIC_ORDER_CNT_CYCLE; 312 313 h264_memset( &(pInfo->active_SPS), 0x0, sizeof(seq_param_set_used) ); 314 h264_memset( &(pInfo->active_PPS), 0x0, sizeof(pic_param_set) ); 315 316 /* Global for SPS & PPS */ 317 for(i=0;i<MAX_NUM_SPS;i++) 318 { 319 pInfo->active_SPS.seq_parameter_set_id = 0xff; 320 h264_Parse_Copy_Sps_To_DDR (pInfo, &(pInfo->active_SPS), i); 321 } 322 for(i=0;i<MAX_NUM_PPS;i++) 323 { 324 pInfo->active_PPS.seq_parameter_set_id = 0xff; 325 h264_Parse_Copy_Pps_To_DDR (pInfo, &(pInfo->active_PPS), i); 326 } 327 328 pInfo->active_SPS.seq_parameter_set_id = 0xff; 329 pInfo->sps_valid = 0; 330 pInfo->got_start = 0; 331 332 return; 333 } 334 335 336 void h264_init_Info_under_sps_pps_level(h264_Info* pInfo) 337 { 338 int32_t i=0; 339 340 h264_memset( &(pInfo->dpb), 0x0, sizeof(h264_DecodedPictureBuffer) ); 341 h264_memset( &(pInfo->SliceHeader), 0x0, sizeof(h264_Slice_Header_t) ); 342 h264_memset( &(pInfo->old_slice), 0x0, sizeof(OldSliceParams) ); 343 h264_memset( &(pInfo->sei_information), 0x0, sizeof(sei_info) ); 344 h264_memset( &(pInfo->img), 0x0, sizeof(h264_img_par) ); 345 346 pInfo->h264_list_replacement = 0; 347 348 pInfo->h264_pwt_start_byte_offset = 0; 349 pInfo->h264_pwt_start_bit_offset = 0; 350 pInfo->h264_pwt_end_byte_offset = 0; 351 pInfo->h264_pwt_end_bit_offset = 0; 352 pInfo->h264_pwt_enabled = 0; 353 354 for(i=0;i<32;i++) 355 { 356 pInfo->slice_ref_list0[i] = 0; 357 pInfo->slice_ref_list1[i] = 0; 358 } 359 360 pInfo->qm_present_list = 0; 361 362 pInfo->nal_unit_type = 0; 363 pInfo->old_nal_unit_type = 0xff; 364 365 pInfo->push_to_cur = 0; 366 pInfo->Is_first_frame_in_stream = 1; 367 pInfo->Is_SPS_updated = 0; 368 pInfo->number_of_first_au_info_nal_before_first_slice = 0; 369 370 pInfo->is_frame_boundary_detected_by_non_slice_nal = 0; 371 pInfo->is_frame_boundary_detected_by_slice_nal = 0; 372 pInfo->is_current_workload_done = 0; 373 374 pInfo->sei_rp_received = 0; 375 pInfo->last_I_frame_idc = 255; 376 pInfo->wl_err_curr = 0; 377 pInfo->wl_err_next = 0; 378 379 pInfo->primary_pic_type_plus_one = 0; 380 pInfo->sei_b_state_ready = 0; 381 382 /* Init old slice structure */ 383 h264_init_old_slice(pInfo); 384 385 /* init_dpb */ 386 h264_init_dpb(&(pInfo->dpb)); 387 388 /* init_sei */ 389 h264_sei_stream_initialise(pInfo); 390 391 } 392 393 void h264_init_Info(h264_Info* pInfo) 394 { 395 h264_memset(pInfo, 0x0, sizeof(h264_Info)); 396 397 pInfo->old_nal_unit_type = 0xff; 398 399 pInfo->Is_first_frame_in_stream =1; 400 pInfo->img.frame_count = 0; 401 pInfo->last_I_frame_idc = 255; 402 403 return; 404 } 405 406 /* ------------------------------------------------------------------------------------------ */ 407 /* ------------------------------------------------------------------------------------------ */ 408 /* ------------------------------------------------------------------------------------------ */ 409 410 ///////////////////////////////////////////////////// 411 // 412 // Judge whether it is the first VCL of a new picture 413 // 414 ///////////////////////////////////////////////////// 415 int32_t h264_is_second_field(h264_Info * pInfo) 416 { 417 h264_Slice_Header_t cur_slice = pInfo->SliceHeader; 418 OldSliceParams old_slice = pInfo->old_slice; 419 420 int result = 0; 421 422 //pInfo->img.second_field = 0; 423 424 /// is it second field? 425 426 //OS_INFO( "xxx is_used = %d\n", pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].is_used); 427 428 if (cur_slice.structure != FRAME) 429 { 430 if( ( MPD_DPB_FS_NULL_IDC != pInfo->dpb.fs_dec_idc)&&(3 != viddec_h264_get_is_used(&(pInfo->dpb.fs[pInfo->dpb.fs_dec_idc])) ) 431 &&(0 != viddec_h264_get_is_used(&(pInfo->dpb.fs[pInfo->dpb.fs_dec_idc])) )) 432 { 433 if ((cur_slice.frame_num == old_slice.frame_num)||(cur_slice.idr_flag)) 434 { 435 436 if(old_slice.structure != cur_slice.structure) 437 { 438 439 if (((cur_slice.structure == TOP_FIELD &&old_slice.structure == BOTTOM_FIELD) || // Condition 1: 440 (old_slice.structure == TOP_FIELD && cur_slice.structure == BOTTOM_FIELD)) && \ 441 ((old_slice.nal_ref_idc ==0 && cur_slice.nal_ref_idc == 0) || // Condition 2: 442 (old_slice.nal_ref_idc !=0 &&cur_slice.nal_ref_idc != 0))) 443 { 444 //pInfo->img.second_field = 1; 445 result = 1; 446 } 447 } 448 } 449 450 451 } 452 453 454 } 455 456 457 458 return result; 459 460 } //// End of h264_is_second_field 461 462 463 464 /* ------------------------------------------------------------------------------------------ */ 465 /* ------------------------------------------------------------------------------------------ */ 466 /* ------------------------------------------------------------------------------------------ */ 467 468 int32_t h264_is_new_picture_start(h264_Info * pInfo, h264_Slice_Header_t cur_slice, h264_Slice_Header_t old_slice) 469 { 470 int result = 0; 471 472 if(pInfo->number_of_first_au_info_nal_before_first_slice) 473 { 474 pInfo->number_of_first_au_info_nal_before_first_slice = 0; 475 return 1; 476 } 477 478 479 480 result |= (old_slice.pic_parameter_id != cur_slice.pic_parameter_id); 481 result |= (old_slice.frame_num != cur_slice.frame_num); 482 result |= (old_slice.field_pic_flag != cur_slice.field_pic_flag); 483 if(cur_slice.field_pic_flag && old_slice.field_pic_flag) 484 { 485 result |= (old_slice.bottom_field_flag != cur_slice.bottom_field_flag); 486 } 487 488 result |= (old_slice.nal_ref_idc != cur_slice.nal_ref_idc) && \ 489 ((old_slice.nal_ref_idc == 0) || (cur_slice.nal_ref_idc == 0)); 490 result |= ( old_slice.idr_flag != cur_slice.idr_flag); 491 492 if (cur_slice.idr_flag && old_slice.idr_flag) 493 { 494 result |= (old_slice.idr_pic_id != cur_slice.idr_pic_id); 495 } 496 497 if (pInfo->active_SPS.pic_order_cnt_type == 0) 498 { 499 result |= (old_slice.pic_order_cnt_lsb != cur_slice.pic_order_cnt_lsb); 500 result |= (old_slice.delta_pic_order_cnt_bottom != cur_slice.delta_pic_order_cnt_bottom); 501 } 502 503 if (pInfo->active_SPS.pic_order_cnt_type == 1) 504 { 505 result |= (old_slice.delta_pic_order_cnt[0] != cur_slice.delta_pic_order_cnt[0]); 506 result |= (old_slice.delta_pic_order_cnt[1] != cur_slice.delta_pic_order_cnt[1]); 507 } 508 509 return result; 510 } 511 512 513 int32_t h264_check_previous_frame_end(h264_Info * pInfo) 514 { 515 int result = 0; 516 517 if( (h264_NAL_UNIT_TYPE_SLICE==pInfo->old_nal_unit_type)||(h264_NAL_UNIT_TYPE_IDR==pInfo->old_nal_unit_type) ) 518 { 519 520 switch ( pInfo->nal_unit_type ) 521 { 522 case h264_NAL_UNIT_TYPE_Acc_unit_delimiter: 523 case h264_NAL_UNIT_TYPE_SPS: 524 case h264_NAL_UNIT_TYPE_PPS: 525 case h264_NAL_UNIT_TYPE_SEI: 526 case h264_NAL_UNIT_TYPE_EOSeq: 527 case h264_NAL_UNIT_TYPE_EOstream: 528 case h264_NAL_UNIT_TYPE_Reserved1: 529 case h264_NAL_UNIT_TYPE_Reserved2: 530 case h264_NAL_UNIT_TYPE_Reserved3: 531 case h264_NAL_UNIT_TYPE_Reserved4: 532 case h264_NAL_UNIT_TYPE_Reserved5: 533 { 534 pInfo->img.current_slice_num = 0; 535 536 if((pInfo->img.structure == FRAME) || (pInfo->img.second_field)) { 537 pInfo->is_frame_boundary_detected_by_non_slice_nal =1; 538 pInfo->is_current_workload_done=1; 539 result=1; 540 } 541 break; 542 } 543 default: 544 break; 545 } 546 547 } 548 549 return result; 550 551 } 552 553 554 555 556 /* ------------------------------------------------------------------------------------------ */ 557 /* ------------------------------------------------------------------------------------------ */ 558 /* ------------------------------------------------------------------------------------------ */ 559 560 ////////////////////////////////////////////////////////////// 561 // 1) Update old slice structure for frame boundary detection 562 ////////////////////////////////////////////////////////////// 563 void h264_update_old_slice(h264_Info * pInfo,h264_Slice_Header_t next_SliceHeader) 564 { 565 pInfo->old_slice.pic_parameter_id = pInfo->SliceHeader.pic_parameter_id; 566 567 pInfo->old_slice.frame_num = pInfo->SliceHeader.frame_num; 568 569 pInfo->old_slice.field_pic_flag = pInfo->SliceHeader.field_pic_flag; 570 571 if(pInfo->SliceHeader.field_pic_flag) 572 { 573 pInfo->old_slice.bottom_field_flag = pInfo->SliceHeader.bottom_field_flag; 574 } 575 576 pInfo->old_slice.nal_ref_idc = pInfo->SliceHeader.nal_ref_idc; 577 578 pInfo->old_slice.structure = pInfo->SliceHeader.structure; 579 580 pInfo->old_slice.idr_flag = pInfo->SliceHeader.idr_flag; 581 if (pInfo->SliceHeader.idr_flag) 582 { 583 pInfo->old_slice.idr_pic_id = pInfo->SliceHeader.idr_pic_id; 584 } 585 586 if (pInfo->active_SPS.pic_order_cnt_type == 0) 587 { 588 pInfo->old_slice.pic_order_cnt_lsb = pInfo->SliceHeader.pic_order_cnt_lsb; 589 pInfo->old_slice.delta_pic_order_cnt_bottom = pInfo->SliceHeader.delta_pic_order_cnt_bottom; 590 } 591 592 if (pInfo->active_SPS.pic_order_cnt_type == 1) 593 { 594 pInfo->old_slice.delta_pic_order_cnt[0] = pInfo->SliceHeader.delta_pic_order_cnt[0]; 595 pInfo->old_slice.delta_pic_order_cnt[1] = pInfo->SliceHeader.delta_pic_order_cnt[1]; 596 } 597 598 ////////////////////////////// Next to current 599 memcpy(&pInfo->SliceHeader, &next_SliceHeader, sizeof(h264_Slice_Header_t)); 600 601 return; 602 } 603 604 /* ------------------------------------------------------------------------------------------ */ 605 /* ------------------------------------------------------------------------------------------ */ 606 /* ------------------------------------------------------------------------------------------ */ 607 608 ////////////////////////////////////////////////////////////////////////////// 609 // Initialization for new picture 610 ////////////////////////////////////////////////////////////////////////////// 611 void h264_update_img_info(h264_Info * pInfo ) 612 { 613 h264_DecodedPictureBuffer *p_dpb = &pInfo->dpb; 614 615 pInfo->img.frame_num = pInfo->SliceHeader.frame_num; 616 pInfo->img.structure = pInfo->SliceHeader.structure; 617 618 pInfo->img.field_pic_flag = pInfo->SliceHeader.field_pic_flag; 619 pInfo->img.bottom_field_flag = pInfo->SliceHeader.bottom_field_flag; 620 621 pInfo->img.MbaffFrameFlag = pInfo->active_SPS.sps_disp.mb_adaptive_frame_field_flag & (!(pInfo->SliceHeader.field_pic_flag)); 622 pInfo->img.pic_order_cnt_type = pInfo->active_SPS.pic_order_cnt_type; 623 624 if(pInfo->img.pic_order_cnt_type == 1) { 625 pInfo->img.num_ref_frames_in_pic_order_cnt_cycle = pInfo->active_SPS.num_ref_frames_in_pic_order_cnt_cycle; 626 pInfo->img.delta_pic_order_always_zero_flag = pInfo->active_SPS.delta_pic_order_always_zero_flag; 627 pInfo->img.offset_for_non_ref_pic = pInfo->active_SPS.offset_for_non_ref_pic; 628 pInfo->img.offset_for_top_to_bottom_field = pInfo->active_SPS.offset_for_top_to_bottom_field; 629 } 630 631 pInfo->img.pic_order_cnt_lsb = pInfo->SliceHeader.pic_order_cnt_lsb; 632 //pInfo->img.pic_order_cnt_msb = pInfo->SliceHeader.pic_order_cnt_msb; 633 pInfo->img.delta_pic_order_cnt_bottom = pInfo->SliceHeader.delta_pic_order_cnt_bottom; 634 pInfo->img.delta_pic_order_cnt[0] = pInfo->SliceHeader.delta_pic_order_cnt[0]; 635 pInfo->img.delta_pic_order_cnt[1] = pInfo->SliceHeader.delta_pic_order_cnt[1]; 636 637 638 pInfo->img.PreviousFrameNum = pInfo->old_slice.frame_num; 639 640 pInfo->img.no_output_of_prior_pics_flag = pInfo->SliceHeader.sh_dec_refpic.no_output_of_prior_pics_flag; 641 642 ////////////////////////////////////////////////// Check SEI recovery point 643 if (pInfo->sei_information.recovery_point) { 644 int32_t MaxFrameNum = 1 << (pInfo->active_SPS.log2_max_frame_num_minus4 + 4); 645 pInfo->sei_information.recovery_frame_num = (pInfo->img.frame_num + pInfo->sei_information.recovery_frame_cnt) % MaxFrameNum; 646 } 647 648 if (pInfo->SliceHeader.idr_flag) 649 pInfo->sei_information.recovery_frame_num = pInfo->img.frame_num; 650 651 652 653 /////////////////////////////////////////////////Resolution Change 654 pInfo->img.curr_has_mmco_5 = 0; 655 656 if ( (pInfo->img.PicWidthInMbs != p_dpb->PicWidthInMbs)|| 657 (pInfo->img.FrameHeightInMbs != p_dpb->FrameHeightInMbs) ) 658 { 659 int32_t no_output_old_pics = (pInfo->SliceHeader.idr_flag)? pInfo->img.no_output_of_prior_pics_flag : 0; 660 661 // If resolution changed, reset the soft DPB here 662 h264_dpb_reset_dpb(pInfo, pInfo->img.PicWidthInMbs, pInfo->img.FrameHeightInMbs, 1, no_output_old_pics); 663 } 664 665 return; 666 667 } ///// End of init new frame 668 669 670 void h264_update_frame_type(h264_Info * pInfo ) 671 { 672 673 //update frame type 674 if(pInfo->img.structure == FRAME) 675 { 676 if(pInfo->nal_unit_type == h264_NAL_UNIT_TYPE_IDR) 677 { 678 pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type = (0x1 << FRAME_TYPE_STRUCTRUE_OFFSET)|(FRAME_TYPE_IDR << FRAME_TYPE_FRAME_OFFSET); 679 //pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type = 0xff; 680 //pInfo->dpb.fs[0].pic_type = pInfo->dpb.fs_dec_idc; 681 682 } 683 else 684 { 685 #if 1 686 switch(pInfo->SliceHeader.slice_type) 687 { 688 case h264_PtypeB: 689 pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type = (0x1 << FRAME_TYPE_STRUCTRUE_OFFSET)|(FRAME_TYPE_B << FRAME_TYPE_FRAME_OFFSET); 690 break; 691 case h264_PtypeSP: 692 case h264_PtypeP: 693 if( ((pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type) & (0x7 << FRAME_TYPE_FRAME_OFFSET))>>FRAME_TYPE_FRAME_OFFSET != FRAME_TYPE_B) 694 pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type = (0x1 << FRAME_TYPE_STRUCTRUE_OFFSET)|(FRAME_TYPE_P << FRAME_TYPE_FRAME_OFFSET); 695 break; 696 case h264_PtypeI: 697 case h264_PtypeSI: 698 if( ((pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type) & (0x7 << FRAME_TYPE_FRAME_OFFSET))>>FRAME_TYPE_FRAME_OFFSET == FRAME_TYPE_INVALID) 699 { 700 pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type = (0x1 << FRAME_TYPE_STRUCTRUE_OFFSET)|(FRAME_TYPE_I << FRAME_TYPE_FRAME_OFFSET); 701 } 702 pInfo->last_I_frame_idc = pInfo->dpb.fs_dec_idc; 703 704 break; 705 default: 706 break; 707 708 } 709 #endif 710 711 } 712 713 } 714 else if(pInfo->img.structure == TOP_FIELD) 715 { 716 if(pInfo->nal_unit_type == h264_NAL_UNIT_TYPE_IDR) 717 { 718 pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type = (FRAME_TYPE_IDR << FRAME_TYPE_TOP_OFFSET)|(pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type & (0x7 << FRAME_TYPE_BOTTOM_OFFSET));; 719 } 720 else 721 { 722 switch(pInfo->SliceHeader.slice_type) 723 { 724 case h264_PtypeB: 725 pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type = (FRAME_TYPE_B << FRAME_TYPE_TOP_OFFSET)|(pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type & (0x7 << FRAME_TYPE_BOTTOM_OFFSET)); 726 break; 727 case h264_PtypeSP: 728 case h264_PtypeP: 729 if( ((pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type) & (0x7 << FRAME_TYPE_TOP_OFFSET))>>FRAME_TYPE_TOP_OFFSET != FRAME_TYPE_B) 730 pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type = (FRAME_TYPE_P << FRAME_TYPE_TOP_OFFSET)|(pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type & (0x7 << FRAME_TYPE_BOTTOM_OFFSET)); 731 break; 732 case h264_PtypeI: 733 case h264_PtypeSI: 734 if( ((pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type) & (0x7 << FRAME_TYPE_TOP_OFFSET))>>FRAME_TYPE_TOP_OFFSET == FRAME_TYPE_INVALID) 735 { 736 pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type = (FRAME_TYPE_I << FRAME_TYPE_TOP_OFFSET)|(pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type & (0x7 << FRAME_TYPE_BOTTOM_OFFSET)); 737 } 738 break; 739 default: 740 break; 741 742 } 743 744 } 745 746 747 }else if(pInfo->img.structure == BOTTOM_FIELD) 748 { 749 if(pInfo->nal_unit_type == h264_NAL_UNIT_TYPE_IDR) 750 { 751 pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type = (FRAME_TYPE_IDR << FRAME_TYPE_BOTTOM_OFFSET)|(pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type & (0x7 << FRAME_TYPE_TOP_OFFSET));; 752 } 753 else 754 { 755 switch(pInfo->SliceHeader.slice_type) 756 { 757 case h264_PtypeB: 758 pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type = (FRAME_TYPE_B << FRAME_TYPE_BOTTOM_OFFSET)|(pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type & (0x7 << FRAME_TYPE_TOP_OFFSET)); 759 break; 760 case h264_PtypeSP: 761 case h264_PtypeP: 762 if( ((pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type) & (0x7 << FRAME_TYPE_BOTTOM_OFFSET))>>FRAME_TYPE_BOTTOM_OFFSET != FRAME_TYPE_B) 763 pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type = (FRAME_TYPE_P << FRAME_TYPE_BOTTOM_OFFSET)|(pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type & (0x7 << FRAME_TYPE_TOP_OFFSET)); 764 break; 765 case h264_PtypeI: 766 case h264_PtypeSI: 767 if( ((pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type) & (0x7 << FRAME_TYPE_BOTTOM_OFFSET))>>FRAME_TYPE_BOTTOM_OFFSET == FRAME_TYPE_INVALID) 768 { 769 pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type = (FRAME_TYPE_I << FRAME_TYPE_BOTTOM_OFFSET)|(pInfo->dpb.fs[pInfo->dpb.fs_dec_idc].pic_type & (0x7 << FRAME_TYPE_TOP_OFFSET)); 770 } 771 break; 772 default: 773 break; 774 775 } 776 777 } 778 779 } 780 return; 781 782 } 783 784 785 //////#endif ///////////// IFDEF H264_PARSE_C/////////////////// 786 787