| /* | 
| * | 
| * Copyright 2015 Rockchip Electronics Co. LTD | 
| * | 
| * Licensed under the Apache License, Version 2.0 (the "License"); | 
| * you may not use this file except in compliance with the License. | 
| * You may obtain a copy of the License at | 
| * | 
| *      http://www.apache.org/licenses/LICENSE-2.0 | 
| * | 
| * Unless required by applicable law or agreed to in writing, software | 
| * distributed under the License is distributed on an "AS IS" BASIS, | 
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
| * See the License for the specific language governing permissions and | 
| * limitations under the License. | 
| */ | 
|   | 
| #define MODULE_TAG "h264d_slice" | 
|   | 
| #include "mpp_mem.h" | 
|   | 
| #include "h264d_global.h" | 
| #include "h264d_slice.h" | 
| #include "h264d_sps.h" | 
| #include "h264d_pps.h" | 
|   | 
| #define PIXW_1080P      (1920) | 
| #define PIXH_1080P      (1088) | 
| #define PIXW_4Kx2K      (4096) | 
| #define PIXH_4Kx2K      (2304) | 
| #define PIXW_8Kx4K      (8192) | 
| #define PIXH_8Kx4K      (4320) | 
|   | 
| #define MAX_MBW_1080P   (((PIXW_1080P) / 16) - 1)   /* 119 */ | 
| #define MAX_MBH_1080P   (((PIXH_1080P) / 16) - 1)   /* 67  */ | 
| #define MAX_MBW_4Kx2K   (((PIXW_4Kx2K) / 16) - 1)   /* 255 */ | 
| #define MAX_MBH_4Kx2K   (((PIXH_4Kx2K) / 16) - 1)   /* 143 */ | 
| #define MAX_MBW_8Kx4K   (((PIXW_8Kx4K) / 16) - 1)   /* 511 */ | 
| #define MAX_MBH_8Kx4K   (((PIXH_8Kx4K) / 16) - 1)   /* 269 */ | 
|   | 
| static MPP_RET ref_pic_list_mvc_modification(H264_SLICE_t *currSlice) | 
| { | 
|     RK_U32 i = 0; | 
|     MPP_RET ret = MPP_ERR_UNKNOW; | 
|     RK_S32 modification_of_pic_nums_idc = 0; | 
|     BitReadCtx_t *p_bitctx = &currSlice->p_Cur->bitctx; | 
|   | 
|     if ((currSlice->slice_type % 5) != H264_I_SLICE && (currSlice->slice_type % 5) != H264_SI_SLICE) { | 
|         READ_ONEBIT(p_bitctx, &currSlice->ref_pic_list_reordering_flag[LIST_0]); | 
|         if (currSlice->ref_pic_list_reordering_flag[LIST_0]) { | 
|             RK_U32 size = currSlice->num_ref_idx_active[LIST_0] + 1; | 
|             i = 0; | 
|             do { | 
|                 if (i >= size || i >= MAX_REORDER_TIMES) { | 
|                     ret = MPP_NOK; | 
|                     H264D_WARNNING("ref_pic_list_reordering error, i >= num_ref_idx_active[LIST_0](%d)", size); | 
|                     goto __BITREAD_ERR; | 
|                 } | 
|                 READ_UE(p_bitctx, &modification_of_pic_nums_idc); | 
|                 currSlice->modification_of_pic_nums_idc[LIST_0][i] = modification_of_pic_nums_idc; | 
|                 if (modification_of_pic_nums_idc == 0 || modification_of_pic_nums_idc == 1) { | 
|                     READ_UE(p_bitctx, &currSlice->abs_diff_pic_num_minus1[LIST_0][i]); | 
|                 } else { | 
|                     if (modification_of_pic_nums_idc == 2) { | 
|                         READ_UE(p_bitctx, &currSlice->long_term_pic_idx[LIST_0][i]); | 
|                     } else if (modification_of_pic_nums_idc == 4 || modification_of_pic_nums_idc == 5) { | 
|                         READ_UE(p_bitctx, &currSlice->abs_diff_view_idx_minus1[LIST_0][i]); | 
|                     } | 
|                 } | 
|                 i++; | 
|             } while (modification_of_pic_nums_idc != 3); | 
|         } | 
|     } | 
|     if (currSlice->slice_type % 5 == H264_B_SLICE) { | 
|         READ_ONEBIT(p_bitctx, &currSlice->ref_pic_list_reordering_flag[LIST_1]); | 
|         if (currSlice->ref_pic_list_reordering_flag[LIST_1]) { | 
|             RK_U32 size = currSlice->num_ref_idx_active[LIST_1] + 1; | 
|             i = 0; | 
|             do { | 
|                 if (i >= size || i >= MAX_REORDER_TIMES) { | 
|                     ret = MPP_NOK; | 
|                     H264D_WARNNING("ref_pic_list_reordering error, i >= num_ref_idx_active[LIST_1](%d)", size); | 
|                     goto __BITREAD_ERR; | 
|                 } | 
|                 READ_UE(p_bitctx, &modification_of_pic_nums_idc); | 
|                 currSlice->modification_of_pic_nums_idc[LIST_1][i] = modification_of_pic_nums_idc; | 
|                 if (modification_of_pic_nums_idc == 0 || modification_of_pic_nums_idc == 1) { | 
|                     READ_UE(p_bitctx, &currSlice->abs_diff_pic_num_minus1[LIST_1][i]); | 
|                 } else { | 
|                     if (modification_of_pic_nums_idc == 2) { | 
|                         READ_UE(p_bitctx, &currSlice->long_term_pic_idx[LIST_1][i]); | 
|                     } else if (modification_of_pic_nums_idc == 4 || modification_of_pic_nums_idc == 5) { | 
|                         READ_UE(p_bitctx, &currSlice->abs_diff_view_idx_minus1[LIST_1][i]); | 
|                     } | 
|                 } | 
|                 i++; | 
|             } while (modification_of_pic_nums_idc != 3); | 
|         } | 
|     } | 
|     ASSERT(currSlice->redundant_pic_cnt == 0);  //!< not support reference index of redundant slices | 
|   | 
|     return ret = MPP_OK; | 
| __BITREAD_ERR: | 
|     ret = p_bitctx->ret; | 
|   | 
|     return ret; | 
| } | 
|   | 
| static MPP_RET pred_weight_table(H264_SLICE_t *currSlice) | 
| { | 
|     RK_S32 se_tmp = 0; | 
|     MPP_RET ret = MPP_ERR_UNKNOW; | 
|     RK_S32 i = 0, j = 0, temp = 0; | 
|     BitReadCtx_t *p_bitctx = &currSlice->p_Cur->bitctx; | 
|   | 
|     READ_UE(p_bitctx, &temp); //!< log2_weight_denom | 
|     if (currSlice->active_sps->chroma_format_idc) { | 
|         READ_UE(p_bitctx, &temp); //!< log2_weight_denom | 
|     } | 
|     for (i = 0; i < currSlice->num_ref_idx_active[LIST_0]; i++) { | 
|         READ_ONEBIT(p_bitctx, &temp); //!< luma_weight_flag_l0 | 
|         if (temp) { | 
|             READ_SE(p_bitctx, &se_tmp); //!< slice->wp_weight[LIST_0][i][0] | 
|             READ_SE(p_bitctx, &se_tmp); //!< slice->wp_offset[LIST_0][i][0] | 
|         } | 
|         if (currSlice->active_sps->chroma_format_idc) { | 
|             READ_ONEBIT(p_bitctx, &temp); //!< chroma_weight_flag_l0 | 
|             for (j = 1; j < 3; j++) { | 
|                 if (temp) { //!< chroma_weight_flag_l0 | 
|                     READ_SE(p_bitctx, &se_tmp); //!< slice->wp_weight[LIST_0][i][j] | 
|                     READ_SE(p_bitctx, &se_tmp); //!< slice->wp_offset[LIST_0][i][j] | 
|                 } | 
|             } | 
|         } | 
|     } | 
|   | 
|     if ((currSlice->slice_type == H264_B_SLICE) && currSlice->p_Vid->active_pps->weighted_bipred_idc == 1) { | 
|         for (i = 0; i < currSlice->num_ref_idx_active[LIST_1]; i++) { | 
|             READ_ONEBIT(p_bitctx, &temp); //!< luma_weight_flag_l1 | 
|             if (temp) { | 
|                 READ_SE(p_bitctx, &se_tmp); //!< slice->wp_weight[LIST_1][i][0] | 
|                 READ_SE(p_bitctx, &se_tmp); //!< slice->wp_offset[LIST_1][i][0] | 
|             } | 
|             if (currSlice->active_sps->chroma_format_idc) { | 
|                 READ_ONEBIT(p_bitctx, &temp); //!< chroma_weight_flag_l1 | 
|                 for (j = 1; j < 3; j++) { | 
|                     if (temp) { // chroma_weight_flag_l1 | 
|                         READ_SE(p_bitctx, &se_tmp); //!< slice->wp_weight[LIST_1][i][j] | 
|                         READ_SE(p_bitctx, &se_tmp); //!< slice->wp_offset[LIST_1][i][j] | 
|                     } | 
|                 } | 
|             } | 
|         } | 
|     } | 
|   | 
|     return ret = MPP_OK; | 
| __BITREAD_ERR: | 
|     return ret = p_bitctx->ret; | 
| } | 
|   | 
| static MPP_RET dec_ref_pic_marking(H264_SLICE_t *pSlice) | 
| { | 
|     RK_U32 val = 0; | 
|     MPP_RET ret = MPP_ERR_UNKNOW; | 
|     RK_U32 drpm_used_bits = 0; | 
|     H264_DRPM_t *tmp_drpm = NULL, *tmp_drpm2 = NULL; | 
|     H264dVideoCtx_t *p_Vid = pSlice->p_Vid; | 
|     BitReadCtx_t *p_bitctx = &pSlice->p_Cur->bitctx; | 
|   | 
|     drpm_used_bits = p_bitctx->used_bits; | 
|     pSlice->drpm_used_bitlen = 0; | 
|   | 
|     if (pSlice->idr_flag || | 
|         (pSlice->svc_extension_flag == 0 && pSlice->mvcExt.non_idr_flag == 0)) { | 
|         READ_ONEBIT(p_bitctx, &pSlice->no_output_of_prior_pics_flag); | 
|         p_Vid->no_output_of_prior_pics_flag = pSlice->no_output_of_prior_pics_flag; | 
|         READ_ONEBIT(p_bitctx, &pSlice->long_term_reference_flag); | 
|     } else { | 
|         READ_ONEBIT(p_bitctx, &pSlice->adaptive_ref_pic_buffering_flag); | 
|   | 
|         if (pSlice->adaptive_ref_pic_buffering_flag) { | 
|             RK_U32 i = 0; | 
|   | 
|             for (i = 0; i < MAX_MARKING_TIMES; i++) { | 
|                 if (!pSlice->p_Cur->dec_ref_pic_marking_buffer[i]) | 
|                     pSlice->p_Cur->dec_ref_pic_marking_buffer[i] = mpp_calloc(H264_DRPM_t, 1); | 
|                 tmp_drpm = pSlice->p_Cur->dec_ref_pic_marking_buffer[i]; | 
|                 tmp_drpm->Next = NULL; | 
|                 READ_UE(p_bitctx, &val); //!< mmco | 
|                 tmp_drpm->memory_management_control_operation = val; | 
|                 if (val == 0) | 
|                     break; | 
|   | 
|                 if ((val == 1) || (val == 3)) { | 
|                     READ_UE(p_bitctx, &tmp_drpm->difference_of_pic_nums_minus1); | 
|                 } | 
|                 if (val == 2) { | 
|                     READ_UE(p_bitctx, &tmp_drpm->long_term_pic_num); | 
|                 } | 
|                 if ((val == 3) || (val == 6)) { | 
|                     READ_UE(p_bitctx, &tmp_drpm->long_term_frame_idx); | 
|                 } | 
|                 if (val == 4) { | 
|                     READ_UE(p_bitctx, &tmp_drpm->max_long_term_frame_idx_plus1); | 
|                 } | 
|                 // add command | 
|                 if (pSlice->dec_ref_pic_marking_buffer == NULL) { | 
|                     pSlice->dec_ref_pic_marking_buffer = tmp_drpm; | 
|                 } else { | 
|                     tmp_drpm2 = pSlice->dec_ref_pic_marking_buffer; | 
|                     while (tmp_drpm2->Next != NULL) { | 
|                         tmp_drpm2 = tmp_drpm2->Next; | 
|                     } | 
|                     tmp_drpm2->Next = tmp_drpm; | 
|                 } | 
|             } | 
|             if (i >= MAX_MARKING_TIMES) { | 
|                 H264D_ERR("Too many memory management control operations."); | 
|                 goto __BITREAD_ERR; | 
|             } | 
|         } | 
|     } | 
|     pSlice->drpm_used_bitlen = p_bitctx->used_bits - drpm_used_bits; | 
|     return ret = MPP_OK; | 
| __BITREAD_ERR: | 
|     ret = p_bitctx->ret; | 
|   | 
|     return ret; | 
| } | 
|   | 
| static void init_slice_parmeters(H264_SLICE_t *currSlice) | 
| { | 
|     H264dVideoCtx_t *p_Vid   = currSlice->p_Vid; | 
|     H264_Nalu_t    *cur_nalu = &currSlice->p_Cur->nalu; | 
|   | 
|     //--- init slice syntax | 
|     currSlice->idr_flag = ((cur_nalu->nalu_type == H264_NALU_TYPE_IDR) | 
|                            || (currSlice->mvcExt.valid && !currSlice->mvcExt.non_idr_flag)); | 
|     currSlice->nal_reference_idc = cur_nalu->nal_reference_idc; | 
|     //!< set ref flag and dpb error flag | 
|     { | 
|         p_Vid->p_Dec->errctx.used_ref_flag = currSlice->nal_reference_idc ? 1 : 0; | 
|         if (currSlice->slice_type == H264_I_SLICE) { | 
|             p_Vid->p_Dec->errctx.dpb_err_flag = 0; | 
|         } | 
|     } | 
|     if ((!currSlice->svc_extension_flag) || currSlice->mvcExt.iPrefixNALU) { // MVC or have prefixNALU | 
|         currSlice->view_id = currSlice->mvcExt.view_id; | 
|         currSlice->inter_view_flag = currSlice->mvcExt.inter_view_flag; | 
|         currSlice->anchor_pic_flag = currSlice->mvcExt.anchor_pic_flag; | 
|     } else if (currSlice->svc_extension_flag == -1) { // normal AVC | 
|         currSlice->view_id = currSlice->mvcExt.valid ? p_Vid->active_subsps->view_id[0] : 0; | 
|         currSlice->inter_view_flag = 1; | 
|         currSlice->anchor_pic_flag = currSlice->idr_flag; | 
|     } | 
|     currSlice->layer_id = currSlice->view_id; | 
|     if (currSlice->layer_id >= 0) { // if not found, layer_id == -1 | 
|         currSlice->p_Dpb = p_Vid->p_Dpb_layer[currSlice->layer_id]; | 
|     } | 
| } | 
|   | 
| static MPP_RET check_sps_pps(H264_SPS_t *sps, H264_subSPS_t *subset_sps, | 
|                              H264_PPS_t *pps, const MppDecHwCap *hw_info) | 
| { | 
|     RK_U32 ret = 0; | 
|     RK_S32 max_mb_width  = MAX_MBW_1080P; | 
|   | 
|     ret |= (sps->seq_parameter_set_id > 31); | 
|     ret |= (sps->separate_colour_plane_flag == 1); | 
|     ret |= (sps->chroma_format_idc == 3); | 
|     ret |= (sps->bit_depth_luma_minus8 > 2); | 
|     ret |= (sps->bit_depth_chroma_minus8 > 2); | 
|     ret |= (sps->log2_max_frame_num_minus4 > 12); | 
|     ret |= (sps->pic_order_cnt_type > 2); | 
|     ret |= (sps->log2_max_pic_order_cnt_lsb_minus4 > 12); | 
|     ret |= (sps->num_ref_frames_in_pic_order_cnt_cycle > 255); | 
|     ret |= (sps->max_num_ref_frames > 16); | 
|   | 
|     if (hw_info && hw_info->cap_8k) | 
|         max_mb_width  = MAX_MBW_8Kx4K; | 
|     else if (hw_info && hw_info->cap_4k) | 
|         max_mb_width  = MAX_MBW_4Kx2K; | 
|   | 
|     ret |= (sps->pic_width_in_mbs_minus1 < 3 || sps->pic_width_in_mbs_minus1 > max_mb_width); | 
|   | 
|     if (ret) { | 
|         H264D_ERR("sps has error, sps_id=%d", sps->seq_parameter_set_id); | 
|         goto __FAILED; | 
|     } | 
|     if (subset_sps) { //!< MVC | 
|         ret |= (subset_sps->num_views_minus1 != 1); | 
|         if (subset_sps->num_anchor_refs_l0[0] > 0) | 
|             ret |= (subset_sps->anchor_ref_l0[0][0] != subset_sps->view_id[0]); | 
|         if (subset_sps->num_anchor_refs_l1[0] > 0) | 
|             ret |= (subset_sps->anchor_ref_l1[0][0] != subset_sps->view_id[1]); | 
|         if (subset_sps->num_non_anchor_refs_l0[0] > 0) | 
|             ret |= (subset_sps->non_anchor_ref_l0[0][0] != subset_sps->view_id[0]); | 
|         if (subset_sps->num_non_anchor_refs_l1[0] > 0) | 
|             ret |= (subset_sps->non_anchor_ref_l1[0][0] != subset_sps->view_id[1]); | 
|         if (ret) { | 
|             H264D_ERR("subsps has error, sps_id=%d", sps->seq_parameter_set_id); | 
|             goto __FAILED; | 
|         } | 
|     } | 
|     //!< check PPS | 
|     ret |= (pps->pic_parameter_set_id > 255); | 
|     ret |= (pps->seq_parameter_set_id > 31); | 
|     ret |= (pps->num_slice_groups_minus1 > 0); | 
|     ret |= (pps->num_ref_idx_l0_default_active_minus1 > 31); | 
|     ret |= (pps->num_ref_idx_l1_default_active_minus1 > 31); | 
|     ret |= (pps->pic_init_qp_minus26 > 25 || pps->pic_init_qp_minus26 < -(26 + 6 * (RK_S32)sps->bit_depth_luma_minus8)); | 
|     ret |= (pps->pic_init_qs_minus26 > 25 || pps->pic_init_qs_minus26 < -26); | 
|     ret |= (pps->chroma_qp_index_offset > 12 || pps->chroma_qp_index_offset < -12); | 
|     ret |= (pps->redundant_pic_cnt_present_flag == 1); | 
|     if (ret) { | 
|         H264D_ERR("pps has error, sps_id=%d, pps_id", sps->seq_parameter_set_id, pps->pic_parameter_set_id); | 
|         goto __FAILED; | 
|     } | 
|     return MPP_OK; | 
| __FAILED: | 
|     return MPP_NOK; | 
| } | 
|   | 
|   | 
| static MPP_RET set_slice_user_parmeters(H264_SLICE_t *currSlice) | 
| { | 
|     MPP_RET ret = MPP_ERR_UNKNOW; | 
|     H264_PPS_t *cur_pps = NULL; | 
|     H264_SPS_t *cur_sps = NULL; | 
|     H264_subSPS_t *cur_subsps = NULL; | 
|     H264dVideoCtx_t *p_Vid = currSlice->p_Vid; | 
|   | 
|     //!< use parameter set | 
|     if (currSlice->pic_parameter_set_id >= 0 && | 
|         currSlice->pic_parameter_set_id < MAXPPS) { | 
|         cur_pps = p_Vid->ppsSet[currSlice->pic_parameter_set_id]; | 
|         cur_pps = (cur_pps && cur_pps->Valid) ? cur_pps : NULL; | 
|     } | 
|     VAL_CHECK(ret, cur_pps != NULL); | 
|   | 
|     if (currSlice->mvcExt.valid) { | 
|         cur_subsps = p_Vid->subspsSet[cur_pps->seq_parameter_set_id]; | 
|         if (cur_subsps && cur_subsps->Valid) { | 
|             cur_sps = &cur_subsps->sps; | 
|             if ((RK_S32)currSlice->mvcExt.view_id == cur_subsps->view_id[0]) { // combine subsps to sps | 
|                 p_Vid->active_mvc_sps_flag = 0; | 
|                 cur_subsps = NULL; | 
|                 cur_sps = p_Vid->spsSet[cur_pps->seq_parameter_set_id]; | 
|             } else if ((RK_S32)currSlice->mvcExt.view_id == cur_subsps->view_id[1]) { | 
|                 p_Vid->active_mvc_sps_flag = 1; | 
|             } | 
|         } else { | 
|             p_Vid->active_mvc_sps_flag = 0; | 
|             cur_sps = p_Vid->spsSet[cur_pps->seq_parameter_set_id]; | 
|             cur_subsps = NULL; | 
|         } | 
|     } else { | 
|         p_Vid->active_mvc_sps_flag = 0; | 
|         cur_sps = p_Vid->spsSet[cur_pps->seq_parameter_set_id]; | 
|         cur_subsps = NULL; | 
|     } | 
|   | 
|     if (p_Vid->active_mvc_sps_flag) { // layer_id == 1 | 
|         cur_subsps = (cur_subsps && cur_subsps->Valid) ? cur_subsps : NULL; | 
|         VAL_CHECK(ret, cur_subsps != NULL); | 
|         cur_sps = &cur_subsps->sps; | 
|     } else { //!< layer_id == 0 | 
|         cur_subsps = NULL; | 
|         cur_sps = (cur_sps && cur_sps->Valid) ? cur_sps : NULL; | 
|     } | 
|     VAL_CHECK(ret, cur_sps); | 
|     VAL_CHECK(ret, check_sps_pps(cur_sps, cur_subsps, cur_pps, p_Vid->p_Dec->hw_info) != MPP_NOK); | 
|   | 
|     FUN_CHECK(ret = activate_sps(p_Vid, cur_sps, cur_subsps)); | 
|     FUN_CHECK(ret = activate_pps(p_Vid, cur_pps)); | 
|   | 
|     if (p_Vid->last_sps_id != cur_sps->seq_parameter_set_id || | 
|         p_Vid->last_pps_id != cur_pps->pic_parameter_set_id) { | 
|         p_Vid->last_sps_id = cur_sps->seq_parameter_set_id; | 
|         p_Vid->last_pps_id = cur_pps->pic_parameter_set_id; | 
|         p_Vid->spspps_update = 1; | 
|     } | 
|   | 
|     /* NOTE: the SVC is not supported by hardware, so it is dropped. | 
|      * Or svc_extension_flag doesn't equal to -1, it should apply the | 
|      * subset_seq_parameter_set_rbsp(). | 
|      */ | 
|     if (p_Vid->p_Dec->mvc_valid) { | 
|         struct h264_subsps_t *active_subsps = NULL; | 
|   | 
|         active_subsps = p_Vid->subspsSet[cur_pps->seq_parameter_set_id]; | 
|         if (active_subsps && active_subsps->Valid) | 
|             p_Vid->active_subsps = active_subsps; | 
|         else | 
|             p_Vid->active_subsps = NULL; | 
|     } | 
|   | 
|     currSlice->active_sps = p_Vid->active_sps; | 
|     currSlice->active_pps = p_Vid->active_pps; | 
|   | 
|     p_Vid->type = currSlice->slice_type; | 
|     return MPP_OK; | 
| __FAILED: | 
|     return ret; | 
| } | 
|   | 
|   | 
| /*! | 
| *********************************************************************** | 
| * \brief | 
| *    reset current slice buffer | 
| *********************************************************************** | 
| */ | 
| //extern "C" | 
| MPP_RET reset_cur_slice(H264dCurCtx_t *p_Cur, H264_SLICE_t *p) | 
| { | 
|     if (p) { | 
|         p->modification_of_pic_nums_idc[LIST_0] = p_Cur->modification_of_pic_nums_idc[LIST_0]; | 
|         p->abs_diff_pic_num_minus1[LIST_0]      = p_Cur->abs_diff_pic_num_minus1[LIST_0]; | 
|         p->long_term_pic_idx[LIST_0]            = p_Cur->long_term_pic_idx[LIST_0]; | 
|         p->abs_diff_view_idx_minus1[LIST_0]     = p_Cur->abs_diff_view_idx_minus1[LIST_0]; | 
|   | 
|         p->modification_of_pic_nums_idc[LIST_1] = p_Cur->modification_of_pic_nums_idc[LIST_1]; | 
|         p->abs_diff_pic_num_minus1[LIST_1]      = p_Cur->abs_diff_pic_num_minus1[LIST_1]; | 
|         p->long_term_pic_idx[LIST_1]            = p_Cur->long_term_pic_idx[LIST_1]; | 
|         p->abs_diff_view_idx_minus1[LIST_1]     = p_Cur->abs_diff_view_idx_minus1[LIST_1]; | 
|   | 
|         p->dec_ref_pic_marking_buffer = NULL; | 
|     } | 
|   | 
|     return MPP_OK; | 
| } | 
|   | 
| /*! | 
| *********************************************************************** | 
| * \brief | 
| *    parse SEI information | 
| *********************************************************************** | 
| */ | 
| //extern "C" | 
| MPP_RET process_slice(H264_SLICE_t *currSlice) | 
| { | 
|     RK_U32 temp = 0; | 
|     RK_U32 poc_used_bits = 0; | 
|     MPP_RET ret = MPP_ERR_UNKNOW; | 
|     H264dVideoCtx_t *p_Vid = currSlice->p_Vid; | 
|     H264dCurCtx_t *p_Cur = currSlice->p_Cur; | 
|     BitReadCtx_t *p_bitctx = &p_Cur->bitctx; | 
|   | 
|     //!< initial value | 
|     currSlice->p_Dpb_layer[0] = p_Vid->p_Dpb_layer[0]; | 
|     currSlice->p_Dpb_layer[1] = p_Vid->p_Dpb_layer[1]; | 
|   | 
|     //!< read slice head syntax | 
|     READ_UE(p_bitctx, &currSlice->start_mb_nr); //!< first_mb_in_slice | 
|     READ_UE(p_bitctx, &temp); //!< slice_type | 
|     p_Vid->slice_type = currSlice->slice_type = temp % 5; | 
|     if (p_Vid->slice_type == H264_SP_SLICE || p_Vid->slice_type == H264_SI_SLICE) { | 
|         H264D_WARNNING("sp or si slice not support\n"); | 
|         goto __FAILED; | 
|     } | 
|     READ_UE(p_bitctx, &currSlice->pic_parameter_set_id); | 
|     init_slice_parmeters(currSlice); | 
|     FUN_CHECK(ret = set_slice_user_parmeters(currSlice)); | 
|     //!< read rest slice header syntax | 
|     { | 
|         READ_BITS(p_bitctx, currSlice->active_sps->log2_max_frame_num_minus4 + 4, &currSlice->frame_num); | 
|         if (currSlice->active_sps->frame_mbs_only_flag) { //!< user in_slice info | 
|             p_Vid->structure = FRAME; | 
|             currSlice->field_pic_flag = 0; | 
|             currSlice->bottom_field_flag = 0; | 
|         } else { | 
|             READ_ONEBIT(p_bitctx, &currSlice->field_pic_flag); | 
|             if (currSlice->field_pic_flag) { | 
|                 READ_ONEBIT(p_bitctx, &currSlice->bottom_field_flag); | 
|                 p_Vid->structure = currSlice->bottom_field_flag ? BOTTOM_FIELD : TOP_FIELD; | 
|             } else { | 
|                 p_Vid->structure = FRAME; | 
|                 currSlice->bottom_field_flag = 0; | 
|             } | 
|         } | 
|         currSlice->structure = p_Vid->structure; | 
|         currSlice->mb_aff_frame_flag = currSlice->active_sps->mb_adaptive_frame_field_flag; | 
|         if (currSlice->idr_flag) { | 
|             READ_UE(p_bitctx, &currSlice->idr_pic_id); | 
|         } else if (currSlice->svc_extension_flag == 0 && currSlice->mvcExt.non_idr_flag == 0) { | 
|             READ_UE(p_bitctx, &currSlice->idr_pic_id); | 
|         } | 
|         poc_used_bits = p_bitctx->used_bits; //!< init poc used bits | 
|         if (currSlice->active_sps->pic_order_cnt_type == 0) { | 
|             READ_BITS(p_bitctx, currSlice->active_sps->log2_max_pic_order_cnt_lsb_minus4 + 4, &currSlice->pic_order_cnt_lsb); | 
|             if (currSlice->p_Vid->active_pps->bottom_field_pic_order_in_frame_present_flag == 1 | 
|                 && !currSlice->field_pic_flag) { | 
|                 READ_SE(p_bitctx, &currSlice->delta_pic_order_cnt_bottom); | 
|             } else { | 
|                 currSlice->delta_pic_order_cnt_bottom = 0; | 
|             } | 
|         } | 
|         if (currSlice->active_sps->pic_order_cnt_type == 1) { | 
|             if (!currSlice->active_sps->delta_pic_order_always_zero_flag) { | 
|                 READ_SE(p_bitctx, &currSlice->delta_pic_order_cnt[0]); | 
|   | 
|                 if (currSlice->p_Vid->active_pps->bottom_field_pic_order_in_frame_present_flag == 1 && !currSlice->field_pic_flag) { | 
|                     READ_SE(p_bitctx, &currSlice->delta_pic_order_cnt[1]); | 
|                 } else { | 
|                     currSlice->delta_pic_order_cnt[1] = 0;  //!< set to zero if not in stream | 
|                 } | 
|             } else { | 
|                 currSlice->delta_pic_order_cnt[0] = 0; | 
|                 currSlice->delta_pic_order_cnt[1] = 0; | 
|             } | 
|         } | 
|         currSlice->poc_used_bitlen = p_bitctx->used_bits - poc_used_bits; //!< calculate poc used bit length | 
|         //!< redundant_pic_cnt is missing here | 
|         ASSERT(currSlice->p_Vid->active_pps->redundant_pic_cnt_present_flag == 0); // add by dw, high 4:2:2 profile not support | 
|         if (currSlice->p_Vid->active_pps->redundant_pic_cnt_present_flag) { | 
|             READ_UE(p_bitctx, &currSlice->redundant_pic_cnt); | 
|         } | 
|   | 
|         if (currSlice->slice_type == H264_B_SLICE) { | 
|             READ_ONEBIT(p_bitctx, &currSlice->direct_spatial_mv_pred_flag); | 
|         } else { | 
|             currSlice->direct_spatial_mv_pred_flag = 0; | 
|         } | 
|         currSlice->num_ref_idx_active[LIST_0] = currSlice->p_Vid->active_pps->num_ref_idx_l0_default_active_minus1 + 1; | 
|         currSlice->num_ref_idx_active[LIST_1] = currSlice->p_Vid->active_pps->num_ref_idx_l1_default_active_minus1 + 1; | 
|   | 
|         if (currSlice->slice_type == H264_P_SLICE | 
|             || currSlice->slice_type == H264_SP_SLICE || currSlice->slice_type == H264_B_SLICE) { | 
|             READ_ONEBIT(p_bitctx, &currSlice->num_ref_idx_override_flag); | 
|             if (currSlice->num_ref_idx_override_flag) { | 
|                 READ_UE(p_bitctx, &currSlice->num_ref_idx_active[LIST_0]); | 
|                 currSlice->num_ref_idx_active[LIST_0] += 1; | 
|                 if (currSlice->slice_type == H264_B_SLICE) { | 
|                     READ_UE(p_bitctx, &currSlice->num_ref_idx_active[LIST_1]); | 
|                     currSlice->num_ref_idx_active[LIST_1] += 1; | 
|                 } | 
|             } | 
|         } | 
|         if (currSlice->slice_type != H264_B_SLICE) { | 
|             currSlice->num_ref_idx_active[LIST_1] = 0; | 
|         } | 
|         FUN_CHECK(ret = ref_pic_list_mvc_modification(currSlice)); | 
|         if ((currSlice->p_Vid->active_pps->weighted_pred_flag | 
|              && (currSlice->slice_type == H264_P_SLICE || currSlice->slice_type == H264_SP_SLICE)) | 
|             || (currSlice->p_Vid->active_pps->weighted_bipred_idc == 1 && (currSlice->slice_type == H264_B_SLICE))) { | 
|             FUN_CHECK(ret = pred_weight_table(currSlice)); | 
|         } | 
|         currSlice->drpm_used_bitlen = 0; | 
|         if (currSlice->nal_reference_idc) { | 
|             FUN_CHECK(ret = dec_ref_pic_marking(currSlice)); | 
|         } | 
|         H264D_DBG(H264D_DBG_PPS_SPS, "[SLICE_HEAD] type=%d, layer_id=%d,sps_id=%d, pps_id=%d, struct=%d, frame_num=%d", | 
|                   currSlice->slice_type, currSlice->layer_id, currSlice->active_sps->seq_parameter_set_id, | 
|                   currSlice->active_pps->pic_parameter_set_id, currSlice->structure, currSlice->frame_num); | 
|     } | 
|   | 
|     return ret = MPP_OK; | 
| __BITREAD_ERR: | 
|     ret = p_bitctx->ret; | 
| __FAILED: | 
|     return ret; | 
| } |