18d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/****************************************************************************** 28d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 38d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * Copyright (C) 2015 The Android Open Source Project 48d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 58d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * Licensed under the Apache License, Version 2.0 (the "License"); 68d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * you may not use this file except in compliance with the License. 78d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * You may obtain a copy of the License at: 88d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 98d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * http://www.apache.org/licenses/LICENSE-2.0 108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * Unless required by applicable law or agreed to in writing, software 128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * distributed under the License is distributed on an "AS IS" BASIS, 138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * See the License for the specific language governing permissions and 158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * limitations under the License. 168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ***************************************************************************** 188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S*/ 208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*! 218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ************************************************************************** 228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \file ih264d_parse_slice.c 238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \brief 258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * Contains routines that decodes a slice NAL unit 268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \date 288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 19/12/2002 298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \author AI 318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ************************************************************************** 328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */ 338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include <string.h> 348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_typedefs.h" 358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_macros.h" 368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_platform_macros.h" 378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ithread.h" 388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_structs.h" 398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_debug.h" 408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_bitstrm.h" 418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_parse_mb_header.h" 428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_process_bslice.h" 438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_process_pslice.h" 448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_parse_cavlc.h" 458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_utils.h" 468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_deblocking.h" 478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_defs.h" 488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_error_handler.h" 498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_tables.h" 508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_defs.h" 518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_mem_request.h" 528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_parse_islice.h" 538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_parse_slice.h" 548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_mvpred.h" 558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_mb_utils.h" 568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_defs.h" 588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_quant_scaling.h" 598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_inter_pred.h" 618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_sei.h" 638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d.h" 648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_error.h" 658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_disp_mgr.h" 668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264_buf_mgr.h" 678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_thread_parse_decode.h" 698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_thread_compute_bs.h" 708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_dpb_manager.h" 718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include <assert.h> 728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#include "ih264d_parse_islice.h" 738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#define RET_LAST_SKIP 0x80000000 748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*! 768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ************************************************************************** 778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \if Function name : ih264d_form_pred_weight_matrix \endif 788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \brief 808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * Forms pred weight matrix. 818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \return 838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * None 848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ************************************************************************** 868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */ 878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha Svoid ih264d_form_pred_weight_matrix(dec_struct_t *ps_dec) 898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{ 908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S dec_slice_params_t *ps_cur_slice; 918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 uc_num_ref_idx_l0_active, uc_num_ref_idx_l1_active; 928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 i, j; 938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 *pu4_mat_iwt_ofst; 948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD16 i2_idx; 958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 *pui32_weight_offset_l0, *pui32_weight_offset_l1; 968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_temp; 978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_slice = ps_dec->ps_cur_slice; 998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S uc_num_ref_idx_l0_active = ps_cur_slice->u1_num_ref_idx_lx_active[0]; 1008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S uc_num_ref_idx_l1_active = ps_cur_slice->u1_num_ref_idx_lx_active[1]; 1018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 1028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu4_mat_iwt_ofst = ps_dec->pu4_wts_ofsts_mat; 1038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 1048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_cur_slice->u1_slice_type == B_SLICE) 1058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 1068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for(i = 0; i < uc_num_ref_idx_l0_active; i++) 1078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 1088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pui32_weight_offset_l0 = ps_cur_slice->u4_wt_ofst_lx[0][i]; 1098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for(j = 0; j < uc_num_ref_idx_l1_active; j++) 1108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 1118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pui32_weight_offset_l1 = ps_cur_slice->u4_wt_ofst_lx[1][j]; 1128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i2_idx = i * uc_num_ref_idx_l0_active + j; 1138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i2_idx = X3(i2_idx); 1148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* u4_temp = (pui32_weight_offset_l0[0] | (pui32_weight_offset_l1[0] << 16)); 1158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu4_mat_iwt_ofst[0] = u4_temp; 1168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_temp = (pui32_weight_offset_l0[1] | (pui32_weight_offset_l1[1] << 16)); 1178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu4_mat_iwt_ofst[1] = u4_temp; 1188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_temp = (pui32_weight_offset_l0[2] | (pui32_weight_offset_l1[2] << 16)); 1198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu4_mat_iwt_ofst[2] = u4_temp; 1208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu4_mat_iwt_ofst += 3;*/ 1218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu4_mat_iwt_ofst[0] = pui32_weight_offset_l0[0]; 1228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu4_mat_iwt_ofst[1] = pui32_weight_offset_l1[0]; 1238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu4_mat_iwt_ofst[2] = pui32_weight_offset_l0[1]; 1248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu4_mat_iwt_ofst[3] = pui32_weight_offset_l1[1]; 1258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu4_mat_iwt_ofst[4] = pui32_weight_offset_l0[2]; 1268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu4_mat_iwt_ofst[5] = pui32_weight_offset_l1[2]; 1278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu4_mat_iwt_ofst += 6; 1288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 1298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 1308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 1318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 1328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 1338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for(i = 0; i < uc_num_ref_idx_l0_active; i++) 1348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 1358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pui32_weight_offset_l0 = ps_cur_slice->u4_wt_ofst_lx[0][i]; 1368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i2_idx = X3(i); 1378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_temp = (UWORD32)pui32_weight_offset_l0[0]; 1388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu4_mat_iwt_ofst[0] = u4_temp; 1398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_temp = (UWORD32)pui32_weight_offset_l0[1]; 1408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu4_mat_iwt_ofst[2] = u4_temp; 1418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_temp = (UWORD32)pui32_weight_offset_l0[2]; 1428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu4_mat_iwt_ofst[4] = u4_temp; 1438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu4_mat_iwt_ofst += 6; 1448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 1458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 1468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S} 1478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 1488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 1498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*! 1508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ************************************************************************** 1518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \if Function name : init_firstSliceParam \endif 1528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 1538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \brief 1548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * Initialize the Parameter required for all the slices for a picture 1558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 1568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \return : Nothing 1578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 1588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ************************************************************************** 1598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */ 1608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 1618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha SWORD32 ih264d_start_of_pic(dec_struct_t *ps_dec, 1628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_poc, 1638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pocstruct_t *ps_temp_poc, 1648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD16 u2_frame_num, 1658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S dec_pic_params_t *ps_pps) 1668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{ 1678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pocstruct_t *ps_prev_poc = &ps_dec->s_cur_pic_poc; 1688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pocstruct_t *ps_cur_poc = ps_temp_poc; 1698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 1708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pic_buffer_t *pic_buf; 1718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 1728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ivd_video_decode_op_t * ps_dec_output = 1738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S (ivd_video_decode_op_t *)ps_dec->pv_dec_out; 1748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice; 1758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S dec_seq_params_t *ps_seq = ps_pps->ps_sps; 1768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 u1_bottom_field_flag = ps_cur_slice->u1_bottom_field_flag; 1778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag; 1788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* high profile related declarations */ 1798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S high_profile_tools_t s_high_profile; 1808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 ret; 1818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 1828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S H264_MUTEX_LOCK(&ps_dec->process_disp_mutex); 1838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 1848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_prev_poc->i4_pic_order_cnt_lsb = ps_cur_poc->i4_pic_order_cnt_lsb; 1858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_prev_poc->i4_pic_order_cnt_msb = ps_cur_poc->i4_pic_order_cnt_msb; 1868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_prev_poc->i4_delta_pic_order_cnt_bottom = 1878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_poc->i4_delta_pic_order_cnt_bottom; 1888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_prev_poc->i4_delta_pic_order_cnt[0] = 1898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_poc->i4_delta_pic_order_cnt[0]; 1908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_prev_poc->i4_delta_pic_order_cnt[1] = 1918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_poc->i4_delta_pic_order_cnt[1]; 1928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_prev_poc->u1_bot_field = ps_dec->ps_cur_slice->u1_bottom_field_flag; 1938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst; 1948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_prev_poc->u2_frame_num = u2_frame_num; 1958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i1_prev_mb_qp_delta = 0; 1968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i1_next_ctxt_idx = 0; 1978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 1988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 1998ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->u4_nmb_deblk = 0; 2008ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen if(ps_dec->u4_num_cores == 1) 2018ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->u4_nmb_deblk = 1; 2028ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 2038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 2048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 2058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_seq->u1_mb_aff_flag == 1) 2068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 2078ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->u4_nmb_deblk = 0; 2088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->u4_num_cores > 2) 2098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u4_num_cores = 2; 2108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 2118ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 2128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u4_use_intrapred_line_copy = 0; 2138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 2148ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 2158ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 2168ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen if (ps_seq->u1_mb_aff_flag == 0) 2178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 2188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u4_use_intrapred_line_copy = 1; 2198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 2208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 2218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u4_app_disable_deblk_frm = 0; 2228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* If degrade is enabled, set the degrade flags appropriately */ 2238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->i4_degrade_type && ps_dec->i4_degrade_pics) 2248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 2258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 degrade_pic; 2268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i4_degrade_pic_cnt++; 2278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S degrade_pic = 0; 2288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 2298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* If degrade is to be done in all frames, then do not check further */ 2308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S switch(ps_dec->i4_degrade_pics) 2318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 2328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S case 4: 2338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 2348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S degrade_pic = 1; 2358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S break; 2368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 2378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S case 3: 2388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 2398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_cur_slice->u1_slice_type != I_SLICE) 2408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S degrade_pic = 1; 2418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 2428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S break; 2438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 2448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S case 2: 2458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 2468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 2478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* If pic count hits non-degrade interval or it is an islice, then do not degrade */ 2488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if((ps_cur_slice->u1_slice_type != I_SLICE) 2498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S && (ps_dec->i4_degrade_pic_cnt 2508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S != ps_dec->i4_nondegrade_interval)) 2518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S degrade_pic = 1; 2528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 2538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S break; 2548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 2558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S case 1: 2568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 2578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Check if the current picture is non-ref */ 2588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(0 == ps_cur_slice->u1_nal_ref_idc) 2598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 2608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S degrade_pic = 1; 2618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 2628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S break; 2638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 2648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 2658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 2668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(degrade_pic) 2678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 2688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->i4_degrade_type & 0x2) 2698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u4_app_disable_deblk_frm = 1; 2708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 2718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* MC degrading is done only for non-ref pictures */ 2728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(0 == ps_cur_slice->u1_nal_ref_idc) 2738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 2748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->i4_degrade_type & 0x4) 2758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i4_mv_frac_mask = 0; 2768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 2778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->i4_degrade_type & 0x8) 2788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i4_mv_frac_mask = 0; 2798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 2808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 2818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 2828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i4_degrade_pic_cnt = 0; 2838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 2848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 2858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 2868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S dec_err_status_t * ps_err = ps_dec->ps_dec_err_status; 2878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->u1_sl_typ_5_9 2888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S && ((ps_cur_slice->u1_slice_type == I_SLICE) 2898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S || (ps_cur_slice->u1_slice_type 2908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S == SI_SLICE))) 2918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_err->u1_cur_pic_type = PIC_TYPE_I; 2928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 2938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_err->u1_cur_pic_type = PIC_TYPE_UNKNOWN; 2948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 2958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_err->u1_pic_aud_i == PIC_TYPE_I) 2968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 2978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_err->u1_cur_pic_type = PIC_TYPE_I; 2988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_err->u1_pic_aud_i = PIC_TYPE_UNKNOWN; 2998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 3008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL) 3028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 3038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_err->u1_err_flag) 3048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264d_reset_ref_bufs(ps_dec->ps_dpb_mgr); 3058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_err->u1_err_flag = ACCEPT_ALL_PICS; 3068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 3078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 3088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->u1_init_dec_flag && ps_dec->s_prev_seq_params.u1_eoseq_pending) 3108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 3118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Reset the decoder picture buffers */ 3128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 j; 3138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for(j = 0; j < MAX_DISP_BUFS_NEW; j++) 3148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 3158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, 3178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S j, 3188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S BUF_MGR_REF); 3198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr, 3208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->au1_pic_buf_id_mv_buf_id_map[j], 3218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S BUF_MGR_REF); 3228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, 3238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S j, 3248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S BUF_MGR_IO); 3258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 3268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* reset the decoder structure parameters related to buffer handling */ 3288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_second_field = 0; 3298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i4_cur_display_seq = 0; 3308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /********************************************************************/ 3328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* indicate in the decoder output i4_status that some frames are being */ 3338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* dropped, so that it resets timestamp and wait for a new sequence */ 3348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /********************************************************************/ 3358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->s_prev_seq_params.u1_eoseq_pending = 0; 3378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 3388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ret = ih264d_init_pic(ps_dec, u2_frame_num, i4_poc, ps_pps); 3398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ret != OK) 3408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ret; 3418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pv_parse_tu_coeff_data = ps_dec->pv_pic_tu_coeff_data; 3438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_pic_tu_coeff_data; 3448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_nmb_info = ps_dec->ps_frm_mb_info; 3458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->u1_separate_parse) 3468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 3478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD16 pic_wd = ps_dec->u4_width_at_init; 3488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD16 pic_ht = ps_dec->u4_height_at_init; 3498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 num_mbs; 3508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3518ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen if((NULL != ps_dec->ps_cur_sps) && (1 == (ps_dec->ps_cur_sps->u1_is_valid))) 3528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 3538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pic_wd = ps_dec->u2_pic_wd; 3548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pic_ht = ps_dec->u2_pic_ht; 3558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 3568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S num_mbs = (pic_wd * pic_ht) >> 8; 3578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->pu1_dec_mb_map) 3598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 3608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memset((void *)ps_dec->pu1_dec_mb_map, 0, num_mbs); 3618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 3628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->pu1_recon_mb_map) 3648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 3658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memset((void *)ps_dec->pu1_recon_mb_map, 0, num_mbs); 3678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 3688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->pu2_slice_num_map) 3708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 3718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memset((void *)ps_dec->pu2_slice_num_map, 0, 3728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S (num_mbs * sizeof(UWORD16))); 3738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 3748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 3768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3778ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->ps_parse_cur_slice = &(ps_dec->ps_dec_slice_buf[0]); 3788ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->ps_decode_cur_slice = &(ps_dec->ps_dec_slice_buf[0]); 3798ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->ps_computebs_cur_slice = &(ps_dec->ps_dec_slice_buf[0]); 3808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Initialize all the HP toolsets to zero */ 3828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->s_high_profile.u1_scaling_present = 0; 3838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->s_high_profile.u1_transform8x8_present = 0; 3848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Get Next Free Picture */ 3868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(1 == ps_dec->u4_share_disp_buf) 3878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 3888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 i; 3898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Free any buffer that is in the queue to be freed */ 3908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for(i = 0; i < MAX_DISP_BUFS_NEW; i++) 3918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 3928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(0 == ps_dec->u4_disp_buf_to_be_freed[i]) 3938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S continue; 3948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, i, 3958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S BUF_MGR_IO); 3968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u4_disp_buf_to_be_freed[i] = 0; 3978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u4_disp_buf_mapping[i] = 0; 3988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 3998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 4008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 4018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(!(u1_field_pic_flag && 0 != ps_dec->u1_top_bottom_decoded)) //ps_dec->u1_second_field)) 4028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 4038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pic_buffer_t *ps_cur_pic; 4048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 cur_pic_buf_id, cur_mv_buf_id; 4058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S col_mv_buf_t *ps_col_mv; 4068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S while(1) 4078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 4088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_pic = (pic_buffer_t *)ih264_buf_mgr_get_next_free( 4098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S (buf_mgr_t *)ps_dec->pv_pic_buf_mgr, 4108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S &cur_pic_buf_id); 4118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_cur_pic == NULL) 4128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 4138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i4_error_code = ERROR_UNAVAIL_PICBUF_T; 4148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ERROR_UNAVAIL_PICBUF_T; 4158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 4168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(0 == ps_dec->u4_disp_buf_mapping[cur_pic_buf_id]) 4178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 4188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S break; 4198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 4208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 4228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_col_mv = (col_mv_buf_t *)ih264_buf_mgr_get_next_free((buf_mgr_t *)ps_dec->pv_mv_buf_mgr, 4238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S &cur_mv_buf_id); 4248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_col_mv == NULL) 4258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 4268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i4_error_code = ERROR_UNAVAIL_MVBUF_T; 4278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ERROR_UNAVAIL_MVBUF_T; 4288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 4298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic = ps_cur_pic; 4318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_pic_buf_id = cur_pic_buf_id; 4328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_pic->u4_ts = ps_dec->u4_ts; 4338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_pic->u1_mv_buf_id = cur_mv_buf_id; 4368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->au1_pic_buf_id_mv_buf_id_map[cur_pic_buf_id] = cur_mv_buf_id; 4378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_pic->pu1_col_zero_flag = (UWORD8 *)ps_col_mv->pv_col_zero_flag; 4398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_pic->ps_mv = (mv_pred_t *)ps_col_mv->pv_mv; 4408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->au1_pic_buf_ref_flag[cur_pic_buf_id] = 0; 4418ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen if(ps_dec->u1_first_slice_in_stream) 4428ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen { 4438ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen /*make first entry of list0 point to cur pic,so that if first Islice is in error, ref pic struct will have valid entries*/ 4448ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_init_dpb[0]; 4458ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen *(ps_dec->ps_dpb_mgr->ps_init_dpb[0][0]) = *ps_cur_pic; 4468ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen } 4478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(!ps_dec->ps_cur_pic) 4498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 4508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 j; 451086dd8ea90eaf4ead8b4927e777b1c8a19bd23a9Martin Storsjo H264_DEC_DEBUG_PRINT("------- Display Buffers Reset --------\n"); 4528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S for(j = 0; j < MAX_DISP_BUFS_NEW; j++) 4538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 4548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, 4568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S j, 4578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S BUF_MGR_REF); 4588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr, 4598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->au1_pic_buf_id_mv_buf_id_map[j], 4608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S BUF_MGR_REF); 4618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, 4628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S j, 4638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S BUF_MGR_IO); 4648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 4658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i4_cur_display_seq = 0; 4678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i4_prev_max_display_seq = 0; 4688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i4_max_poc = 0; 4698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_pic = (pic_buffer_t *)ih264_buf_mgr_get_next_free( 4718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S (buf_mgr_t *)ps_dec->pv_pic_buf_mgr, 4728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S &cur_pic_buf_id); 4738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_cur_pic == NULL) 4748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 4758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i4_error_code = ERROR_UNAVAIL_PICBUF_T; 4768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ERROR_UNAVAIL_PICBUF_T; 4778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 4788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_col_mv = (col_mv_buf_t *)ih264_buf_mgr_get_next_free((buf_mgr_t *)ps_dec->pv_mv_buf_mgr, 4808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S &cur_mv_buf_id); 4818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_col_mv == NULL) 4828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 4838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i4_error_code = ERROR_UNAVAIL_MVBUF_T; 4848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ERROR_UNAVAIL_MVBUF_T; 4858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 4868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic = ps_cur_pic; 4888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_pic_buf_id = cur_pic_buf_id; 4898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_pic->u4_ts = ps_dec->u4_ts; 4908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->apv_buf_id_pic_buf_map[cur_pic_buf_id] = (void *)ps_cur_pic; 4918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_pic->u1_mv_buf_id = cur_mv_buf_id; 4938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->au1_pic_buf_id_mv_buf_id_map[cur_pic_buf_id] = cur_mv_buf_id; 4948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_pic->pu1_col_zero_flag = (UWORD8 *)ps_col_mv->pv_col_zero_flag; 4968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_pic->ps_mv = (mv_pred_t *)ps_col_mv->pv_mv; 4978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->au1_pic_buf_ref_flag[cur_pic_buf_id] = 0; 4988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 4998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 5008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic->u1_picturetype = u1_field_pic_flag; 5028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic->u4_pack_slc_typ = SKIP_NONE; 5038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S H264_DEC_DEBUG_PRINT("got a buffer\n"); 5048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 5058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 5068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 5078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S H264_DEC_DEBUG_PRINT("did not get a buffer\n"); 5088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 5098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u4_pic_buf_got = 1; 5118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic->i4_poc = i4_poc; 5138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic->i4_frame_num = u2_frame_num; 5148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic->i4_pic_num = u2_frame_num; 5158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic->i4_top_field_order_cnt = ps_pps->i4_top_field_order_cnt; 5168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic->i4_bottom_field_order_cnt = 5178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_pps->i4_bottom_field_order_cnt; 5188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic->i4_avg_poc = ps_pps->i4_avg_poc; 5198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic->u4_time_stamp = ps_dec->u4_pts; 5208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->s_cur_pic = *(ps_dec->ps_cur_pic); 5228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(u1_field_pic_flag && u1_bottom_field_flag) 5238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 5248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_temp_poc; 5258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_top_field_order_poc, i4_bot_field_order_poc; 5268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Point to odd lines, since it's bottom field */ 5278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->s_cur_pic.pu1_buf1 += ps_dec->s_cur_pic.u2_frm_wd_y; 5288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->s_cur_pic.pu1_buf2 += ps_dec->s_cur_pic.u2_frm_wd_uv; 5298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->s_cur_pic.pu1_buf3 += ps_dec->s_cur_pic.u2_frm_wd_uv; 5308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->s_cur_pic.ps_mv += 5318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ((ps_dec->u2_pic_ht * ps_dec->u2_pic_wd) >> 5); 5328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->s_cur_pic.pu1_col_zero_flag += ((ps_dec->u2_pic_ht 5338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * ps_dec->u2_pic_wd) >> 5); 5348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic->u1_picturetype |= BOT_FLD; 5358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_top_field_order_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt; 5368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_bot_field_order_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt; 5378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_temp_poc = MIN(i4_top_field_order_poc, 5388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_bot_field_order_poc); 5398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic->i4_avg_poc = i4_temp_poc; 5408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 5418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_slice->u1_mbaff_frame_flag = ps_seq->u1_mb_aff_flag 5438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S && (!u1_field_pic_flag); 5448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic->u1_picturetype |= (ps_cur_slice->u1_mbaff_frame_flag 5468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S << 2); 5478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_mb_row = ps_dec->ps_nbr_mb_row; //[0]; 5498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_mb_row++; //Increment by 1 ,so that left mb will always be valid 5508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_top_mb_row = 5518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_nbr_mb_row 5528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + ((ps_dec->u2_frm_wd_in_mbs + 1) 5538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S << (1 5548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S - ps_dec->ps_cur_sps->u1_frame_mbs_only_flag)); 5558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_top_mb_row++; //Increment by 1 ,so that left mb will always be valid 5568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pu1_y = ps_dec->pu1_y_scratch[0]; 5588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pu1_u = ps_dec->pu1_u_scratch[0]; 5598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pu1_v = ps_dec->pu1_v_scratch[0]; 5608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_yuv_scratch_idx = 0; 5618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* CHANGED CODE */ 5628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv; 5638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_mv_top = ps_dec->ps_mv_top_p[0]; 5648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* CHANGED CODE */ 5658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_mv_top_p = 0; 5668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_mb_idx = 0; 5678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* CHANGED CODE */ 5688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_mv_left = ps_dec->s_cur_pic.ps_mv; 5698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pu1_yleft = 0; 5708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pu1_uleft = 0; 5718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pu1_vleft = 0; 5728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_not_wait_rec = 2; 5738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u2_total_mbs_coded = 0; 5748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i4_submb_ofst = -(SUB_BLK_SIZE); 5758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u4_pred_info_idx = 0; 5768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u4_pred_info_pkd_idx = 0; 5778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u4_dma_buf_idx = 0; 5788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_mv = ps_dec->s_cur_pic.ps_mv; 5798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_mv_bank_cur = ps_dec->s_cur_pic.ps_mv; 5808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pu1_col_zero_flag = ps_dec->s_cur_pic.pu1_col_zero_flag; 5818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_part = ps_dec->ps_parse_part_params; 5828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i2_prev_slice_mbx = -1; 5838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i2_prev_slice_mby = 0; 5848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u2_mv_2mb[0] = 0; 5858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u2_mv_2mb[1] = 0; 5868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_last_pic_not_decoded = 0; 5878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u2_cur_slice_num = 0; 5898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u2_cur_slice_num_dec_thread = 0; 5908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u2_cur_slice_num_bs = 0; 5918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u4_intra_pred_line_ofst = 0; 5928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pu1_cur_y_intra_pred_line = ps_dec->pu1_y_intra_pred_line; 5938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pu1_cur_u_intra_pred_line = ps_dec->pu1_u_intra_pred_line; 5948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pu1_cur_v_intra_pred_line = ps_dec->pu1_v_intra_pred_line; 5958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 5968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pu1_cur_y_intra_pred_line_base = ps_dec->pu1_y_intra_pred_line; 5978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pu1_cur_u_intra_pred_line_base = ps_dec->pu1_u_intra_pred_line; 5988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pu1_cur_v_intra_pred_line_base = ps_dec->pu1_v_intra_pred_line; 5998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pu1_prev_y_intra_pred_line = ps_dec->pu1_y_intra_pred_line 6058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + (ps_dec->u2_frm_wd_in_mbs * MB_SIZE); 6068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pu1_prev_u_intra_pred_line = ps_dec->pu1_u_intra_pred_line 6088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + ps_dec->u2_frm_wd_in_mbs * BLK8x8SIZE * YUV420SP_FACTOR; 6098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pu1_prev_v_intra_pred_line = ps_dec->pu1_v_intra_pred_line 6108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + ps_dec->u2_frm_wd_in_mbs * BLK8x8SIZE; 6118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic; 6138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_deblk_mbn_curr = ps_dec->ps_deblk_mbn; 6148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_deblk_mbn_prev = ps_dec->ps_deblk_mbn + ps_dec->u1_recon_mb_grp; 6158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Initialize The Function Pointer Depending Upon the Entropy and MbAff Flag */ 6168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 6178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_cur_slice->u1_mbaff_frame_flag) 6188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 6198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pf_compute_bs = ih264d_compute_bs_mbaff; 6208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pf_mvpred = ih264d_mvpred_mbaff; 6218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 6228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 6238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 6248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pf_compute_bs = ih264d_compute_bs_non_mbaff; 6258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_cur_mb_fld_dec_flag = ps_cur_slice->u1_field_pic_flag; 6268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 6278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 6288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Set up the Parameter for DMA transfer */ 6298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 6308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag; 6318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 u1_mbaff = ps_cur_slice->u1_mbaff_frame_flag; 6338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 uc_lastmbs = (((ps_dec->u2_pic_wd) >> 4) 6358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S % (ps_dec->u1_recon_mb_grp >> u1_mbaff)); 6368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD16 ui16_lastmbs_widthY = 6378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S (uc_lastmbs ? (uc_lastmbs << 4) : ((ps_dec->u1_recon_mb_grp 6388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S >> u1_mbaff) << 4)); 6398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD16 ui16_lastmbs_widthUV = 6408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S uc_lastmbs ? (uc_lastmbs << 3) : ((ps_dec->u1_recon_mb_grp 6418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S >> u1_mbaff) << 3); 6428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->s_tran_addrecon.pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1; 6448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->s_tran_addrecon.pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2; 6458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->s_tran_addrecon.pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3; 6468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->s_tran_addrecon.u2_frm_wd_y = ps_dec->u2_frm_wd_y 6488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S << u1_field_pic_flag; 6498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->s_tran_addrecon.u2_frm_wd_uv = ps_dec->u2_frm_wd_uv 6508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S << u1_field_pic_flag; 6518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(u1_field_pic_flag) 6538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 6548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ui16_lastmbs_widthY += ps_dec->u2_frm_wd_y; 6558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ui16_lastmbs_widthUV += ps_dec->u2_frm_wd_uv; 6568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 6578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Normal Increment of Pointer */ 6598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->s_tran_addrecon.u4_inc_y[0] = ((ps_dec->u1_recon_mb_grp << 4) 6608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S >> u1_mbaff); 6618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->s_tran_addrecon.u4_inc_uv[0] = ((ps_dec->u1_recon_mb_grp << 4) 6628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S >> u1_mbaff); 6638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* End of Row Increment */ 6658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->s_tran_addrecon.u4_inc_y[1] = (ui16_lastmbs_widthY 6668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + (PAD_LEN_Y_H << 1) 6678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + ps_dec->s_tran_addrecon.u2_frm_wd_y 6688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * ((15 << u1_mbaff) + u1_mbaff)); 6698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->s_tran_addrecon.u4_inc_uv[1] = (ui16_lastmbs_widthUV 6708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + (PAD_LEN_UV_H << 2) 6718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + ps_dec->s_tran_addrecon.u2_frm_wd_uv 6728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * ((15 << u1_mbaff) + u1_mbaff)); 6738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Assign picture numbers to each frame/field */ 6758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* only once per picture. */ 6768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264d_assign_pic_num(ps_dec); 6778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->s_tran_addrecon.u2_mv_top_left_inc = (ps_dec->u1_recon_mb_grp 6788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S << 2) - 1 - (u1_mbaff << 2); 6798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->s_tran_addrecon.u2_mv_left_inc = ((ps_dec->u1_recon_mb_grp 6808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S >> u1_mbaff) - 1) << (4 + u1_mbaff); 6818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 6828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /**********************************************************************/ 6838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* High profile related initialization at pictrue level */ 6848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /**********************************************************************/ 6858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_seq->u1_profile_idc == HIGH_PROFILE_IDC) 6868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 6878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if((ps_seq->i4_seq_scaling_matrix_present_flag) 6888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S || (ps_pps->i4_pic_scaling_matrix_present_flag)) 6898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 6908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264d_form_scaling_matrix_picture(ps_seq, ps_pps, ps_dec); 6918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->s_high_profile.u1_scaling_present = 1; 6928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 6938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 6948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 6958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264d_form_default_scaling_matrix(ps_dec); 6968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 6978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 6988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_pps->i4_transform_8x8_mode_flag) 6998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 7008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->s_high_profile.u1_transform8x8_present = 1; 7018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 7028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 7038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 7048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 7058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264d_form_default_scaling_matrix(ps_dec); 7068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 7078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* required while reading the transform_size_8x8 u4_flag */ 7098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->s_high_profile.u1_direct_8x8_inference_flag = 7108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_seq->u1_direct_8x8_inference_flag; 7118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->s_high_profile.s_cavlc_ctxt = ps_dec->s_cavlc_ctxt; 7128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7138ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->i1_recon_in_thread3_flag = 1; 7148ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->ps_frame_buf_ip_recon = &ps_dec->s_tran_addrecon; 7158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->u1_separate_parse) 7168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 7178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S memcpy(&ps_dec->s_tran_addrecon_parse, &ps_dec->s_tran_addrecon, 7188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S sizeof(tfr_ctxt_t)); 7198ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen if(ps_dec->u4_num_cores >= 3 && ps_dec->i1_recon_in_thread3_flag) 7208ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen { 7218ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen memcpy(&ps_dec->s_tran_iprecon, &ps_dec->s_tran_addrecon, 7228ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen sizeof(tfr_ctxt_t)); 7238ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->ps_frame_buf_ip_recon = &ps_dec->s_tran_iprecon; 7248ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen } 7258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 7268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7278ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 7288ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ih264d_init_deblk_tfr_ctxt(ps_dec,&(ps_dec->s_pad_mgr), &(ps_dec->s_tran_addrecon), 7298ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->u2_frm_wd_in_mbs, 0); 7308ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 7318ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->ps_cur_deblk_mb = ps_dec->ps_deblk_pic; 7328ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->u4_cur_deblk_mb_num = 0; 7338ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 7348ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->u4_deblk_mb_x = 0; 7358ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->u4_deblk_mb_y = 0; 7368ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 7378ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 7388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex); 7398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return OK; 7408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S} 7418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*! 7438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ************************************************************************** 7448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \if Function name : ih264d_deblock_display \endif 7458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 7468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \brief : The function callls the deblocking routine and manages 7478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S : the Recon buffers and displays . 7488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \return : Nothing 7498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 7508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ************************************************************************** 7518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */ 7528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha SWORD32 ih264d_end_of_pic_dispbuf_mgr(dec_struct_t * ps_dec) 7538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{ 7548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice; 7558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 u1_num_of_users = 0; 7568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 ret; 7578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S H264_MUTEX_LOCK(&ps_dec->process_disp_mutex); 7598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(1) 7608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 7618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 7638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264d_delete_nonref_nondisplay_pics(ps_dec->ps_dpb_mgr); 7648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_cur_slice->u1_mmco_equalto5 7658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S || (ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL)) 7668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 7678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic->i4_poc = 0; 7688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->u2_total_mbs_coded 7698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S == (ps_dec->ps_cur_sps->u2_max_mb_addr + 1)) 7708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264d_reset_ref_bufs(ps_dec->ps_dpb_mgr); 7718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264d_release_display_bufs(ps_dec); 7728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 7738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->u4_num_reorder_frames_at_init != 0) 7748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 7758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ret = ih264d_assign_display_seq(ps_dec); 7768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ret != OK) 7778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ret; 7788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 7798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 7808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_cur_slice->u1_nal_ref_idc) 7828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 7838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Mark pic buf as needed for reference */ 7848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, 7858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_pic_buf_id, 7868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S BUF_MGR_REF); 7878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Mark mv buf as needed for reference */ 7888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_mv_buf_mgr, 7898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->au1_pic_buf_id_mv_buf_id_map[ps_dec->u1_pic_buf_id], 7908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S BUF_MGR_REF); 7918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->au1_pic_buf_ref_flag[ps_dec->u1_pic_buf_id] = 1; 7928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 7938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 7948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* 420 consumer */ 7958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Increment the number of users by 1 for display based upon */ 7968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /*the SEEK KEY FRAME control sent to decoder */ 7978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(((0 == ps_dec->u1_last_pic_not_decoded) 7988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S && (0 7998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S == (ps_dec->ps_cur_pic->u4_pack_slc_typ 8008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S & ps_dec->u4_skip_frm_mask))) 8018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S || (ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL)) 8028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 8038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Mark pic buf as needed for display */ 8048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, 8058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_pic_buf_id, 8068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S BUF_MGR_IO); 8078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 8098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(!ps_cur_slice->u1_field_pic_flag 8118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S || ((TOP_FIELD_ONLY | BOT_FIELD_ONLY) 8128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S != ps_dec->u1_top_bottom_decoded)) 8138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 8148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pic_buffer_t *ps_cur_pic = ps_dec->ps_cur_pic; 8158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_pic->u2_disp_width = ps_dec->u2_disp_width; 8168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_pic->u2_disp_height = ps_dec->u2_disp_height >> 1; 8178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_pic->u2_crop_offset_y = ps_dec->u2_crop_offset_y; 8198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_pic->u2_crop_offset_uv = ps_dec->u2_crop_offset_uv; 8208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_pic->u1_pic_type = 0; 8218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ret = ih264d_insert_pic_in_display_list( 8238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_dpb_mgr, 8248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_pic_buf_id, 8258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i4_prev_max_display_seq 8268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + ps_dec->ps_cur_pic->i4_poc, 8278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic->i4_frame_num); 8288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ret != OK) 8298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ret; 8308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 8328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ivd_video_decode_op_t * ps_dec_output = 8338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S (ivd_video_decode_op_t *)ps_dec->pv_dec_out; 8348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec_output->u4_frame_decoded_flag = 1; 8368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 8378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->au1_pic_buf_ref_flag[ps_dec->u1_pic_buf_id] == 0) 8388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 8398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr, 8408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->au1_pic_buf_id_mv_buf_id_map[ps_dec->u1_pic_buf_id], 8418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S BUF_MGR_REF); 8428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->au1_pic_buf_ref_flag[ps_dec->u1_pic_buf_id] = 0; 8438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 8458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 8468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 8478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 8488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S H264_DEC_DEBUG_PRINT("pic not inserted display %d %d\n", 8498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_slice->u1_field_pic_flag, 8508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_second_field); 8518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 8528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(!ps_cur_slice->u1_field_pic_flag 8548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S || ((TOP_FIELD_ONLY | BOT_FIELD_ONLY) 8558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S == ps_dec->u1_top_bottom_decoded)) 8568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 8578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->u4_num_reorder_frames_at_init == 0) 8588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 8598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ret = ih264d_assign_display_seq(ps_dec); 8608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ret != OK) 8618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ret; 8628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 8638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 8648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 8658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex); 8678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return OK; 8698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S} 8708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha Svoid ih264d_err_pic_dispbuf_mgr(dec_struct_t *ps_dec) 8728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{ 8738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice; 8748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ivd_video_decode_op_t * ps_dec_output = 8758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S (ivd_video_decode_op_t *)ps_dec->pv_dec_out; 8768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, 8788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_pic_buf_id, 8798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S BUF_MGR_REF); 8808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr, 8818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->au1_pic_buf_id_mv_buf_id_map[ps_dec->u1_pic_buf_id], 8828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S BUF_MGR_REF); 8838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, 8848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_pic_buf_id, 8858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S BUF_MGR_IO); 8868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S} 8878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha Svoid ih264d_deblock_picture(void *ptr) 8898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{ 8908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S dec_struct_t *ps_dec = (dec_struct_t *)ptr; 8918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 8928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 8938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /*Deblock picture only if all the mb's in the frame have been decoded*/ 8948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->u1_pic_decode_done == 1) 8958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 8968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag 8978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S || ps_dec->ps_cur_slice->u1_field_pic_flag) 8988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 8998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->p_DeblockPicture[ps_dec->ps_cur_slice->u1_mbaff_frame_flag]( 9008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec); 9018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 9028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 9038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 9048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 9058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 9068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264d_deblock_picture_progressive(ps_dec); 9078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 9088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 9098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 9108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 9118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 9128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S} 9138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 9148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*! 9158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ************************************************************************** 9168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \if Function name : ih264d_deblock_display \endif 9178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 9188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \brief : The function callls the deblocking routine and manages 9198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S : the Recon buffers and displays . 9208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \return : Nothing 9218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 9228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ************************************************************************** 9238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */ 9248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha SWORD32 ih264d_deblock_display(dec_struct_t *ps_dec) 9258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{ 9268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 ret; 9278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Call deblocking */ 9288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264d_deblock_picture(ps_dec); 9298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 9308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ret = ih264d_end_of_pic_dispbuf_mgr(ps_dec); 9318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ret != OK) 9328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ret; 9338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 9348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return OK; 9358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S} 9368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 9378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/* 9388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S *! 9398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ************************************************************************** 9408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \if Function name : EndofPoc \endif 9418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 9428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \brief 9438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * EndofPoc Processing 9448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 9458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \return 9468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 0 on Success and Error code otherwise 9478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ************************************************************************** 9488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */ 9498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 9508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha SWORD32 ih264d_end_of_pic(dec_struct_t *ps_dec, 9518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 u1_is_idr_slice, 9528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD16 u2_frame_num) 9538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{ 9548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice; 9558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 ret; 9568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 9578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_first_pb_nal_in_pic = 1; 9588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u2_mbx = 0xffff; 9598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u2_mby = 0; 9608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 9618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S dec_err_status_t * ps_err = ps_dec->ps_dec_err_status; 9628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_err->u1_err_flag & REJECT_CUR_PIC) 9638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 9648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264d_err_pic_dispbuf_mgr(ps_dec); 9659f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S return ERROR_NEW_FRAME_EXPECTED; 9668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 9678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 9688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 9698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S H264_MUTEX_LOCK(&ps_dec->process_disp_mutex); 9708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ret = ih264d_end_of_pic_processing(ps_dec); 9718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ret != OK) 9728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ret; 9738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u2_total_mbs_coded = 0; 9748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /*--------------------------------------------------------------------*/ 9758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* ih264d_decode_pic_order_cnt - calculate the Pic Order Cnt */ 9768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Needed to detect end of picture */ 9778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /*--------------------------------------------------------------------*/ 9788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 9798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pocstruct_t *ps_prev_poc = &ps_dec->s_prev_pic_poc; 9808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pocstruct_t *ps_cur_poc = &ps_dec->s_cur_pic_poc; 9818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if((0 == u1_is_idr_slice) && ps_cur_slice->u1_nal_ref_idc) 9828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u2_prev_ref_frame_num = ps_cur_slice->u2_frame_num; 9838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 9848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(u1_is_idr_slice || ps_cur_slice->u1_mmco_equalto5) 9858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u2_prev_ref_frame_num = 0; 9868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 9878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->ps_cur_sps->u1_gaps_in_frame_num_value_allowed_flag) 9888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 9898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ret = ih264d_decode_gaps_in_frame_num(ps_dec, u2_frame_num); 9908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ret != OK) 9918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ret; 9928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 9938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 9948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst; 9958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_prev_poc->u2_frame_num = ps_cur_poc->u2_frame_num; 9968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_prev_poc->u1_mmco_equalto5 = ps_cur_slice->u1_mmco_equalto5; 9978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_cur_slice->u1_nal_ref_idc) 9988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 9998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_prev_poc->i4_pic_order_cnt_lsb = ps_cur_poc->i4_pic_order_cnt_lsb; 10008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_prev_poc->i4_pic_order_cnt_msb = ps_cur_poc->i4_pic_order_cnt_msb; 10018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_prev_poc->i4_delta_pic_order_cnt_bottom = 10028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_poc->i4_delta_pic_order_cnt_bottom; 10038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_prev_poc->i4_delta_pic_order_cnt[0] = 10048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_poc->i4_delta_pic_order_cnt[0]; 10058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_prev_poc->i4_delta_pic_order_cnt[1] = 10068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_poc->i4_delta_pic_order_cnt[1]; 10078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_prev_poc->u1_bot_field = ps_cur_poc->u1_bot_field; 10088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 10098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 10109f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S 10119f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex); 10128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return OK; 10148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S} 10158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S/*! 10178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ************************************************************************** 10188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \if Function name : DecodeSlice \endif 10198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 10208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \brief 10218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * Parses a slice 10228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 10238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * \return 10248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * 0 on Success and Error code otherwise 10258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ************************************************************************** 10268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */ 10278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha SWORD32 ih264d_parse_decode_slice(UWORD8 u1_is_idr_slice, 10298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 u1_nal_ref_idc, 10308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S dec_struct_t *ps_dec /* Decoder parameters */ 10318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ) 10328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S{ 10338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm; 10348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S dec_pic_params_t *ps_pps; 10358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S dec_seq_params_t *ps_seq; 10368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice; 10378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pocstruct_t s_tmp_poc; 10388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i_delta_poc[2]; 10398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_poc = 0; 10408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD16 u2_first_mb_in_slice, u2_frame_num; 10418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 u1_field_pic_flag, u1_redundant_pic_cnt = 0, u1_slice_type; 10428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_idr_pic_id = 0; 10438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 u1_bottom_field_flag, u1_pic_order_cnt_type; 10448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 u1_nal_unit_type; 10468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; 10478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; 10488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD8 i1_is_end_of_poc; 10498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10508ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen WORD32 ret, end_of_frame; 10518ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen WORD32 prev_slice_err, num_mb_skipped; 10528ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen UWORD8 u1_mbaff; 10538ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen pocstruct_t *ps_cur_poc; 10548ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 10558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_temp; 10568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i_temp; 10578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_call_end_of_pic = 0; 10588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* read FirstMbInSlice and slice type*/ 10608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_dpb_cmds->u1_dpb_commands_read_slc = 0; 10618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u2_first_mb_in_slice = ih264d_uev(pu4_bitstrm_ofst, 10628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu4_bitstrm_buf); 10638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(u2_first_mb_in_slice 10648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S > (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)) 10658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 10668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ERROR_CORRUPTED_SLICE; 10688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 10698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /*we currently don not support ASO*/ 10718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(((u2_first_mb_in_slice << ps_cur_slice->u1_mbaff_frame_flag) 10728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S <= ps_dec->u2_cur_mb_addr) && (ps_dec->u2_cur_mb_addr != 0) 10738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S && (ps_dec->u4_first_slice_in_pic != 0)) 10748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 10758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ERROR_CORRUPTED_SLICE; 10768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 10778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S COPYTHECONTEXT("SH: first_mb_in_slice",u2_first_mb_in_slice); 10798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); 10818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(u4_temp > 9) 10838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ERROR_INV_SLC_TYPE_T; 10848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_slice_type = u4_temp; 10868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S COPYTHECONTEXT("SH: slice_type",(u1_slice_type)); 10878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_sl_typ_5_9 = 0; 10888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Find Out the Slice Type is 5 to 9 or not then Set the Flag */ 10898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* u1_sl_typ_5_9 = 1 .Which tells that all the slices in the Pic*/ 10908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* will be of same type of current */ 10918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(u1_slice_type > 4) 10928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 10938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_slice_type -= 5; 10948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_sl_typ_5_9 = 1; 10958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 10968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 10978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 10988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 skip; 10998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 11008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if((ps_dec->i4_app_skip_mode == IVD_SKIP_PB) 11018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S || (ps_dec->i4_dec_skip_mode == IVD_SKIP_PB)) 11028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_bit_stream_offset = 0; 11048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 11058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->u1_nal_unit_type == IDR_SLICE_NAL) 11068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S skip = 0; 11088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 11098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i4_dec_skip_mode = IVD_SKIP_NONE; 11108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if((I_SLICE == u1_slice_type) 11128ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen && (1 >= ps_dec->ps_cur_sps->u1_num_ref_frames)) 11138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S skip = 0; 11158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 11168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i4_dec_skip_mode = IVD_SKIP_NONE; 11178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 11198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S skip = 1; 11218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 11238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* If one frame worth of data is already skipped, do not skip the next one */ 11248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if((0 == u2_first_mb_in_slice) && (1 == ps_dec->u4_prev_nal_skipped)) 11258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S skip = 0; 11278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 11298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(skip) 11308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u4_prev_nal_skipped = 1; 11328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i4_dec_skip_mode = IVD_SKIP_PB; 11338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return 0; 11348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 11368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* If the previous NAL was skipped, then 11388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S do not process that buffer in this call. 11398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S Return to app and process it in the next call. 11408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S This is necessary to handle cases where I/IDR is not complete in 11418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S the current buffer and application intends to fill the remaining part of the bitstream 11428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S later. This ensures we process only frame worth of data in every call */ 11438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(1 == ps_dec->u4_prev_nal_skipped) 11448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u4_return_to_app = 1; 11468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return 0; 11478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 11518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 11538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); 11548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(u4_temp & MASK_ERR_PIC_SET_ID) 11558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ERROR_INV_SPS_PPS_T; 11568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* discard slice if pic param is invalid */ 11578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S COPYTHECONTEXT("SH: pic_parameter_set_id", u4_temp); 11588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_pps = &ps_dec->ps_pps[u4_temp]; 11598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(FALSE == ps_pps->u1_is_valid) 11608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ERROR_INV_SPS_PPS_T; 11628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_seq = ps_pps->ps_sps; 11648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(!ps_seq) 11658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ERROR_INV_SPS_PPS_T; 11668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(FALSE == ps_seq->u1_is_valid) 11678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ERROR_INV_SPS_PPS_T; 11688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 11698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Get the frame num */ 11708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u2_frame_num = ih264d_get_bits_h264(ps_bitstrm, 11718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_seq->u1_bits_in_frm_num); 11728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S// H264_DEC_DEBUG_PRINT("FRAME %d First MB in slice: %d\n", u2_frame_num, u2_first_mb_in_slice); 11738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 11748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S COPYTHECONTEXT("SH: frame_num", u2_frame_num); 11758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S// 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); 11768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 11778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Get the field related flags */ 11788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(!ps_seq->u1_frame_mbs_only_flag) 11798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 11818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_field_pic_flag = ih264d_get_bit_h264(ps_bitstrm); 11828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S COPYTHECONTEXT("SH: field_pic_flag", u1_field_pic_flag); 11838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_bottom_field_flag = 0; 11848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 11858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(u1_field_pic_flag) 11868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan_fld; 11888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_bottom_field_flag = ih264d_get_bit_h264(ps_bitstrm); 11898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S COPYTHECONTEXT("SH: bottom_field_flag", u1_bottom_field_flag); 11908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 11918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 11938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan; 11958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 11978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 11988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 11998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_field_pic_flag = 0; 12008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_bottom_field_flag = 0; 12018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 12028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan; 12038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 12048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 12058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_nal_unit_type = SLICE_NAL; 12068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(u1_is_idr_slice) 12078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 12088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(0 == u1_field_pic_flag) 12098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 12108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_top_bottom_decoded = TOP_FIELD_ONLY | BOT_FIELD_ONLY; 12118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 12128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_nal_unit_type = IDR_SLICE_NAL; 12138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_idr_pic_id = ih264d_uev(pu4_bitstrm_ofst, 12148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu4_bitstrm_buf); 12158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(u4_idr_pic_id > 65535) 12168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ERROR_INV_SPS_PPS_T; 12178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S COPYTHECONTEXT("SH: ", u4_idr_pic_id); 12188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 12198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 12208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* read delta pic order count information*/ 12218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i_delta_poc[0] = i_delta_poc[1] = 0; 12228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_tmp_poc.i4_pic_order_cnt_lsb = 0; 12238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_tmp_poc.i4_delta_pic_order_cnt_bottom = 0; 12248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_pic_order_cnt_type = ps_seq->u1_pic_order_cnt_type; 12258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(u1_pic_order_cnt_type == 0) 12268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 12278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i_temp = ih264d_get_bits_h264( 12288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_bitstrm, 12298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_seq->u1_log2_max_pic_order_cnt_lsb_minus); 12308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(i_temp < 0 || i_temp >= ps_seq->i4_max_pic_order_cntLsb) 12318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ERROR_INV_SPS_PPS_T; 12328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_tmp_poc.i4_pic_order_cnt_lsb = i_temp; 12338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S COPYTHECONTEXT("SH: pic_order_cnt_lsb", s_tmp_poc.i4_pic_order_cnt_lsb); 12348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 12358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if((ps_pps->u1_pic_order_present_flag == 1) && (!u1_field_pic_flag)) 12368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 12378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_tmp_poc.i4_delta_pic_order_cnt_bottom = ih264d_sev( 12388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu4_bitstrm_ofst, pu4_bitstrm_buf); 12398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S //if(s_tmp_poc.i4_delta_pic_order_cnt_bottom > ps_seq->i4_max_pic_order_cntLsb) 12408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S COPYTHECONTEXT("SH: delta_pic_order_cnt_bottom", 12418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_tmp_poc.i4_delta_pic_order_cnt_bottom); 12428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 12438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 12448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 12458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_tmp_poc.i4_delta_pic_order_cnt[0] = 0; 12468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_tmp_poc.i4_delta_pic_order_cnt[1] = 0; 12478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(u1_pic_order_cnt_type == 1 12488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S && (!ps_seq->u1_delta_pic_order_always_zero_flag)) 12498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 12508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_tmp_poc.i4_delta_pic_order_cnt[0] = ih264d_sev(pu4_bitstrm_ofst, 12518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu4_bitstrm_buf); 12528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S COPYTHECONTEXT("SH: delta_pic_order_cnt[0]", 12538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_tmp_poc.i4_delta_pic_order_cnt[0]); 12548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 12558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_pps->u1_pic_order_present_flag && !u1_field_pic_flag) 12568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 12578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_tmp_poc.i4_delta_pic_order_cnt[1] = ih264d_sev( 12588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu4_bitstrm_ofst, pu4_bitstrm_buf); 12598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S COPYTHECONTEXT("SH: delta_pic_order_cnt[1]", 12608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S s_tmp_poc.i4_delta_pic_order_cnt[1]); 12618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 12628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 12638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 12648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_pps->u1_redundant_pic_cnt_present_flag) 12658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 12668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); 12678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(u4_temp > MAX_REDUNDANT_PIC_CNT) 12688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ERROR_INV_SPS_PPS_T; 12698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_redundant_pic_cnt = u4_temp; 12708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S COPYTHECONTEXT("SH: redundant_pic_cnt", u1_redundant_pic_cnt); 12718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 12728ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 12738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /*--------------------------------------------------------------------*/ 12748ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen /* Check if the slice is part of new picture */ 12758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /*--------------------------------------------------------------------*/ 12768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i1_is_end_of_poc = 0; 12778ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen if(!ps_dec->u1_first_slice_in_stream) 12788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 12798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i1_is_end_of_poc = ih264d_is_end_of_pic(u2_frame_num, u1_nal_ref_idc, 12808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S &s_tmp_poc, &ps_dec->s_cur_pic_poc, 12818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_slice, u1_pic_order_cnt_type, 12828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_nal_unit_type, u4_idr_pic_id, 12838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_field_pic_flag, 12848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_bottom_field_flag); 12858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 12869f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S /* since we support only Full frame decode, every new process should 12879f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S * process a new pic 12889f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S */ 12899f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S if((ps_dec->u4_first_slice_in_pic == 2) && (i1_is_end_of_poc == 0)) 12909f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S { 12919f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S /* if it is the first slice is process call ,it should be a new frame. If it is not 12929f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S * reject current pic and dont add it to dpb 12939f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S */ 12949f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S ps_dec->ps_dec_err_status->u1_err_flag |= REJECT_CUR_PIC; 12959f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S i1_is_end_of_poc = 1; 12969f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S } 12979f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S else 12989f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S { 12999f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S /* reset REJECT_CUR_PIC */ 13009f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S ps_dec->ps_dec_err_status->u1_err_flag &= MASK_REJECT_CUR_PIC; 13019f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S } 13028ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen } 13038ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 13048ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen /*--------------------------------------------------------------------*/ 13058ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen /* Check for error in slice and parse the missing/corrupted MB's */ 13068ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen /* as skip-MB's in an inserted P-slice */ 13078ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen /*--------------------------------------------------------------------*/ 13088ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen u1_mbaff = ps_seq->u1_mb_aff_flag && (!u1_field_pic_flag); 13098ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen prev_slice_err = 0; 13108ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 13118ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen if(i1_is_end_of_poc || ps_dec->u1_first_slice_in_stream) 13128ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen { 13138ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen if(u2_frame_num != ps_dec->u2_prv_frame_num 13148ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen && ps_dec->u1_top_bottom_decoded != 0 13158ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen && ps_dec->u1_top_bottom_decoded 13168ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen != (TOP_FIELD_ONLY | BOT_FIELD_ONLY)) 13178ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen { 13189f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S ps_dec->u1_dangling_field = 1; 13198ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen if(ps_dec->u4_first_slice_in_pic) 13208ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen { 13218ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen // first slice - dangling field 13228ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen prev_slice_err = 1; 13238ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen } 13248ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen else 13258ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen { 13268ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen // last slice - dangling field 13278ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen prev_slice_err = 2; 13288ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen } 13298ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 13308ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen if(ps_dec->u1_top_bottom_decoded ==TOP_FIELD_ONLY) 13318ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_cur_slice->u1_bottom_field_flag = 1; 13328ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen else 13338ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_cur_slice->u1_bottom_field_flag = 0; 13348ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 13358ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen num_mb_skipped = (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs) 13368ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen - ps_dec->u2_total_mbs_coded; 13378ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_cur_poc = &ps_dec->s_cur_pic_poc; 13388ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 13398ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen u1_is_idr_slice = ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL; 13408ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen } 13419f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S else if(ps_dec->u4_first_slice_in_pic == 2) 13428ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen { 13438ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen if(u2_first_mb_in_slice > 0) 13448ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen { 13458ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen // first slice - missing/header corruption 13468ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen prev_slice_err = 1; 13478ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen num_mb_skipped = u2_first_mb_in_slice << u1_mbaff; 13488ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_cur_poc = &s_tmp_poc; 13498ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 13508ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen // initializing slice parameters 13518ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_cur_slice->u4_idr_pic_id = u4_idr_pic_id; 13528ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_cur_slice->u1_field_pic_flag = u1_field_pic_flag; 13538ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag; 13548ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_cur_slice->i4_pic_order_cnt_lsb = 13558ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen s_tmp_poc.i4_pic_order_cnt_lsb; 13568ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_cur_slice->u1_nal_unit_type = u1_nal_unit_type; 13578ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_cur_slice->u1_redundant_pic_cnt = u1_redundant_pic_cnt; 13588ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_cur_slice->u1_nal_ref_idc = u1_nal_ref_idc; 13598ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_cur_slice->u1_pic_order_cnt_type = u1_pic_order_cnt_type; 13608ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen } 13618ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen } 13628ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen else 13638ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen { 13649f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S 13659f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S if(ps_dec->u4_first_slice_in_pic) 13669f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S { 13679f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S /* if valid slice header is not decoded do start of pic processing 13689f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S * since in the current process call, frame num is not updated in the slice structure yet 13699f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S * ih264d_is_end_of_pic is checked with valid frame num of previous process call, 13709f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S * although i1_is_end_of_poc is set there could be more slices in the frame, 13719f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S * so conceal only till cur slice */ 13729f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S prev_slice_err = 1; 13739f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S num_mb_skipped = u2_first_mb_in_slice << u1_mbaff; 13749f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S } 13759f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S else 13769f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S { 13779f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S /* since i1_is_end_of_poc is set ,means new frame num is encountered. so conceal the current frame 13789f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S * completely */ 13799f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S prev_slice_err = 2; 13809f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S num_mb_skipped = (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs) 13819f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S - ps_dec->u2_total_mbs_coded; 13829f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S } 13838ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_cur_poc = &s_tmp_poc; 13848ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen } 13858ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen } 13868ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen else 13878ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen { 13888ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen if((u2_first_mb_in_slice << u1_mbaff) > ps_dec->u2_total_mbs_coded) 13898ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen { 13908ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen // previous slice - missing/corruption 13918ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen prev_slice_err = 2; 13928ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen num_mb_skipped = (u2_first_mb_in_slice << u1_mbaff) 13938ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen - ps_dec->u2_total_mbs_coded; 13948ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_cur_poc = &s_tmp_poc; 13958ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen } 13968ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen else if((u2_first_mb_in_slice << u1_mbaff) < ps_dec->u2_total_mbs_coded) 13978ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen { 13988ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen return ERROR_CORRUPTED_SLICE; 13998ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen } 14008ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen } 14018ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 14028ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen if(prev_slice_err) 14038ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen { 14049f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S ret = ih264d_mark_err_slice_skip(ps_dec, num_mb_skipped, u1_is_idr_slice, u2_frame_num, ps_cur_poc, prev_slice_err); 14059f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S 14069f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S if(ps_dec->u1_dangling_field == 1) 14079f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S { 14089f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S ps_dec->u1_second_field = 1 - ps_dec->u1_second_field; 14099f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag; 14109f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S ps_dec->u2_prv_frame_num = u2_frame_num; 14119f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S ps_dec->u1_first_slice_in_stream = 0; 14129f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S return ERROR_DANGLING_FIELD_IN_PIC; 14139f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S } 14149f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S 14159f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S if(prev_slice_err == 2) 14169f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S { 14179f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S ps_dec->u1_first_slice_in_stream = 0; 14189f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S return ERROR_INCOMPLETE_FRAME; 14199f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S } 14208ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 14219f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S if(ps_dec->u2_total_mbs_coded 14229f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs) 14238ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen { 14249f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S /* return if all MBs in frame are parsed*/ 14259f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S ps_dec->u1_first_slice_in_stream = 0; 14268ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen return ERROR_IN_LAST_SLICE_OF_PIC; 14278ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen } 14289f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S 14299f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S if(ps_dec->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC) 14309f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S { 14319f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S ih264d_err_pic_dispbuf_mgr(ps_dec); 14329f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S return ERROR_NEW_FRAME_EXPECTED; 14339f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S } 14349f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S 14359f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S if(ret != OK) 14369f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S return ret; 14379f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S 14388ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen i1_is_end_of_poc = 0; 14398ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen } 14408ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 14418ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen if (ps_dec->u4_first_slice_in_pic == 0) 14428ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->ps_parse_cur_slice++; 14438ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 14448ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->u1_slice_header_done = 0; 14458ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 14468ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen /*--------------------------------------------------------------------*/ 14478ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen /* If the slice is part of new picture, do End of Pic processing. */ 14488ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen /*--------------------------------------------------------------------*/ 14498ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen if(!ps_dec->u1_first_slice_in_stream) 14508ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen { 14518ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen UWORD8 uc_mbs_exceed = 0; 14528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 14538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->u2_total_mbs_coded 14548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S == (ps_dec->ps_cur_sps->u2_max_mb_addr + 1)) 14558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 14568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /*u2_total_mbs_coded is forced to u2_max_mb_addr+ 1 at the end of decode ,so 14578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ,if it is first slice in pic dont consider u2_total_mbs_coded to detect new picture */ 14588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->u4_first_slice_in_pic == 0) 14598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S uc_mbs_exceed = 1; 14608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 14618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 14628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(i1_is_end_of_poc || uc_mbs_exceed) 14638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 14648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 14658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(1 == ps_dec->u1_last_pic_not_decoded) 14668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 14678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ret = ih264d_end_of_pic_dispbuf_mgr(ps_dec); 14688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 14698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ret != OK) 14708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ret; 14718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 14728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ret = ih264d_end_of_pic(ps_dec, u1_is_idr_slice, u2_frame_num); 14738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ret != OK) 14748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ret; 14758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#if WIN32 14768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S H264_DEC_DEBUG_PRINT(" ------ PIC SKIPPED ------\n"); 14778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S#endif 14788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return RET_LAST_SKIP; 14798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 14808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 14818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 14828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ret = ih264d_end_of_pic(ps_dec, u1_is_idr_slice, u2_frame_num); 14838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ret != OK) 14848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ret; 14858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 14868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 14878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 14888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 14898ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 14908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(u1_field_pic_flag) 14918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 14928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u2_prv_frame_num = u2_frame_num; 14938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 14948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 14958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_cur_slice->u1_mmco_equalto5) 14968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 14978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_temp_poc; 14988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_top_field_order_poc, i4_bot_field_order_poc; 14998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(!ps_cur_slice->u1_field_pic_flag) // or a complementary field pair 15018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 15028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_top_field_order_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt; 15038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_bot_field_order_poc = 15048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic->i4_bottom_field_order_cnt; 15058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_temp_poc = MIN(i4_top_field_order_poc, 15068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_bot_field_order_poc); 15078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 15088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if(!ps_cur_slice->u1_bottom_field_flag) 15098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_temp_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt; 15108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 15118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_temp_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt; 15128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic->i4_top_field_order_cnt = i4_temp_poc 15148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S - ps_dec->ps_cur_pic->i4_top_field_order_cnt; 15158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic->i4_bottom_field_order_cnt = i4_temp_poc 15168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S - ps_dec->ps_cur_pic->i4_bottom_field_order_cnt; 15178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic->i4_poc = i4_temp_poc; 15188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic->i4_avg_poc = i4_temp_poc; 15198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 15209f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S if(ps_dec->u4_first_slice_in_pic == 2) 15218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 15228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ret = ih264d_decode_pic_order_cnt(u1_is_idr_slice, u2_frame_num, 15238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S &ps_dec->s_prev_pic_poc, 15248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S &s_tmp_poc, ps_cur_slice, ps_pps, 15258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_nal_ref_idc, 15268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_bottom_field_flag, 15278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_field_pic_flag, &i4_poc); 15288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ret != OK) 15298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ret; 15308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Display seq no calculations */ 15318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(i4_poc >= ps_dec->i4_max_poc) 15328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i4_max_poc = i4_poc; 15338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* IDR Picture or POC wrap around */ 15348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(i4_poc == 0) 15358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 15368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i4_prev_max_display_seq = ps_dec->i4_prev_max_display_seq 15378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + ps_dec->i4_max_poc 15388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + ps_dec->u1_max_dec_frame_buffering + 1; 15398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i4_max_poc = 0; 15408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 15418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 15428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /*--------------------------------------------------------------------*/ 15448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Copy the values read from the bitstream to the slice header and then*/ 15458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* If the slice is first slice in picture, then do Start of Picture */ 15468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* processing. */ 15478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /*--------------------------------------------------------------------*/ 15488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_slice->i4_delta_pic_order_cnt[0] = i_delta_poc[0]; 15498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_slice->i4_delta_pic_order_cnt[1] = i_delta_poc[1]; 15508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_slice->u4_idr_pic_id = u4_idr_pic_id; 15518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_slice->u2_first_mb_in_slice = u2_first_mb_in_slice; 15528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_slice->u1_field_pic_flag = u1_field_pic_flag; 15538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag; 15548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_slice->u1_slice_type = u1_slice_type; 15558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_slice->i4_pic_order_cnt_lsb = s_tmp_poc.i4_pic_order_cnt_lsb; 15568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_slice->u1_nal_unit_type = u1_nal_unit_type; 15588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_slice->u1_redundant_pic_cnt = u1_redundant_pic_cnt; 15598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_slice->u1_nal_ref_idc = u1_nal_ref_idc; 15608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_slice->u1_pic_order_cnt_type = u1_pic_order_cnt_type; 15618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_seq->u1_frame_mbs_only_flag) 15638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_slice->u1_direct_8x8_inference_flag = 15648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_seq->u1_direct_8x8_inference_flag; 15658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 15668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_slice->u1_direct_8x8_inference_flag = 1; 15678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(u1_slice_type == B_SLICE) 15698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 15708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_slice->u1_direct_spatial_mv_pred_flag = ih264d_get_bit_h264( 15718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_bitstrm); 15728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S COPYTHECONTEXT("SH: direct_spatial_mv_pred_flag", 15738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_slice->u1_direct_spatial_mv_pred_flag); 15748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_cur_slice->u1_direct_spatial_mv_pred_flag) 15768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_slice->pf_decodeDirect = ih264d_decode_spatial_direct; 15778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 15788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_cur_slice->pf_decodeDirect = ih264d_decode_temporal_direct; 15798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(!((ps_pps->ps_sps->u1_mb_aff_flag) && (!u1_field_pic_flag))) 15808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pf_mvpred = ih264d_mvpred_nonmbaffB; 15818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 15828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 15838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 15848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(!((ps_pps->ps_sps->u1_mb_aff_flag) && (!u1_field_pic_flag))) 15858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->pf_mvpred = ih264d_mvpred_nonmbaff; 15868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 15878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15889f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S if(ps_dec->u4_first_slice_in_pic == 2) 15898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 15909f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S if(u2_first_mb_in_slice == 0) 15919f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S { 15929f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S ret = ih264d_start_of_pic(ps_dec, i4_poc, &s_tmp_poc, u2_frame_num, ps_pps); 15939f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S if(ret != OK) 15949f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S return ret; 15959f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S } 15968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u4_output_present = 0; 15988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 15998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 16008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ih264d_get_next_display_field(ps_dec, 16018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_out_buffer, 16028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S &(ps_dec->s_disp_op)); 16038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* If error code is non-zero then there is no buffer available for display, 16048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S hence avoid format conversion */ 16058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 16068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(0 != ps_dec->s_disp_op.u4_error_code) 16078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 16088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u4_fmt_conv_cur_row = ps_dec->s_disp_frame_info.u4_y_ht; 16098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 16108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 16118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u4_output_present = 1; 16128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 16138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->u1_separate_parse == 1) 16148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 16158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->u4_dec_thread_created == 0) 16168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 16178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ithread_create(ps_dec->pv_dec_thread_handle, NULL, 16188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S (void *)ih264d_decode_picture_thread, 16198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S (void *)ps_dec); 16208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 16218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u4_dec_thread_created = 1; 16228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 16238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 16248ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen if((ps_dec->u4_num_cores == 3) && 16258ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ((ps_dec->u4_app_disable_deblk_frm == 0) || ps_dec->i1_recon_in_thread3_flag) 16268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S && (ps_dec->u4_bs_deblk_thread_created == 0)) 16278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 16288ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->u4_start_recon_deblk = 0; 16298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ithread_create(ps_dec->pv_bs_deblk_thread_handle, NULL, 16308ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen (void *)ih264d_recon_deblk_thread, 16318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S (void *)ps_dec); 16328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u4_bs_deblk_thread_created = 1; 16338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 16348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 16358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 16368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 16378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 16388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* INITIALIZATION of fn ptrs for MC and formMbPartInfo functions */ 16398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 16408ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen UWORD8 uc_nofield_nombaff; 16418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 16428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 16438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 16448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S uc_nofield_nombaff = ((ps_dec->ps_cur_slice->u1_field_pic_flag == 0) 16458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S && (ps_dec->ps_cur_slice->u1_mbaff_frame_flag == 0) 16468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S && (u1_slice_type != B_SLICE) 16478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S && (ps_dec->ps_cur_pps->u1_wted_pred_flag == 0)); 16488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 16498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Initialise MC and formMbPartInfo fn ptrs one time based on profile_idc */ 16508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 16518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(uc_nofield_nombaff) 16528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 16538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_bp; 16548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->p_motion_compensate = ih264d_motion_compensate_bp; 16558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 16568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 16578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 16588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_mp; 16598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->p_motion_compensate = ih264d_motion_compensate_mp; 16608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 16618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 16628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 16638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 16648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 16658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* 16668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S * Decide whether to decode the current picture or not 16678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S */ 16688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 16698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S dec_err_status_t * ps_err = ps_dec->ps_dec_err_status; 16708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_err->u4_frm_sei_sync == u2_frame_num) 16718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 16728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_err->u1_err_flag = ACCEPT_ALL_PICS; 16738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_err->u4_frm_sei_sync = SYNC_FRM_DEFAULT; 16748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 16758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_err->u4_cur_frm = u2_frame_num; 16768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 16778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 16788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Decision for decoding if the picture is to be skipped */ 16798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 16808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 i4_skip_b_pic, i4_skip_p_pic; 16818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 16828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_skip_b_pic = (ps_dec->u4_skip_frm_mask & B_SLC_BIT) 16838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S && (B_SLICE == u1_slice_type) && (0 == u1_nal_ref_idc); 16848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 16858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S i4_skip_p_pic = (ps_dec->u4_skip_frm_mask & P_SLC_BIT) 16868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S && (P_SLICE == u1_slice_type) && (0 == u1_nal_ref_idc); 16878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 16888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /**************************************************************/ 16898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Skip the B picture if skip mask is set for B picture and */ 16908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Current B picture is a non reference B picture or there is */ 16918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* no user for reference B picture */ 16928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /**************************************************************/ 16938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(i4_skip_b_pic) 16948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 16958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic->u4_pack_slc_typ |= B_SLC_BIT; 16968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Don't decode the picture in SKIP-B mode if that picture is B */ 16978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* and also it is not to be used as a reference picture */ 16988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_last_pic_not_decoded = 1; 16998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return OK; 17018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 17028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /**************************************************************/ 17038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Skip the P picture if skip mask is set for P picture and */ 17048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Current P picture is a non reference P picture or there is */ 17058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* no user for reference P picture */ 17068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /**************************************************************/ 17078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(i4_skip_p_pic) 17088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 17098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic->u4_pack_slc_typ |= P_SLC_BIT; 17108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* Don't decode the picture in SKIP-P mode if that picture is P */ 17118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* and also it is not to be used as a reference picture */ 17128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_last_pic_not_decoded = 1; 17138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return OK; 17158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 17168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 17178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 17198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD16 u2_mb_x, u2_mb_y; 17208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i4_submb_ofst = ((u2_first_mb_in_slice 17228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S << ps_cur_slice->u1_mbaff_frame_flag) * SUB_BLK_SIZE) 17238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S - SUB_BLK_SIZE; 17248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(u2_first_mb_in_slice) 17258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 17268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 u1_mb_aff; 17278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 u1_field_pic; 17288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD16 u2_frm_wd_in_mbs; 17298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u2_frm_wd_in_mbs = ps_seq->u2_frm_wd_in_mbs; 17308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_mb_aff = ps_cur_slice->u1_mbaff_frame_flag; 17318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u1_field_pic = ps_cur_slice->u1_field_pic_flag; 17328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 17348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 x_offset; 17358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 y_offset; 17368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD32 u4_frame_stride; 17378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S tfr_ctxt_t *ps_trns_addr; // = &ps_dec->s_tran_addrecon_parse; 17388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->u1_separate_parse) 17408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 17418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_trns_addr = &ps_dec->s_tran_addrecon_parse; 17428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 17438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 17448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 17458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_trns_addr = &ps_dec->s_tran_addrecon; 17468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 17478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u2_mb_x = MOD(u2_first_mb_in_slice, u2_frm_wd_in_mbs); 17488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u2_mb_y = DIV(u2_first_mb_in_slice, u2_frm_wd_in_mbs); 17498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u2_mb_y <<= u1_mb_aff; 17518d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if((u2_mb_x > u2_frm_wd_in_mbs - 1) 17538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S || (u2_mb_y > ps_dec->u2_frm_ht_in_mbs - 1)) 17548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 17558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ERROR_CORRUPTED_SLICE; 17568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 17578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_frame_stride = ps_dec->u2_frm_wd_y << u1_field_pic; 17598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S x_offset = u2_mb_x << 4; 17608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S y_offset = (u2_mb_y * u4_frame_stride) << 4; 17618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1 + x_offset 17638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + y_offset; 17648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17658d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u4_frame_stride = ps_dec->u2_frm_wd_uv << u1_field_pic; 17668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S x_offset >>= 1; 17678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S y_offset = (u2_mb_y * u4_frame_stride) << 3; 17688d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17698d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S x_offset *= YUV420SP_FACTOR; 17708d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17718d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2 + x_offset 17728d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + y_offset; 17738d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3 + x_offset 17748d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + y_offset; 17758d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17768d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y; 17778d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u; 17788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v; 17798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S // assign the deblock structure pointers to start of slice 17828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->u1_separate_parse == 1) 17838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 17848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic 17858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + (u2_first_mb_in_slice << u1_mb_aff); 17868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 17878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 17888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 17898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic 17908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + (u2_first_mb_in_slice << u1_mb_aff); 17918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 17928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u2_cur_mb_addr = (u2_first_mb_in_slice << u1_mb_aff); 17948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 17958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv 17968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S + ((u2_first_mb_in_slice << u1_mb_aff) << 4); 17978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 17988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 17998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 18008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 18018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S tfr_ctxt_t *ps_trns_addr; 18028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->u1_separate_parse) 18048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 18058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_trns_addr = &ps_dec->s_tran_addrecon_parse; 18068d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 18078d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 18088d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 18098d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_trns_addr = &ps_dec->s_tran_addrecon; 18108d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 18118d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18128d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u2_mb_x = 0xffff; 18138d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S u2_mb_y = 0; 18148d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S // assign the deblock structure pointers to start of slice 18158d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u2_cur_mb_addr = 0; 18168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic; 18178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv; 18188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1; 18198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2; 18208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3; 18218d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y; 18238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u; 18248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v; 18258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 18278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_part = ps_dec->ps_parse_part_params; 18298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u2_mbx = 18318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S (MOD(u2_first_mb_in_slice - 1, ps_seq->u2_frm_wd_in_mbs)); 18328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u2_mby = 18338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S (DIV(u2_first_mb_in_slice - 1, ps_seq->u2_frm_wd_in_mbs)); 18348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u2_mby <<= ps_cur_slice->u1_mbaff_frame_flag; 18358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx; 18368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i2_prev_slice_mby = ps_dec->u2_mby; 18378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 18388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* RBSP stop bit is used for CABAC decoding*/ 18408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_bitstrm->u4_max_ofst += ps_dec->ps_cur_pps->u1_entropy_coding_mode; 18418d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_B = (u1_slice_type == B_SLICE); 18438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u4_next_mb_skip = 0; 18448d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18458d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice = 18468d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_slice->u2_first_mb_in_slice; 18478d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_parse_cur_slice->slice_type = 18488d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_slice->u1_slice_type; 18498d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18508d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18518ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->u4_start_recon_deblk = 1; 18528d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 18538d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 num_entries; 18548d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S WORD32 size; 18558d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S UWORD8 *pu1_buf; 18568d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18578d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S num_entries = MIN(MAX_FRAMES, ps_dec->u4_num_ref_frames_at_init); 18588d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S num_entries = 2 * ((2 * num_entries) + 1); 18598d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18608d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S size = num_entries * sizeof(void *); 18618d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S size += PAD_MAP_IDX_POC * sizeof(void *); 18628d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18638d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_buf = (UWORD8 *)ps_dec->pv_map_ref_idx_to_poc_buf; 18648d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S pu1_buf += size * ps_dec->u2_cur_slice_num; 18658ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc = ( void *)pu1_buf; 18668d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 18678d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18688ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen if(ps_dec->u1_separate_parse) 18698ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen { 18708ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->ps_parse_cur_slice->pv_tu_coeff_data_start = ps_dec->pv_parse_tu_coeff_data; 18718ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen } 18728ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen else 18738ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen { 18748ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data; 18758ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen } 18768ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 18778ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat; 18788d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(u1_slice_type == I_SLICE) 18798d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 18808d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic->u4_pack_slc_typ |= I_SLC_BIT; 18818d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18828d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ret = ih264d_parse_islice(ps_dec, u2_first_mb_in_slice); 18838d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18848d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->i4_pic_type != B_SLICE && ps_dec->i4_pic_type != P_SLICE) 18858d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i4_pic_type = I_SLICE; 18868d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 18878d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 18888d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if(u1_slice_type == P_SLICE) 18898d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 18908d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic->u4_pack_slc_typ |= P_SLC_BIT; 18918d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ret = ih264d_parse_pslice(ps_dec, u2_first_mb_in_slice); 18928d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_pr_sl_type = u1_slice_type; 18938d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->i4_pic_type != B_SLICE) 18948d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i4_pic_type = P_SLICE; 18958d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 18968d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else if(u1_slice_type == B_SLICE) 18978d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 18988d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->ps_cur_pic->u4_pack_slc_typ |= B_SLC_BIT; 18998d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ret = ih264d_parse_bslice(ps_dec, u2_first_mb_in_slice); 19008d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_pr_sl_type = u1_slice_type; 19018d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i4_pic_type = B_SLICE; 19028d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 19038d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S else 19048d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S return ERROR_INV_SLC_TYPE_T; 19058d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 19068ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen if(ps_dec->u1_slice_header_done) 19078ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen { 19089f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S /* set to zero to indicate a valid slice has been decoded */ 19099f0dcba9b4f792aedf37b6ecdceae46d36b93068Hamsalekha S /* first slice header successfully decoded */ 19108ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->u4_first_slice_in_pic = 0; 19118ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen ps_dec->u1_first_slice_in_stream = 0; 19128ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen } 19138ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 19148ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen if(ret != OK) 19158ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen return ret; 19168d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 19178d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u2_cur_slice_num++; 19188d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* storing last Mb X and MbY of the slice */ 19198d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx; 19208d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->i2_prev_slice_mby = ps_dec->u2_mby; 19218ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen 19228d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S /* End of Picture detection */ 19238d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 19248d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if(ps_dec->u2_total_mbs_coded >= (ps_seq->u2_max_mb_addr + 1)) 19258d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 19268d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_dec->u1_pic_decode_done = 1; 19278d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 19288d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 19298d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 19308d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 19318d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S dec_err_status_t * ps_err = ps_dec->ps_dec_err_status; 19328d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S if((ps_err->u1_err_flag & REJECT_PB_PICS) 19338d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S && (ps_err->u1_cur_pic_type == PIC_TYPE_I)) 19348d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S { 19358d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S ps_err->u1_err_flag = ACCEPT_ALL_PICS; 19368d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 19378d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S } 19388d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 19398d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S PRINT_BIN_BIT_RATIO(ps_dec) 19408d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 19418ef4c3f6142028732a155cbfc1febd6ef5da72fdMarco Nelissen return ret; 19428d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S} 19438d3d303c7942ced6a987a52db8977d768dc3605fHamsalekha S 1944