diff options
Diffstat (limited to 'decoder/ih264d_parse_pslice.c')
-rw-r--r-- | decoder/ih264d_parse_pslice.c | 484 |
1 files changed, 441 insertions, 43 deletions
diff --git a/decoder/ih264d_parse_pslice.c b/decoder/ih264d_parse_pslice.c index 67d1405..02110eb 100644 --- a/decoder/ih264d_parse_pslice.c +++ b/decoder/ih264d_parse_pslice.c @@ -57,6 +57,7 @@ #include "ih264d_format_conv.h" #include "ih264d_quant_scaling.h" #include "ih264d_thread_parse_decode.h" +#include "ih264d_thread_compute_bs.h" #include "ih264d_process_bslice.h" #include "ithread.h" #include "ih264d_utils.h" @@ -820,7 +821,7 @@ WORD32 ih264d_parse_inter_slice_data_cabac(dec_struct_t * ps_dec, UWORD32 u1_deblk_mb_type; UWORD32 u1_mb_threshold; dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; - WORD32 ret; + WORD32 ret = OK; /******************************************************/ /* Initialisations specific to B or P slice */ @@ -845,9 +846,7 @@ WORD32 ih264d_parse_inter_slice_data_cabac(dec_struct_t * ps_dec, /******************************************************/ i2_cur_mb_addr = u2_first_mb_in_slice; ps_dec->u1_qp = ps_slice->u1_slice_qp; - ret = ih264d_update_qp(ps_dec, 0); - if(ret != OK) - return ret; + ih264d_update_qp(ps_dec, 0); u1_mb_idx = ps_dec->u1_mb_idx; u1_num_mbs = u1_mb_idx; u1_num_mbsNby2 = 0; @@ -873,8 +872,16 @@ WORD32 ih264d_parse_inter_slice_data_cabac(dec_struct_t * ps_dec, UWORD8 u1_mb_type; UWORD32 u4_mb_skip; + ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data; + + if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr) + { + ret = ERROR_MB_ADDRESS_T; + break; + } ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs; + ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs; ps_cur_mb_info->u1_Mux = 0; ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff); @@ -1001,8 +1008,6 @@ WORD32 ih264d_parse_inter_slice_data_cabac(dec_struct_t * ps_dec, ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info); } /* Next macroblock information */ - if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr) - return ERROR_MB_ADDRESS_T; i2_cur_mb_addr++; if(ps_cur_mb_info->u1_topmb && u1_mbaff) @@ -1039,9 +1044,7 @@ WORD32 ih264d_parse_inter_slice_data_cabac(dec_struct_t * ps_dec, if(u1_decode_nmb) { - ret = ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs); - if(ret != OK) - return ret; + ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs); u1_num_mbsNby2 = 0; { @@ -1065,11 +1068,9 @@ WORD32 ih264d_parse_inter_slice_data_cabac(dec_struct_t * ps_dec, } else { - ret = ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, - u1_num_mbs_next, u1_tfr_n_mb, - u1_end_of_row); - if(ret != OK) - return ret; + ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, + u1_num_mbs_next, u1_tfr_n_mb, + u1_end_of_row); } if(u1_tfr_n_mb) @@ -1080,13 +1081,13 @@ WORD32 ih264d_parse_inter_slice_data_cabac(dec_struct_t * ps_dec, } } - if(ps_dec->u1_separate_parse) - { - ps_dec->ps_parse_cur_slice->end_of_slice = 1; - ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr + + ps_dec->u4_num_mbs_cur_nmb = 0; + ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr + - (u2_first_mb_in_slice << u1_mbaff); - } - return OK; + + return ret; } /*****************************************************************************/ @@ -1141,7 +1142,7 @@ WORD32 ih264d_parse_inter_slice_data_cavlc(dec_struct_t * ps_dec, UWORD32 u1_inter_mb_type; UWORD32 u1_deblk_mb_type; UWORD32 u1_mb_threshold; - WORD32 ret; + WORD32 ret = OK; /******************************************************/ /* Initialisations specific to B or P slice */ @@ -1162,11 +1163,8 @@ WORD32 ih264d_parse_inter_slice_data_cavlc(dec_struct_t * ps_dec, /******************************************************/ /* Slice Level Initialisations */ /******************************************************/ - i2_cur_mb_addr = u2_first_mb_in_slice; ps_dec->u1_qp = ps_slice->u1_slice_qp; - ret = ih264d_update_qp(ps_dec, 0); - if(ret != OK) - return ret; + ih264d_update_qp(ps_dec, 0); u1_mb_idx = ps_dec->u1_mb_idx; u1_num_mbs = u1_mb_idx; @@ -1181,14 +1179,17 @@ WORD32 ih264d_parse_inter_slice_data_cavlc(dec_struct_t * ps_dec, { UWORD8 u1_mb_type; + ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data; + if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr) { - + ret = ERROR_MB_ADDRESS_T; break; } ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs; + ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs; ps_cur_mb_info->u1_Mux = 0; ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff); @@ -1380,10 +1381,7 @@ WORD32 ih264d_parse_inter_slice_data_cavlc(dec_struct_t * ps_dec, //if(u1_dma_nby2mb) if(u1_decode_nmb) { - - ret = ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs); - if(ret != OK) - return ret; + ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs); u1_num_mbsNby2 = 0; { @@ -1409,11 +1407,9 @@ WORD32 ih264d_parse_inter_slice_data_cavlc(dec_struct_t * ps_dec, } else { - ret = ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, - u1_num_mbs_next, u1_tfr_n_mb, - u1_end_of_row); - if(ret != OK) - return ret; + ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, + u1_num_mbs_next, u1_tfr_n_mb, + u1_end_of_row); } if(u1_tfr_n_mb) @@ -1425,15 +1421,420 @@ WORD32 ih264d_parse_inter_slice_data_cavlc(dec_struct_t * ps_dec, //ps_dec->ps_pred++; } + ps_dec->u4_num_mbs_cur_nmb = 0; + ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr + - (u2_first_mb_in_slice << u1_mbaff); + + + return ret; +} + +WORD32 ih264d_mark_err_slice_skip(dec_struct_t * ps_dec, + WORD32 num_mb_skip, + UWORD8 u1_is_idr_slice, + pocstruct_t *ps_cur_poc, + WORD32 prev_slice_err) +{ + WORD32 i2_cur_mb_addr; + UWORD32 u1_num_mbs, u1_num_mbsNby2; + UWORD32 u1_mb_idx = ps_dec->u1_mb_idx; + UWORD32 i2_mb_skip_run; + + UWORD32 u1_num_mbs_next, u1_end_of_row; + const UWORD32 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs; + UWORD32 u1_slice_end; + UWORD32 u1_tfr_n_mb; + UWORD32 u1_decode_nmb; + dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; + dec_slice_params_t * ps_slice = ps_dec->ps_cur_slice; + UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; + UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; + deblk_mb_t *ps_cur_deblk_mb; + dec_mb_info_t *ps_cur_mb_info; + parse_pmbarams_t *ps_parse_mb_data; + UWORD32 u1_inter_mb_type; + UWORD32 u1_deblk_mb_type; + UWORD16 u2_total_mbs_coded; + UWORD32 u1_mbaff = ps_slice->u1_mbaff_frame_flag; + parse_part_params_t *ps_part_info; + + if(prev_slice_err == 1) + { + // first slice - missing/header corruption + if(u1_is_idr_slice) + ps_dec->ps_cur_slice->u2_frame_num = 0; + else + ps_dec->ps_cur_slice->u2_frame_num++; + + if(!ps_dec->u1_first_slice_in_stream) + { + ih264d_end_of_pic(ps_dec, u1_is_idr_slice, + ps_dec->ps_cur_slice->u2_frame_num); + ps_dec->s_cur_pic_poc.u2_frame_num = + ps_dec->ps_cur_slice->u2_frame_num; + } + + { + WORD32 i, j, poc = 0; + + ps_dec->ps_cur_slice->u2_first_mb_in_slice = 0; + + ps_dec->pf_mvpred = ih264d_mvpred_nonmbaff; + ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_bp; + ps_dec->p_motion_compensate = ih264d_motion_compensate_bp; + ps_dec->ps_pps->ps_sps = ps_dec->ps_cur_sps; + + if(ps_dec->ps_cur_pic != NULL) + poc = ps_dec->ps_cur_pic->i4_poc + 2; + + j = 0; + for(i = 0; i < MAX_NUM_PIC_PARAMS; i++) + if(ps_dec->ps_pps[i].u1_is_valid == TRUE) + j = i; + + ih264d_start_of_pic(ps_dec, poc, ps_cur_poc, + ps_dec->ps_cur_slice->u2_frame_num, + &ps_dec->ps_pps[j]); + + ps_dec->ps_ref_pic_buf_lx[0][0]->u1_pic_buf_id = 0; + + ps_dec->u4_output_present = 0; + + { + ih264d_get_next_display_field(ps_dec, + ps_dec->ps_out_buffer, + &(ps_dec->s_disp_op)); + /* If error code is non-zero then there is no buffer available for display, + hence avoid format conversion */ + + if(0 != ps_dec->s_disp_op.u4_error_code) + { + ps_dec->u4_fmt_conv_cur_row = ps_dec->s_disp_frame_info.u4_y_ht; + } + else + ps_dec->u4_output_present = 1; + } + + if(ps_dec->u1_separate_parse == 1) + { + if(ps_dec->u4_dec_thread_created == 0) + { + ithread_create(ps_dec->pv_dec_thread_handle, NULL, + (void *)ih264d_decode_picture_thread, + (void *)ps_dec); + + ps_dec->u4_dec_thread_created = 1; + } + + if((ps_dec->u4_num_cores == 3) && + ((ps_dec->u4_app_disable_deblk_frm == 0) || ps_dec->i1_recon_in_thread3_flag) + && (ps_dec->u4_bs_deblk_thread_created == 0)) + { + ps_dec->u4_start_recon_deblk = 0; + ithread_create(ps_dec->pv_bs_deblk_thread_handle, NULL, + (void *)ih264d_recon_deblk_thread, + (void *)ps_dec); + ps_dec->u4_bs_deblk_thread_created = 1; + } + } + } + } + else + { + // Middle / last slice + + dec_slice_struct_t *ps_parse_cur_slice; + ps_parse_cur_slice = ps_dec->ps_dec_slice_buf + ps_dec->u2_cur_slice_num; + + if(ps_dec->u1_slice_header_done + && ps_parse_cur_slice == ps_dec->ps_parse_cur_slice) + { + // Slice data corrupted + u1_num_mbs = ps_dec->u4_num_mbs_cur_nmb; + + if(u1_num_mbs) + { + ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs - 1; + } + else + { + if(ps_dec->u1_separate_parse) + { + ps_cur_mb_info = ps_dec->ps_nmb_info - 1; + } + else + { + ps_cur_mb_info = ps_dec->ps_nmb_info + + ps_dec->u4_num_mbs_prev_nmb - 1; + } + } + + ps_dec->u2_mby = ps_cur_mb_info->u2_mby; + ps_dec->u2_mbx = ps_cur_mb_info->u2_mbx; + + ps_dec->u1_mb_ngbr_availablity = + ps_cur_mb_info->u1_mb_ngbr_availablity; + + // Going back 1 mb + ps_dec->pv_parse_tu_coeff_data = ps_dec->pv_prev_mb_parse_tu_coeff_data; + ps_dec->u2_cur_mb_addr--; + ps_dec->i4_submb_ofst -= SUB_BLK_SIZE; + + if(u1_num_mbs) + { + // Parse/decode N-MB left unparsed + if (ps_dec->u1_pr_sl_type == P_SLICE + || ps_dec->u1_pr_sl_type == B_SLICE) + { + ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs); + ps_dec->ps_part = ps_dec->ps_parse_part_params; + } + + u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1; + u1_end_of_row = (!u1_num_mbs_next) + && (!(u1_mbaff && (u1_num_mbs & 0x01))); + u1_slice_end = 1; + u1_tfr_n_mb = 1; + ps_cur_mb_info->u1_end_of_slice = u1_slice_end; + + if(ps_dec->u1_separate_parse) + { + ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, + u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row); + ps_dec->ps_nmb_info += u1_num_mbs; + } + else + { + ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, + u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row); + } + + ps_dec->u1_mb_idx = 0; + ps_dec->u4_num_mbs_cur_nmb = 0; + } + + if(ps_dec->u2_total_mbs_coded + >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs) + { + ps_dec->u1_pic_decode_done = 1; + return 1; + } + + // Inserting new slice + ps_dec->u2_cur_slice_num++; + ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx; + ps_dec->i2_prev_slice_mby = ps_dec->u2_mby; + ps_dec->ps_parse_cur_slice++; + + } + else + { + // Slice missing / header corrupted + ps_dec->ps_parse_cur_slice = ps_dec->ps_dec_slice_buf + + ps_dec->u2_cur_slice_num; + } + } + + /******************************************************/ + /* Initializations to new slice */ + /******************************************************/ + { + WORD32 num_entries; + WORD32 size; + UWORD8 *pu1_buf; + + num_entries = MIN(MAX_FRAMES, ps_dec->u4_num_ref_frames_at_init); + num_entries = 2 * ((2 * num_entries) + 1); + + size = num_entries * sizeof(void *); + size += PAD_MAP_IDX_POC * sizeof(void *); + + pu1_buf = (UWORD8 *)ps_dec->pv_map_ref_idx_to_poc_buf; + pu1_buf += size * ps_dec->u2_cur_slice_num; + ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc = (volatile void **)pu1_buf; + } + + ps_dec->ps_cur_slice->u2_first_mb_in_slice = ps_dec->u2_total_mbs_coded << u1_mbaff; + if(ps_dec->ps_cur_slice->u1_field_pic_flag) + ps_dec->u2_prv_frame_num = ps_dec->ps_cur_slice->u2_frame_num; + + ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice = ps_dec->u2_total_mbs_coded << u1_mbaff; + ps_dec->ps_parse_cur_slice->u2_log2Y_crwd = ps_dec->ps_cur_slice->u2_log2Y_crwd; + + if(ps_dec->u1_separate_parse) { - ps_dec->ps_parse_cur_slice->end_of_slice = 1; - ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr - - (u2_first_mb_in_slice << u1_mbaff); + ps_dec->ps_parse_cur_slice->pv_tu_coeff_data_start = ps_dec->pv_parse_tu_coeff_data; + } + else + { + ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data; } + /******************************************************/ + /* Initializations specific to P slice */ + /******************************************************/ + u1_inter_mb_type = P_MB; + u1_deblk_mb_type = D_INTER_MB; + + ps_dec->ps_cur_slice->u1_slice_type = P_SLICE; + ps_dec->ps_parse_cur_slice->slice_type = P_SLICE; + ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb; + ps_dec->ps_part = ps_dec->ps_parse_part_params; + + /******************************************************/ + /* Parsing / decoding the slice */ + /******************************************************/ + ps_dec->u4_first_slice_in_pic = 0; + ps_dec->u1_first_slice_in_stream = 0; + ps_dec->u1_slice_header_done = 2; + ps_dec->u1_qp = ps_slice->u1_slice_qp; + ih264d_update_qp(ps_dec, 0); + u1_mb_idx = ps_dec->u1_mb_idx; + ps_parse_mb_data = ps_dec->ps_parse_mb_data; + u1_num_mbs = u1_mb_idx; + + u1_slice_end = 0; + u1_tfr_n_mb = 0; + u1_decode_nmb = 0; + u1_num_mbsNby2 = 0; + i2_cur_mb_addr = ps_dec->u2_total_mbs_coded; + i2_mb_skip_run = num_mb_skip; + + while(!u1_slice_end) + { + UWORD8 u1_mb_type; + + if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u2_max_mb_addr) + break; + + ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs; + ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs; + + ps_cur_mb_info->u1_Mux = 0; + ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff); + ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs; + + ps_cur_mb_info->u1_end_of_slice = 0; + + /* Storing Default partition info */ + ps_parse_mb_data->u1_num_part = 1; + ps_parse_mb_data->u1_isI_mb = 0; + + /**************************************************************/ + /* Get the required information for decoding of MB */ + /**************************************************************/ + /* mb_x, mb_y, neighbor availablity, */ + if (u1_mbaff) + ih264d_get_mb_info_cavlc_mbaff(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run); + else + ih264d_get_mb_info_cavlc_nonmbaff(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run); + + /* Set the deblocking parameters for this MB */ + if(ps_dec->u4_app_disable_deblk_frm == 0) + { + ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice, + ps_dec->u1_mb_ngbr_availablity, + ps_dec->u1_cur_mb_fld_dec_flag); + } + + /* Set appropriate flags in ps_cur_mb_info and ps_dec */ + ps_dec->i1_prev_mb_qp_delta = 0; + ps_dec->u1_sub_mb_num = 0; + ps_cur_mb_info->u1_mb_type = MB_SKIP; + ps_cur_mb_info->u1_mb_mc_mode = PRED_16x16; + ps_cur_mb_info->u1_cbp = 0; + + /* Storing Skip partition info */ + ps_part_info = ps_dec->ps_part; + ps_part_info->u1_is_direct = PART_DIRECT_16x16; + ps_part_info->u1_sub_mb_num = 0; + ps_dec->ps_part++; + + /* Update Nnzs */ + ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC); + + ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type; + ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type; + + i2_mb_skip_run--; + + ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp; + + if (u1_mbaff) + { + ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info); + } + + /**************************************************************/ + /* Get next Macroblock address */ + /**************************************************************/ + i2_cur_mb_addr++; + + u1_num_mbs++; + ps_dec->u2_total_mbs_coded++; + u1_num_mbsNby2++; + ps_parse_mb_data++; + + /****************************************************************/ + /* Check for End Of Row and other flags that determine when to */ + /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for */ + /* N-Mb */ + /****************************************************************/ + u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1; + u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01))); + u1_slice_end = !i2_mb_skip_run; + u1_tfr_n_mb = (u1_num_mbs == ps_dec->u1_recon_mb_grp) || u1_end_of_row + || u1_slice_end; + u1_decode_nmb = u1_tfr_n_mb || u1_slice_end; + ps_cur_mb_info->u1_end_of_slice = u1_slice_end; + + if(u1_decode_nmb) + { + ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs); + u1_num_mbsNby2 = 0; + + ps_parse_mb_data = ps_dec->ps_parse_mb_data; + ps_dec->ps_part = ps_dec->ps_parse_part_params; + + if(ps_dec->u1_separate_parse) + { + ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, + u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row); + ps_dec->ps_nmb_info += u1_num_mbs; + } + else + { + ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, + u1_tfr_n_mb, u1_end_of_row); + } + + if(u1_tfr_n_mb) + u1_num_mbs = 0; + u1_mb_idx = u1_num_mbs; + ps_dec->u1_mb_idx = u1_num_mbs; + } + } + + ps_dec->u4_num_mbs_cur_nmb = 0; + ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr + - ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice; + + H264_DEC_DEBUG_PRINT("Mbs in slice: %d\n", ps_dec->ps_cur_slice->u4_mbs_in_slice); + + ps_dec->u2_cur_slice_num++; + ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx; + ps_dec->i2_prev_slice_mby = ps_dec->u2_mby; + + if(ps_dec->u2_total_mbs_coded + >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs) + { + ps_dec->u1_pic_decode_done = 1; + return 1; + } + + return 0; - return OK; } /*! @@ -1720,15 +2121,12 @@ WORD32 ih264d_parse_pslice(dec_struct_t *ps_dec, UWORD16 u2_first_mb_in_slice) ps_cur_slice->i1_slice_beta_offset = 0; } - DATA_SYNC(); - ps_dec->ps_parse_cur_slice->slice_header_done = 2; + ps_dec->u1_slice_header_done = 2; if(ps_pps->u1_entropy_coding_mode) { SWITCHOFFTRACE; SWITCHONTRACECABAC; ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cabac; - if(ps_dec->ps_parse_cur_slice->u2_error_flag == 1) - return 0; ps_dec->pf_parse_inter_mb = ih264d_parse_pmb_cabac; ih264d_init_cabac_contexts(P_SLICE, ps_dec); |