1 /****************************************************************************** 2 * 3 * Copyright (C) 2015 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ***************************************************************************** 18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19 */ 20 /*! 21 ************************************************************************** 22 * \file ih264d_utils.c 23 * 24 * \brief 25 * Contains routines that handle of start and end of pic processing 26 * 27 * \date 28 * 19/12/2002 29 * 30 * \author AI 31 ************************************************************************** 32 */ 33 34 #include <string.h> 35 #include "ih264_typedefs.h" 36 #include "ithread.h" 37 #include "ih264d_deblocking.h" 38 #include "ih264d_parse_slice.h" 39 #include "ih264d_parse_cavlc.h" 40 #include "ih264d_dpb_manager.h" 41 #include "ih264d_defs.h" 42 #include "ih264d_structs.h" 43 #include "ih264d_mem_request.h" 44 #include "ih264_typedefs.h" 45 #include "ih264_macros.h" 46 #include "ih264_platform_macros.h" 47 #include "ih264d_tables.h" 48 #include "ih264d_debug.h" 49 #include "ih264d_mb_utils.h" 50 #include "ih264d_error_handler.h" 51 #include "ih264d_dpb_manager.h" 52 #include "ih264d_utils.h" 53 #include "ih264d_defs.h" 54 #include "ih264d_tables.h" 55 #include "ih264d_inter_pred.h" 56 #include "ih264d_dpb_manager.h" 57 #include "iv.h" 58 #include "ivd.h" 59 #include "ih264d_format_conv.h" 60 #include "ih264_error.h" 61 #include "ih264_disp_mgr.h" 62 #include "ih264_buf_mgr.h" 63 #include "ih264d_utils.h" 64 65 /*! 66 ************************************************************************** 67 * \if Function name : ih264d_is_end_of_pic \endif 68 * 69 * \brief 70 * Determines whether current slice is first slice of a new picture as 71 * defined in 7.4.1.2.4 of 14496-10. 72 * 73 * \return 74 * Return 1 if current slice is first slice of a new picture 75 * Otherwise it returns 0 76 ************************************************************************** 77 */ 78 UWORD8 ih264d_is_end_of_pic(UWORD16 u2_frame_num, 79 UWORD8 u1_nal_ref_idc, 80 pocstruct_t *ps_cur_poc, 81 pocstruct_t *ps_prev_poc, 82 dec_slice_params_t * ps_prev_slice, /*!< Previous slice parameters*/ 83 UWORD8 u1_pic_order_cnt_type, 84 UWORD8 u1_nal_unit_type, 85 UWORD32 u4_idr_pic_id, 86 UWORD8 u1_field_pic_flag, 87 UWORD8 u1_bottom_field_flag) 88 { 89 WORD8 i1_is_end_of_pic; 90 WORD8 a, b, c, d, e, f, g, h; 91 92 a = b = c = d = e = f = g = h = 0; 93 a = (ps_prev_slice->u2_frame_num != u2_frame_num); 94 b = (ps_prev_slice->u1_field_pic_flag != u1_field_pic_flag); 95 if(u1_field_pic_flag && ps_prev_slice->u1_field_pic_flag) 96 c = (u1_bottom_field_flag != ps_prev_slice->u1_bottom_field_flag); 97 d = 98 (u1_nal_ref_idc == 0 && ps_prev_slice->u1_nal_ref_idc != 0) 99 || (u1_nal_ref_idc != 0 100 && ps_prev_slice->u1_nal_ref_idc 101 == 0); 102 if(!a) 103 { 104 if((u1_pic_order_cnt_type == 0) 105 && (ps_prev_slice->u1_pic_order_cnt_type == 0)) 106 { 107 e = 108 ((ps_cur_poc->i4_pic_order_cnt_lsb 109 != ps_prev_poc->i4_pic_order_cnt_lsb) 110 || (ps_cur_poc->i4_delta_pic_order_cnt_bottom 111 != ps_prev_poc->i4_delta_pic_order_cnt_bottom)); 112 } 113 114 if((u1_pic_order_cnt_type == 1) 115 && (ps_prev_slice->u1_pic_order_cnt_type == 1)) 116 { 117 f = 118 ((ps_cur_poc->i4_delta_pic_order_cnt[0] 119 != ps_prev_poc->i4_delta_pic_order_cnt[0]) 120 || (ps_cur_poc->i4_delta_pic_order_cnt[1] 121 != ps_prev_poc->i4_delta_pic_order_cnt[1])); 122 } 123 } 124 125 if((u1_nal_unit_type == IDR_SLICE_NAL) 126 && (ps_prev_slice->u1_nal_unit_type == IDR_SLICE_NAL)) 127 { 128 g = (u4_idr_pic_id != ps_prev_slice->u4_idr_pic_id); 129 } 130 131 if((u1_nal_unit_type == IDR_SLICE_NAL) 132 && (ps_prev_slice->u1_nal_unit_type != IDR_SLICE_NAL)) 133 { 134 h = 1; 135 } 136 i1_is_end_of_pic = a + b + c + d + e + f + g + h; 137 return (i1_is_end_of_pic); 138 } 139 140 /*! 141 ************************************************************************** 142 * \if Function name : ih264d_decode_pic_order_cnt \endif 143 * 144 * \brief 145 * Calculates picture order count of picture. 146 * 147 * \return 148 * Returns the pic order count of the picture to which current 149 * Slice belongs. 150 * 151 ************************************************************************** 152 */ 153 WORD32 ih264d_decode_pic_order_cnt(UWORD8 u1_is_idr_slice, 154 UWORD32 u2_frame_num, 155 pocstruct_t *ps_prev_poc, 156 pocstruct_t *ps_cur_poc, 157 dec_slice_params_t *ps_cur_slice, /*!< Pointer to current slice Params*/ 158 dec_pic_params_t * ps_pps, 159 UWORD8 u1_nal_ref_idc, 160 UWORD8 u1_bottom_field_flag, 161 UWORD8 u1_field_pic_flag, 162 WORD32 *pi4_poc) 163 { 164 WORD16 i1_pic_msb; 165 WORD32 i4_top_field_order_cnt = 0, i4_bottom_field_order_cnt = 0; 166 dec_seq_params_t *ps_seq = ps_pps->ps_sps; 167 WORD32 i4_prev_frame_num_ofst; 168 169 switch(ps_seq->u1_pic_order_cnt_type) 170 { 171 case 0: 172 /* POC TYPE 0 */ 173 if(u1_is_idr_slice) 174 { 175 ps_prev_poc->i4_pic_order_cnt_msb = 0; 176 ps_prev_poc->i4_pic_order_cnt_lsb = 0; 177 } 178 if(ps_prev_poc->u1_mmco_equalto5) 179 { 180 if(ps_prev_poc->u1_bot_field != 1) 181 { 182 ps_prev_poc->i4_pic_order_cnt_msb = 0; 183 ps_prev_poc->i4_pic_order_cnt_lsb = 184 ps_prev_poc->i4_top_field_order_count; 185 } 186 else 187 { 188 ps_prev_poc->i4_pic_order_cnt_msb = 0; 189 ps_prev_poc->i4_pic_order_cnt_lsb = 0; 190 } 191 } 192 193 if((ps_cur_poc->i4_pic_order_cnt_lsb 194 < ps_prev_poc->i4_pic_order_cnt_lsb) 195 && ((ps_prev_poc->i4_pic_order_cnt_lsb 196 - ps_cur_poc->i4_pic_order_cnt_lsb) 197 >= (ps_seq->i4_max_pic_order_cntLsb 198 >> 1))) 199 { 200 i1_pic_msb = ps_prev_poc->i4_pic_order_cnt_msb 201 + ps_seq->i4_max_pic_order_cntLsb; 202 } 203 else if((ps_cur_poc->i4_pic_order_cnt_lsb 204 > ps_prev_poc->i4_pic_order_cnt_lsb) 205 && ((ps_cur_poc->i4_pic_order_cnt_lsb 206 - ps_prev_poc->i4_pic_order_cnt_lsb) 207 >= (ps_seq->i4_max_pic_order_cntLsb 208 >> 1))) 209 { 210 i1_pic_msb = ps_prev_poc->i4_pic_order_cnt_msb 211 - ps_seq->i4_max_pic_order_cntLsb; 212 } 213 else 214 { 215 i1_pic_msb = ps_prev_poc->i4_pic_order_cnt_msb; 216 } 217 218 if(!u1_field_pic_flag || !u1_bottom_field_flag) 219 i4_top_field_order_cnt = i1_pic_msb 220 + ps_cur_poc->i4_pic_order_cnt_lsb; 221 222 if(!u1_field_pic_flag) 223 { 224 i4_bottom_field_order_cnt = i4_top_field_order_cnt 225 + ps_cur_poc->i4_delta_pic_order_cnt_bottom; 226 } 227 else if(u1_bottom_field_flag) 228 { 229 i4_bottom_field_order_cnt = i1_pic_msb 230 + ps_cur_poc->i4_pic_order_cnt_lsb; 231 } 232 ps_cur_poc->i4_pic_order_cnt_msb = i1_pic_msb; 233 break; 234 235 case 1: 236 { 237 /* POC TYPE 1 */ 238 UWORD8 i; 239 WORD32 prev_frame_num; 240 WORD32 frame_num_ofst; 241 WORD32 abs_frm_num; 242 WORD32 poc_cycle_cnt, frame_num_in_poc_cycle; 243 WORD32 expected_delta_poc_cycle; 244 WORD32 expected_poc; 245 246 prev_frame_num = (WORD32)ps_cur_slice->u2_frame_num; 247 if(!u1_is_idr_slice) 248 { 249 if(ps_cur_slice->u1_mmco_equalto5) 250 { 251 prev_frame_num = 0; 252 i4_prev_frame_num_ofst = 0; 253 } 254 else 255 { 256 i4_prev_frame_num_ofst = ps_prev_poc->i4_prev_frame_num_ofst; 257 } 258 } 259 else 260 i4_prev_frame_num_ofst = 0; 261 262 /* 1. Derivation for FrameNumOffset */ 263 if(u1_is_idr_slice) 264 { 265 frame_num_ofst = 0; 266 ps_cur_poc->i4_delta_pic_order_cnt[0] = 0; 267 ps_cur_poc->i4_delta_pic_order_cnt[1] = 0; 268 } 269 else if(prev_frame_num > ((WORD32)u2_frame_num)) 270 { 271 frame_num_ofst = i4_prev_frame_num_ofst 272 + ps_seq->u2_u4_max_pic_num_minus1 + 1; 273 } 274 else 275 frame_num_ofst = i4_prev_frame_num_ofst; 276 277 /* 2. Derivation for absFrameNum */ 278 if(0 != ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle) 279 abs_frm_num = frame_num_ofst + u2_frame_num; 280 else 281 abs_frm_num = 0; 282 if((u1_nal_ref_idc == 0) && (abs_frm_num > 0)) 283 abs_frm_num = abs_frm_num - 1; 284 285 /* 4. expectedDeltaPerPicOrderCntCycle is derived as */ 286 expected_delta_poc_cycle = 0; 287 for(i = 0; i < ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle; 288 i++) 289 { 290 expected_delta_poc_cycle += 291 ps_seq->i4_ofst_for_ref_frame[i]; 292 } 293 294 /* 3. When absFrameNum > 0, picOrderCntCycleCnt and 295 frame_num_in_poc_cycle are derived as : */ 296 /* 5. expectedPicOrderCnt is derived as : */ 297 if(abs_frm_num > 0) 298 { 299 poc_cycle_cnt = 300 DIV((abs_frm_num - 1), 301 ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle); 302 frame_num_in_poc_cycle = 303 MOD((abs_frm_num - 1), 304 ps_seq->u1_num_ref_frames_in_pic_order_cnt_cycle); 305 306 expected_poc = poc_cycle_cnt 307 * expected_delta_poc_cycle; 308 for(i = 0; i <= frame_num_in_poc_cycle; i++) 309 { 310 expected_poc = expected_poc 311 + ps_seq->i4_ofst_for_ref_frame[i]; 312 } 313 } 314 else 315 expected_poc = 0; 316 317 if(u1_nal_ref_idc == 0) 318 { 319 expected_poc = expected_poc 320 + ps_seq->i4_ofst_for_non_ref_pic; 321 } 322 323 /* 6. TopFieldOrderCnt or BottomFieldOrderCnt are derived as */ 324 if(!u1_field_pic_flag) 325 { 326 i4_top_field_order_cnt = expected_poc 327 + ps_cur_poc->i4_delta_pic_order_cnt[0]; 328 i4_bottom_field_order_cnt = i4_top_field_order_cnt 329 + ps_seq->i4_ofst_for_top_to_bottom_field 330 + ps_cur_poc->i4_delta_pic_order_cnt[1]; 331 } 332 else if(!u1_bottom_field_flag) 333 { 334 i4_top_field_order_cnt = expected_poc 335 + ps_cur_poc->i4_delta_pic_order_cnt[0]; 336 } 337 else 338 { 339 i4_bottom_field_order_cnt = expected_poc 340 + ps_seq->i4_ofst_for_top_to_bottom_field 341 + ps_cur_poc->i4_delta_pic_order_cnt[0]; 342 } 343 /* Copy the current POC info into Previous POC structure */ 344 ps_cur_poc->i4_prev_frame_num_ofst = frame_num_ofst; 345 } 346 347 break; 348 case 2: 349 { 350 /* POC TYPE 2 */ 351 WORD32 prev_frame_num; 352 WORD32 frame_num_ofst; 353 WORD32 tmp_poc; 354 355 prev_frame_num = (WORD32)ps_cur_slice->u2_frame_num; 356 if(!u1_is_idr_slice) 357 { 358 if(ps_cur_slice->u1_mmco_equalto5) 359 { 360 prev_frame_num = 0; 361 i4_prev_frame_num_ofst = 0; 362 } 363 else 364 i4_prev_frame_num_ofst = ps_prev_poc->i4_prev_frame_num_ofst; 365 } 366 else 367 i4_prev_frame_num_ofst = 0; 368 369 /* 1. Derivation for FrameNumOffset */ 370 if(u1_is_idr_slice) 371 { 372 frame_num_ofst = 0; 373 ps_cur_poc->i4_delta_pic_order_cnt[0] = 0; 374 ps_cur_poc->i4_delta_pic_order_cnt[1] = 0; 375 } 376 else if(prev_frame_num > ((WORD32)u2_frame_num)) 377 { 378 frame_num_ofst = i4_prev_frame_num_ofst 379 + ps_seq->u2_u4_max_pic_num_minus1 + 1; 380 } 381 else 382 frame_num_ofst = i4_prev_frame_num_ofst; 383 384 /* 2. Derivation for tempPicOrderCnt */ 385 if(u1_is_idr_slice) 386 tmp_poc = 0; 387 else if(u1_nal_ref_idc == 0) 388 tmp_poc = ((frame_num_ofst + u2_frame_num) << 1) 389 - 1; 390 else 391 tmp_poc = ((frame_num_ofst + u2_frame_num) << 1); 392 393 /* 6. TopFieldOrderCnt or BottomFieldOrderCnt are derived as */ 394 if(!u1_field_pic_flag) 395 { 396 i4_top_field_order_cnt = tmp_poc; 397 i4_bottom_field_order_cnt = tmp_poc; 398 } 399 else if(!u1_bottom_field_flag) 400 i4_top_field_order_cnt = tmp_poc; 401 else 402 i4_bottom_field_order_cnt = tmp_poc; 403 404 /* Copy the current POC info into Previous POC structure */ 405 ps_prev_poc->i4_prev_frame_num_ofst = frame_num_ofst; 406 ps_cur_poc->i4_prev_frame_num_ofst = frame_num_ofst; 407 } 408 break; 409 default: 410 return ERROR_INV_POC_TYPE_T; 411 break; 412 } 413 414 if(!u1_field_pic_flag) // or a complementary field pair 415 { 416 *pi4_poc = MIN(i4_top_field_order_cnt, i4_bottom_field_order_cnt); 417 ps_pps->i4_top_field_order_cnt = i4_top_field_order_cnt; 418 ps_pps->i4_bottom_field_order_cnt = i4_bottom_field_order_cnt; 419 } 420 else if(!u1_bottom_field_flag) 421 { 422 *pi4_poc = i4_top_field_order_cnt; 423 ps_pps->i4_top_field_order_cnt = i4_top_field_order_cnt; 424 } 425 else 426 { 427 *pi4_poc = i4_bottom_field_order_cnt; 428 ps_pps->i4_bottom_field_order_cnt = i4_bottom_field_order_cnt; 429 } 430 431 ps_pps->i4_avg_poc = *pi4_poc; 432 433 return OK; 434 } 435 436 /*! 437 ************************************************************************** 438 * \if Function name : ih264d_end_of_pic_processing \endif 439 * 440 * \brief 441 * Performs the end of picture processing. 442 * 443 * It performs deblocking on the current picture and sets the i4_status of 444 * current picture as decoded. 445 * 446 * \return 447 * 0 on Success and Error code otherwise. 448 ************************************************************************** 449 */ 450 WORD32 ih264d_end_of_pic_processing(dec_struct_t *ps_dec) 451 { 452 UWORD8 u1_pic_type, u1_nal_ref_idc; 453 dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice; 454 WORD32 ret; 455 456 /* If nal_ref_idc is equal to 0 for one slice or slice data partition NAL 457 unit of a particular picture, it shall be equal to 0 for all slice and 458 slice data partition NAL units of the picture. nal_ref_idc greater 459 than 0 indicates that the content of the NAL unit belongs to a decoded 460 picture that is stored and marked for use as a reference picture in the 461 decoded picture buffer. */ 462 463 /* 1. Do MMCO 464 2. Add Cur Pic to list of reference pics. 465 */ 466 467 /* Call MMCO */ 468 u1_pic_type = 0; 469 u1_nal_ref_idc = ps_cur_slice->u1_nal_ref_idc; 470 471 if(u1_nal_ref_idc) 472 { 473 if(ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL) 474 { 475 if(ps_dec->ps_dpb_cmds->u1_long_term_reference_flag == 0) 476 { 477 ih264d_reset_ref_bufs(ps_dec->ps_dpb_mgr); 478 479 { 480 ret = ih264d_insert_st_node(ps_dec->ps_dpb_mgr, 481 ps_dec->ps_cur_pic, 482 ps_dec->u1_pic_buf_id, 483 ps_cur_slice->u2_frame_num); 484 if(ret != OK) 485 return ret; 486 } 487 } 488 else 489 { 490 /* Equivalent of inserting a pic directly as longterm Pic */ 491 492 { 493 ret = ih264d_insert_st_node(ps_dec->ps_dpb_mgr, 494 ps_dec->ps_cur_pic, 495 ps_dec->u1_pic_buf_id, 496 ps_cur_slice->u2_frame_num); 497 if(ret != OK) 498 return ret; 499 /* Set longTermIdx = 0, MaxLongTermFrameIdx = 0 */ 500 ret = ih264d_delete_st_node_or_make_lt( 501 ps_dec->ps_dpb_mgr, 502 ps_cur_slice->u2_frame_num, 0, 503 ps_cur_slice->u1_field_pic_flag); 504 if(ret != OK) 505 return ret; 506 ps_dec->ps_dpb_mgr->u1_max_lt_pic_idx_plus1 = 1; 507 } 508 } 509 } 510 else 511 { 512 513 { 514 UWORD16 u2_pic_num = ps_cur_slice->u2_frame_num; 515 516 517 518 ret = ih264d_do_mmco_buffer( 519 ps_dec->ps_dpb_cmds, ps_dec->ps_dpb_mgr, 520 ps_dec->ps_cur_sps->u1_num_ref_frames, 521 u2_pic_num, 522 (ps_dec->ps_cur_sps->u2_u4_max_pic_num_minus1), 523 ps_dec->u1_nal_unit_type, ps_dec->ps_cur_pic, 524 ps_dec->u1_pic_buf_id, 525 ps_cur_slice->u1_field_pic_flag, 526 ps_dec->e_dec_status); 527 if(ret != OK) 528 return ret; 529 } 530 } 531 ih264d_update_default_index_list(ps_dec->ps_dpb_mgr); 532 } 533 534 if(ps_cur_slice->u1_field_pic_flag) 535 { 536 if(ps_cur_slice->u1_bottom_field_flag) 537 { 538 if(u1_nal_ref_idc) 539 u1_pic_type = u1_pic_type | BOT_REF; 540 u1_pic_type = u1_pic_type | BOT_FLD; 541 } 542 else 543 { 544 if(u1_nal_ref_idc) 545 u1_pic_type = u1_pic_type | TOP_REF; 546 u1_pic_type = u1_pic_type | TOP_FLD; 547 } 548 } 549 else 550 u1_pic_type = TOP_REF | BOT_REF; 551 ps_dec->ps_cur_pic->u1_pic_type |= u1_pic_type; 552 553 #if ROW_ACCESSES_STAT 554 { 555 H264_DEC_DEBUG_PRINT("Row_Accesses_BeforeBB = %6d, Row_Accesses_AfterBB = %6d \n\n", 556 gui_Row_Accesses_BeforeBB, gui_Row_Accesses_AfterBB); 557 gui_Row_Accesses_BeforeBBTotal += gui_Row_Accesses_BeforeBB; 558 gui_Row_Accesses_AfterBBTotal += gui_Row_Accesses_AfterBB; 559 gui_Row_Accesses_AfterBB = 0; 560 gui_Row_Accesses_BeforeBB = 0; 561 } 562 #endif 563 564 if(ps_cur_slice->u1_field_pic_flag) 565 { 566 H264_DEC_DEBUG_PRINT("Toggling secondField\n"); 567 ps_dec->u1_second_field = 1 - ps_dec->u1_second_field; 568 } 569 570 return OK; 571 } 572 573 /*****************************************************************************/ 574 /* */ 575 /* Function Name : init_dpb_size */ 576 /* */ 577 /* Description : This function calculates the DBP i4_size in frames */ 578 /* Inputs : ps_seq - current sequence params */ 579 /* */ 580 /* Globals : None */ 581 /* */ 582 /* Outputs : None */ 583 /* */ 584 /* Returns : DPB in frames */ 585 /* */ 586 /* Issues : None */ 587 /* */ 588 /* Revision History: */ 589 /* */ 590 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 591 /* 28 04 2005 NS Draft */ 592 /* */ 593 /*****************************************************************************/ 594 WORD32 ih264d_get_dpb_size(dec_seq_params_t *ps_seq, dec_struct_t *ps_dec) 595 { 596 WORD32 i4_size; 597 UWORD8 u1_level_idc; 598 599 u1_level_idc = ps_seq->u1_level_idc; //harcode for the time being 600 u1_level_idc = MIN(u1_level_idc, ps_dec->u4_level_at_init); 601 602 switch(u1_level_idc) 603 { 604 case 10: 605 i4_size = 152064; 606 break; 607 case 11: 608 i4_size = 345600; 609 break; 610 case 12: 611 i4_size = 912384; 612 break; 613 case 13: 614 i4_size = 912384; 615 break; 616 case 20: 617 i4_size = 912384; 618 break; 619 case 21: 620 i4_size = 1824768; 621 break; 622 case 22: 623 i4_size = 3110400; 624 break; 625 case 30: 626 i4_size = 3110400; 627 break; 628 case 31: 629 i4_size = 6912000; 630 break; 631 case 32: 632 i4_size = 7864320; 633 break; 634 case 40: 635 i4_size = 12582912; 636 break; 637 case 41: 638 i4_size = 12582912; 639 break; 640 case 42: 641 i4_size = 12582912; 642 break; 643 case 50: 644 i4_size = 42393600; 645 break; 646 case 51: 647 i4_size = 70778880; 648 break; 649 case 52: 650 i4_size = 70778880; 651 break; 652 default: 653 i4_size = 70778880; 654 break; 655 } 656 657 i4_size /= (ps_seq->u2_frm_wd_in_mbs * (ps_seq->u2_frm_ht_in_mbs << (1 - ps_seq->u1_frame_mbs_only_flag))); 658 i4_size /= 384; 659 i4_size = MIN(i4_size, 16); 660 i4_size = MAX(i4_size, 1); 661 return (i4_size); 662 } 663 664 WORD32 ih264d_get_dpb_size_new(UWORD32 u4_level_idc, 665 UWORD32 u2_frm_wd_in_mbs, 666 UWORD32 u2_frm_ht_in_mbs) 667 { 668 669 UWORD32 i4_size = 0; 670 671 switch(u4_level_idc) 672 { 673 case 10: 674 i4_size = 152064; 675 break; 676 case 11: 677 i4_size = 345600; 678 break; 679 case 12: 680 i4_size = 912384; 681 break; 682 case 13: 683 i4_size = 912384; 684 break; 685 case 20: 686 i4_size = 912384; 687 break; 688 case 21: 689 i4_size = 1824768; 690 break; 691 case 22: 692 i4_size = 3110400; 693 break; 694 case 30: 695 i4_size = 3110400; 696 break; 697 case 31: 698 i4_size = 6912000; 699 break; 700 case 32: 701 i4_size = 7864320; 702 break; 703 case 40: 704 i4_size = 12582912; 705 break; 706 case 41: 707 i4_size = 12582912; 708 break; 709 case 42: 710 i4_size = 12582912; 711 break; 712 case 50: 713 i4_size = 42393600; 714 break; 715 case 51: 716 i4_size = 70778880; 717 break; 718 case 52: 719 i4_size = 70778880; 720 break; 721 default: 722 { 723 i4_size = 70778880; 724 } 725 break; 726 } 727 728 i4_size = i4_size / (u2_frm_wd_in_mbs * (u2_frm_ht_in_mbs)); 729 i4_size = (i4_size + 383) / 384; 730 i4_size = MIN(i4_size, 16); 731 i4_size = MAX(i4_size, 1); 732 return (i4_size); 733 } 734 735 /*****************************************************************************/ 736 /* */ 737 /* Function Name : ih264d_max_possible_ref_pics */ 738 /* */ 739 /* Description : This function returns the maximum number of */ 740 /* reference buffers corresponding to the current Level */ 741 /* in accordance to "Table A-1 Level limits" in standard. */ 742 /* Please refer to Annex A - Profiles and Levels */ 743 /* Maximum Number of reference buffers are derived from */ 744 /* the dbpsize and max_mbs_in frame given in the table */ 745 /* Inputs : level number */ 746 /* */ 747 /* Revision History: */ 748 /* */ 749 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 750 /* 19 05 2005 SWRN Draft */ 751 /* */ 752 /*****************************************************************************/ 753 754 UWORD8 ih264d_max_possible_ref_pics(UWORD8 u1_level) 755 { 756 switch(u1_level) 757 { 758 case H264_LEVEL_1_0: 759 return (MAX_REF_LEVEL_1_0); 760 case H264_LEVEL_1_1: 761 return (MAX_REF_LEVEL_1_1); 762 case H264_LEVEL_1_2: 763 return (MAX_REF_LEVEL_1_2); 764 case H264_LEVEL_1_3: 765 return (MAX_REF_LEVEL_1_3); 766 case H264_LEVEL_2_0: 767 return (MAX_REF_LEVEL_2_0); 768 case H264_LEVEL_2_1: 769 return (MAX_REF_LEVEL_2_1); 770 case H264_LEVEL_2_2: 771 return (MAX_REF_LEVEL_2_2); 772 case H264_LEVEL_3_0: 773 return (MAX_REF_LEVEL_3_0); 774 } 775 776 return (H264_MAX_REF_PICS); 777 } 778 779 /***************************************************************************/ 780 /* If change in Level or the required PicBuffers i4_size is more than the */ 781 /* current one FREE the current PicBuffers and allocate affresh */ 782 /***************************************************************************/ 783 UWORD8 ih264d_is_sps_changed(prev_seq_params_t * ps_prv, 784 dec_seq_params_t * ps_cur) 785 { 786 787 if((ps_prv->u2_frm_wd_in_mbs != ps_cur->u2_frm_wd_in_mbs) 788 || (ps_prv->u1_level_idc != ps_cur->u1_level_idc) 789 || (ps_prv->u1_profile_idc != ps_cur->u1_profile_idc) 790 || (ps_cur->u2_frm_ht_in_mbs != ps_prv->u2_frm_ht_in_mbs) 791 || (ps_cur->u1_frame_mbs_only_flag 792 != ps_prv->u1_frame_mbs_only_flag) 793 || (ps_cur->u1_direct_8x8_inference_flag 794 != ps_prv->u1_direct_8x8_inference_flag)) 795 return 1; 796 797 return 0; 798 } 799 800 /**************************************************************************/ 801 /* This function initialises the value of ps_dec->u1_recon_mb_grp */ 802 /* ps_dec->u1_recon_mb_grp must satisfy the following criteria */ 803 /* - multiple of 2 (required for N/2 parse-mvpred design) */ 804 /* - multiple of 4 (if it is not a frame_mbs_only sequence), */ 805 /* in this case N/2 itself needs to be even for mbpair processing */ 806 /* - lesser than ps_dec->u2_frm_wd_in_mbs/2 (at least 3 N-Chunks */ 807 /* should make a row to ensure proper MvTop transferring) */ 808 /**************************************************************************/ 809 WORD32 ih264d_init_dec_mb_grp(dec_struct_t *ps_dec) 810 { 811 dec_seq_params_t *ps_seq = ps_dec->ps_cur_sps; 812 UWORD8 u1_frm = ps_seq->u1_frame_mbs_only_flag; 813 814 ps_dec->u1_recon_mb_grp = PARSE_MB_GROUP_4; 815 816 //NMB set to width in MBs for non-mbaff cases 817 if(0 == ps_seq->u1_mb_aff_flag) 818 ps_dec->u1_recon_mb_grp = ps_dec->u2_frm_wd_in_mbs; 819 820 ps_dec->u1_recon_mb_grp_pair = ps_dec->u1_recon_mb_grp >> 1; 821 822 if(!ps_dec->u1_recon_mb_grp) 823 { 824 return ERROR_MB_GROUP_ASSGN_T; 825 } 826 827 ps_dec->u4_num_mbs_prev_nmb = ps_dec->u1_recon_mb_grp; 828 829 return OK; 830 } 831 832 /*! 833 ************************************************************************** 834 * \if Function name : ih264d_get_numbuf_dpb_bank \endif 835 * 836 * \brief 837 * Initializes the picture. 838 * 839 * \return 840 * 0 on Success and Error code otherwise 841 * 842 * \note 843 * This function is called when first slice of the 844 * NON -IDR picture is encountered. 845 ************************************************************************** 846 */ 847 WORD32 ih264d_get_numbuf_dpb_bank(dec_struct_t *ps_dec, UWORD32 u4_frame_wd, UWORD32 u4_frame_ht) 848 { 849 WORD32 i4_DPB_size; 850 WORD32 i4_pic_size; 851 WORD32 i4_num_buf_alloc; 852 UWORD32 Ysize; 853 UWORD32 UVsize; 854 UWORD32 one_frm_size; 855 856 857 i4_DPB_size = ps_dec->ps_mem_tab[MEM_REC_REF_PIC].u4_mem_size; 858 859 Ysize = u4_frame_wd * u4_frame_ht; 860 861 UVsize = Ysize >> 2; 862 863 { 864 if(ps_dec->u4_share_disp_buf == 1) 865 { 866 /* In case of buffers getting shared between application and library 867 there is no need of reference memtabs. Instead of setting the i4_size 868 to zero, it is reduced to a small i4_size to ensure that changes 869 in the code are minimal */ 870 if((ps_dec->u1_chroma_format == IV_YUV_420SP_UV) 871 || (ps_dec->u1_chroma_format == IV_YUV_420SP_VU) 872 || (ps_dec->u1_chroma_format == IV_YUV_420P)) 873 { 874 Ysize = 64; 875 } 876 if(ps_dec->u1_chroma_format == IV_YUV_420SP_UV) 877 { 878 UVsize = 64; 879 } 880 881 } 882 } 883 884 one_frm_size = (((Ysize + 127) >> 7) << 7) 885 + ((((UVsize << 1) + 127) >> 7) << 7); 886 i4_num_buf_alloc = i4_DPB_size / (one_frm_size); 887 888 return i4_num_buf_alloc; 889 } 890 891 /*! 892 ************************************************************************** 893 * \if Function name : ih264d_get_numbuf_mv_bank \endif 894 * 895 * \brief 896 * Computes number of MVbank buffers that can be allocated. 897 * 898 * \return 899 * Number of MV bank buffers that can be allocated. 900 * 901 * \note 902 ************************************************************************** 903 */ 904 UWORD32 ih264d_get_numbuf_mv_bank(dec_struct_t *ps_dec, UWORD32 width, 905 UWORD32 height) 906 { 907 UWORD32 u4_mv_bank_size,one_frame_size; 908 UWORD32 u4_num_buf_alloc; 909 910 u4_mv_bank_size = ps_dec->ps_mem_tab[MEM_REC_MVBANK].u4_mem_size; 911 one_frame_size = sizeof(mv_pred_t) 912 * ((width * (height + PAD_MV_BANK_ROW)) >> 4); 913 u4_num_buf_alloc = u4_mv_bank_size / one_frame_size; 914 return u4_num_buf_alloc; 915 } 916 /*! 917 ************************************************************************** 918 * \if Function name : ih264d_init_pic \endif 919 * 920 * \brief 921 * Initializes the picture. 922 * 923 * \return 924 * 0 on Success and Error code otherwise 925 * 926 * \note 927 * This function is called when first slice of the 928 * NON -IDR picture is encountered. 929 ************************************************************************** 930 */ 931 WORD32 ih264d_init_pic(dec_struct_t *ps_dec, 932 UWORD16 u2_frame_num, 933 WORD32 i4_poc, 934 dec_pic_params_t *ps_pps) 935 { 936 dec_seq_params_t *ps_seq = ps_pps->ps_sps; 937 prev_seq_params_t * ps_prev_seq_params = &ps_dec->s_prev_seq_params; 938 WORD32 i4_pic_bufs; 939 WORD32 ret; 940 941 ps_dec->ps_cur_slice->u2_frame_num = u2_frame_num; 942 ps_dec->ps_cur_slice->i4_poc = i4_poc; 943 ps_dec->ps_cur_pps = ps_pps; 944 ps_dec->ps_cur_pps->pv_codec_handle = ps_dec; 945 946 ps_dec->ps_cur_sps = ps_seq; 947 ps_dec->ps_dpb_mgr->i4_max_frm_num = ps_seq->u2_u4_max_pic_num_minus1 948 + 1; 949 950 ps_dec->ps_dpb_mgr->u2_pic_ht = ps_dec->u2_pic_ht; 951 ps_dec->ps_dpb_mgr->u2_pic_wd = ps_dec->u2_pic_wd; 952 ps_dec->i4_pic_type = -1; 953 ps_dec->i4_frametype = -1; 954 ps_dec->i4_content_type = -1; 955 956 /*--------------------------------------------------------------------*/ 957 /* Get the value of MaxMbAddress and frmheight in Mbs */ 958 /*--------------------------------------------------------------------*/ 959 ps_seq->u2_max_mb_addr = 960 (ps_seq->u2_frm_wd_in_mbs 961 * (ps_dec->u2_pic_ht 962 >> (4 963 + ps_dec->ps_cur_slice->u1_field_pic_flag))) 964 - 1; 965 ps_dec->u2_frm_ht_in_mbs = (ps_dec->u2_pic_ht 966 >> (4 + ps_dec->ps_cur_slice->u1_field_pic_flag)); 967 968 /***************************************************************************/ 969 /* If change in Level or the required PicBuffers i4_size is more than the */ 970 /* current one FREE the current PicBuffers and allocate affresh */ 971 /***************************************************************************/ 972 if(!ps_dec->u1_init_dec_flag 973 || ih264d_is_sps_changed(ps_prev_seq_params, ps_seq)) 974 { 975 976 977 ivd_video_decode_ip_t *ps_dec_in = ps_dec->pv_dec_in; 978 ivd_video_decode_op_t *ps_dec_out = ps_dec->pv_dec_out; 979 980 if(ps_dec->u4_share_disp_buf == 0) 981 { 982 i4_pic_bufs = ih264d_get_numbuf_dpb_bank(ps_dec, ps_dec->u2_frm_wd_y, 983 ps_dec->u2_frm_ht_y); 984 } 985 else 986 { 987 i4_pic_bufs = (WORD32)ps_dec->u4_num_disp_bufs; 988 } 989 990 ps_dec->u1_pic_bufs = CLIP_U8(i4_pic_bufs); 991 992 if(ps_dec->u4_share_disp_buf == 0) 993 ps_dec->u1_pic_bufs = MIN(ps_dec->u1_pic_bufs, 994 (H264_MAX_REF_PICS * 2)); 995 996 ps_dec->u1_max_dec_frame_buffering = ih264d_get_dpb_size(ps_seq, 997 ps_dec); 998 999 ps_dec->u1_max_dec_frame_buffering = MIN( 1000 ps_dec->u1_max_dec_frame_buffering, 1001 ps_dec->u4_num_ref_frames_at_init); 1002 ps_dec->u1_max_dec_frame_buffering = MIN( 1003 ps_dec->u1_max_dec_frame_buffering, 1004 ps_dec->u1_pic_bufs); 1005 1006 // ps_dec->u1_pic_bufs = ps_dec->i1_max_dec_frame_buffering; 1007 1008 /* Fix is for handling one pic in and one pic out incase of */ 1009 /* MMCO 5 or IDR */ 1010 1011 ps_dec->i4_display_delay = MIN(ps_dec->u4_num_reorder_frames_at_init, 1012 ps_dec->u1_max_dec_frame_buffering); 1013 1014 if(1 == ps_seq->u1_vui_parameters_present_flag) 1015 { 1016 if(ps_seq->u1_frame_mbs_only_flag == 1) 1017 ps_dec->i4_display_delay = MIN( 1018 (UWORD32 )ps_dec->i4_display_delay, 1019 ((UWORD32 )ps_seq->s_vui.u4_num_reorder_frames 1020 + 1)); 1021 else 1022 ps_dec->i4_display_delay = MIN( 1023 (UWORD32 )ps_dec->i4_display_delay, 1024 ((UWORD32 )ps_seq->s_vui.u4_num_reorder_frames 1025 + 1) * 2); 1026 } 1027 1028 /* Temporary hack to run Tractor Cav/Cab/MbAff Profiler streams also for CAFI1_SVA_C.264 in conformance*/ 1029 if(ps_dec->u1_init_dec_flag) 1030 { 1031 ih264d_release_pics_in_dpb((void *)ps_dec, 1032 ps_dec->u1_pic_bufs); 1033 ih264d_release_display_bufs(ps_dec); 1034 ih264d_reset_ref_bufs(ps_dec->ps_dpb_mgr); 1035 } 1036 1037 /*********************************************************************/ 1038 /* Configuring decoder parameters based on level and then */ 1039 /* fresh pointer initialisation in decoder scratch and state buffers */ 1040 /*********************************************************************/ 1041 if(!ps_dec->u1_init_dec_flag || 1042 ((ps_seq->u1_level_idc < H264_LEVEL_3_0) ^ (ps_prev_seq_params->u1_level_idc < H264_LEVEL_3_0))) 1043 { 1044 ret = ih264d_init_dec_mb_grp(ps_dec); 1045 if(ret != OK) 1046 return ret; 1047 } 1048 1049 ret = ih264d_create_pic_buffers(ps_dec->u1_pic_bufs, 1050 ps_dec); 1051 if(ret != OK) 1052 return ret; 1053 1054 ih264d_get_memory_dec_params(ps_dec); 1055 1056 ret = ih264d_create_mv_bank(ps_dec, ps_dec->u2_pic_wd, 1057 ps_dec->u2_pic_ht); 1058 if(ret != OK) 1059 return ret; 1060 1061 /* In shared mode, set all of them as used by display */ 1062 if(ps_dec->u4_share_disp_buf == 1) 1063 { 1064 WORD32 i; 1065 1066 for(i = 0; i < ps_dec->u1_pic_bufs; i++) 1067 { 1068 ih264_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, i, 1069 BUF_MGR_IO); 1070 } 1071 } 1072 1073 ps_dec->u1_init_dec_flag = 1; 1074 ps_prev_seq_params->u2_frm_wd_in_mbs = ps_seq->u2_frm_wd_in_mbs; 1075 ps_prev_seq_params->u1_level_idc = ps_seq->u1_level_idc; 1076 ps_prev_seq_params->u1_profile_idc = ps_seq->u1_profile_idc; 1077 ps_prev_seq_params->u2_frm_ht_in_mbs = ps_seq->u2_frm_ht_in_mbs; 1078 ps_prev_seq_params->u1_frame_mbs_only_flag = 1079 ps_seq->u1_frame_mbs_only_flag; 1080 ps_prev_seq_params->u1_direct_8x8_inference_flag = 1081 ps_seq->u1_direct_8x8_inference_flag; 1082 1083 ps_dec->i4_cur_display_seq = 0; 1084 ps_dec->i4_prev_max_display_seq = 0; 1085 ps_dec->i4_max_poc = 0; 1086 1087 { 1088 /* 0th entry of CtxtIncMbMap will be always be containing default values 1089 for CABAC context representing MB not available */ 1090 ctxt_inc_mb_info_t *p_DefCtxt = ps_dec->p_ctxt_inc_mb_map - 1; 1091 UWORD8 *pu1_temp; 1092 WORD8 i; 1093 p_DefCtxt->u1_mb_type = CAB_SKIP; 1094 1095 p_DefCtxt->u1_cbp = 0x0f; 1096 p_DefCtxt->u1_intra_chroma_pred_mode = 0; 1097 1098 p_DefCtxt->u1_yuv_dc_csbp = 0x7; 1099 1100 p_DefCtxt->u1_transform8x8_ctxt = 0; 1101 1102 pu1_temp = (UWORD8*)p_DefCtxt->i1_ref_idx; 1103 for(i = 0; i < 4; i++, pu1_temp++) 1104 (*pu1_temp) = 0; 1105 pu1_temp = (UWORD8*)p_DefCtxt->u1_mv; 1106 for(i = 0; i < 16; i++, pu1_temp++) 1107 (*pu1_temp) = 0; 1108 ps_dec->ps_def_ctxt_mb_info = p_DefCtxt; 1109 } 1110 1111 } 1112 /* reset DBP commands read u4_flag */ 1113 ps_dec->ps_dpb_cmds->u1_dpb_commands_read = 0; 1114 1115 return OK; 1116 } 1117 1118 /*****************************************************************************/ 1119 /* */ 1120 /* Function Name : ih264d_get_next_display_field */ 1121 /* */ 1122 /* Description : Application calls this module to get the next field */ 1123 /* to be displayed */ 1124 /* */ 1125 /* Inputs : 1. IBUFAPI_Handle Hnadle to the Display buffer */ 1126 /* 2. IH264DEC_DispUnit Pointer to the display struct */ 1127 /* */ 1128 /* Globals : */ 1129 /* */ 1130 /* */ 1131 /* Processing : None */ 1132 /* Outputs : None */ 1133 /* Returns : None */ 1134 /* Issues : None */ 1135 /* */ 1136 /* Revision History: */ 1137 /* */ 1138 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1139 /* 27 05 2005 Ittiam Draft */ 1140 /* */ 1141 /*****************************************************************************/ 1142 1143 WORD32 ih264d_get_next_display_field(dec_struct_t * ps_dec, 1144 ivd_out_bufdesc_t *ps_out_buffer, 1145 ivd_get_display_frame_op_t *pv_disp_op) 1146 { 1147 pic_buffer_t *pic_buf; 1148 1149 UWORD8 i1_cur_fld; 1150 WORD32 u4_api_ret = -1; 1151 WORD32 i4_disp_buf_id; 1152 iv_yuv_buf_t *ps_op_frm; 1153 1154 1155 1156 ps_op_frm = &(ps_dec->s_disp_frame_info); 1157 H264_MUTEX_LOCK(&ps_dec->process_disp_mutex); 1158 pic_buf = (pic_buffer_t *)ih264_disp_mgr_get( 1159 (disp_mgr_t *)ps_dec->pv_disp_buf_mgr, &i4_disp_buf_id); 1160 ps_dec->u4_num_fld_in_frm = 0; 1161 u4_api_ret = -1; 1162 pv_disp_op->u4_ts = -1; 1163 pv_disp_op->e_output_format = ps_dec->u1_chroma_format; 1164 1165 pv_disp_op->s_disp_frm_buf.pv_y_buf = ps_out_buffer->pu1_bufs[0]; 1166 pv_disp_op->s_disp_frm_buf.pv_u_buf = ps_out_buffer->pu1_bufs[1]; 1167 pv_disp_op->s_disp_frm_buf.pv_v_buf = ps_out_buffer->pu1_bufs[2]; 1168 if(pic_buf != NULL) 1169 { 1170 pv_disp_op->e4_fld_type = 0; 1171 pv_disp_op->u4_disp_buf_id = i4_disp_buf_id; 1172 1173 ps_op_frm->u4_y_ht = pic_buf->u2_disp_height << 1; 1174 ps_op_frm->u4_u_ht = ps_op_frm->u4_v_ht = ps_op_frm->u4_y_ht >> 1; 1175 ps_op_frm->u4_y_wd = pic_buf->u2_disp_width; 1176 1177 ps_op_frm->u4_u_wd = ps_op_frm->u4_v_wd = ps_op_frm->u4_y_wd >> 1; 1178 1179 ps_op_frm->u4_y_strd = pic_buf->u2_frm_wd_y; 1180 ps_op_frm->u4_u_strd = ps_op_frm->u4_v_strd = pic_buf->u2_frm_wd_uv; 1181 1182 /* ! */ 1183 pv_disp_op->u4_ts = pic_buf->u4_ts; 1184 1185 /* set the start of the Y, U and V buffer pointer for display */ 1186 ps_op_frm->pv_y_buf = pic_buf->pu1_buf1 + pic_buf->u2_crop_offset_y; 1187 ps_op_frm->pv_u_buf = pic_buf->pu1_buf2 + pic_buf->u2_crop_offset_uv; 1188 ps_op_frm->pv_v_buf = pic_buf->pu1_buf3 + pic_buf->u2_crop_offset_uv; 1189 ps_dec->u4_num_fld_in_frm++; 1190 ps_dec->u4_num_fld_in_frm++; 1191 u4_api_ret = 0; 1192 1193 if(pic_buf->u1_picturetype == 0) 1194 pv_disp_op->u4_progressive_frame_flag = 1; 1195 else 1196 pv_disp_op->u4_progressive_frame_flag = 0; 1197 1198 } H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex); 1199 pv_disp_op->u4_error_code = u4_api_ret; 1200 pv_disp_op->e_pic_type = 0xFFFFFFFF; //Junk; 1201 1202 if(u4_api_ret) 1203 { 1204 pv_disp_op->u4_error_code = 1; //put a proper error code here 1205 } 1206 else 1207 { 1208 1209 //Release the buffer if being sent for display 1210 UWORD32 temp; 1211 UWORD32 dest_inc_Y = 0, dest_inc_UV = 0; 1212 1213 pv_disp_op->s_disp_frm_buf.u4_y_wd = temp = MIN(ps_op_frm->u4_y_wd, 1214 ps_op_frm->u4_y_strd); 1215 pv_disp_op->s_disp_frm_buf.u4_u_wd = pv_disp_op->s_disp_frm_buf.u4_y_wd 1216 >> 1; 1217 pv_disp_op->s_disp_frm_buf.u4_v_wd = pv_disp_op->s_disp_frm_buf.u4_y_wd 1218 >> 1; 1219 1220 pv_disp_op->s_disp_frm_buf.u4_y_ht = ps_op_frm->u4_y_ht; 1221 pv_disp_op->s_disp_frm_buf.u4_u_ht = pv_disp_op->s_disp_frm_buf.u4_y_ht 1222 >> 1; 1223 pv_disp_op->s_disp_frm_buf.u4_v_ht = pv_disp_op->s_disp_frm_buf.u4_y_ht 1224 >> 1; 1225 if(0 == ps_dec->u4_share_disp_buf) 1226 { 1227 pv_disp_op->s_disp_frm_buf.u4_y_strd = 1228 pv_disp_op->s_disp_frm_buf.u4_y_wd; 1229 pv_disp_op->s_disp_frm_buf.u4_u_strd = 1230 pv_disp_op->s_disp_frm_buf.u4_y_wd >> 1; 1231 pv_disp_op->s_disp_frm_buf.u4_v_strd = 1232 pv_disp_op->s_disp_frm_buf.u4_y_wd >> 1; 1233 1234 } 1235 else 1236 { 1237 pv_disp_op->s_disp_frm_buf.u4_y_strd = ps_op_frm->u4_y_strd; 1238 } 1239 1240 if(ps_dec->u4_app_disp_width) 1241 { 1242 pv_disp_op->s_disp_frm_buf.u4_y_strd = MAX( 1243 ps_dec->u4_app_disp_width, 1244 pv_disp_op->s_disp_frm_buf.u4_y_strd); 1245 } 1246 1247 pv_disp_op->u4_error_code = 0; 1248 if(pv_disp_op->e_output_format == IV_YUV_420P) 1249 { 1250 UWORD32 i; 1251 pv_disp_op->s_disp_frm_buf.u4_u_strd = 1252 pv_disp_op->s_disp_frm_buf.u4_y_strd >> 1; 1253 pv_disp_op->s_disp_frm_buf.u4_v_strd = 1254 pv_disp_op->s_disp_frm_buf.u4_y_strd >> 1; 1255 1256 pv_disp_op->s_disp_frm_buf.u4_u_wd = ps_op_frm->u4_y_wd >> 1; 1257 pv_disp_op->s_disp_frm_buf.u4_v_wd = ps_op_frm->u4_y_wd >> 1; 1258 1259 if(1 == ps_dec->u4_share_disp_buf) 1260 { 1261 pv_disp_op->s_disp_frm_buf.pv_y_buf = ps_op_frm->pv_y_buf; 1262 1263 for(i = 0; i < MAX_DISP_BUFS_NEW; i++) 1264 { 1265 UWORD8 *buf = ps_dec->disp_bufs[i].buf[0]; 1266 buf += ps_dec->disp_bufs[i].u4_ofst[0]; 1267 if(((UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_y_buf 1268 - pic_buf->u2_crop_offset_y) == buf) 1269 { 1270 buf = ps_dec->disp_bufs[i].buf[1]; 1271 buf += ps_dec->disp_bufs[i].u4_ofst[1]; 1272 pv_disp_op->s_disp_frm_buf.pv_u_buf = buf 1273 + pic_buf->u2_crop_offset_uv; 1274 1275 buf = ps_dec->disp_bufs[i].buf[2]; 1276 buf += ps_dec->disp_bufs[i].u4_ofst[2]; 1277 pv_disp_op->s_disp_frm_buf.pv_v_buf = buf 1278 + pic_buf->u2_crop_offset_uv; 1279 } 1280 } 1281 } 1282 1283 } 1284 else if((pv_disp_op->e_output_format == IV_YUV_420SP_UV) 1285 || (pv_disp_op->e_output_format == IV_YUV_420SP_VU)) 1286 { 1287 pv_disp_op->s_disp_frm_buf.u4_u_strd = 1288 pv_disp_op->s_disp_frm_buf.u4_y_strd; 1289 pv_disp_op->s_disp_frm_buf.u4_v_strd = 0; 1290 1291 if(1 == ps_dec->u4_share_disp_buf) 1292 { 1293 UWORD32 i; 1294 1295 pv_disp_op->s_disp_frm_buf.pv_y_buf = ps_op_frm->pv_y_buf; 1296 1297 for(i = 0; i < MAX_DISP_BUFS_NEW; i++) 1298 { 1299 UWORD8 *buf = ps_dec->disp_bufs[i].buf[0]; 1300 buf += ps_dec->disp_bufs[i].u4_ofst[0]; 1301 if((UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_y_buf 1302 - pic_buf->u2_crop_offset_y == buf) 1303 { 1304 buf = ps_dec->disp_bufs[i].buf[1]; 1305 buf += ps_dec->disp_bufs[i].u4_ofst[1]; 1306 pv_disp_op->s_disp_frm_buf.pv_u_buf = buf 1307 + pic_buf->u2_crop_offset_uv; 1308 ; 1309 1310 buf = ps_dec->disp_bufs[i].buf[2]; 1311 buf += ps_dec->disp_bufs[i].u4_ofst[2]; 1312 pv_disp_op->s_disp_frm_buf.pv_v_buf = buf 1313 + pic_buf->u2_crop_offset_uv; 1314 ; 1315 } 1316 } 1317 } 1318 pv_disp_op->s_disp_frm_buf.u4_u_wd = 1319 pv_disp_op->s_disp_frm_buf.u4_y_wd; 1320 pv_disp_op->s_disp_frm_buf.u4_v_wd = 0; 1321 1322 } 1323 else if((pv_disp_op->e_output_format == IV_RGB_565) 1324 || (pv_disp_op->e_output_format == IV_YUV_422ILE)) 1325 { 1326 1327 pv_disp_op->s_disp_frm_buf.u4_u_strd = 0; 1328 pv_disp_op->s_disp_frm_buf.u4_v_strd = 0; 1329 pv_disp_op->s_disp_frm_buf.u4_u_wd = 0; 1330 pv_disp_op->s_disp_frm_buf.u4_v_wd = 0; 1331 pv_disp_op->s_disp_frm_buf.u4_u_ht = 0; 1332 pv_disp_op->s_disp_frm_buf.u4_v_ht = 0; 1333 1334 } 1335 1336 1337 } 1338 1339 return u4_api_ret; 1340 } 1341 1342 1343 /*****************************************************************************/ 1344 /* Function Name : ih264d_release_display_field */ 1345 /* */ 1346 /* Description : This function releases the display field that was returned */ 1347 /* here. */ 1348 /* Inputs : ps_dec - Decoder parameters */ 1349 /* Globals : None */ 1350 /* Processing : Refer bumping process in the standard */ 1351 /* Outputs : Assigns display sequence number. */ 1352 /* Returns : None */ 1353 /* */ 1354 /* Issues : None */ 1355 /* */ 1356 /* Revision History: */ 1357 /* */ 1358 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1359 /* 27 04 2005 NS Draft */ 1360 /* */ 1361 /*****************************************************************************/ 1362 void ih264d_release_display_field(dec_struct_t *ps_dec, 1363 ivd_get_display_frame_op_t *pv_disp_op) 1364 { 1365 if(1 == pv_disp_op->u4_error_code) 1366 { 1367 if(1 == ps_dec->u1_flushfrm) 1368 { 1369 UWORD32 i; 1370 1371 if(1 == ps_dec->u4_share_disp_buf) 1372 { 1373 H264_MUTEX_LOCK(&ps_dec->process_disp_mutex); 1374 for(i = 0; i < (MAX_DISP_BUFS_NEW); i++) 1375 { 1376 if(1 == ps_dec->u4_disp_buf_mapping[i]) 1377 { 1378 ih264_buf_mgr_release( 1379 (buf_mgr_t *)ps_dec->pv_pic_buf_mgr, i, 1380 BUF_MGR_IO); 1381 ps_dec->u4_disp_buf_mapping[i] = 0; 1382 } 1383 } H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex); 1384 1385 memset(ps_dec->u4_disp_buf_to_be_freed, 0, 1386 (MAX_DISP_BUFS_NEW) * sizeof(UWORD32)); 1387 for(i = 0; i < ps_dec->u1_pic_bufs; i++) 1388 ps_dec->u4_disp_buf_mapping[i] = 1; 1389 } 1390 ps_dec->u1_flushfrm = 0; 1391 1392 } 1393 } 1394 else 1395 { 1396 H264_MUTEX_LOCK(&ps_dec->process_disp_mutex); 1397 1398 if(0 == ps_dec->u4_share_disp_buf) 1399 { 1400 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, 1401 pv_disp_op->u4_disp_buf_id, 1402 BUF_MGR_IO); 1403 1404 } 1405 else 1406 { 1407 ps_dec->u4_disp_buf_mapping[pv_disp_op->u4_disp_buf_id] = 1; 1408 } H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex); 1409 1410 } 1411 } 1412 /*****************************************************************************/ 1413 /* Function Name : ih264d_assign_display_seq */ 1414 /* */ 1415 /* Description : This function implments bumping process. Every outgoing */ 1416 /* frame from DPB is assigned a display sequence number */ 1417 /* which increases monotonically. System looks for this */ 1418 /* number to display a frame. */ 1419 /* here. */ 1420 /* Inputs : ps_dec - Decoder parameters */ 1421 /* Globals : None */ 1422 /* Processing : Refer bumping process in the standard */ 1423 /* Outputs : Assigns display sequence number. */ 1424 /* Returns : None */ 1425 /* */ 1426 /* Issues : None */ 1427 /* */ 1428 /* Revision History: */ 1429 /* */ 1430 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1431 /* 27 04 2005 NS Draft */ 1432 /* */ 1433 /*****************************************************************************/ 1434 WORD32 ih264d_assign_display_seq(dec_struct_t *ps_dec) 1435 { 1436 WORD32 i; 1437 WORD32 i4_min_poc; 1438 WORD32 i4_min_poc_buf_id; 1439 WORD32 i4_min_index; 1440 dpb_manager_t *ps_dpb_mgr = ps_dec->ps_dpb_mgr; 1441 WORD32 (*i4_poc_buf_id_map)[3] = ps_dpb_mgr->ai4_poc_buf_id_map; 1442 1443 i4_min_poc = 0x7fffffff; 1444 i4_min_poc_buf_id = -1; 1445 i4_min_index = -1; 1446 1447 if(ps_dpb_mgr->i1_poc_buf_id_entries >= ps_dec->i4_display_delay) 1448 { 1449 for(i = 0; i < MAX_FRAMES; i++) 1450 { 1451 if((i4_poc_buf_id_map[i][0] != -1) 1452 && (DO_NOT_DISP 1453 != ps_dpb_mgr->ai4_poc_buf_id_map[i][0])) 1454 { 1455 if(i4_poc_buf_id_map[i][1] < i4_min_poc) 1456 { 1457 i4_min_poc = i4_poc_buf_id_map[i][1]; 1458 i4_min_poc_buf_id = i4_poc_buf_id_map[i][0]; 1459 i4_min_index = i; 1460 } 1461 } 1462 } 1463 1464 if((i4_min_index != -1) && (DO_NOT_DISP != i4_min_poc_buf_id)) 1465 { 1466 ps_dec->i4_cur_display_seq++; 1467 ih264_disp_mgr_add( 1468 (disp_mgr_t *)ps_dec->pv_disp_buf_mgr, 1469 i4_min_poc_buf_id, ps_dec->i4_cur_display_seq, 1470 ps_dec->apv_buf_id_pic_buf_map[i4_min_poc_buf_id]); 1471 i4_poc_buf_id_map[i4_min_index][0] = -1; 1472 i4_poc_buf_id_map[i4_min_index][1] = 0x7fffffff; 1473 ps_dpb_mgr->i1_poc_buf_id_entries--; 1474 } 1475 else if(DO_NOT_DISP == i4_min_poc_buf_id) 1476 { 1477 WORD32 i4_error_code; 1478 i4_error_code = ERROR_GAPS_IN_FRM_NUM; 1479 // i4_error_code |= 1<<IVD_CORRUPTEDDATA; 1480 return i4_error_code; 1481 } 1482 } 1483 return OK; 1484 } 1485 1486 /*****************************************************************************/ 1487 /* */ 1488 /* Function Name : ih264d_release_display_bufs */ 1489 /* */ 1490 /* Description : This function implments bumping process when mmco = 5. */ 1491 /* Each outgoing frame from DPB is assigned a display */ 1492 /* sequence number which increases monotonically. System */ 1493 /* looks for this number to display a frame. */ 1494 /* Inputs : ps_dec - Decoder parameters */ 1495 /* Globals : None */ 1496 /* Processing : Refer bumping process in the standard for mmco = 5 */ 1497 /* Outputs : Assigns display sequence number. */ 1498 /* Returns : None */ 1499 /* */ 1500 /* Issues : None */ 1501 /* */ 1502 /* Revision History: */ 1503 /* */ 1504 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1505 /* 27 04 2005 NS Draft */ 1506 /* */ 1507 /*****************************************************************************/ 1508 void ih264d_release_display_bufs(dec_struct_t *ps_dec) 1509 { 1510 WORD32 i, j; 1511 WORD32 i4_min_poc; 1512 WORD32 i4_min_poc_buf_id; 1513 WORD32 i4_min_index; 1514 dpb_manager_t *ps_dpb_mgr = ps_dec->ps_dpb_mgr; 1515 WORD32 (*i4_poc_buf_id_map)[3] = ps_dpb_mgr->ai4_poc_buf_id_map; 1516 1517 i4_min_poc = 0x7fffffff; 1518 i4_min_poc_buf_id = -1; 1519 i4_min_index = -1; 1520 1521 ih264d_delete_nonref_nondisplay_pics(ps_dpb_mgr); 1522 1523 for(j = 0; j < ps_dpb_mgr->i1_poc_buf_id_entries; j++) 1524 { 1525 i4_min_poc = 0x7fffffff; 1526 for(i = 0; i < MAX_FRAMES; i++) 1527 { 1528 if(i4_poc_buf_id_map[i][0] != -1) 1529 { 1530 if(i4_poc_buf_id_map[i][1] < i4_min_poc) 1531 { 1532 i4_min_poc = i4_poc_buf_id_map[i][1]; 1533 i4_min_poc_buf_id = i4_poc_buf_id_map[i][0]; 1534 i4_min_index = i; 1535 } 1536 } 1537 } 1538 1539 if(DO_NOT_DISP != i4_min_poc_buf_id) 1540 { 1541 ps_dec->i4_cur_display_seq++; 1542 ih264_disp_mgr_add( 1543 (disp_mgr_t *)ps_dec->pv_disp_buf_mgr, 1544 i4_min_poc_buf_id, ps_dec->i4_cur_display_seq, 1545 ps_dec->apv_buf_id_pic_buf_map[i4_min_poc_buf_id]); 1546 i4_poc_buf_id_map[i4_min_index][0] = -1; 1547 i4_poc_buf_id_map[i4_min_index][1] = 0x7fffffff; 1548 ps_dpb_mgr->ai4_poc_buf_id_map[i4_min_index][2] = 0; 1549 } 1550 else 1551 { 1552 i4_poc_buf_id_map[i4_min_index][0] = -1; 1553 i4_poc_buf_id_map[i4_min_index][1] = 0x7fffffff; 1554 ps_dpb_mgr->ai4_poc_buf_id_map[i4_min_index][2] = 0; 1555 } 1556 } 1557 ps_dpb_mgr->i1_poc_buf_id_entries = 0; 1558 ps_dec->i4_prev_max_display_seq = ps_dec->i4_prev_max_display_seq 1559 + ps_dec->i4_max_poc + ps_dec->u1_max_dec_frame_buffering 1560 + 1; 1561 ps_dec->i4_max_poc = 0; 1562 } 1563 1564 /*****************************************************************************/ 1565 /* */ 1566 /* Function Name : ih264d_assign_pic_num */ 1567 /* */ 1568 /* Description : This function assigns pic num to each reference frame */ 1569 /* depending on the cur_frame_num as speified in section */ 1570 /* 8.2.4.1 */ 1571 /* */ 1572 /* Inputs : ps_dec */ 1573 /* */ 1574 /* Globals : NO globals used */ 1575 /* */ 1576 /* Processing : for all ST pictures */ 1577 /* if( FrameNum > cur_frame_num) */ 1578 /* PicNum = FrameNum - MaxFrameNum */ 1579 /* else */ 1580 /* PicNum = FrameNum */ 1581 /* */ 1582 /* Returns : void */ 1583 /* */ 1584 /* Issues : NO */ 1585 /* */ 1586 /* Revision History: */ 1587 /* */ 1588 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1589 /* 13 07 2002 Jay Draft */ 1590 /* */ 1591 /*****************************************************************************/ 1592 1593 void ih264d_assign_pic_num(dec_struct_t *ps_dec) 1594 { 1595 dpb_manager_t *ps_dpb_mgr; 1596 struct dpb_info_t *ps_next_dpb; 1597 WORD8 i; 1598 WORD32 i4_cur_frame_num, i4_max_frame_num; 1599 WORD32 i4_ref_frame_num; 1600 UWORD8 u1_fld_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag; 1601 1602 i4_max_frame_num = ps_dec->ps_cur_sps->u2_u4_max_pic_num_minus1 + 1; 1603 i4_cur_frame_num = ps_dec->ps_cur_pic->i4_frame_num; 1604 ps_dpb_mgr = ps_dec->ps_dpb_mgr; 1605 1606 /* Start from ST head */ 1607 ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head; 1608 for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++) 1609 { 1610 WORD32 i4_pic_num; 1611 1612 i4_ref_frame_num = ps_next_dpb->ps_pic_buf->i4_frame_num; 1613 if(i4_ref_frame_num > i4_cur_frame_num) 1614 { 1615 /* RefPic Buf frame_num is before Current frame_num in decode order */ 1616 i4_pic_num = i4_ref_frame_num - i4_max_frame_num; 1617 } 1618 else 1619 { 1620 /* RefPic Buf frame_num is after Current frame_num in decode order */ 1621 i4_pic_num = i4_ref_frame_num; 1622 } 1623 1624 ps_next_dpb->ps_pic_buf->i4_pic_num = i4_pic_num; 1625 ps_next_dpb->i4_frame_num = i4_pic_num; 1626 ps_next_dpb->ps_pic_buf->u1_long_term_frm_idx = MAX_REF_BUFS + 1; 1627 if(u1_fld_pic_flag) 1628 { 1629 /* Assign the pic num to top fields and bot fields */ 1630 1631 ps_next_dpb->s_top_field.i4_pic_num = i4_pic_num * 2 1632 + !(ps_dec->ps_cur_slice->u1_bottom_field_flag); 1633 ps_next_dpb->s_bot_field.i4_pic_num = i4_pic_num * 2 1634 + ps_dec->ps_cur_slice->u1_bottom_field_flag; 1635 } 1636 /* Chase the next link */ 1637 ps_next_dpb = ps_next_dpb->ps_prev_short; 1638 } 1639 1640 if(ps_dec->ps_cur_sps->u1_gaps_in_frame_num_value_allowed_flag 1641 && ps_dpb_mgr->u1_num_gaps) 1642 { 1643 WORD32 i4_start_frm, i4_end_frm; 1644 /* Assign pic numbers for gaps */ 1645 for(i = 0; i < MAX_FRAMES; i++) 1646 { 1647 i4_start_frm = ps_dpb_mgr->ai4_gaps_start_frm_num[i]; 1648 if(i4_start_frm != INVALID_FRAME_NUM) 1649 { 1650 if(i4_start_frm > i4_cur_frame_num) 1651 { 1652 /* gap's frame_num is before Current frame_num in 1653 decode order */ 1654 i4_start_frm -= i4_max_frame_num; 1655 } 1656 ps_dpb_mgr->ai4_gaps_start_frm_num[i] = i4_start_frm; 1657 i4_end_frm = ps_dpb_mgr->ai4_gaps_end_frm_num[i]; 1658 1659 if(i4_end_frm > i4_cur_frame_num) 1660 { 1661 /* gap's frame_num is before Current frame_num in 1662 decode order */ 1663 i4_end_frm -= i4_max_frame_num; 1664 } 1665 ps_dpb_mgr->ai4_gaps_end_frm_num[i] = i4_end_frm; 1666 } 1667 } 1668 } 1669 } 1670 1671 /*! 1672 ************************************************************************** 1673 * \if Function name : ih264d_update_qp \endif 1674 * 1675 * \brief 1676 * Updates the values of QP and its related entities 1677 * 1678 * \return 1679 * 0 on Success and Error code otherwise 1680 * 1681 ************************************************************************** 1682 */ 1683 WORD32 ih264d_update_qp(dec_struct_t * ps_dec, const WORD8 i1_qp) 1684 { 1685 WORD32 i_temp; 1686 i_temp = (ps_dec->u1_qp + i1_qp + 52) % 52; 1687 1688 if((i_temp < 0) || (i_temp > 51) || (i1_qp < -26) || (i1_qp > 25)) 1689 return ERROR_INV_RANGE_QP_T; 1690 1691 ps_dec->u1_qp = i_temp; 1692 ps_dec->u1_qp_y_rem6 = ps_dec->u1_qp % 6; 1693 ps_dec->u1_qp_y_div6 = ps_dec->u1_qp / 6; 1694 i_temp = CLIP3(0, 51, ps_dec->u1_qp + ps_dec->ps_cur_pps->i1_chroma_qp_index_offset); 1695 ps_dec->u1_qp_u_rem6 = MOD(gau1_ih264d_qp_scale_cr[12 + i_temp], 6); 1696 ps_dec->u1_qp_u_div6 = DIV(gau1_ih264d_qp_scale_cr[12 + i_temp], 6); 1697 1698 i_temp = CLIP3(0, 51, ps_dec->u1_qp + ps_dec->ps_cur_pps->i1_second_chroma_qp_index_offset); 1699 ps_dec->u1_qp_v_rem6 = MOD(gau1_ih264d_qp_scale_cr[12 + i_temp], 6); 1700 ps_dec->u1_qp_v_div6 = DIV(gau1_ih264d_qp_scale_cr[12 + i_temp], 6); 1701 1702 ps_dec->pu2_quant_scale_y = 1703 gau2_ih264_iquant_scale_4x4[ps_dec->u1_qp_y_rem6]; 1704 ps_dec->pu2_quant_scale_u = 1705 gau2_ih264_iquant_scale_4x4[ps_dec->u1_qp_u_rem6]; 1706 ps_dec->pu2_quant_scale_v = 1707 gau2_ih264_iquant_scale_4x4[ps_dec->u1_qp_v_rem6]; 1708 return OK; 1709 } 1710 1711 /*****************************************************************************/ 1712 /* */ 1713 /* Function Name : ih264d_decode_gaps_in_frame_num */ 1714 /* */ 1715 /* Description : This function decodes gaps in frame number */ 1716 /* */ 1717 /* Inputs : ps_dec Decoder parameters */ 1718 /* u2_frame_num current frame number */ 1719 /* */ 1720 /* Globals : None */ 1721 /* Processing : This functionality needs to be implemented */ 1722 /* Outputs : None */ 1723 /* Returns : None */ 1724 /* */ 1725 /* Issues : Not implemented */ 1726 /* */ 1727 /* Revision History: */ 1728 /* */ 1729 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 1730 /* 06 05 2002 NS Draft */ 1731 /* */ 1732 /*****************************************************************************/ 1733 WORD32 ih264d_decode_gaps_in_frame_num(dec_struct_t *ps_dec, 1734 UWORD16 u2_frame_num) 1735 { 1736 UWORD32 u4_next_frm_num, u4_start_frm_num; 1737 UWORD32 u4_max_frm_num; 1738 pocstruct_t s_tmp_poc; 1739 WORD32 i4_poc; 1740 dec_slice_params_t *ps_cur_slice; 1741 1742 dec_pic_params_t *ps_pic_params; 1743 WORD8 i1_gap_idx; 1744 WORD32 *i4_gaps_start_frm_num; 1745 dpb_manager_t *ps_dpb_mgr; 1746 WORD32 i4_frame_gaps; 1747 WORD8 *pi1_gaps_per_seq; 1748 WORD32 ret; 1749 1750 ps_cur_slice = ps_dec->ps_cur_slice; 1751 if(ps_cur_slice->u1_field_pic_flag) 1752 { 1753 if(ps_dec->u2_prev_ref_frame_num == u2_frame_num) 1754 return 0; 1755 } 1756 1757 u4_next_frm_num = ps_dec->u2_prev_ref_frame_num + 1; 1758 u4_max_frm_num = ps_dec->ps_cur_sps->u2_u4_max_pic_num_minus1 + 1; 1759 1760 // check 1761 if(u4_next_frm_num >= u4_max_frm_num) 1762 { 1763 u4_next_frm_num -= u4_max_frm_num; 1764 } 1765 1766 if(u4_next_frm_num == u2_frame_num) 1767 { 1768 return (0); 1769 } 1770 1771 // check 1772 if((ps_dec->u1_nal_unit_type == IDR_SLICE_NAL) 1773 && (u4_next_frm_num >= u2_frame_num)) 1774 { 1775 return (0); 1776 } 1777 u4_start_frm_num = u4_next_frm_num; 1778 1779 s_tmp_poc.i4_pic_order_cnt_lsb = 0; 1780 s_tmp_poc.i4_delta_pic_order_cnt_bottom = 0; 1781 s_tmp_poc.i4_pic_order_cnt_lsb = 0; 1782 s_tmp_poc.i4_delta_pic_order_cnt_bottom = 0; 1783 s_tmp_poc.i4_delta_pic_order_cnt[0] = 0; 1784 s_tmp_poc.i4_delta_pic_order_cnt[1] = 0; 1785 1786 ps_cur_slice = ps_dec->ps_cur_slice; 1787 ps_pic_params = ps_dec->ps_cur_pps; 1788 ps_cur_slice->u1_field_pic_flag = 0; 1789 1790 i4_frame_gaps = 0; 1791 ps_dpb_mgr = ps_dec->ps_dpb_mgr; 1792 1793 /* Find a empty slot to store gap seqn info */ 1794 i4_gaps_start_frm_num = ps_dpb_mgr->ai4_gaps_start_frm_num; 1795 for(i1_gap_idx = 0; i1_gap_idx < MAX_FRAMES; i1_gap_idx++) 1796 { 1797 if(INVALID_FRAME_NUM == i4_gaps_start_frm_num[i1_gap_idx]) 1798 break; 1799 } 1800 if(MAX_FRAMES == i1_gap_idx) 1801 { 1802 UWORD32 i4_error_code; 1803 i4_error_code = ERROR_DBP_MANAGER_T; 1804 // i4_error_code |= 1<<IVD_CORRUPTEDDATA; 1805 return i4_error_code; 1806 } 1807 1808 i4_poc = 0; 1809 i4_gaps_start_frm_num[i1_gap_idx] = u4_start_frm_num; 1810 ps_dpb_mgr->ai4_gaps_end_frm_num[i1_gap_idx] = u2_frame_num - 1; 1811 pi1_gaps_per_seq = ps_dpb_mgr->ai1_gaps_per_seq; 1812 pi1_gaps_per_seq[i1_gap_idx] = 0; 1813 while(u4_next_frm_num != u2_frame_num) 1814 { 1815 ih264d_delete_nonref_nondisplay_pics(ps_dpb_mgr); 1816 if(ps_pic_params->ps_sps->u1_pic_order_cnt_type) 1817 { 1818 /* allocate a picture buffer and insert it as ST node */ 1819 ret = ih264d_decode_pic_order_cnt(0, u4_next_frm_num, 1820 &ps_dec->s_prev_pic_poc, 1821 &s_tmp_poc, ps_cur_slice, 1822 ps_pic_params, 1, 0, 0, 1823 &i4_poc); 1824 if(ret != OK) 1825 return ret; 1826 1827 /* Display seq no calculations */ 1828 if(i4_poc >= ps_dec->i4_max_poc) 1829 ps_dec->i4_max_poc = i4_poc; 1830 /* IDR Picture or POC wrap around */ 1831 if(i4_poc == 0) 1832 { 1833 ps_dec->i4_prev_max_display_seq = 1834 ps_dec->i4_prev_max_display_seq 1835 + ps_dec->i4_max_poc 1836 + ps_dec->u1_max_dec_frame_buffering 1837 + 1; 1838 ps_dec->i4_max_poc = 0; 1839 } 1840 1841 ps_cur_slice->u1_mmco_equalto5 = 0; 1842 ps_cur_slice->u2_frame_num = u4_next_frm_num; 1843 } 1844 1845 // check 1846 if(ps_dpb_mgr->i1_poc_buf_id_entries 1847 >= ps_dec->u1_max_dec_frame_buffering) 1848 { 1849 ret = ih264d_assign_display_seq(ps_dec); 1850 if(ret != OK) 1851 return ret; 1852 } 1853 1854 ret = ih264d_insert_pic_in_display_list( 1855 ps_dec->ps_dpb_mgr, (WORD8) DO_NOT_DISP, 1856 (WORD32)(ps_dec->i4_prev_max_display_seq + i4_poc), 1857 u4_next_frm_num); 1858 if(ret != OK) 1859 return ret; 1860 1861 pi1_gaps_per_seq[i1_gap_idx]++; 1862 ret = ih264d_do_mmco_for_gaps(ps_dpb_mgr, 1863 ps_dec->ps_cur_sps->u1_num_ref_frames); 1864 if(ret != OK) 1865 return ret; 1866 1867 ih264d_delete_nonref_nondisplay_pics(ps_dpb_mgr); 1868 1869 u4_next_frm_num++; 1870 if(u4_next_frm_num >= u4_max_frm_num) 1871 { 1872 u4_next_frm_num -= u4_max_frm_num; 1873 } 1874 1875 i4_frame_gaps++; 1876 } 1877 1878 return OK; 1879 } 1880 1881 /*! 1882 ************************************************************************** 1883 * \if Function name : ih264d_create_pic_buffers \endif 1884 * 1885 * \brief 1886 * This function creates Picture Buffers. 1887 * 1888 * \return 1889 * 0 on Success and -1 on error 1890 ************************************************************************** 1891 */ 1892 WORD32 ih264d_create_pic_buffers(UWORD8 u1_num_of_buf, 1893 dec_struct_t *ps_dec) 1894 { 1895 struct pic_buffer_t *ps_pic_buf; 1896 UWORD8 i; 1897 UWORD32 u4_luma_size, u4_chroma_size; 1898 UWORD8 u1_frm = ps_dec->ps_cur_sps->u1_frame_mbs_only_flag; 1899 WORD32 j; 1900 UWORD32 u4_pic_buf_mem_used, u4_ref_buf_mem_used; 1901 UWORD8 *pu1_pic_buf_mem_base, *pu1_ref_buf_mem_base; 1902 1903 u4_pic_buf_mem_used = 0; 1904 pu1_pic_buf_mem_base = ps_dec->ps_mem_tab[MEM_REC_PIC_BUF_MGR].pv_base; 1905 1906 ps_dec->pv_disp_buf_mgr = (void *)(pu1_pic_buf_mem_base 1907 + u4_pic_buf_mem_used); 1908 u4_pic_buf_mem_used += sizeof(disp_mgr_t); 1909 ih264_disp_mgr_init((disp_mgr_t *)ps_dec->pv_disp_buf_mgr); 1910 1911 ps_dec->pv_pic_buf_mgr = 1912 (void *)(pu1_pic_buf_mem_base + u4_pic_buf_mem_used); 1913 u4_pic_buf_mem_used += sizeof(buf_mgr_t) + ithread_get_mutex_lock_size(); 1914 ih264_buf_mgr_init((buf_mgr_t *)ps_dec->pv_pic_buf_mgr); 1915 1916 ps_pic_buf = (pic_buffer_t *)(pu1_pic_buf_mem_base + u4_pic_buf_mem_used); 1917 u4_pic_buf_mem_used += sizeof(struct pic_buffer_t) 1918 * (H264_MAX_REF_PICS * 2); 1919 1920 u4_luma_size = ps_dec->u2_frm_wd_y * ps_dec->u2_frm_ht_y; 1921 u4_chroma_size = ps_dec->u2_frm_wd_uv * ps_dec->u2_frm_ht_uv; 1922 1923 { 1924 if(ps_dec->u4_share_disp_buf == 1) 1925 { 1926 /* In case of buffers getting shared between application and library 1927 there is no need of reference memtabs. Instead of setting the i4_size 1928 to zero, it is reduced to a small i4_size to ensure that changes 1929 in the code are minimal */ 1930 if((ps_dec->u1_chroma_format == IV_YUV_420SP_UV) 1931 || (ps_dec->u1_chroma_format == IV_YUV_420SP_VU) 1932 || (ps_dec->u1_chroma_format == IV_YUV_420P)) 1933 { 1934 u4_luma_size = 64; 1935 } 1936 1937 if(ps_dec->u1_chroma_format == IV_YUV_420SP_UV) 1938 1939 { 1940 u4_chroma_size = 64; 1941 } 1942 1943 } 1944 } 1945 1946 pu1_ref_buf_mem_base = ps_dec->ps_mem_tab[MEM_REC_REF_PIC].pv_base; 1947 u4_ref_buf_mem_used = 0; 1948 1949 /* Allocate memory for refernce buffers */ 1950 for(i = 0; i < u1_num_of_buf; i++) 1951 { 1952 UWORD32 u4_offset; 1953 WORD32 buf_ret; 1954 UWORD8 *pu1_luma, *pu1_chroma; 1955 1956 pu1_luma = pu1_ref_buf_mem_base + u4_ref_buf_mem_used; 1957 u4_ref_buf_mem_used += u4_luma_size; 1958 pu1_chroma = pu1_ref_buf_mem_base + u4_ref_buf_mem_used; 1959 u4_ref_buf_mem_used += u4_chroma_size; 1960 1961 /* Offset to the start of the pic from the top left corner of the frame 1962 buffer */ 1963 1964 if((0 == ps_dec->u4_share_disp_buf) 1965 || (NULL == ps_dec->disp_bufs[i].buf[0])) 1966 { 1967 UWORD32 pad_len_h, pad_len_v; 1968 1969 u4_offset = ps_dec->u2_frm_wd_y * (PAD_LEN_Y_V << 1) + PAD_LEN_Y_H; 1970 ps_pic_buf->pu1_buf1 = (UWORD8 *)(pu1_luma) + u4_offset; 1971 1972 pad_len_h = MAX(PAD_LEN_UV_H, (PAD_LEN_Y_H >> 1)); 1973 pad_len_v = MAX(PAD_LEN_UV_V, PAD_LEN_Y_V); 1974 1975 u4_offset = ps_dec->u2_frm_wd_uv * pad_len_v + pad_len_h; 1976 1977 ps_pic_buf->pu1_buf2 = (UWORD8 *)(pu1_chroma) + u4_offset; 1978 ps_pic_buf->pu1_buf3 = (UWORD8 *)(NULL) + u4_offset; 1979 1980 } 1981 else 1982 { 1983 UWORD32 pad_len_h, pad_len_v; 1984 u4_offset = ps_dec->u2_frm_wd_y * (PAD_LEN_Y_V << 1) + PAD_LEN_Y_H; 1985 ps_pic_buf->pu1_buf1 = (UWORD8 *)ps_dec->disp_bufs[i].buf[0] 1986 + u4_offset; 1987 1988 ps_dec->disp_bufs[i].u4_ofst[0] = u4_offset; 1989 1990 if(ps_dec->u1_chroma_format == IV_YUV_420P) 1991 { 1992 pad_len_h = MAX(PAD_LEN_UV_H * YUV420SP_FACTOR, 1993 (PAD_LEN_Y_H >> 1)); 1994 pad_len_v = MAX(PAD_LEN_UV_V, PAD_LEN_Y_V); 1995 1996 u4_offset = ps_dec->u2_frm_wd_uv * pad_len_v + pad_len_h; 1997 ps_pic_buf->pu1_buf2 = (UWORD8 *)(pu1_chroma) + u4_offset; 1998 ps_pic_buf->pu1_buf3 = (UWORD8 *)(NULL) + u4_offset; 1999 2000 ps_dec->disp_bufs[i].u4_ofst[1] = u4_offset; 2001 ps_dec->disp_bufs[i].u4_ofst[2] = u4_offset; 2002 2003 } 2004 else 2005 { 2006 pad_len_h = MAX(PAD_LEN_UV_H * YUV420SP_FACTOR, 2007 (PAD_LEN_Y_H >> 1)); 2008 pad_len_v = MAX(PAD_LEN_UV_V, PAD_LEN_Y_V); 2009 2010 u4_offset = ps_dec->u2_frm_wd_uv * pad_len_v + pad_len_h; 2011 ps_pic_buf->pu1_buf2 = (UWORD8 *)(ps_dec->disp_bufs[i].buf[1]) 2012 + u4_offset; 2013 ps_pic_buf->pu1_buf3 = (UWORD8 *)(ps_dec->disp_bufs[i].buf[1]) 2014 + u4_offset; 2015 2016 ps_dec->disp_bufs[i].u4_ofst[1] = u4_offset; 2017 ps_dec->disp_bufs[i].u4_ofst[2] = u4_offset; 2018 2019 } 2020 2021 } 2022 2023 ps_pic_buf->u2_frm_ht_y = ps_dec->u2_frm_ht_y; 2024 ps_pic_buf->u2_frm_ht_uv = ps_dec->u2_frm_ht_uv; 2025 ps_pic_buf->u2_frm_wd_y = ps_dec->u2_frm_wd_y; 2026 ps_pic_buf->u2_frm_wd_uv = ps_dec->u2_frm_wd_uv; 2027 2028 ps_pic_buf->u1_pic_buf_id = i; 2029 2030 buf_ret = ih264_buf_mgr_add((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, 2031 ps_pic_buf, i); 2032 if(0 != buf_ret) 2033 { 2034 ps_dec->i4_error_code = ERROR_BUF_MGR; 2035 return ERROR_BUF_MGR; 2036 } 2037 2038 ps_dec->apv_buf_id_pic_buf_map[i] = (void *)ps_pic_buf; 2039 ps_pic_buf++; 2040 } 2041 2042 if((u4_ref_buf_mem_used > ps_dec->ps_mem_tab[MEM_REC_REF_PIC].u4_mem_size) || 2043 (u4_pic_buf_mem_used > ps_dec->ps_mem_tab[MEM_REC_PIC_BUF_MGR].u4_mem_size)) 2044 { 2045 ps_dec->i4_error_code = ERROR_BUF_MGR; 2046 return ERROR_BUF_MGR; 2047 } 2048 2049 if(1 == ps_dec->u4_share_disp_buf) 2050 { 2051 for(i = 0; i < u1_num_of_buf; i++) 2052 ps_dec->u4_disp_buf_mapping[i] = 1; 2053 } 2054 return OK; 2055 } 2056 2057 /*! 2058 ************************************************************************** 2059 * \if Function name : ih264d_get_memory_dec_params \endif 2060 * 2061 * \brief 2062 * This function allocates memory required by Decoder. 2063 * 2064 * \param ps_dec: Pointer to dec_struct_t. 2065 * 2066 * \return 2067 * Returns i4_status as returned by MemManager. 2068 * 2069 ************************************************************************** 2070 */ 2071 WORD16 ih264d_get_memory_dec_params(dec_struct_t * ps_dec) 2072 { 2073 struct MemReq s_MemReq; 2074 struct MemBlock *p_MemBlock; 2075 2076 pred_info_t *ps_pred_frame; 2077 dec_mb_info_t *ps_frm_mb_info; 2078 dec_slice_struct_t *ps_dec_slice_buf; 2079 UWORD8 *pu1_dec_mb_map, *pu1_recon_mb_map; 2080 UWORD16 *pu2_slice_num_map; 2081 2082 WORD16 *pi16_res_coeff; 2083 WORD16 i16_status = 0; 2084 UWORD8 uc_frmOrFld = (1 - ps_dec->ps_cur_sps->u1_frame_mbs_only_flag); 2085 UWORD16 u4_luma_wd = ps_dec->u2_frm_wd_y; 2086 UWORD16 u4_chroma_wd = ps_dec->u2_frm_wd_uv; 2087 WORD8 c_i = 0; 2088 dec_seq_params_t *ps_sps = ps_dec->ps_cur_sps; 2089 UWORD32 u4_total_mbs = ps_sps->u2_total_num_of_mbs << uc_frmOrFld; 2090 UWORD32 u4_wd_mbs = ps_dec->u2_frm_wd_in_mbs; 2091 UWORD32 u4_ht_mbs = ps_dec->u2_frm_ht_in_mbs; 2092 UWORD32 u4_blk_wd; 2093 UWORD32 ui_size = 0; 2094 UWORD32 u4_int_scratch_size = 0, u4_ref_pred_size = 0; 2095 UWORD8 *pu1_buf; 2096 2097 ps_dec->ps_deblk_pic = ps_dec->ps_mem_tab[MEM_REC_DEBLK_MB_INFO].pv_base; 2098 memset(ps_dec->ps_deblk_pic, 0, ps_dec->ps_mem_tab[MEM_REC_DEBLK_MB_INFO].u4_mem_size); 2099 2100 ps_dec->pu1_dec_mb_map = ps_dec->ps_mem_tab[MEM_REC_PARSE_MAP].pv_base; 2101 2102 ps_dec->pu1_recon_mb_map = ps_dec->ps_mem_tab[MEM_REC_PROC_MAP].pv_base; 2103 2104 ps_dec->pu2_slice_num_map = 2105 ps_dec->ps_mem_tab[MEM_REC_SLICE_NUM_MAP].pv_base; 2106 2107 ps_dec->ps_dec_slice_buf = ps_dec->ps_mem_tab[MEM_REC_SLICE_HDR].pv_base; 2108 memset(ps_dec->ps_mem_tab[MEM_REC_SLICE_HDR].pv_base, 0, 2109 ps_dec->ps_mem_tab[MEM_REC_SLICE_HDR].u4_mem_size); 2110 pu1_buf = (UWORD8 *)ps_dec->ps_dec_slice_buf; 2111 pu1_buf += sizeof(dec_slice_struct_t) * u4_total_mbs; 2112 ps_dec->pv_map_ref_idx_to_poc_buf = (void *)pu1_buf; 2113 2114 ps_dec->ps_frm_mb_info = ps_dec->ps_mem_tab[MEM_REC_MB_INFO].pv_base; 2115 memset(ps_dec->ps_frm_mb_info, 0, ps_dec->ps_mem_tab[MEM_REC_MB_INFO].u4_mem_size); 2116 2117 ps_dec->ps_pred = ps_dec->ps_mem_tab[MEM_REC_PRED_INFO].pv_base; 2118 2119 ps_dec->pi2_coeff_data = ps_dec->ps_mem_tab[MEM_REC_COEFF_DATA].pv_base; 2120 2121 ps_dec->pv_pic_tu_coeff_data = (void *)(ps_dec->pi2_coeff_data + MB_LUM_SIZE); 2122 2123 /*scratch memory allocations*/ 2124 { 2125 UWORD8 *pu1_scratch_mem_base; 2126 UWORD32 u4_scratch_mem_used; 2127 2128 pu1_scratch_mem_base = 2129 ps_dec->ps_mem_tab[MEM_REC_INTERNAL_SCRATCH].pv_base; 2130 u4_scratch_mem_used = 0; 2131 2132 ps_dec->ppv_map_ref_idx_to_poc = (void *)(pu1_scratch_mem_base 2133 + u4_scratch_mem_used); 2134 u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used); 2135 u4_scratch_mem_used += ((TOTAL_LIST_ENTRIES + PAD_MAP_IDX_POC) 2136 * sizeof(void *)); 2137 u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used); 2138 memset(ps_dec->ppv_map_ref_idx_to_poc, 0, (TOTAL_LIST_ENTRIES + PAD_MAP_IDX_POC) 2139 * sizeof(void *)); 2140 2141 ps_dec->p_cabac_ctxt_table_t = (void *)(pu1_scratch_mem_base 2142 + u4_scratch_mem_used); 2143 u4_scratch_mem_used += (sizeof(bin_ctxt_model_t) * NUM_CABAC_CTXTS); 2144 u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used); 2145 2146 ps_dec->ps_left_mb_ctxt_info = (void *)(pu1_scratch_mem_base 2147 + u4_scratch_mem_used); 2148 u4_scratch_mem_used += sizeof(ctxt_inc_mb_info_t); 2149 u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used); 2150 2151 ps_dec->pu4_defI_wts_ofsts = (void *)(pu1_scratch_mem_base 2152 + u4_scratch_mem_used); 2153 u4_scratch_mem_used += 2154 sizeof(UWORD32) 2155 * (ps_sps->u1_num_ref_frames 2156 * ps_sps->u1_num_ref_frames); 2157 u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used); 2158 2159 ps_dec->pu1_ref_buff = pu1_scratch_mem_base + u4_scratch_mem_used + MAX_REF_BUF_SIZE; 2160 u4_scratch_mem_used += MAX_REF_BUF_SIZE * 2; 2161 u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used); 2162 ps_dec->pi2_pred1 = 2163 (void *)(pu1_scratch_mem_base + u4_scratch_mem_used); 2164 u4_scratch_mem_used += ((sizeof(WORD16)) * PRED_BUFFER_WIDTH 2165 * PRED_BUFFER_HEIGHT * 2); 2166 u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used); 2167 2168 ps_dec->pu1_temp_mc_buffer = (void *)(pu1_scratch_mem_base 2169 + u4_scratch_mem_used); 2170 u4_scratch_mem_used += sizeof(UWORD8) * (MB_LUM_SIZE); 2171 2172 ps_dec->ps_parse_mb_data = (void *)(pu1_scratch_mem_base 2173 + u4_scratch_mem_used); 2174 u4_scratch_mem_used += sizeof(parse_pmbarams_t) 2175 * (ps_dec->u1_recon_mb_grp); 2176 u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used); 2177 2178 ps_dec->ps_parse_part_params = (void *)(pu1_scratch_mem_base 2179 + u4_scratch_mem_used); 2180 u4_scratch_mem_used += sizeof(parse_part_params_t) 2181 * ((ps_dec->u1_recon_mb_grp) << 4); 2182 u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used); 2183 2184 ps_dec->ps_dpb_mgr->ps_init_dpb[0][0] = 2185 (struct pic_buffer_t*)(pu1_scratch_mem_base 2186 + u4_scratch_mem_used); 2187 u4_scratch_mem_used += 2 * MAX_REF_BUFS * sizeof(struct pic_buffer_t); 2188 2189 u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used); 2190 ps_dec->ps_dpb_mgr->ps_init_dpb[1][0] = 2191 (struct pic_buffer_t*)(pu1_scratch_mem_base + u4_scratch_mem_used); 2192 u4_scratch_mem_used += 2 * MAX_REF_BUFS * sizeof(struct pic_buffer_t); 2193 u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used); 2194 ps_dec->pu4_mbaff_wt_mat = (UWORD32 *)(pu1_scratch_mem_base + u4_scratch_mem_used); 2195 2196 u4_scratch_mem_used += (sizeof(UWORD32) * 3 2197 * (MAX_FRAMES * MAX_FRAMES)) 2198 << 3; 2199 u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used); 2200 2201 ps_dec->pu4_wts_ofsts_mat = (UWORD32 *)(pu1_scratch_mem_base + u4_scratch_mem_used); 2202 u4_scratch_mem_used += sizeof(UWORD32) * 2 * 3 2203 * (MAX_FRAMES * MAX_FRAMES); 2204 u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used); 2205 } 2206 /********************************************************************/ 2207 /* check whether deblk memory used is less than the scratch buffer */ 2208 /* and assign deblocking pointers in the the reference buffers */ 2209 /********************************************************************/ 2210 { 2211 /************************************************************/ 2212 /* Post allocation Initialisations */ 2213 /************************************************************/ 2214 memset(ps_dec->ppv_map_ref_idx_to_poc, 0, 2215 (TOTAL_LIST_ENTRIES + PAD_MAP_IDX_POC) * sizeof(void *)); 2216 ps_dec->ppv_map_ref_idx_to_poc += OFFSET_MAP_IDX_POC; 2217 2218 { 2219 ps_dec->ps_parse_cur_slice = &(ps_dec->ps_dec_slice_buf[0]); 2220 ps_dec->ps_decode_cur_slice = &(ps_dec->ps_dec_slice_buf[0]); 2221 ps_dec->ps_computebs_cur_slice = &(ps_dec->ps_dec_slice_buf[0]); 2222 2223 ps_dec->ps_pred_start = ps_dec->ps_pred; 2224 ps_dec->u4_ref_buf_size = MAX_REF_BUF_SIZE; 2225 } 2226 2227 { 2228 UWORD8 i; 2229 struct pic_buffer_t *ps_init_dpb; 2230 ps_init_dpb = ps_dec->ps_dpb_mgr->ps_init_dpb[0][0]; 2231 for(i = 0; i < 2 * MAX_REF_BUFS; i++) 2232 { 2233 ps_init_dpb->pu1_buf1 = NULL; 2234 ps_init_dpb->u1_long_term_frm_idx = MAX_REF_BUFS + 1; 2235 ps_dec->ps_dpb_mgr->ps_init_dpb[0][i] = ps_init_dpb; 2236 ps_dec->ps_dpb_mgr->ps_mod_dpb[0][i] = ps_init_dpb; 2237 ps_init_dpb++; 2238 } 2239 2240 ps_init_dpb = ps_dec->ps_dpb_mgr->ps_init_dpb[1][0]; 2241 for(i = 0; i < 2 * MAX_REF_BUFS; i++) 2242 { 2243 ps_init_dpb->pu1_buf1 = NULL; 2244 ps_init_dpb->u1_long_term_frm_idx = MAX_REF_BUFS + 1; 2245 ps_dec->ps_dpb_mgr->ps_init_dpb[1][i] = ps_init_dpb; 2246 ps_dec->ps_dpb_mgr->ps_mod_dpb[1][i] = ps_init_dpb; 2247 ps_init_dpb++; 2248 } 2249 } 2250 } 2251 2252 /*persistent memory allocations*/ 2253 2254 { 2255 UWORD8 *pu1_persitent_mem_base; 2256 UWORD32 u4_persistent_mem_used; 2257 2258 pu1_persitent_mem_base = 2259 ps_dec->ps_mem_tab[MEM_REC_INTERNAL_PERSIST].pv_base; 2260 u4_persistent_mem_used = 0; 2261 2262 ps_dec->ps_deblk_top_mb = (void *)(pu1_persitent_mem_base 2263 + u4_persistent_mem_used); 2264 u4_persistent_mem_used += ((u4_wd_mbs 2265 * sizeof(deblkmb_neighbour_t)) << uc_frmOrFld); 2266 u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used); 2267 2268 ps_dec->ps_left_mvpred_addr = (void *)(pu1_persitent_mem_base 2269 + u4_persistent_mem_used); 2270 u4_persistent_mem_used += (sizeof(neighbouradd_t) << 2); 2271 u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used); 2272 2273 ps_dec->p_ctxt_inc_mb_map = (void *)(pu1_persitent_mem_base 2274 + u4_persistent_mem_used); 2275 u4_persistent_mem_used += ((sizeof(ctxt_inc_mb_info_t)) 2276 * (((u4_wd_mbs + 1) << uc_frmOrFld) + 1)); 2277 u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used); 2278 2279 ps_dec->ps_mv_p[0] = (void *)(pu1_persitent_mem_base 2280 + u4_persistent_mem_used); 2281 u4_persistent_mem_used += (sizeof(mv_pred_t) * ps_dec->u1_recon_mb_grp 2282 * 16); 2283 u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used); 2284 2285 ps_dec->ps_mv_p[1] = (void *)(pu1_persitent_mem_base 2286 + u4_persistent_mem_used); 2287 u4_persistent_mem_used += (sizeof(mv_pred_t) * ps_dec->u1_recon_mb_grp 2288 * 16); 2289 u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used); 2290 2291 { 2292 UWORD8 i; 2293 for(i = 0; i < MV_SCRATCH_BUFS; i++) 2294 { 2295 2296 ps_dec->ps_mv_top_p[i] = (void *)(pu1_persitent_mem_base 2297 + u4_persistent_mem_used); 2298 u4_persistent_mem_used += (sizeof(mv_pred_t) 2299 * ps_dec->u1_recon_mb_grp * 4); 2300 u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used); 2301 2302 } 2303 } 2304 2305 { 2306 UWORD32 u4_numRows = MB_SIZE << 1; 2307 2308 /* Allocate memory for ping, pong and left reconstruction buffers */ 2309 u4_blk_wd = ((ps_dec->u1_recon_mb_grp << 4) >> 1) + 8; 2310 2311 ps_dec->pu1_y_scratch[0] = (void *)(pu1_persitent_mem_base 2312 + u4_persistent_mem_used); 2313 u4_persistent_mem_used += sizeof(UWORD8) * u4_numRows * u4_blk_wd; 2314 u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used); 2315 2316 ps_dec->pu1_y_scratch[1] = (void *)(pu1_persitent_mem_base 2317 + u4_persistent_mem_used); 2318 u4_persistent_mem_used += sizeof(UWORD8) * u4_numRows * u4_blk_wd; 2319 u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used); 2320 2321 u4_numRows = BLK8x8SIZE << 1; 2322 u4_blk_wd = ((ps_dec->u1_recon_mb_grp << 3) >> 1) + 8; 2323 2324 ps_dec->pu1_u_scratch[0] = (void *)(pu1_persitent_mem_base 2325 + u4_persistent_mem_used); 2326 u4_persistent_mem_used += sizeof(UWORD8) * u4_numRows * u4_blk_wd; 2327 u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used); 2328 2329 ps_dec->pu1_v_scratch[0] = (void *)(pu1_persitent_mem_base 2330 + u4_persistent_mem_used); 2331 u4_persistent_mem_used += sizeof(UWORD8) * u4_numRows * u4_blk_wd; 2332 u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used); 2333 2334 ps_dec->pu1_u_scratch[1] = (void *)(pu1_persitent_mem_base 2335 + u4_persistent_mem_used); 2336 u4_persistent_mem_used += sizeof(UWORD8) * u4_numRows * u4_blk_wd; 2337 u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used); 2338 2339 ps_dec->pu1_v_scratch[1] = (void *)(pu1_persitent_mem_base 2340 + u4_persistent_mem_used); 2341 u4_persistent_mem_used += sizeof(UWORD8) * u4_numRows * u4_blk_wd; 2342 u4_persistent_mem_used += 32; 2343 u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used); 2344 2345 } 2346 2347 ps_dec->pu1_y_intra_pred_line = (void *)(pu1_persitent_mem_base 2348 + u4_persistent_mem_used); 2349 u4_persistent_mem_used += sizeof(UWORD8) * ((u4_wd_mbs + 1) * MB_SIZE) * 2; 2350 u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used); 2351 2352 ps_dec->pu1_u_intra_pred_line = (void *)(pu1_persitent_mem_base 2353 + u4_persistent_mem_used); 2354 u4_persistent_mem_used += sizeof(UWORD8) * ((u4_wd_mbs + 1) * MB_SIZE) * 2; 2355 u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used); 2356 2357 ps_dec->pu1_v_intra_pred_line = (void *)(pu1_persitent_mem_base 2358 + u4_persistent_mem_used); 2359 u4_persistent_mem_used += sizeof(UWORD8) * ((u4_wd_mbs + 1) * MB_SIZE) * 2; 2360 u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used); 2361 2362 ps_dec->ps_nbr_mb_row = (void *)(pu1_persitent_mem_base 2363 + u4_persistent_mem_used); 2364 if(ps_dec->u1_separate_parse) 2365 { 2366 u4_persistent_mem_used += sizeof(mb_neigbour_params_t) 2367 * ((u4_wd_mbs + 1) * u4_ht_mbs); 2368 memset(ps_dec->ps_nbr_mb_row, 0, sizeof(mb_neigbour_params_t) 2369 * ((u4_wd_mbs + 1) * u4_ht_mbs)); 2370 } 2371 else 2372 { 2373 u4_persistent_mem_used += sizeof(mb_neigbour_params_t) 2374 * ((u4_wd_mbs + 1) << uc_frmOrFld); 2375 memset(ps_dec->ps_nbr_mb_row, 0, sizeof(mb_neigbour_params_t) 2376 * ((u4_wd_mbs + 1) << uc_frmOrFld)); 2377 2378 } 2379 u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used); 2380 ps_dec->s_pad_mgr.pu1_row_y = (void *)(pu1_persitent_mem_base 2381 + u4_persistent_mem_used); 2382 u4_persistent_mem_used += ps_dec->u2_frm_wd_y; 2383 u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used); 2384 2385 ps_dec->s_pad_mgr.pu1_row_u = (void *)(pu1_persitent_mem_base 2386 + u4_persistent_mem_used); 2387 u4_persistent_mem_used += ps_dec->u2_frm_wd_uv; 2388 u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used); 2389 2390 ps_dec->s_pad_mgr.pu1_row_v = (void *)(pu1_persitent_mem_base 2391 + u4_persistent_mem_used); 2392 u4_persistent_mem_used += ps_dec->u2_frm_wd_uv; 2393 u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used); 2394 2395 ps_dec->s_pad_mgr.pu1_mb_y = (void *)(pu1_persitent_mem_base 2396 + u4_persistent_mem_used); 2397 u4_persistent_mem_used += ((MB_SIZE + 4) << uc_frmOrFld) * PAD_LEN_Y_H; 2398 u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used); 2399 2400 ps_dec->s_pad_mgr.pu1_mb_u = (void *)(pu1_persitent_mem_base 2401 + u4_persistent_mem_used); 2402 u4_persistent_mem_used += ((BLK8x8SIZE + 2) << uc_frmOrFld) 2403 * PAD_LEN_UV_H; 2404 u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used); 2405 2406 ps_dec->s_pad_mgr.pu1_mb_v = (void *)(pu1_persitent_mem_base 2407 + u4_persistent_mem_used); 2408 u4_persistent_mem_used += ((BLK8x8SIZE + 2) << uc_frmOrFld) 2409 * PAD_LEN_UV_H; 2410 u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used); 2411 } 2412 2413 /*Post allocation initializations*/ 2414 memset(ps_dec->pu1_y_intra_pred_line, 0, 2415 sizeof(UWORD8) * u4_luma_wd + PAD_LEN_Y_H); 2416 memset(ps_dec->pu1_u_intra_pred_line, 0, 2417 sizeof(UWORD8) * u4_chroma_wd + PAD_LEN_UV_H); 2418 memset(ps_dec->pu1_v_intra_pred_line, 0, 2419 sizeof(UWORD8) * u4_chroma_wd + PAD_LEN_UV_H); 2420 2421 /* 0th entry of CtxtIncMbMap will be always be containing default values 2422 for CABAC context representing MB not available */ 2423 ps_dec->p_ctxt_inc_mb_map += 1; 2424 /* Post allocation Increment Actions */ 2425 2426 /***************************************************************************/ 2427 /*Initialize cabac context pointers for every SE that has fixed contextIdx */ 2428 /***************************************************************************/ 2429 { 2430 bin_ctxt_model_t * const p_cabac_ctxt_table_t = 2431 ps_dec->p_cabac_ctxt_table_t; 2432 bin_ctxt_model_t * * p_coeff_abs_level_minus1_t = 2433 ps_dec->p_coeff_abs_level_minus1_t; 2434 bin_ctxt_model_t * * p_cbf_t = ps_dec->p_cbf_t; 2435 2436 ps_dec->p_mb_field_dec_flag_t = p_cabac_ctxt_table_t 2437 + MB_FIELD_DECODING_FLAG; 2438 ps_dec->p_prev_intra4x4_pred_mode_flag_t = p_cabac_ctxt_table_t 2439 + PREV_INTRA4X4_PRED_MODE_FLAG; 2440 ps_dec->p_rem_intra4x4_pred_mode_t = p_cabac_ctxt_table_t 2441 + REM_INTRA4X4_PRED_MODE; 2442 ps_dec->p_intra_chroma_pred_mode_t = p_cabac_ctxt_table_t 2443 + INTRA_CHROMA_PRED_MODE; 2444 ps_dec->p_mb_qp_delta_t = p_cabac_ctxt_table_t + MB_QP_DELTA; 2445 ps_dec->p_ref_idx_t = p_cabac_ctxt_table_t + REF_IDX; 2446 ps_dec->p_mvd_x_t = p_cabac_ctxt_table_t + MVD_X; 2447 ps_dec->p_mvd_y_t = p_cabac_ctxt_table_t + MVD_Y; 2448 p_cbf_t[0] = p_cabac_ctxt_table_t + CBF + 0; 2449 p_cbf_t[1] = p_cabac_ctxt_table_t + CBF + 4; 2450 p_cbf_t[2] = p_cabac_ctxt_table_t + CBF + 8; 2451 p_cbf_t[3] = p_cabac_ctxt_table_t + CBF + 12; 2452 p_cbf_t[4] = p_cabac_ctxt_table_t + CBF + 16; 2453 ps_dec->p_cbp_luma_t = p_cabac_ctxt_table_t + CBP_LUMA; 2454 ps_dec->p_cbp_chroma_t = p_cabac_ctxt_table_t + CBP_CHROMA; 2455 2456 p_coeff_abs_level_minus1_t[LUMA_DC_CTXCAT] = p_cabac_ctxt_table_t 2457 + COEFF_ABS_LEVEL_MINUS1 + COEFF_ABS_LEVEL_CAT_0_OFFSET; 2458 2459 p_coeff_abs_level_minus1_t[LUMA_AC_CTXCAT] = p_cabac_ctxt_table_t 2460 + COEFF_ABS_LEVEL_MINUS1 + COEFF_ABS_LEVEL_CAT_1_OFFSET; 2461 2462 p_coeff_abs_level_minus1_t[LUMA_4X4_CTXCAT] = p_cabac_ctxt_table_t 2463 + COEFF_ABS_LEVEL_MINUS1 + COEFF_ABS_LEVEL_CAT_2_OFFSET; 2464 2465 p_coeff_abs_level_minus1_t[CHROMA_DC_CTXCAT] = p_cabac_ctxt_table_t 2466 + COEFF_ABS_LEVEL_MINUS1 + COEFF_ABS_LEVEL_CAT_3_OFFSET; 2467 2468 p_coeff_abs_level_minus1_t[CHROMA_AC_CTXCAT] = p_cabac_ctxt_table_t 2469 + COEFF_ABS_LEVEL_MINUS1 + COEFF_ABS_LEVEL_CAT_4_OFFSET; 2470 2471 p_coeff_abs_level_minus1_t[LUMA_8X8_CTXCAT] = p_cabac_ctxt_table_t 2472 + COEFF_ABS_LEVEL_MINUS1_8X8 2473 + COEFF_ABS_LEVEL_CAT_5_OFFSET; 2474 2475 /********************************************************/ 2476 /* context for the high profile related syntax elements */ 2477 /* This is maintained seperately in s_high_profile */ 2478 /********************************************************/ 2479 { 2480 2481 ps_dec->s_high_profile.ps_transform8x8_flag = p_cabac_ctxt_table_t 2482 + TRANSFORM_SIZE_8X8_FLAG; 2483 2484 ps_dec->s_high_profile.ps_sigcoeff_8x8_frame = p_cabac_ctxt_table_t 2485 + SIGNIFICANT_COEFF_FLAG_8X8_FRAME; 2486 2487 ps_dec->s_high_profile.ps_last_sigcoeff_8x8_frame = 2488 p_cabac_ctxt_table_t 2489 + LAST_SIGNIFICANT_COEFF_FLAG_8X8_FRAME; 2490 2491 ps_dec->s_high_profile.ps_coeff_abs_levelminus1 = 2492 p_cabac_ctxt_table_t + COEFF_ABS_LEVEL_MINUS1_8X8; 2493 2494 ps_dec->s_high_profile.ps_sigcoeff_8x8_field = p_cabac_ctxt_table_t 2495 + SIGNIFICANT_COEFF_FLAG_8X8_FIELD; 2496 2497 ps_dec->s_high_profile.ps_last_sigcoeff_8x8_field = 2498 p_cabac_ctxt_table_t 2499 + LAST_SIGNIFICANT_COEFF_FLAG_8X8_FIELD; 2500 2501 } 2502 2503 } 2504 return (i16_status); 2505 } 2506 2507 /*! 2508 ************************************************************************** 2509 * \if Function name : ih264d_create_mv_bank \endif 2510 * 2511 * \brief 2512 * This function creates MV bank. 2513 * 2514 * \param memType : Type of memory being handled 2515 * 0: Display Buffer 2516 * 1: Decoder Buffer 2517 * 2: Internal Buffer 2518 * \param u1_num_of_buf: Number of decode or display buffers. 2519 * \param u4_wd : Frame width. 2520 * \param u4_ht : Frame Height. 2521 * \param ps_pic_buf_api : Pointer to Picture Buffer API. 2522 * \param ih264d_dec_mem_manager : Memory manager utility supplied by system. 2523 * 2524 * \return 2525 * 0 on Success and -1 on error 2526 * 2527 ************************************************************************** 2528 */ 2529 WORD32 ih264d_create_mv_bank(void *pv_dec, 2530 UWORD32 ui_width, 2531 UWORD32 ui_height) 2532 { 2533 UWORD8 i; 2534 UWORD32 col_flag_buffer_size, mvpred_buffer_size; 2535 UWORD8 *pu1_mv_buf_mgr_base, *pu1_mv_bank_base; 2536 UWORD32 u4_mv_buf_mgr_mem_used, u4_mv_bank_mem_used; 2537 col_mv_buf_t *ps_col_mv; 2538 mv_pred_t *ps_mv; 2539 UWORD8 *pu1_col_zero_flag_buf; 2540 dec_struct_t *ps_dec = (dec_struct_t *)pv_dec; 2541 WORD32 buf_ret; 2542 UWORD32 u4_num_bufs; 2543 2544 pu1_mv_buf_mgr_base = ps_dec->ps_mem_tab[MEM_REC_MV_BUF_MGR].pv_base; 2545 u4_mv_buf_mgr_mem_used = 0; 2546 col_flag_buffer_size = ((ui_width * ui_height) >> 4); 2547 2548 pu1_mv_bank_base = ps_dec->ps_mem_tab[MEM_REC_MVBANK].pv_base; 2549 u4_mv_bank_mem_used = 0; 2550 mvpred_buffer_size = sizeof(mv_pred_t) 2551 * ((ui_width * (ui_height + PAD_MV_BANK_ROW)) >> 4); 2552 2553 ps_dec->pv_mv_buf_mgr = (void *)(pu1_mv_buf_mgr_base + u4_mv_buf_mgr_mem_used); 2554 u4_mv_buf_mgr_mem_used += sizeof(buf_mgr_t) + ithread_get_mutex_lock_size(); 2555 ih264_buf_mgr_init((buf_mgr_t *)ps_dec->pv_mv_buf_mgr); 2556 2557 ps_col_mv = (col_mv_buf_t *)(pu1_mv_buf_mgr_base + u4_mv_buf_mgr_mem_used); 2558 u4_mv_buf_mgr_mem_used += sizeof(col_mv_buf_t) * (H264_MAX_REF_PICS * 2); 2559 u4_mv_buf_mgr_mem_used = ALIGN128(u4_mv_buf_mgr_mem_used); 2560 2561 u4_num_bufs = ih264d_get_numbuf_mv_bank(ps_dec, ui_width, ui_height); 2562 2563 u4_num_bufs = MIN(u4_num_bufs, ps_dec->u1_pic_bufs); 2564 2565 for(i = 0 ; i < u4_num_bufs ; i++) 2566 { 2567 pu1_col_zero_flag_buf = pu1_mv_buf_mgr_base + u4_mv_buf_mgr_mem_used; 2568 u4_mv_buf_mgr_mem_used += col_flag_buffer_size; 2569 2570 ps_mv = (mv_pred_t *)(pu1_mv_bank_base + u4_mv_bank_mem_used); 2571 u4_mv_bank_mem_used += mvpred_buffer_size; 2572 2573 memset(ps_mv, 0, ((ui_width*OFFSET_MV_BANK_ROW) >> 4) * sizeof(mv_pred_t)); 2574 ps_mv += (ui_width*OFFSET_MV_BANK_ROW) >> 4; 2575 2576 ps_col_mv->pv_col_zero_flag = (void *)pu1_col_zero_flag_buf; 2577 ps_col_mv->pv_mv = (void *)ps_mv; 2578 buf_ret = ih264_buf_mgr_add((buf_mgr_t *)ps_dec->pv_mv_buf_mgr, ps_col_mv, i); 2579 if(0 != buf_ret) 2580 { 2581 ps_dec->i4_error_code = ERROR_BUF_MGR; 2582 return ERROR_BUF_MGR; 2583 } 2584 ps_col_mv++; 2585 } 2586 2587 if((u4_mv_buf_mgr_mem_used > ps_dec->ps_mem_tab[MEM_REC_MV_BUF_MGR].u4_mem_size) || 2588 (u4_mv_bank_mem_used > ps_dec->ps_mem_tab[MEM_REC_MVBANK].u4_mem_size)) 2589 { 2590 ps_dec->i4_error_code = ERROR_BUF_MGR; 2591 return ERROR_BUF_MGR; 2592 } 2593 2594 return OK; 2595 2596 } 2597 2598 2599 void ih264d_unpack_coeff4x4_dc_4x4blk(tu_sblk4x4_coeff_data_t *ps_tu_4x4, 2600 WORD16 *pi2_out_coeff_data, 2601 UWORD8 *pu1_inv_scan) 2602 { 2603 UWORD16 u2_sig_coeff_map = ps_tu_4x4->u2_sig_coeff_map; 2604 WORD32 idx; 2605 WORD16 *pi2_coeff_data = &ps_tu_4x4->ai2_level[0]; 2606 2607 while(u2_sig_coeff_map) 2608 { 2609 idx = CLZ(u2_sig_coeff_map); 2610 2611 idx = 31 - idx; 2612 RESET_BIT(u2_sig_coeff_map,idx); 2613 2614 idx = pu1_inv_scan[idx]; 2615 pi2_out_coeff_data[idx] = *pi2_coeff_data++; 2616 2617 } 2618 } 2619