ih264d_parse_slice.c revision 086dd8ea90eaf4ead8b4927e777b1c8a19bd23a9
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_parse_slice.c 23 * 24 * \brief 25 * Contains routines that decodes a slice NAL unit 26 * 27 * \date 28 * 19/12/2002 29 * 30 * \author AI 31 ************************************************************************** 32 */ 33#include <string.h> 34#include "ih264_typedefs.h" 35#include "ih264_macros.h" 36#include "ih264_platform_macros.h" 37#include "ithread.h" 38#include "ih264d_structs.h" 39#include "ih264d_debug.h" 40#include "ih264d_bitstrm.h" 41#include "ih264d_parse_mb_header.h" 42#include "ih264d_process_bslice.h" 43#include "ih264d_process_pslice.h" 44#include "ih264d_parse_cavlc.h" 45#include "ih264d_utils.h" 46#include "ih264d_deblocking.h" 47#include "ih264d_defs.h" 48#include "ih264d_error_handler.h" 49#include "ih264d_tables.h" 50#include "ih264d_defs.h" 51#include "ih264d_mem_request.h" 52#include "ih264d_parse_islice.h" 53#include "ih264d_parse_slice.h" 54#include "ih264d_mvpred.h" 55#include "ih264d_mb_utils.h" 56 57#include "ih264d_defs.h" 58#include "ih264d_quant_scaling.h" 59 60#include "ih264d_inter_pred.h" 61 62#include "ih264d_sei.h" 63#include "ih264d.h" 64#include "ih264_error.h" 65#include "ih264_disp_mgr.h" 66#include "ih264_buf_mgr.h" 67 68#include "ih264d_thread_parse_decode.h" 69#include "ih264d_thread_compute_bs.h" 70#include "ih264d_dpb_manager.h" 71#include <assert.h> 72#include "ih264d_parse_islice.h" 73#define RET_LAST_SKIP 0x80000000 74 75/*! 76 ************************************************************************** 77 * \if Function name : ih264d_form_pred_weight_matrix \endif 78 * 79 * \brief 80 * Forms pred weight matrix. 81 * 82 * \return 83 * None 84 * 85 ************************************************************************** 86 */ 87 88void ih264d_form_pred_weight_matrix(dec_struct_t *ps_dec) 89{ 90 dec_slice_params_t *ps_cur_slice; 91 UWORD8 uc_num_ref_idx_l0_active, uc_num_ref_idx_l1_active; 92 UWORD8 i, j; 93 UWORD32 *pu4_mat_iwt_ofst; 94 UWORD16 i2_idx; 95 UWORD32 *pui32_weight_offset_l0, *pui32_weight_offset_l1; 96 UWORD32 u4_temp; 97 98 ps_cur_slice = ps_dec->ps_cur_slice; 99 uc_num_ref_idx_l0_active = ps_cur_slice->u1_num_ref_idx_lx_active[0]; 100 uc_num_ref_idx_l1_active = ps_cur_slice->u1_num_ref_idx_lx_active[1]; 101 102 pu4_mat_iwt_ofst = ps_dec->pu4_wts_ofsts_mat; 103 104 if(ps_cur_slice->u1_slice_type == B_SLICE) 105 { 106 for(i = 0; i < uc_num_ref_idx_l0_active; i++) 107 { 108 pui32_weight_offset_l0 = ps_cur_slice->u4_wt_ofst_lx[0][i]; 109 for(j = 0; j < uc_num_ref_idx_l1_active; j++) 110 { 111 pui32_weight_offset_l1 = ps_cur_slice->u4_wt_ofst_lx[1][j]; 112 i2_idx = i * uc_num_ref_idx_l0_active + j; 113 i2_idx = X3(i2_idx); 114 /* u4_temp = (pui32_weight_offset_l0[0] | (pui32_weight_offset_l1[0] << 16)); 115 pu4_mat_iwt_ofst[0] = u4_temp; 116 u4_temp = (pui32_weight_offset_l0[1] | (pui32_weight_offset_l1[1] << 16)); 117 pu4_mat_iwt_ofst[1] = u4_temp; 118 u4_temp = (pui32_weight_offset_l0[2] | (pui32_weight_offset_l1[2] << 16)); 119 pu4_mat_iwt_ofst[2] = u4_temp; 120 pu4_mat_iwt_ofst += 3;*/ 121 pu4_mat_iwt_ofst[0] = pui32_weight_offset_l0[0]; 122 pu4_mat_iwt_ofst[1] = pui32_weight_offset_l1[0]; 123 pu4_mat_iwt_ofst[2] = pui32_weight_offset_l0[1]; 124 pu4_mat_iwt_ofst[3] = pui32_weight_offset_l1[1]; 125 pu4_mat_iwt_ofst[4] = pui32_weight_offset_l0[2]; 126 pu4_mat_iwt_ofst[5] = pui32_weight_offset_l1[2]; 127 pu4_mat_iwt_ofst += 6; 128 } 129 } 130 } 131 else 132 { 133 for(i = 0; i < uc_num_ref_idx_l0_active; i++) 134 { 135 pui32_weight_offset_l0 = ps_cur_slice->u4_wt_ofst_lx[0][i]; 136 i2_idx = X3(i); 137 u4_temp = (UWORD32)pui32_weight_offset_l0[0]; 138 pu4_mat_iwt_ofst[0] = u4_temp; 139 u4_temp = (UWORD32)pui32_weight_offset_l0[1]; 140 pu4_mat_iwt_ofst[2] = u4_temp; 141 u4_temp = (UWORD32)pui32_weight_offset_l0[2]; 142 pu4_mat_iwt_ofst[4] = u4_temp; 143 pu4_mat_iwt_ofst += 6; 144 } 145 } 146} 147 148 149/*! 150 ************************************************************************** 151 * \if Function name : init_firstSliceParam \endif 152 * 153 * \brief 154 * Initialize the Parameter required for all the slices for a picture 155 * 156 * \return : Nothing 157 * 158 ************************************************************************** 159 */ 160 161WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, 162 WORD32 i4_poc, 163 pocstruct_t *ps_temp_poc, 164 UWORD16 u2_frame_num, 165 dec_pic_params_t *ps_pps) 166{ 167 pocstruct_t *ps_prev_poc = &ps_dec->s_cur_pic_poc; 168 pocstruct_t *ps_cur_poc = ps_temp_poc; 169 170 pic_buffer_t *pic_buf; 171 172 ivd_video_decode_op_t * ps_dec_output = 173 (ivd_video_decode_op_t *)ps_dec->pv_dec_out; 174 dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice; 175 dec_seq_params_t *ps_seq = ps_pps->ps_sps; 176 UWORD8 u1_bottom_field_flag = ps_cur_slice->u1_bottom_field_flag; 177 UWORD8 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag; 178 /* high profile related declarations */ 179 high_profile_tools_t s_high_profile; 180 WORD32 ret; 181 182 H264_MUTEX_LOCK(&ps_dec->process_disp_mutex); 183 184 ps_prev_poc->i4_pic_order_cnt_lsb = ps_cur_poc->i4_pic_order_cnt_lsb; 185 ps_prev_poc->i4_pic_order_cnt_msb = ps_cur_poc->i4_pic_order_cnt_msb; 186 ps_prev_poc->i4_delta_pic_order_cnt_bottom = 187 ps_cur_poc->i4_delta_pic_order_cnt_bottom; 188 ps_prev_poc->i4_delta_pic_order_cnt[0] = 189 ps_cur_poc->i4_delta_pic_order_cnt[0]; 190 ps_prev_poc->i4_delta_pic_order_cnt[1] = 191 ps_cur_poc->i4_delta_pic_order_cnt[1]; 192 ps_prev_poc->u1_bot_field = ps_dec->ps_cur_slice->u1_bottom_field_flag; 193 ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst; 194 ps_prev_poc->u2_frame_num = u2_frame_num; 195 ps_dec->i1_prev_mb_qp_delta = 0; 196 ps_dec->i1_next_ctxt_idx = 0; 197 198 199 ps_dec->u4_nmb_deblk = 0; 200 if(ps_dec->u4_num_cores == 1) 201 ps_dec->u4_nmb_deblk = 1; 202 203 204 205 if(ps_seq->u1_mb_aff_flag == 1) 206 { 207 ps_dec->u4_nmb_deblk = 0; 208 if(ps_dec->u4_num_cores > 2) 209 ps_dec->u4_num_cores = 2; 210 } 211 212 ps_dec->u4_use_intrapred_line_copy = 0; 213 214 215 216 if (ps_seq->u1_mb_aff_flag == 0) 217 { 218 ps_dec->u4_use_intrapred_line_copy = 1; 219 } 220 221 ps_dec->u4_app_disable_deblk_frm = 0; 222 /* If degrade is enabled, set the degrade flags appropriately */ 223 if(ps_dec->i4_degrade_type && ps_dec->i4_degrade_pics) 224 { 225 WORD32 degrade_pic; 226 ps_dec->i4_degrade_pic_cnt++; 227 degrade_pic = 0; 228 229 /* If degrade is to be done in all frames, then do not check further */ 230 switch(ps_dec->i4_degrade_pics) 231 { 232 case 4: 233 { 234 degrade_pic = 1; 235 break; 236 } 237 case 3: 238 { 239 if(ps_cur_slice->u1_slice_type != I_SLICE) 240 degrade_pic = 1; 241 242 break; 243 } 244 case 2: 245 { 246 247 /* If pic count hits non-degrade interval or it is an islice, then do not degrade */ 248 if((ps_cur_slice->u1_slice_type != I_SLICE) 249 && (ps_dec->i4_degrade_pic_cnt 250 != ps_dec->i4_nondegrade_interval)) 251 degrade_pic = 1; 252 253 break; 254 } 255 case 1: 256 { 257 /* Check if the current picture is non-ref */ 258 if(0 == ps_cur_slice->u1_nal_ref_idc) 259 { 260 degrade_pic = 1; 261 } 262 break; 263 } 264 265 } 266 if(degrade_pic) 267 { 268 if(ps_dec->i4_degrade_type & 0x2) 269 ps_dec->u4_app_disable_deblk_frm = 1; 270 271 /* MC degrading is done only for non-ref pictures */ 272 if(0 == ps_cur_slice->u1_nal_ref_idc) 273 { 274 if(ps_dec->i4_degrade_type & 0x4) 275 ps_dec->i4_mv_frac_mask = 0; 276 277 if(ps_dec->i4_degrade_type & 0x8) 278 ps_dec->i4_mv_frac_mask = 0; 279 } 280 } 281 else 282 ps_dec->i4_degrade_pic_cnt = 0; 283 } 284 285 { 286 dec_err_status_t * ps_err = ps_dec->ps_dec_err_status; 287 if(ps_dec->u1_sl_typ_5_9 288 && ((ps_cur_slice->u1_slice_type == I_SLICE) 289 || (ps_cur_slice->u1_slice_type 290 == SI_SLICE))) 291 ps_err->u1_cur_pic_type = PIC_TYPE_I; 292 else 293 ps_err->u1_cur_pic_type = PIC_TYPE_UNKNOWN; 294 295 if(ps_err->u1_pic_aud_i == PIC_TYPE_I) 296 { 297 ps_err->u1_cur_pic_type = PIC_TYPE_I; 298 ps_err->u1_pic_aud_i = PIC_TYPE_UNKNOWN; 299 } 300 301 if(ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL) 302 { 303 if(ps_err->u1_err_flag) 304 ih264d_reset_ref_bufs(ps_dec->ps_dpb_mgr); 305 ps_err->u1_err_flag = ACCEPT_ALL_PICS; 306 } 307 } 308 309 if(ps_dec->u1_init_dec_flag && ps_dec->s_prev_seq_params.u1_eoseq_pending) 310 { 311 /* Reset the decoder picture buffers */ 312 WORD32 j; 313 for(j = 0; j < MAX_DISP_BUFS_NEW; j++) 314 { 315 316 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, 317 j, 318 BUF_MGR_REF); 319 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr, 320 ps_dec->au1_pic_buf_id_mv_buf_id_map[j], 321 BUF_MGR_REF); 322 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, 323 j, 324 BUF_MGR_IO); 325 } 326 327 /* reset the decoder structure parameters related to buffer handling */ 328 ps_dec->u1_second_field = 0; 329 ps_dec->i4_cur_display_seq = 0; 330 331 /********************************************************************/ 332 /* indicate in the decoder output i4_status that some frames are being */ 333 /* dropped, so that it resets timestamp and wait for a new sequence */ 334 /********************************************************************/ 335 336 ps_dec->s_prev_seq_params.u1_eoseq_pending = 0; 337 } 338 ret = ih264d_init_pic(ps_dec, u2_frame_num, i4_poc, ps_pps); 339 if(ret != OK) 340 return ret; 341 342 ps_dec->pv_parse_tu_coeff_data = ps_dec->pv_pic_tu_coeff_data; 343 ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_pic_tu_coeff_data; 344 ps_dec->ps_nmb_info = ps_dec->ps_frm_mb_info; 345 if(ps_dec->u1_separate_parse) 346 { 347 UWORD16 pic_wd = ps_dec->u4_width_at_init; 348 UWORD16 pic_ht = ps_dec->u4_height_at_init; 349 UWORD32 num_mbs; 350 351 if((NULL != ps_dec->ps_cur_sps) && (1 == (ps_dec->ps_cur_sps->u1_is_valid))) 352 { 353 pic_wd = ps_dec->u2_pic_wd; 354 pic_ht = ps_dec->u2_pic_ht; 355 } 356 num_mbs = (pic_wd * pic_ht) >> 8; 357 358 if(ps_dec->pu1_dec_mb_map) 359 { 360 memset((void *)ps_dec->pu1_dec_mb_map, 0, num_mbs); 361 } 362 363 if(ps_dec->pu1_recon_mb_map) 364 { 365 366 memset((void *)ps_dec->pu1_recon_mb_map, 0, num_mbs); 367 } 368 369 if(ps_dec->pu2_slice_num_map) 370 { 371 memset((void *)ps_dec->pu2_slice_num_map, 0, 372 (num_mbs * sizeof(UWORD16))); 373 } 374 375 } 376 377 ps_dec->ps_parse_cur_slice = &(ps_dec->ps_dec_slice_buf[0]); 378 ps_dec->ps_decode_cur_slice = &(ps_dec->ps_dec_slice_buf[0]); 379 ps_dec->ps_computebs_cur_slice = &(ps_dec->ps_dec_slice_buf[0]); 380 381 /* Initialize all the HP toolsets to zero */ 382 ps_dec->s_high_profile.u1_scaling_present = 0; 383 ps_dec->s_high_profile.u1_transform8x8_present = 0; 384 385 /* Get Next Free Picture */ 386 if(1 == ps_dec->u4_share_disp_buf) 387 { 388 UWORD32 i; 389 /* Free any buffer that is in the queue to be freed */ 390 for(i = 0; i < MAX_DISP_BUFS_NEW; i++) 391 { 392 if(0 == ps_dec->u4_disp_buf_to_be_freed[i]) 393 continue; 394 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, i, 395 BUF_MGR_IO); 396 ps_dec->u4_disp_buf_to_be_freed[i] = 0; 397 ps_dec->u4_disp_buf_mapping[i] = 0; 398 399 } 400 } 401 if(!(u1_field_pic_flag && 0 != ps_dec->u1_top_bottom_decoded)) //ps_dec->u1_second_field)) 402 { 403 pic_buffer_t *ps_cur_pic; 404 WORD32 cur_pic_buf_id, cur_mv_buf_id; 405 col_mv_buf_t *ps_col_mv; 406 while(1) 407 { 408 ps_cur_pic = (pic_buffer_t *)ih264_buf_mgr_get_next_free( 409 (buf_mgr_t *)ps_dec->pv_pic_buf_mgr, 410 &cur_pic_buf_id); 411 if(ps_cur_pic == NULL) 412 { 413 ps_dec->i4_error_code = ERROR_UNAVAIL_PICBUF_T; 414 return ERROR_UNAVAIL_PICBUF_T; 415 } 416 if(0 == ps_dec->u4_disp_buf_mapping[cur_pic_buf_id]) 417 { 418 break; 419 } 420 421 } 422 ps_col_mv = (col_mv_buf_t *)ih264_buf_mgr_get_next_free((buf_mgr_t *)ps_dec->pv_mv_buf_mgr, 423 &cur_mv_buf_id); 424 if(ps_col_mv == NULL) 425 { 426 ps_dec->i4_error_code = ERROR_UNAVAIL_MVBUF_T; 427 return ERROR_UNAVAIL_MVBUF_T; 428 } 429 430 ps_dec->ps_cur_pic = ps_cur_pic; 431 ps_dec->u1_pic_buf_id = cur_pic_buf_id; 432 ps_cur_pic->u4_ts = ps_dec->u4_ts; 433 434 435 ps_cur_pic->u1_mv_buf_id = cur_mv_buf_id; 436 ps_dec->au1_pic_buf_id_mv_buf_id_map[cur_pic_buf_id] = cur_mv_buf_id; 437 438 ps_cur_pic->pu1_col_zero_flag = (UWORD8 *)ps_col_mv->pv_col_zero_flag; 439 ps_cur_pic->ps_mv = (mv_pred_t *)ps_col_mv->pv_mv; 440 ps_dec->au1_pic_buf_ref_flag[cur_pic_buf_id] = 0; 441 if(ps_dec->u1_first_slice_in_stream) 442 { 443 /*make first entry of list0 point to cur pic,so that if first Islice is in error, ref pic struct will have valid entries*/ 444 ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_init_dpb[0]; 445 *(ps_dec->ps_dpb_mgr->ps_init_dpb[0][0]) = *ps_cur_pic; 446 } 447 448 if(!ps_dec->ps_cur_pic) 449 { 450 WORD32 j; 451 H264_DEC_DEBUG_PRINT("------- Display Buffers Reset --------\n"); 452 for(j = 0; j < MAX_DISP_BUFS_NEW; j++) 453 { 454 455 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, 456 j, 457 BUF_MGR_REF); 458 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr, 459 ps_dec->au1_pic_buf_id_mv_buf_id_map[j], 460 BUF_MGR_REF); 461 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, 462 j, 463 BUF_MGR_IO); 464 } 465 466 ps_dec->i4_cur_display_seq = 0; 467 ps_dec->i4_prev_max_display_seq = 0; 468 ps_dec->i4_max_poc = 0; 469 470 ps_cur_pic = (pic_buffer_t *)ih264_buf_mgr_get_next_free( 471 (buf_mgr_t *)ps_dec->pv_pic_buf_mgr, 472 &cur_pic_buf_id); 473 if(ps_cur_pic == NULL) 474 { 475 ps_dec->i4_error_code = ERROR_UNAVAIL_PICBUF_T; 476 return ERROR_UNAVAIL_PICBUF_T; 477 } 478 479 ps_col_mv = (col_mv_buf_t *)ih264_buf_mgr_get_next_free((buf_mgr_t *)ps_dec->pv_mv_buf_mgr, 480 &cur_mv_buf_id); 481 if(ps_col_mv == NULL) 482 { 483 ps_dec->i4_error_code = ERROR_UNAVAIL_MVBUF_T; 484 return ERROR_UNAVAIL_MVBUF_T; 485 } 486 487 ps_dec->ps_cur_pic = ps_cur_pic; 488 ps_dec->u1_pic_buf_id = cur_pic_buf_id; 489 ps_cur_pic->u4_ts = ps_dec->u4_ts; 490 ps_dec->apv_buf_id_pic_buf_map[cur_pic_buf_id] = (void *)ps_cur_pic; 491 492 ps_cur_pic->u1_mv_buf_id = cur_mv_buf_id; 493 ps_dec->au1_pic_buf_id_mv_buf_id_map[cur_pic_buf_id] = cur_mv_buf_id; 494 495 ps_cur_pic->pu1_col_zero_flag = (UWORD8 *)ps_col_mv->pv_col_zero_flag; 496 ps_cur_pic->ps_mv = (mv_pred_t *)ps_col_mv->pv_mv; 497 ps_dec->au1_pic_buf_ref_flag[cur_pic_buf_id] = 0; 498 499 } 500 501 ps_dec->ps_cur_pic->u1_picturetype = u1_field_pic_flag; 502 ps_dec->ps_cur_pic->u4_pack_slc_typ = SKIP_NONE; 503 H264_DEC_DEBUG_PRINT("got a buffer\n"); 504 } 505 else 506 { 507 H264_DEC_DEBUG_PRINT("did not get a buffer\n"); 508 } 509 510 ps_dec->u4_pic_buf_got = 1; 511 512 ps_dec->ps_cur_pic->i4_poc = i4_poc; 513 ps_dec->ps_cur_pic->i4_frame_num = u2_frame_num; 514 ps_dec->ps_cur_pic->i4_pic_num = u2_frame_num; 515 ps_dec->ps_cur_pic->i4_top_field_order_cnt = ps_pps->i4_top_field_order_cnt; 516 ps_dec->ps_cur_pic->i4_bottom_field_order_cnt = 517 ps_pps->i4_bottom_field_order_cnt; 518 ps_dec->ps_cur_pic->i4_avg_poc = ps_pps->i4_avg_poc; 519 ps_dec->ps_cur_pic->u4_time_stamp = ps_dec->u4_pts; 520 521 ps_dec->s_cur_pic = *(ps_dec->ps_cur_pic); 522 if(u1_field_pic_flag && u1_bottom_field_flag) 523 { 524 WORD32 i4_temp_poc; 525 WORD32 i4_top_field_order_poc, i4_bot_field_order_poc; 526 /* Point to odd lines, since it's bottom field */ 527 ps_dec->s_cur_pic.pu1_buf1 += ps_dec->s_cur_pic.u2_frm_wd_y; 528 ps_dec->s_cur_pic.pu1_buf2 += ps_dec->s_cur_pic.u2_frm_wd_uv; 529 ps_dec->s_cur_pic.pu1_buf3 += ps_dec->s_cur_pic.u2_frm_wd_uv; 530 ps_dec->s_cur_pic.ps_mv += 531 ((ps_dec->u2_pic_ht * ps_dec->u2_pic_wd) >> 5); 532 ps_dec->s_cur_pic.pu1_col_zero_flag += ((ps_dec->u2_pic_ht 533 * ps_dec->u2_pic_wd) >> 5); 534 ps_dec->ps_cur_pic->u1_picturetype |= BOT_FLD; 535 i4_top_field_order_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt; 536 i4_bot_field_order_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt; 537 i4_temp_poc = MIN(i4_top_field_order_poc, 538 i4_bot_field_order_poc); 539 ps_dec->ps_cur_pic->i4_avg_poc = i4_temp_poc; 540 } 541 542 ps_cur_slice->u1_mbaff_frame_flag = ps_seq->u1_mb_aff_flag 543 && (!u1_field_pic_flag); 544 545 ps_dec->ps_cur_pic->u1_picturetype |= (ps_cur_slice->u1_mbaff_frame_flag 546 << 2); 547 548 ps_dec->ps_cur_mb_row = ps_dec->ps_nbr_mb_row; //[0]; 549 ps_dec->ps_cur_mb_row++; //Increment by 1 ,so that left mb will always be valid 550 ps_dec->ps_top_mb_row = 551 ps_dec->ps_nbr_mb_row 552 + ((ps_dec->u2_frm_wd_in_mbs + 1) 553 << (1 554 - ps_dec->ps_cur_sps->u1_frame_mbs_only_flag)); 555 ps_dec->ps_top_mb_row++; //Increment by 1 ,so that left mb will always be valid 556 557 ps_dec->pu1_y = ps_dec->pu1_y_scratch[0]; 558 ps_dec->pu1_u = ps_dec->pu1_u_scratch[0]; 559 ps_dec->pu1_v = ps_dec->pu1_v_scratch[0]; 560 ps_dec->u1_yuv_scratch_idx = 0; 561 /* CHANGED CODE */ 562 ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv; 563 ps_dec->ps_mv_top = ps_dec->ps_mv_top_p[0]; 564 /* CHANGED CODE */ 565 ps_dec->u1_mv_top_p = 0; 566 ps_dec->u1_mb_idx = 0; 567 /* CHANGED CODE */ 568 ps_dec->ps_mv_left = ps_dec->s_cur_pic.ps_mv; 569 ps_dec->pu1_yleft = 0; 570 ps_dec->pu1_uleft = 0; 571 ps_dec->pu1_vleft = 0; 572 ps_dec->u1_not_wait_rec = 2; 573 ps_dec->u2_total_mbs_coded = 0; 574 ps_dec->i4_submb_ofst = -(SUB_BLK_SIZE); 575 ps_dec->u4_pred_info_idx = 0; 576 ps_dec->u4_pred_info_pkd_idx = 0; 577 ps_dec->u4_dma_buf_idx = 0; 578 ps_dec->ps_mv = ps_dec->s_cur_pic.ps_mv; 579 ps_dec->ps_mv_bank_cur = ps_dec->s_cur_pic.ps_mv; 580 ps_dec->pu1_col_zero_flag = ps_dec->s_cur_pic.pu1_col_zero_flag; 581 ps_dec->ps_part = ps_dec->ps_parse_part_params; 582 ps_dec->i2_prev_slice_mbx = -1; 583 ps_dec->i2_prev_slice_mby = 0; 584 ps_dec->u2_mv_2mb[0] = 0; 585 ps_dec->u2_mv_2mb[1] = 0; 586 ps_dec->u1_last_pic_not_decoded = 0; 587 588 ps_dec->u2_cur_slice_num = 0; 589 ps_dec->u2_cur_slice_num_dec_thread = 0; 590 ps_dec->u2_cur_slice_num_bs = 0; 591 ps_dec->u4_intra_pred_line_ofst = 0; 592 ps_dec->pu1_cur_y_intra_pred_line = ps_dec->pu1_y_intra_pred_line; 593 ps_dec->pu1_cur_u_intra_pred_line = ps_dec->pu1_u_intra_pred_line; 594 ps_dec->pu1_cur_v_intra_pred_line = ps_dec->pu1_v_intra_pred_line; 595 596 ps_dec->pu1_cur_y_intra_pred_line_base = ps_dec->pu1_y_intra_pred_line; 597 ps_dec->pu1_cur_u_intra_pred_line_base = ps_dec->pu1_u_intra_pred_line; 598 ps_dec->pu1_cur_v_intra_pred_line_base = ps_dec->pu1_v_intra_pred_line; 599 600 601 602 603 604 ps_dec->pu1_prev_y_intra_pred_line = ps_dec->pu1_y_intra_pred_line 605 + (ps_dec->u2_frm_wd_in_mbs * MB_SIZE); 606 607 ps_dec->pu1_prev_u_intra_pred_line = ps_dec->pu1_u_intra_pred_line 608 + ps_dec->u2_frm_wd_in_mbs * BLK8x8SIZE * YUV420SP_FACTOR; 609 ps_dec->pu1_prev_v_intra_pred_line = ps_dec->pu1_v_intra_pred_line 610 + ps_dec->u2_frm_wd_in_mbs * BLK8x8SIZE; 611 612 ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic; 613 ps_dec->ps_deblk_mbn_curr = ps_dec->ps_deblk_mbn; 614 ps_dec->ps_deblk_mbn_prev = ps_dec->ps_deblk_mbn + ps_dec->u1_recon_mb_grp; 615 /* Initialize The Function Pointer Depending Upon the Entropy and MbAff Flag */ 616 { 617 if(ps_cur_slice->u1_mbaff_frame_flag) 618 { 619 ps_dec->pf_compute_bs = ih264d_compute_bs_mbaff; 620 ps_dec->pf_mvpred = ih264d_mvpred_mbaff; 621 } 622 else 623 { 624 ps_dec->pf_compute_bs = ih264d_compute_bs_non_mbaff; 625 ps_dec->u1_cur_mb_fld_dec_flag = ps_cur_slice->u1_field_pic_flag; 626 } 627 } 628 /* Set up the Parameter for DMA transfer */ 629 { 630 UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag; 631 632 UWORD8 u1_mbaff = ps_cur_slice->u1_mbaff_frame_flag; 633 634 UWORD8 uc_lastmbs = (((ps_dec->u2_pic_wd) >> 4) 635 % (ps_dec->u1_recon_mb_grp >> u1_mbaff)); 636 UWORD16 ui16_lastmbs_widthY = 637 (uc_lastmbs ? (uc_lastmbs << 4) : ((ps_dec->u1_recon_mb_grp 638 >> u1_mbaff) << 4)); 639 UWORD16 ui16_lastmbs_widthUV = 640 uc_lastmbs ? (uc_lastmbs << 3) : ((ps_dec->u1_recon_mb_grp 641 >> u1_mbaff) << 3); 642 643 ps_dec->s_tran_addrecon.pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1; 644 ps_dec->s_tran_addrecon.pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2; 645 ps_dec->s_tran_addrecon.pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3; 646 647 ps_dec->s_tran_addrecon.u2_frm_wd_y = ps_dec->u2_frm_wd_y 648 << u1_field_pic_flag; 649 ps_dec->s_tran_addrecon.u2_frm_wd_uv = ps_dec->u2_frm_wd_uv 650 << u1_field_pic_flag; 651 652 if(u1_field_pic_flag) 653 { 654 ui16_lastmbs_widthY += ps_dec->u2_frm_wd_y; 655 ui16_lastmbs_widthUV += ps_dec->u2_frm_wd_uv; 656 } 657 658 /* Normal Increment of Pointer */ 659 ps_dec->s_tran_addrecon.u4_inc_y[0] = ((ps_dec->u1_recon_mb_grp << 4) 660 >> u1_mbaff); 661 ps_dec->s_tran_addrecon.u4_inc_uv[0] = ((ps_dec->u1_recon_mb_grp << 4) 662 >> u1_mbaff); 663 664 /* End of Row Increment */ 665 ps_dec->s_tran_addrecon.u4_inc_y[1] = (ui16_lastmbs_widthY 666 + (PAD_LEN_Y_H << 1) 667 + ps_dec->s_tran_addrecon.u2_frm_wd_y 668 * ((15 << u1_mbaff) + u1_mbaff)); 669 ps_dec->s_tran_addrecon.u4_inc_uv[1] = (ui16_lastmbs_widthUV 670 + (PAD_LEN_UV_H << 2) 671 + ps_dec->s_tran_addrecon.u2_frm_wd_uv 672 * ((15 << u1_mbaff) + u1_mbaff)); 673 674 /* Assign picture numbers to each frame/field */ 675 /* only once per picture. */ 676 ih264d_assign_pic_num(ps_dec); 677 ps_dec->s_tran_addrecon.u2_mv_top_left_inc = (ps_dec->u1_recon_mb_grp 678 << 2) - 1 - (u1_mbaff << 2); 679 ps_dec->s_tran_addrecon.u2_mv_left_inc = ((ps_dec->u1_recon_mb_grp 680 >> u1_mbaff) - 1) << (4 + u1_mbaff); 681 } 682 /**********************************************************************/ 683 /* High profile related initialization at pictrue level */ 684 /**********************************************************************/ 685 if(ps_seq->u1_profile_idc == HIGH_PROFILE_IDC) 686 { 687 if((ps_seq->i4_seq_scaling_matrix_present_flag) 688 || (ps_pps->i4_pic_scaling_matrix_present_flag)) 689 { 690 ih264d_form_scaling_matrix_picture(ps_seq, ps_pps, ps_dec); 691 ps_dec->s_high_profile.u1_scaling_present = 1; 692 } 693 else 694 { 695 ih264d_form_default_scaling_matrix(ps_dec); 696 } 697 698 if(ps_pps->i4_transform_8x8_mode_flag) 699 { 700 ps_dec->s_high_profile.u1_transform8x8_present = 1; 701 } 702 } 703 else 704 { 705 ih264d_form_default_scaling_matrix(ps_dec); 706 } 707 708 /* required while reading the transform_size_8x8 u4_flag */ 709 ps_dec->s_high_profile.u1_direct_8x8_inference_flag = 710 ps_seq->u1_direct_8x8_inference_flag; 711 ps_dec->s_high_profile.s_cavlc_ctxt = ps_dec->s_cavlc_ctxt; 712 713 ps_dec->i1_recon_in_thread3_flag = 1; 714 ps_dec->ps_frame_buf_ip_recon = &ps_dec->s_tran_addrecon; 715 if(ps_dec->u1_separate_parse) 716 { 717 memcpy(&ps_dec->s_tran_addrecon_parse, &ps_dec->s_tran_addrecon, 718 sizeof(tfr_ctxt_t)); 719 if(ps_dec->u4_num_cores >= 3 && ps_dec->i1_recon_in_thread3_flag) 720 { 721 memcpy(&ps_dec->s_tran_iprecon, &ps_dec->s_tran_addrecon, 722 sizeof(tfr_ctxt_t)); 723 ps_dec->ps_frame_buf_ip_recon = &ps_dec->s_tran_iprecon; 724 } 725 } 726 727 728 ih264d_init_deblk_tfr_ctxt(ps_dec,&(ps_dec->s_pad_mgr), &(ps_dec->s_tran_addrecon), 729 ps_dec->u2_frm_wd_in_mbs, 0); 730 731 ps_dec->ps_cur_deblk_mb = ps_dec->ps_deblk_pic; 732 ps_dec->u4_cur_deblk_mb_num = 0; 733 734 ps_dec->u4_deblk_mb_x = 0; 735 ps_dec->u4_deblk_mb_y = 0; 736 737 738 H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex); 739 return OK; 740} 741 742/*! 743 ************************************************************************** 744 * \if Function name : ih264d_deblock_display \endif 745 * 746 * \brief : The function callls the deblocking routine and manages 747 : the Recon buffers and displays . 748 * \return : Nothing 749 * 750 ************************************************************************** 751 */ 752WORD32 ih264d_end_of_pic_dispbuf_mgr(dec_struct_t * ps_dec) 753{ 754 dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice; 755 UWORD8 u1_num_of_users = 0; 756 WORD32 ret; 757 758 H264_MUTEX_LOCK(&ps_dec->process_disp_mutex); 759 if(1) 760 { 761 762 { 763 ih264d_delete_nonref_nondisplay_pics(ps_dec->ps_dpb_mgr); 764 if(ps_cur_slice->u1_mmco_equalto5 765 || (ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL)) 766 { 767 ps_dec->ps_cur_pic->i4_poc = 0; 768 if(ps_dec->u2_total_mbs_coded 769 == (ps_dec->ps_cur_sps->u2_max_mb_addr + 1)) 770 ih264d_reset_ref_bufs(ps_dec->ps_dpb_mgr); 771 ih264d_release_display_bufs(ps_dec); 772 } 773 if(ps_dec->u4_num_reorder_frames_at_init != 0) 774 { 775 ret = ih264d_assign_display_seq(ps_dec); 776 if(ret != OK) 777 return ret; 778 } 779 } 780 781 if(ps_cur_slice->u1_nal_ref_idc) 782 { 783 /* Mark pic buf as needed for reference */ 784 ih264_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, 785 ps_dec->u1_pic_buf_id, 786 BUF_MGR_REF); 787 /* Mark mv buf as needed for reference */ 788 ih264_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_mv_buf_mgr, 789 ps_dec->au1_pic_buf_id_mv_buf_id_map[ps_dec->u1_pic_buf_id], 790 BUF_MGR_REF); 791 ps_dec->au1_pic_buf_ref_flag[ps_dec->u1_pic_buf_id] = 1; 792 } 793 794 /* 420 consumer */ 795 /* Increment the number of users by 1 for display based upon */ 796 /*the SEEK KEY FRAME control sent to decoder */ 797 if(((0 == ps_dec->u1_last_pic_not_decoded) 798 && (0 799 == (ps_dec->ps_cur_pic->u4_pack_slc_typ 800 & ps_dec->u4_skip_frm_mask))) 801 || (ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL)) 802 { 803 /* Mark pic buf as needed for display */ 804 ih264_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, 805 ps_dec->u1_pic_buf_id, 806 BUF_MGR_IO); 807 808 } 809 810 if(!ps_cur_slice->u1_field_pic_flag 811 || ((TOP_FIELD_ONLY | BOT_FIELD_ONLY) 812 != ps_dec->u1_top_bottom_decoded)) 813 { 814 pic_buffer_t *ps_cur_pic = ps_dec->ps_cur_pic; 815 ps_cur_pic->u2_disp_width = ps_dec->u2_disp_width; 816 ps_cur_pic->u2_disp_height = ps_dec->u2_disp_height >> 1; 817 818 ps_cur_pic->u2_crop_offset_y = ps_dec->u2_crop_offset_y; 819 ps_cur_pic->u2_crop_offset_uv = ps_dec->u2_crop_offset_uv; 820 ps_cur_pic->u1_pic_type = 0; 821 822 ret = ih264d_insert_pic_in_display_list( 823 ps_dec->ps_dpb_mgr, 824 ps_dec->u1_pic_buf_id, 825 ps_dec->i4_prev_max_display_seq 826 + ps_dec->ps_cur_pic->i4_poc, 827 ps_dec->ps_cur_pic->i4_frame_num); 828 if(ret != OK) 829 return ret; 830 831 { 832 ivd_video_decode_op_t * ps_dec_output = 833 (ivd_video_decode_op_t *)ps_dec->pv_dec_out; 834 835 ps_dec_output->u4_frame_decoded_flag = 1; 836 } 837 if(ps_dec->au1_pic_buf_ref_flag[ps_dec->u1_pic_buf_id] == 0) 838 { 839 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr, 840 ps_dec->au1_pic_buf_id_mv_buf_id_map[ps_dec->u1_pic_buf_id], 841 BUF_MGR_REF); 842 ps_dec->au1_pic_buf_ref_flag[ps_dec->u1_pic_buf_id] = 0; 843 844 } 845 } 846 else 847 { 848 H264_DEC_DEBUG_PRINT("pic not inserted display %d %d\n", 849 ps_cur_slice->u1_field_pic_flag, 850 ps_dec->u1_second_field); 851 } 852 853 if(!ps_cur_slice->u1_field_pic_flag 854 || ((TOP_FIELD_ONLY | BOT_FIELD_ONLY) 855 == ps_dec->u1_top_bottom_decoded)) 856 { 857 if(ps_dec->u4_num_reorder_frames_at_init == 0) 858 { 859 ret = ih264d_assign_display_seq(ps_dec); 860 if(ret != OK) 861 return ret; 862 } 863 } 864 } 865 866 H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex); 867 868 return OK; 869} 870 871void ih264d_err_pic_dispbuf_mgr(dec_struct_t *ps_dec) 872{ 873 dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice; 874 ivd_video_decode_op_t * ps_dec_output = 875 (ivd_video_decode_op_t *)ps_dec->pv_dec_out; 876 877 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, 878 ps_dec->u1_pic_buf_id, 879 BUF_MGR_REF); 880 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr, 881 ps_dec->au1_pic_buf_id_mv_buf_id_map[ps_dec->u1_pic_buf_id], 882 BUF_MGR_REF); 883 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, 884 ps_dec->u1_pic_buf_id, 885 BUF_MGR_IO); 886} 887 888void ih264d_deblock_picture(void *ptr) 889{ 890 dec_struct_t *ps_dec = (dec_struct_t *)ptr; 891 892 { 893 /*Deblock picture only if all the mb's in the frame have been decoded*/ 894 if(ps_dec->u1_pic_decode_done == 1) 895 { 896 if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag 897 || ps_dec->ps_cur_slice->u1_field_pic_flag) 898 { 899 ps_dec->p_DeblockPicture[ps_dec->ps_cur_slice->u1_mbaff_frame_flag]( 900 ps_dec); 901 } 902 else 903 904 { 905 906 ih264d_deblock_picture_progressive(ps_dec); 907 } 908 909 } 910 } 911 912} 913 914/*! 915 ************************************************************************** 916 * \if Function name : ih264d_deblock_display \endif 917 * 918 * \brief : The function callls the deblocking routine and manages 919 : the Recon buffers and displays . 920 * \return : Nothing 921 * 922 ************************************************************************** 923 */ 924WORD32 ih264d_deblock_display(dec_struct_t *ps_dec) 925{ 926 WORD32 ret; 927 /* Call deblocking */ 928 ih264d_deblock_picture(ps_dec); 929 930 ret = ih264d_end_of_pic_dispbuf_mgr(ps_dec); 931 if(ret != OK) 932 return ret; 933 934 return OK; 935} 936 937/* 938 *! 939 ************************************************************************** 940 * \if Function name : EndofPoc \endif 941 * 942 * \brief 943 * EndofPoc Processing 944 * 945 * \return 946 * 0 on Success and Error code otherwise 947 ************************************************************************** 948 */ 949 950WORD32 ih264d_end_of_pic(dec_struct_t *ps_dec, 951 UWORD8 u1_is_idr_slice, 952 UWORD16 u2_frame_num) 953{ 954 dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice; 955 WORD32 ret; 956 957 ps_dec->u1_first_pb_nal_in_pic = 1; 958 ps_dec->u2_mbx = 0xffff; 959 ps_dec->u2_mby = 0; 960 { 961 dec_err_status_t * ps_err = ps_dec->ps_dec_err_status; 962 if(ps_err->u1_err_flag & REJECT_CUR_PIC) 963 { 964 ih264d_err_pic_dispbuf_mgr(ps_dec); 965 return ERROR_NEW_FRAME_EXPECTED; 966 } 967 } 968 969 H264_MUTEX_LOCK(&ps_dec->process_disp_mutex); 970 ret = ih264d_end_of_pic_processing(ps_dec); 971 if(ret != OK) 972 return ret; 973 ps_dec->u2_total_mbs_coded = 0; 974 /*--------------------------------------------------------------------*/ 975 /* ih264d_decode_pic_order_cnt - calculate the Pic Order Cnt */ 976 /* Needed to detect end of picture */ 977 /*--------------------------------------------------------------------*/ 978 { 979 pocstruct_t *ps_prev_poc = &ps_dec->s_prev_pic_poc; 980 pocstruct_t *ps_cur_poc = &ps_dec->s_cur_pic_poc; 981 if((0 == u1_is_idr_slice) && ps_cur_slice->u1_nal_ref_idc) 982 ps_dec->u2_prev_ref_frame_num = ps_cur_slice->u2_frame_num; 983 984 if(u1_is_idr_slice || ps_cur_slice->u1_mmco_equalto5) 985 ps_dec->u2_prev_ref_frame_num = 0; 986 987 if(ps_dec->ps_cur_sps->u1_gaps_in_frame_num_value_allowed_flag) 988 { 989 ret = ih264d_decode_gaps_in_frame_num(ps_dec, u2_frame_num); 990 if(ret != OK) 991 return ret; 992 } 993 994 ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst; 995 ps_prev_poc->u2_frame_num = ps_cur_poc->u2_frame_num; 996 ps_prev_poc->u1_mmco_equalto5 = ps_cur_slice->u1_mmco_equalto5; 997 if(ps_cur_slice->u1_nal_ref_idc) 998 { 999 ps_prev_poc->i4_pic_order_cnt_lsb = ps_cur_poc->i4_pic_order_cnt_lsb; 1000 ps_prev_poc->i4_pic_order_cnt_msb = ps_cur_poc->i4_pic_order_cnt_msb; 1001 ps_prev_poc->i4_delta_pic_order_cnt_bottom = 1002 ps_cur_poc->i4_delta_pic_order_cnt_bottom; 1003 ps_prev_poc->i4_delta_pic_order_cnt[0] = 1004 ps_cur_poc->i4_delta_pic_order_cnt[0]; 1005 ps_prev_poc->i4_delta_pic_order_cnt[1] = 1006 ps_cur_poc->i4_delta_pic_order_cnt[1]; 1007 ps_prev_poc->u1_bot_field = ps_cur_poc->u1_bot_field; 1008 } 1009 } 1010 1011 H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex); 1012 1013 return OK; 1014} 1015 1016/*! 1017 ************************************************************************** 1018 * \if Function name : DecodeSlice \endif 1019 * 1020 * \brief 1021 * Parses a slice 1022 * 1023 * \return 1024 * 0 on Success and Error code otherwise 1025 ************************************************************************** 1026 */ 1027 1028WORD32 ih264d_parse_decode_slice(UWORD8 u1_is_idr_slice, 1029 UWORD8 u1_nal_ref_idc, 1030 dec_struct_t *ps_dec /* Decoder parameters */ 1031 ) 1032{ 1033 dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm; 1034 dec_pic_params_t *ps_pps; 1035 dec_seq_params_t *ps_seq; 1036 dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice; 1037 pocstruct_t s_tmp_poc; 1038 WORD32 i_delta_poc[2]; 1039 WORD32 i4_poc = 0; 1040 UWORD16 u2_first_mb_in_slice, u2_frame_num; 1041 UWORD8 u1_field_pic_flag, u1_redundant_pic_cnt = 0, u1_slice_type; 1042 UWORD32 u4_idr_pic_id = 0; 1043 UWORD8 u1_bottom_field_flag, u1_pic_order_cnt_type; 1044 1045 UWORD8 u1_nal_unit_type; 1046 UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; 1047 UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; 1048 WORD8 i1_is_end_of_poc; 1049 1050 WORD32 ret, end_of_frame; 1051 WORD32 prev_slice_err, num_mb_skipped; 1052 UWORD8 u1_mbaff; 1053 pocstruct_t *ps_cur_poc; 1054 1055 UWORD32 u4_temp; 1056 WORD32 i_temp; 1057 UWORD32 u4_call_end_of_pic = 0; 1058 1059 /* read FirstMbInSlice and slice type*/ 1060 ps_dec->ps_dpb_cmds->u1_dpb_commands_read_slc = 0; 1061 u2_first_mb_in_slice = ih264d_uev(pu4_bitstrm_ofst, 1062 pu4_bitstrm_buf); 1063 if(u2_first_mb_in_slice 1064 > (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)) 1065 { 1066 1067 return ERROR_CORRUPTED_SLICE; 1068 } 1069 1070 /*we currently don not support ASO*/ 1071 if(((u2_first_mb_in_slice << ps_cur_slice->u1_mbaff_frame_flag) 1072 <= ps_dec->u2_cur_mb_addr) && (ps_dec->u2_cur_mb_addr != 0) 1073 && (ps_dec->u4_first_slice_in_pic != 0)) 1074 { 1075 return ERROR_CORRUPTED_SLICE; 1076 } 1077 1078 COPYTHECONTEXT("SH: first_mb_in_slice",u2_first_mb_in_slice); 1079 1080 u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); 1081 1082 if(u4_temp > 9) 1083 return ERROR_INV_SLC_TYPE_T; 1084 1085 u1_slice_type = u4_temp; 1086 COPYTHECONTEXT("SH: slice_type",(u1_slice_type)); 1087 ps_dec->u1_sl_typ_5_9 = 0; 1088 /* Find Out the Slice Type is 5 to 9 or not then Set the Flag */ 1089 /* u1_sl_typ_5_9 = 1 .Which tells that all the slices in the Pic*/ 1090 /* will be of same type of current */ 1091 if(u1_slice_type > 4) 1092 { 1093 u1_slice_type -= 5; 1094 ps_dec->u1_sl_typ_5_9 = 1; 1095 } 1096 1097 { 1098 UWORD32 skip; 1099 1100 if((ps_dec->i4_app_skip_mode == IVD_SKIP_PB) 1101 || (ps_dec->i4_dec_skip_mode == IVD_SKIP_PB)) 1102 { 1103 UWORD32 u4_bit_stream_offset = 0; 1104 1105 if(ps_dec->u1_nal_unit_type == IDR_SLICE_NAL) 1106 { 1107 skip = 0; 1108 1109 ps_dec->i4_dec_skip_mode = IVD_SKIP_NONE; 1110 } 1111 else if((I_SLICE == u1_slice_type) 1112 && (1 >= ps_dec->ps_cur_sps->u1_num_ref_frames)) 1113 { 1114 skip = 0; 1115 1116 ps_dec->i4_dec_skip_mode = IVD_SKIP_NONE; 1117 } 1118 else 1119 { 1120 skip = 1; 1121 } 1122 1123 /* If one frame worth of data is already skipped, do not skip the next one */ 1124 if((0 == u2_first_mb_in_slice) && (1 == ps_dec->u4_prev_nal_skipped)) 1125 { 1126 skip = 0; 1127 } 1128 1129 if(skip) 1130 { 1131 ps_dec->u4_prev_nal_skipped = 1; 1132 ps_dec->i4_dec_skip_mode = IVD_SKIP_PB; 1133 return 0; 1134 } 1135 else 1136 { 1137 /* If the previous NAL was skipped, then 1138 do not process that buffer in this call. 1139 Return to app and process it in the next call. 1140 This is necessary to handle cases where I/IDR is not complete in 1141 the current buffer and application intends to fill the remaining part of the bitstream 1142 later. This ensures we process only frame worth of data in every call */ 1143 if(1 == ps_dec->u4_prev_nal_skipped) 1144 { 1145 ps_dec->u4_return_to_app = 1; 1146 return 0; 1147 } 1148 } 1149 } 1150 1151 } 1152 1153 u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); 1154 if(u4_temp & MASK_ERR_PIC_SET_ID) 1155 return ERROR_INV_SPS_PPS_T; 1156 /* discard slice if pic param is invalid */ 1157 COPYTHECONTEXT("SH: pic_parameter_set_id", u4_temp); 1158 ps_pps = &ps_dec->ps_pps[u4_temp]; 1159 if(FALSE == ps_pps->u1_is_valid) 1160 { 1161 return ERROR_INV_SPS_PPS_T; 1162 } 1163 ps_seq = ps_pps->ps_sps; 1164 if(!ps_seq) 1165 return ERROR_INV_SPS_PPS_T; 1166 if(FALSE == ps_seq->u1_is_valid) 1167 return ERROR_INV_SPS_PPS_T; 1168 1169 /* Get the frame num */ 1170 u2_frame_num = ih264d_get_bits_h264(ps_bitstrm, 1171 ps_seq->u1_bits_in_frm_num); 1172// H264_DEC_DEBUG_PRINT("FRAME %d First MB in slice: %d\n", u2_frame_num, u2_first_mb_in_slice); 1173 1174 COPYTHECONTEXT("SH: frame_num", u2_frame_num); 1175// H264_DEC_DEBUG_PRINT("Second field: %d frame num: %d prv_frame_num: %d \n", ps_dec->u1_second_field, u2_frame_num, ps_dec->u2_prv_frame_num); 1176 1177 /* Get the field related flags */ 1178 if(!ps_seq->u1_frame_mbs_only_flag) 1179 { 1180 1181 u1_field_pic_flag = ih264d_get_bit_h264(ps_bitstrm); 1182 COPYTHECONTEXT("SH: field_pic_flag", u1_field_pic_flag); 1183 u1_bottom_field_flag = 0; 1184 1185 if(u1_field_pic_flag) 1186 { 1187 ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan_fld; 1188 u1_bottom_field_flag = ih264d_get_bit_h264(ps_bitstrm); 1189 COPYTHECONTEXT("SH: bottom_field_flag", u1_bottom_field_flag); 1190 1191 } 1192 else 1193 { 1194 ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan; 1195 } 1196 } 1197 else 1198 { 1199 u1_field_pic_flag = 0; 1200 u1_bottom_field_flag = 0; 1201 1202 ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan; 1203 } 1204 1205 u1_nal_unit_type = SLICE_NAL; 1206 if(u1_is_idr_slice) 1207 { 1208 if(0 == u1_field_pic_flag) 1209 { 1210 ps_dec->u1_top_bottom_decoded = TOP_FIELD_ONLY | BOT_FIELD_ONLY; 1211 } 1212 u1_nal_unit_type = IDR_SLICE_NAL; 1213 u4_idr_pic_id = ih264d_uev(pu4_bitstrm_ofst, 1214 pu4_bitstrm_buf); 1215 if(u4_idr_pic_id > 65535) 1216 return ERROR_INV_SPS_PPS_T; 1217 COPYTHECONTEXT("SH: ", u4_idr_pic_id); 1218 } 1219 1220 /* read delta pic order count information*/ 1221 i_delta_poc[0] = i_delta_poc[1] = 0; 1222 s_tmp_poc.i4_pic_order_cnt_lsb = 0; 1223 s_tmp_poc.i4_delta_pic_order_cnt_bottom = 0; 1224 u1_pic_order_cnt_type = ps_seq->u1_pic_order_cnt_type; 1225 if(u1_pic_order_cnt_type == 0) 1226 { 1227 i_temp = ih264d_get_bits_h264( 1228 ps_bitstrm, 1229 ps_seq->u1_log2_max_pic_order_cnt_lsb_minus); 1230 if(i_temp < 0 || i_temp >= ps_seq->i4_max_pic_order_cntLsb) 1231 return ERROR_INV_SPS_PPS_T; 1232 s_tmp_poc.i4_pic_order_cnt_lsb = i_temp; 1233 COPYTHECONTEXT("SH: pic_order_cnt_lsb", s_tmp_poc.i4_pic_order_cnt_lsb); 1234 1235 if((ps_pps->u1_pic_order_present_flag == 1) && (!u1_field_pic_flag)) 1236 { 1237 s_tmp_poc.i4_delta_pic_order_cnt_bottom = ih264d_sev( 1238 pu4_bitstrm_ofst, pu4_bitstrm_buf); 1239 //if(s_tmp_poc.i4_delta_pic_order_cnt_bottom > ps_seq->i4_max_pic_order_cntLsb) 1240 COPYTHECONTEXT("SH: delta_pic_order_cnt_bottom", 1241 s_tmp_poc.i4_delta_pic_order_cnt_bottom); 1242 } 1243 } 1244 1245 s_tmp_poc.i4_delta_pic_order_cnt[0] = 0; 1246 s_tmp_poc.i4_delta_pic_order_cnt[1] = 0; 1247 if(u1_pic_order_cnt_type == 1 1248 && (!ps_seq->u1_delta_pic_order_always_zero_flag)) 1249 { 1250 s_tmp_poc.i4_delta_pic_order_cnt[0] = ih264d_sev(pu4_bitstrm_ofst, 1251 pu4_bitstrm_buf); 1252 COPYTHECONTEXT("SH: delta_pic_order_cnt[0]", 1253 s_tmp_poc.i4_delta_pic_order_cnt[0]); 1254 1255 if(ps_pps->u1_pic_order_present_flag && !u1_field_pic_flag) 1256 { 1257 s_tmp_poc.i4_delta_pic_order_cnt[1] = ih264d_sev( 1258 pu4_bitstrm_ofst, pu4_bitstrm_buf); 1259 COPYTHECONTEXT("SH: delta_pic_order_cnt[1]", 1260 s_tmp_poc.i4_delta_pic_order_cnt[1]); 1261 } 1262 } 1263 1264 if(ps_pps->u1_redundant_pic_cnt_present_flag) 1265 { 1266 u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); 1267 if(u4_temp > MAX_REDUNDANT_PIC_CNT) 1268 return ERROR_INV_SPS_PPS_T; 1269 u1_redundant_pic_cnt = u4_temp; 1270 COPYTHECONTEXT("SH: redundant_pic_cnt", u1_redundant_pic_cnt); 1271 } 1272 1273 /*--------------------------------------------------------------------*/ 1274 /* Check if the slice is part of new picture */ 1275 /*--------------------------------------------------------------------*/ 1276 i1_is_end_of_poc = 0; 1277 if(!ps_dec->u1_first_slice_in_stream) 1278 { 1279 i1_is_end_of_poc = ih264d_is_end_of_pic(u2_frame_num, u1_nal_ref_idc, 1280 &s_tmp_poc, &ps_dec->s_cur_pic_poc, 1281 ps_cur_slice, u1_pic_order_cnt_type, 1282 u1_nal_unit_type, u4_idr_pic_id, 1283 u1_field_pic_flag, 1284 u1_bottom_field_flag); 1285 1286 /* since we support only Full frame decode, every new process should 1287 * process a new pic 1288 */ 1289 if((ps_dec->u4_first_slice_in_pic == 2) && (i1_is_end_of_poc == 0)) 1290 { 1291 /* if it is the first slice is process call ,it should be a new frame. If it is not 1292 * reject current pic and dont add it to dpb 1293 */ 1294 ps_dec->ps_dec_err_status->u1_err_flag |= REJECT_CUR_PIC; 1295 i1_is_end_of_poc = 1; 1296 } 1297 else 1298 { 1299 /* reset REJECT_CUR_PIC */ 1300 ps_dec->ps_dec_err_status->u1_err_flag &= MASK_REJECT_CUR_PIC; 1301 } 1302 } 1303 1304 /*--------------------------------------------------------------------*/ 1305 /* Check for error in slice and parse the missing/corrupted MB's */ 1306 /* as skip-MB's in an inserted P-slice */ 1307 /*--------------------------------------------------------------------*/ 1308 u1_mbaff = ps_seq->u1_mb_aff_flag && (!u1_field_pic_flag); 1309 prev_slice_err = 0; 1310 1311 if(i1_is_end_of_poc || ps_dec->u1_first_slice_in_stream) 1312 { 1313 if(u2_frame_num != ps_dec->u2_prv_frame_num 1314 && ps_dec->u1_top_bottom_decoded != 0 1315 && ps_dec->u1_top_bottom_decoded 1316 != (TOP_FIELD_ONLY | BOT_FIELD_ONLY)) 1317 { 1318 ps_dec->u1_dangling_field = 1; 1319 if(ps_dec->u4_first_slice_in_pic) 1320 { 1321 // first slice - dangling field 1322 prev_slice_err = 1; 1323 } 1324 else 1325 { 1326 // last slice - dangling field 1327 prev_slice_err = 2; 1328 } 1329 1330 if(ps_dec->u1_top_bottom_decoded ==TOP_FIELD_ONLY) 1331 ps_cur_slice->u1_bottom_field_flag = 1; 1332 else 1333 ps_cur_slice->u1_bottom_field_flag = 0; 1334 1335 num_mb_skipped = (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs) 1336 - ps_dec->u2_total_mbs_coded; 1337 ps_cur_poc = &ps_dec->s_cur_pic_poc; 1338 1339 u1_is_idr_slice = ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL; 1340 } 1341 else if(ps_dec->u4_first_slice_in_pic == 2) 1342 { 1343 if(u2_first_mb_in_slice > 0) 1344 { 1345 // first slice - missing/header corruption 1346 prev_slice_err = 1; 1347 num_mb_skipped = u2_first_mb_in_slice << u1_mbaff; 1348 ps_cur_poc = &s_tmp_poc; 1349 1350 // initializing slice parameters 1351 ps_cur_slice->u4_idr_pic_id = u4_idr_pic_id; 1352 ps_cur_slice->u1_field_pic_flag = u1_field_pic_flag; 1353 ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag; 1354 ps_cur_slice->i4_pic_order_cnt_lsb = 1355 s_tmp_poc.i4_pic_order_cnt_lsb; 1356 ps_cur_slice->u1_nal_unit_type = u1_nal_unit_type; 1357 ps_cur_slice->u1_redundant_pic_cnt = u1_redundant_pic_cnt; 1358 ps_cur_slice->u1_nal_ref_idc = u1_nal_ref_idc; 1359 ps_cur_slice->u1_pic_order_cnt_type = u1_pic_order_cnt_type; 1360 } 1361 } 1362 else 1363 { 1364 1365 if(ps_dec->u4_first_slice_in_pic) 1366 { 1367 /* if valid slice header is not decoded do start of pic processing 1368 * since in the current process call, frame num is not updated in the slice structure yet 1369 * ih264d_is_end_of_pic is checked with valid frame num of previous process call, 1370 * although i1_is_end_of_poc is set there could be more slices in the frame, 1371 * so conceal only till cur slice */ 1372 prev_slice_err = 1; 1373 num_mb_skipped = u2_first_mb_in_slice << u1_mbaff; 1374 } 1375 else 1376 { 1377 /* since i1_is_end_of_poc is set ,means new frame num is encountered. so conceal the current frame 1378 * completely */ 1379 prev_slice_err = 2; 1380 num_mb_skipped = (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs) 1381 - ps_dec->u2_total_mbs_coded; 1382 } 1383 ps_cur_poc = &s_tmp_poc; 1384 } 1385 } 1386 else 1387 { 1388 if((u2_first_mb_in_slice << u1_mbaff) > ps_dec->u2_total_mbs_coded) 1389 { 1390 // previous slice - missing/corruption 1391 prev_slice_err = 2; 1392 num_mb_skipped = (u2_first_mb_in_slice << u1_mbaff) 1393 - ps_dec->u2_total_mbs_coded; 1394 ps_cur_poc = &s_tmp_poc; 1395 } 1396 else if((u2_first_mb_in_slice << u1_mbaff) < ps_dec->u2_total_mbs_coded) 1397 { 1398 return ERROR_CORRUPTED_SLICE; 1399 } 1400 } 1401 1402 if(prev_slice_err) 1403 { 1404 ret = ih264d_mark_err_slice_skip(ps_dec, num_mb_skipped, u1_is_idr_slice, u2_frame_num, ps_cur_poc, prev_slice_err); 1405 1406 if(ps_dec->u1_dangling_field == 1) 1407 { 1408 ps_dec->u1_second_field = 1 - ps_dec->u1_second_field; 1409 ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag; 1410 ps_dec->u2_prv_frame_num = u2_frame_num; 1411 ps_dec->u1_first_slice_in_stream = 0; 1412 return ERROR_DANGLING_FIELD_IN_PIC; 1413 } 1414 1415 if(prev_slice_err == 2) 1416 { 1417 ps_dec->u1_first_slice_in_stream = 0; 1418 return ERROR_INCOMPLETE_FRAME; 1419 } 1420 1421 if(ps_dec->u2_total_mbs_coded 1422 >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs) 1423 { 1424 /* return if all MBs in frame are parsed*/ 1425 ps_dec->u1_first_slice_in_stream = 0; 1426 return ERROR_IN_LAST_SLICE_OF_PIC; 1427 } 1428 1429 if(ps_dec->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC) 1430 { 1431 ih264d_err_pic_dispbuf_mgr(ps_dec); 1432 return ERROR_NEW_FRAME_EXPECTED; 1433 } 1434 1435 if(ret != OK) 1436 return ret; 1437 1438 i1_is_end_of_poc = 0; 1439 } 1440 1441 if (ps_dec->u4_first_slice_in_pic == 0) 1442 ps_dec->ps_parse_cur_slice++; 1443 1444 ps_dec->u1_slice_header_done = 0; 1445 1446 /*--------------------------------------------------------------------*/ 1447 /* If the slice is part of new picture, do End of Pic processing. */ 1448 /*--------------------------------------------------------------------*/ 1449 if(!ps_dec->u1_first_slice_in_stream) 1450 { 1451 UWORD8 uc_mbs_exceed = 0; 1452 1453 if(ps_dec->u2_total_mbs_coded 1454 == (ps_dec->ps_cur_sps->u2_max_mb_addr + 1)) 1455 { 1456 /*u2_total_mbs_coded is forced to u2_max_mb_addr+ 1 at the end of decode ,so 1457 ,if it is first slice in pic dont consider u2_total_mbs_coded to detect new picture */ 1458 if(ps_dec->u4_first_slice_in_pic == 0) 1459 uc_mbs_exceed = 1; 1460 } 1461 1462 if(i1_is_end_of_poc || uc_mbs_exceed) 1463 { 1464 1465 if(1 == ps_dec->u1_last_pic_not_decoded) 1466 { 1467 ret = ih264d_end_of_pic_dispbuf_mgr(ps_dec); 1468 1469 if(ret != OK) 1470 return ret; 1471 1472 ret = ih264d_end_of_pic(ps_dec, u1_is_idr_slice, u2_frame_num); 1473 if(ret != OK) 1474 return ret; 1475#if WIN32 1476 H264_DEC_DEBUG_PRINT(" ------ PIC SKIPPED ------\n"); 1477#endif 1478 return RET_LAST_SKIP; 1479 } 1480 else 1481 { 1482 ret = ih264d_end_of_pic(ps_dec, u1_is_idr_slice, u2_frame_num); 1483 if(ret != OK) 1484 return ret; 1485 } 1486 1487 } 1488 } 1489 1490 if(u1_field_pic_flag) 1491 { 1492 ps_dec->u2_prv_frame_num = u2_frame_num; 1493 } 1494 1495 if(ps_cur_slice->u1_mmco_equalto5) 1496 { 1497 WORD32 i4_temp_poc; 1498 WORD32 i4_top_field_order_poc, i4_bot_field_order_poc; 1499 1500 if(!ps_cur_slice->u1_field_pic_flag) // or a complementary field pair 1501 { 1502 i4_top_field_order_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt; 1503 i4_bot_field_order_poc = 1504 ps_dec->ps_cur_pic->i4_bottom_field_order_cnt; 1505 i4_temp_poc = MIN(i4_top_field_order_poc, 1506 i4_bot_field_order_poc); 1507 } 1508 else if(!ps_cur_slice->u1_bottom_field_flag) 1509 i4_temp_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt; 1510 else 1511 i4_temp_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt; 1512 1513 ps_dec->ps_cur_pic->i4_top_field_order_cnt = i4_temp_poc 1514 - ps_dec->ps_cur_pic->i4_top_field_order_cnt; 1515 ps_dec->ps_cur_pic->i4_bottom_field_order_cnt = i4_temp_poc 1516 - ps_dec->ps_cur_pic->i4_bottom_field_order_cnt; 1517 ps_dec->ps_cur_pic->i4_poc = i4_temp_poc; 1518 ps_dec->ps_cur_pic->i4_avg_poc = i4_temp_poc; 1519 } 1520 if(ps_dec->u4_first_slice_in_pic == 2) 1521 { 1522 ret = ih264d_decode_pic_order_cnt(u1_is_idr_slice, u2_frame_num, 1523 &ps_dec->s_prev_pic_poc, 1524 &s_tmp_poc, ps_cur_slice, ps_pps, 1525 u1_nal_ref_idc, 1526 u1_bottom_field_flag, 1527 u1_field_pic_flag, &i4_poc); 1528 if(ret != OK) 1529 return ret; 1530 /* Display seq no calculations */ 1531 if(i4_poc >= ps_dec->i4_max_poc) 1532 ps_dec->i4_max_poc = i4_poc; 1533 /* IDR Picture or POC wrap around */ 1534 if(i4_poc == 0) 1535 { 1536 ps_dec->i4_prev_max_display_seq = ps_dec->i4_prev_max_display_seq 1537 + ps_dec->i4_max_poc 1538 + ps_dec->u1_max_dec_frame_buffering + 1; 1539 ps_dec->i4_max_poc = 0; 1540 } 1541 } 1542 1543 /*--------------------------------------------------------------------*/ 1544 /* Copy the values read from the bitstream to the slice header and then*/ 1545 /* If the slice is first slice in picture, then do Start of Picture */ 1546 /* processing. */ 1547 /*--------------------------------------------------------------------*/ 1548 ps_cur_slice->i4_delta_pic_order_cnt[0] = i_delta_poc[0]; 1549 ps_cur_slice->i4_delta_pic_order_cnt[1] = i_delta_poc[1]; 1550 ps_cur_slice->u4_idr_pic_id = u4_idr_pic_id; 1551 ps_cur_slice->u2_first_mb_in_slice = u2_first_mb_in_slice; 1552 ps_cur_slice->u1_field_pic_flag = u1_field_pic_flag; 1553 ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag; 1554 ps_cur_slice->u1_slice_type = u1_slice_type; 1555 ps_cur_slice->i4_pic_order_cnt_lsb = s_tmp_poc.i4_pic_order_cnt_lsb; 1556 1557 ps_cur_slice->u1_nal_unit_type = u1_nal_unit_type; 1558 ps_cur_slice->u1_redundant_pic_cnt = u1_redundant_pic_cnt; 1559 ps_cur_slice->u1_nal_ref_idc = u1_nal_ref_idc; 1560 ps_cur_slice->u1_pic_order_cnt_type = u1_pic_order_cnt_type; 1561 1562 if(ps_seq->u1_frame_mbs_only_flag) 1563 ps_cur_slice->u1_direct_8x8_inference_flag = 1564 ps_seq->u1_direct_8x8_inference_flag; 1565 else 1566 ps_cur_slice->u1_direct_8x8_inference_flag = 1; 1567 1568 if(u1_slice_type == B_SLICE) 1569 { 1570 ps_cur_slice->u1_direct_spatial_mv_pred_flag = ih264d_get_bit_h264( 1571 ps_bitstrm); 1572 COPYTHECONTEXT("SH: direct_spatial_mv_pred_flag", 1573 ps_cur_slice->u1_direct_spatial_mv_pred_flag); 1574 1575 if(ps_cur_slice->u1_direct_spatial_mv_pred_flag) 1576 ps_cur_slice->pf_decodeDirect = ih264d_decode_spatial_direct; 1577 else 1578 ps_cur_slice->pf_decodeDirect = ih264d_decode_temporal_direct; 1579 if(!((ps_pps->ps_sps->u1_mb_aff_flag) && (!u1_field_pic_flag))) 1580 ps_dec->pf_mvpred = ih264d_mvpred_nonmbaffB; 1581 } 1582 else 1583 { 1584 if(!((ps_pps->ps_sps->u1_mb_aff_flag) && (!u1_field_pic_flag))) 1585 ps_dec->pf_mvpred = ih264d_mvpred_nonmbaff; 1586 } 1587 1588 if(ps_dec->u4_first_slice_in_pic == 2) 1589 { 1590 if(u2_first_mb_in_slice == 0) 1591 { 1592 ret = ih264d_start_of_pic(ps_dec, i4_poc, &s_tmp_poc, u2_frame_num, ps_pps); 1593 if(ret != OK) 1594 return ret; 1595 } 1596 1597 ps_dec->u4_output_present = 0; 1598 1599 { 1600 ih264d_get_next_display_field(ps_dec, 1601 ps_dec->ps_out_buffer, 1602 &(ps_dec->s_disp_op)); 1603 /* If error code is non-zero then there is no buffer available for display, 1604 hence avoid format conversion */ 1605 1606 if(0 != ps_dec->s_disp_op.u4_error_code) 1607 { 1608 ps_dec->u4_fmt_conv_cur_row = ps_dec->s_disp_frame_info.u4_y_ht; 1609 } 1610 else 1611 ps_dec->u4_output_present = 1; 1612 } 1613 if(ps_dec->u1_separate_parse == 1) 1614 { 1615 if(ps_dec->u4_dec_thread_created == 0) 1616 { 1617 ithread_create(ps_dec->pv_dec_thread_handle, NULL, 1618 (void *)ih264d_decode_picture_thread, 1619 (void *)ps_dec); 1620 1621 ps_dec->u4_dec_thread_created = 1; 1622 } 1623 1624 if((ps_dec->u4_num_cores == 3) && 1625 ((ps_dec->u4_app_disable_deblk_frm == 0) || ps_dec->i1_recon_in_thread3_flag) 1626 && (ps_dec->u4_bs_deblk_thread_created == 0)) 1627 { 1628 ps_dec->u4_start_recon_deblk = 0; 1629 ithread_create(ps_dec->pv_bs_deblk_thread_handle, NULL, 1630 (void *)ih264d_recon_deblk_thread, 1631 (void *)ps_dec); 1632 ps_dec->u4_bs_deblk_thread_created = 1; 1633 } 1634 } 1635 1636 } 1637 1638 /* INITIALIZATION of fn ptrs for MC and formMbPartInfo functions */ 1639 { 1640 UWORD8 uc_nofield_nombaff; 1641 1642 1643 1644 uc_nofield_nombaff = ((ps_dec->ps_cur_slice->u1_field_pic_flag == 0) 1645 && (ps_dec->ps_cur_slice->u1_mbaff_frame_flag == 0) 1646 && (u1_slice_type != B_SLICE) 1647 && (ps_dec->ps_cur_pps->u1_wted_pred_flag == 0)); 1648 1649 /* Initialise MC and formMbPartInfo fn ptrs one time based on profile_idc */ 1650 1651 if(uc_nofield_nombaff) 1652 { 1653 ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_bp; 1654 ps_dec->p_motion_compensate = ih264d_motion_compensate_bp; 1655 } 1656 else 1657 { 1658 ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_mp; 1659 ps_dec->p_motion_compensate = ih264d_motion_compensate_mp; 1660 } 1661 1662 1663 } 1664 1665 /* 1666 * Decide whether to decode the current picture or not 1667 */ 1668 { 1669 dec_err_status_t * ps_err = ps_dec->ps_dec_err_status; 1670 if(ps_err->u4_frm_sei_sync == u2_frame_num) 1671 { 1672 ps_err->u1_err_flag = ACCEPT_ALL_PICS; 1673 ps_err->u4_frm_sei_sync = SYNC_FRM_DEFAULT; 1674 } 1675 ps_err->u4_cur_frm = u2_frame_num; 1676 } 1677 1678 /* Decision for decoding if the picture is to be skipped */ 1679 { 1680 WORD32 i4_skip_b_pic, i4_skip_p_pic; 1681 1682 i4_skip_b_pic = (ps_dec->u4_skip_frm_mask & B_SLC_BIT) 1683 && (B_SLICE == u1_slice_type) && (0 == u1_nal_ref_idc); 1684 1685 i4_skip_p_pic = (ps_dec->u4_skip_frm_mask & P_SLC_BIT) 1686 && (P_SLICE == u1_slice_type) && (0 == u1_nal_ref_idc); 1687 1688 /**************************************************************/ 1689 /* Skip the B picture if skip mask is set for B picture and */ 1690 /* Current B picture is a non reference B picture or there is */ 1691 /* no user for reference B picture */ 1692 /**************************************************************/ 1693 if(i4_skip_b_pic) 1694 { 1695 ps_dec->ps_cur_pic->u4_pack_slc_typ |= B_SLC_BIT; 1696 /* Don't decode the picture in SKIP-B mode if that picture is B */ 1697 /* and also it is not to be used as a reference picture */ 1698 ps_dec->u1_last_pic_not_decoded = 1; 1699 1700 return OK; 1701 } 1702 /**************************************************************/ 1703 /* Skip the P picture if skip mask is set for P picture and */ 1704 /* Current P picture is a non reference P picture or there is */ 1705 /* no user for reference P picture */ 1706 /**************************************************************/ 1707 if(i4_skip_p_pic) 1708 { 1709 ps_dec->ps_cur_pic->u4_pack_slc_typ |= P_SLC_BIT; 1710 /* Don't decode the picture in SKIP-P mode if that picture is P */ 1711 /* and also it is not to be used as a reference picture */ 1712 ps_dec->u1_last_pic_not_decoded = 1; 1713 1714 return OK; 1715 } 1716 } 1717 1718 { 1719 UWORD16 u2_mb_x, u2_mb_y; 1720 1721 ps_dec->i4_submb_ofst = ((u2_first_mb_in_slice 1722 << ps_cur_slice->u1_mbaff_frame_flag) * SUB_BLK_SIZE) 1723 - SUB_BLK_SIZE; 1724 if(u2_first_mb_in_slice) 1725 { 1726 UWORD8 u1_mb_aff; 1727 UWORD8 u1_field_pic; 1728 UWORD16 u2_frm_wd_in_mbs; 1729 u2_frm_wd_in_mbs = ps_seq->u2_frm_wd_in_mbs; 1730 u1_mb_aff = ps_cur_slice->u1_mbaff_frame_flag; 1731 u1_field_pic = ps_cur_slice->u1_field_pic_flag; 1732 1733 { 1734 UWORD32 x_offset; 1735 UWORD32 y_offset; 1736 UWORD32 u4_frame_stride; 1737 tfr_ctxt_t *ps_trns_addr; // = &ps_dec->s_tran_addrecon_parse; 1738 1739 if(ps_dec->u1_separate_parse) 1740 { 1741 ps_trns_addr = &ps_dec->s_tran_addrecon_parse; 1742 } 1743 else 1744 { 1745 ps_trns_addr = &ps_dec->s_tran_addrecon; 1746 } 1747 u2_mb_x = MOD(u2_first_mb_in_slice, u2_frm_wd_in_mbs); 1748 u2_mb_y = DIV(u2_first_mb_in_slice, u2_frm_wd_in_mbs); 1749 1750 u2_mb_y <<= u1_mb_aff; 1751 1752 if((u2_mb_x > u2_frm_wd_in_mbs - 1) 1753 || (u2_mb_y > ps_dec->u2_frm_ht_in_mbs - 1)) 1754 { 1755 return ERROR_CORRUPTED_SLICE; 1756 } 1757 1758 u4_frame_stride = ps_dec->u2_frm_wd_y << u1_field_pic; 1759 x_offset = u2_mb_x << 4; 1760 y_offset = (u2_mb_y * u4_frame_stride) << 4; 1761 1762 ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1 + x_offset 1763 + y_offset; 1764 1765 u4_frame_stride = ps_dec->u2_frm_wd_uv << u1_field_pic; 1766 x_offset >>= 1; 1767 y_offset = (u2_mb_y * u4_frame_stride) << 3; 1768 1769 x_offset *= YUV420SP_FACTOR; 1770 1771 ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2 + x_offset 1772 + y_offset; 1773 ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3 + x_offset 1774 + y_offset; 1775 1776 ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y; 1777 ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u; 1778 ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v; 1779 1780 1781 // assign the deblock structure pointers to start of slice 1782 if(ps_dec->u1_separate_parse == 1) 1783 { 1784 ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic 1785 + (u2_first_mb_in_slice << u1_mb_aff); 1786 } 1787 else 1788 { 1789 ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic 1790 + (u2_first_mb_in_slice << u1_mb_aff); 1791 } 1792 1793 ps_dec->u2_cur_mb_addr = (u2_first_mb_in_slice << u1_mb_aff); 1794 1795 ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv 1796 + ((u2_first_mb_in_slice << u1_mb_aff) << 4); 1797 } 1798 } 1799 else 1800 { 1801 tfr_ctxt_t *ps_trns_addr; 1802 1803 if(ps_dec->u1_separate_parse) 1804 { 1805 ps_trns_addr = &ps_dec->s_tran_addrecon_parse; 1806 } 1807 else 1808 { 1809 ps_trns_addr = &ps_dec->s_tran_addrecon; 1810 } 1811 1812 u2_mb_x = 0xffff; 1813 u2_mb_y = 0; 1814 // assign the deblock structure pointers to start of slice 1815 ps_dec->u2_cur_mb_addr = 0; 1816 ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic; 1817 ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv; 1818 ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1; 1819 ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2; 1820 ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3; 1821 1822 ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y; 1823 ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u; 1824 ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v; 1825 1826 } 1827 1828 ps_dec->ps_part = ps_dec->ps_parse_part_params; 1829 1830 ps_dec->u2_mbx = 1831 (MOD(u2_first_mb_in_slice - 1, ps_seq->u2_frm_wd_in_mbs)); 1832 ps_dec->u2_mby = 1833 (DIV(u2_first_mb_in_slice - 1, ps_seq->u2_frm_wd_in_mbs)); 1834 ps_dec->u2_mby <<= ps_cur_slice->u1_mbaff_frame_flag; 1835 ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx; 1836 ps_dec->i2_prev_slice_mby = ps_dec->u2_mby; 1837 } 1838 1839 /* RBSP stop bit is used for CABAC decoding*/ 1840 ps_bitstrm->u4_max_ofst += ps_dec->ps_cur_pps->u1_entropy_coding_mode; 1841 1842 ps_dec->u1_B = (u1_slice_type == B_SLICE); 1843 ps_dec->u4_next_mb_skip = 0; 1844 1845 ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice = 1846 ps_dec->ps_cur_slice->u2_first_mb_in_slice; 1847 ps_dec->ps_parse_cur_slice->slice_type = 1848 ps_dec->ps_cur_slice->u1_slice_type; 1849 1850 1851 ps_dec->u4_start_recon_deblk = 1; 1852 { 1853 WORD32 num_entries; 1854 WORD32 size; 1855 UWORD8 *pu1_buf; 1856 1857 num_entries = MIN(MAX_FRAMES, ps_dec->u4_num_ref_frames_at_init); 1858 num_entries = 2 * ((2 * num_entries) + 1); 1859 1860 size = num_entries * sizeof(void *); 1861 size += PAD_MAP_IDX_POC * sizeof(void *); 1862 1863 pu1_buf = (UWORD8 *)ps_dec->pv_map_ref_idx_to_poc_buf; 1864 pu1_buf += size * ps_dec->u2_cur_slice_num; 1865 ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc = ( void *)pu1_buf; 1866 } 1867 1868 if(ps_dec->u1_separate_parse) 1869 { 1870 ps_dec->ps_parse_cur_slice->pv_tu_coeff_data_start = ps_dec->pv_parse_tu_coeff_data; 1871 } 1872 else 1873 { 1874 ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data; 1875 } 1876 1877 ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat; 1878 if(u1_slice_type == I_SLICE) 1879 { 1880 ps_dec->ps_cur_pic->u4_pack_slc_typ |= I_SLC_BIT; 1881 1882 ret = ih264d_parse_islice(ps_dec, u2_first_mb_in_slice); 1883 1884 if(ps_dec->i4_pic_type != B_SLICE && ps_dec->i4_pic_type != P_SLICE) 1885 ps_dec->i4_pic_type = I_SLICE; 1886 1887 } 1888 else if(u1_slice_type == P_SLICE) 1889 { 1890 ps_dec->ps_cur_pic->u4_pack_slc_typ |= P_SLC_BIT; 1891 ret = ih264d_parse_pslice(ps_dec, u2_first_mb_in_slice); 1892 ps_dec->u1_pr_sl_type = u1_slice_type; 1893 if(ps_dec->i4_pic_type != B_SLICE) 1894 ps_dec->i4_pic_type = P_SLICE; 1895 } 1896 else if(u1_slice_type == B_SLICE) 1897 { 1898 ps_dec->ps_cur_pic->u4_pack_slc_typ |= B_SLC_BIT; 1899 ret = ih264d_parse_bslice(ps_dec, u2_first_mb_in_slice); 1900 ps_dec->u1_pr_sl_type = u1_slice_type; 1901 ps_dec->i4_pic_type = B_SLICE; 1902 } 1903 else 1904 return ERROR_INV_SLC_TYPE_T; 1905 1906 if(ps_dec->u1_slice_header_done) 1907 { 1908 /* set to zero to indicate a valid slice has been decoded */ 1909 /* first slice header successfully decoded */ 1910 ps_dec->u4_first_slice_in_pic = 0; 1911 ps_dec->u1_first_slice_in_stream = 0; 1912 } 1913 1914 if(ret != OK) 1915 return ret; 1916 1917 ps_dec->u2_cur_slice_num++; 1918 /* storing last Mb X and MbY of the slice */ 1919 ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx; 1920 ps_dec->i2_prev_slice_mby = ps_dec->u2_mby; 1921 1922 /* End of Picture detection */ 1923 1924 if(ps_dec->u2_total_mbs_coded >= (ps_seq->u2_max_mb_addr + 1)) 1925 { 1926 ps_dec->u1_pic_decode_done = 1; 1927 1928 } 1929 1930 { 1931 dec_err_status_t * ps_err = ps_dec->ps_dec_err_status; 1932 if((ps_err->u1_err_flag & REJECT_PB_PICS) 1933 && (ps_err->u1_cur_pic_type == PIC_TYPE_I)) 1934 { 1935 ps_err->u1_err_flag = ACCEPT_ALL_PICS; 1936 } 1937 } 1938 1939 PRINT_BIN_BIT_RATIO(ps_dec) 1940 1941 return ret; 1942} 1943 1944