1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka *
3*437bfbebSnyanmisaka * Copyright 2015 Rockchip Electronics Co. LTD
4*437bfbebSnyanmisaka *
5*437bfbebSnyanmisaka * Licensed under the Apache License, Version 2.0 (the "License");
6*437bfbebSnyanmisaka * you may not use this file except in compliance with the License.
7*437bfbebSnyanmisaka * You may obtain a copy of the License at
8*437bfbebSnyanmisaka *
9*437bfbebSnyanmisaka * http://www.apache.org/licenses/LICENSE-2.0
10*437bfbebSnyanmisaka *
11*437bfbebSnyanmisaka * Unless required by applicable law or agreed to in writing, software
12*437bfbebSnyanmisaka * distributed under the License is distributed on an "AS IS" BASIS,
13*437bfbebSnyanmisaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*437bfbebSnyanmisaka * See the License for the specific language governing permissions and
15*437bfbebSnyanmisaka * limitations under the License.
16*437bfbebSnyanmisaka */
17*437bfbebSnyanmisaka
18*437bfbebSnyanmisaka #define MODULE_TAG "h264d_slice"
19*437bfbebSnyanmisaka
20*437bfbebSnyanmisaka #include <string.h>
21*437bfbebSnyanmisaka
22*437bfbebSnyanmisaka #include "mpp_mem.h"
23*437bfbebSnyanmisaka
24*437bfbebSnyanmisaka #include "h264d_global.h"
25*437bfbebSnyanmisaka #include "h264d_slice.h"
26*437bfbebSnyanmisaka #include "h264d_sps.h"
27*437bfbebSnyanmisaka #include "h264d_pps.h"
28*437bfbebSnyanmisaka #include "h2645d_sei.h"
29*437bfbebSnyanmisaka
30*437bfbebSnyanmisaka #define PIXW_1080P (1920)
31*437bfbebSnyanmisaka #define PIXH_1080P (1088)
32*437bfbebSnyanmisaka #define PIXW_4Kx2K (4096)
33*437bfbebSnyanmisaka #define PIXH_4Kx2K (2304)
34*437bfbebSnyanmisaka #define PIXW_8Kx4K (8192)
35*437bfbebSnyanmisaka #define PIXH_8Kx4K (4320)
36*437bfbebSnyanmisaka
37*437bfbebSnyanmisaka #define MAX_MBW_1080P (((PIXW_1080P) / 16) - 1) /* 119 */
38*437bfbebSnyanmisaka #define MAX_MBH_1080P (((PIXH_1080P) / 16) - 1) /* 67 */
39*437bfbebSnyanmisaka #define MAX_MBW_4Kx2K (((PIXW_4Kx2K) / 16) - 1) /* 255 */
40*437bfbebSnyanmisaka #define MAX_MBH_4Kx2K (((PIXH_4Kx2K) / 16) - 1) /* 143 */
41*437bfbebSnyanmisaka #define MAX_MBW_8Kx4K (((PIXW_8Kx4K) / 16) - 1) /* 511 */
42*437bfbebSnyanmisaka #define MAX_MBH_8Kx4K (((PIXH_8Kx4K) / 16) - 1) /* 269 */
43*437bfbebSnyanmisaka
ref_pic_list_mvc_modification(H264_SLICE_t * currSlice)44*437bfbebSnyanmisaka static MPP_RET ref_pic_list_mvc_modification(H264_SLICE_t *currSlice)
45*437bfbebSnyanmisaka {
46*437bfbebSnyanmisaka RK_U32 i = 0;
47*437bfbebSnyanmisaka MPP_RET ret = MPP_ERR_UNKNOW;
48*437bfbebSnyanmisaka RK_S32 modification_of_pic_nums_idc = 0;
49*437bfbebSnyanmisaka BitReadCtx_t *p_bitctx = &currSlice->p_Cur->bitctx;
50*437bfbebSnyanmisaka
51*437bfbebSnyanmisaka if ((currSlice->slice_type % 5) != H264_I_SLICE && (currSlice->slice_type % 5) != H264_SI_SLICE) {
52*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &currSlice->ref_pic_list_reordering_flag[LIST_0]);
53*437bfbebSnyanmisaka if (currSlice->ref_pic_list_reordering_flag[LIST_0]) {
54*437bfbebSnyanmisaka RK_U32 size = currSlice->num_ref_idx_active[LIST_0] + 1;
55*437bfbebSnyanmisaka i = 0;
56*437bfbebSnyanmisaka do {
57*437bfbebSnyanmisaka if (i >= size || i >= MAX_REORDER_TIMES) {
58*437bfbebSnyanmisaka ret = MPP_NOK;
59*437bfbebSnyanmisaka H264D_WARNNING("ref_pic_list_reordering error, i >= num_ref_idx_active[LIST_0](%d)", size);
60*437bfbebSnyanmisaka goto __BITREAD_ERR;
61*437bfbebSnyanmisaka }
62*437bfbebSnyanmisaka READ_UE(p_bitctx, &modification_of_pic_nums_idc);
63*437bfbebSnyanmisaka currSlice->modification_of_pic_nums_idc[LIST_0][i] = modification_of_pic_nums_idc;
64*437bfbebSnyanmisaka if (modification_of_pic_nums_idc == 0 || modification_of_pic_nums_idc == 1) {
65*437bfbebSnyanmisaka READ_UE(p_bitctx, &currSlice->abs_diff_pic_num_minus1[LIST_0][i]);
66*437bfbebSnyanmisaka } else {
67*437bfbebSnyanmisaka if (modification_of_pic_nums_idc == 2) {
68*437bfbebSnyanmisaka READ_UE(p_bitctx, &currSlice->long_term_pic_idx[LIST_0][i]);
69*437bfbebSnyanmisaka } else if (modification_of_pic_nums_idc == 4 || modification_of_pic_nums_idc == 5) {
70*437bfbebSnyanmisaka READ_UE(p_bitctx, &currSlice->abs_diff_view_idx_minus1[LIST_0][i]);
71*437bfbebSnyanmisaka }
72*437bfbebSnyanmisaka }
73*437bfbebSnyanmisaka i++;
74*437bfbebSnyanmisaka } while (modification_of_pic_nums_idc != 3);
75*437bfbebSnyanmisaka }
76*437bfbebSnyanmisaka }
77*437bfbebSnyanmisaka if (currSlice->slice_type % 5 == H264_B_SLICE) {
78*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &currSlice->ref_pic_list_reordering_flag[LIST_1]);
79*437bfbebSnyanmisaka if (currSlice->ref_pic_list_reordering_flag[LIST_1]) {
80*437bfbebSnyanmisaka RK_U32 size = currSlice->num_ref_idx_active[LIST_1] + 1;
81*437bfbebSnyanmisaka i = 0;
82*437bfbebSnyanmisaka do {
83*437bfbebSnyanmisaka if (i >= size || i >= MAX_REORDER_TIMES) {
84*437bfbebSnyanmisaka ret = MPP_NOK;
85*437bfbebSnyanmisaka H264D_WARNNING("ref_pic_list_reordering error, i >= num_ref_idx_active[LIST_1](%d)", size);
86*437bfbebSnyanmisaka goto __BITREAD_ERR;
87*437bfbebSnyanmisaka }
88*437bfbebSnyanmisaka READ_UE(p_bitctx, &modification_of_pic_nums_idc);
89*437bfbebSnyanmisaka currSlice->modification_of_pic_nums_idc[LIST_1][i] = modification_of_pic_nums_idc;
90*437bfbebSnyanmisaka if (modification_of_pic_nums_idc == 0 || modification_of_pic_nums_idc == 1) {
91*437bfbebSnyanmisaka READ_UE(p_bitctx, &currSlice->abs_diff_pic_num_minus1[LIST_1][i]);
92*437bfbebSnyanmisaka } else {
93*437bfbebSnyanmisaka if (modification_of_pic_nums_idc == 2) {
94*437bfbebSnyanmisaka READ_UE(p_bitctx, &currSlice->long_term_pic_idx[LIST_1][i]);
95*437bfbebSnyanmisaka } else if (modification_of_pic_nums_idc == 4 || modification_of_pic_nums_idc == 5) {
96*437bfbebSnyanmisaka READ_UE(p_bitctx, &currSlice->abs_diff_view_idx_minus1[LIST_1][i]);
97*437bfbebSnyanmisaka }
98*437bfbebSnyanmisaka }
99*437bfbebSnyanmisaka i++;
100*437bfbebSnyanmisaka } while (modification_of_pic_nums_idc != 3);
101*437bfbebSnyanmisaka }
102*437bfbebSnyanmisaka }
103*437bfbebSnyanmisaka ASSERT(currSlice->redundant_pic_cnt == 0); //!< not support reference index of redundant slices
104*437bfbebSnyanmisaka
105*437bfbebSnyanmisaka return ret = MPP_OK;
106*437bfbebSnyanmisaka __BITREAD_ERR:
107*437bfbebSnyanmisaka ret = p_bitctx->ret;
108*437bfbebSnyanmisaka
109*437bfbebSnyanmisaka return ret;
110*437bfbebSnyanmisaka }
111*437bfbebSnyanmisaka
pred_weight_table(H264_SLICE_t * currSlice)112*437bfbebSnyanmisaka static MPP_RET pred_weight_table(H264_SLICE_t *currSlice)
113*437bfbebSnyanmisaka {
114*437bfbebSnyanmisaka RK_S32 se_tmp = 0;
115*437bfbebSnyanmisaka MPP_RET ret = MPP_ERR_UNKNOW;
116*437bfbebSnyanmisaka RK_S32 i = 0, j = 0, temp = 0;
117*437bfbebSnyanmisaka BitReadCtx_t *p_bitctx = &currSlice->p_Cur->bitctx;
118*437bfbebSnyanmisaka
119*437bfbebSnyanmisaka READ_UE(p_bitctx, &temp); //!< log2_weight_denom
120*437bfbebSnyanmisaka if (currSlice->active_sps->chroma_format_idc) {
121*437bfbebSnyanmisaka READ_UE(p_bitctx, &temp); //!< log2_weight_denom
122*437bfbebSnyanmisaka }
123*437bfbebSnyanmisaka for (i = 0; i < currSlice->num_ref_idx_active[LIST_0]; i++) {
124*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &temp); //!< luma_weight_flag_l0
125*437bfbebSnyanmisaka if (temp) {
126*437bfbebSnyanmisaka READ_SE(p_bitctx, &se_tmp); //!< slice->wp_weight[LIST_0][i][0]
127*437bfbebSnyanmisaka READ_SE(p_bitctx, &se_tmp); //!< slice->wp_offset[LIST_0][i][0]
128*437bfbebSnyanmisaka }
129*437bfbebSnyanmisaka if (currSlice->active_sps->chroma_format_idc) {
130*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &temp); //!< chroma_weight_flag_l0
131*437bfbebSnyanmisaka for (j = 1; j < 3; j++) {
132*437bfbebSnyanmisaka if (temp) { //!< chroma_weight_flag_l0
133*437bfbebSnyanmisaka READ_SE(p_bitctx, &se_tmp); //!< slice->wp_weight[LIST_0][i][j]
134*437bfbebSnyanmisaka READ_SE(p_bitctx, &se_tmp); //!< slice->wp_offset[LIST_0][i][j]
135*437bfbebSnyanmisaka }
136*437bfbebSnyanmisaka }
137*437bfbebSnyanmisaka }
138*437bfbebSnyanmisaka }
139*437bfbebSnyanmisaka
140*437bfbebSnyanmisaka if ((currSlice->slice_type == H264_B_SLICE) && currSlice->p_Vid->active_pps->weighted_bipred_idc == 1) {
141*437bfbebSnyanmisaka for (i = 0; i < currSlice->num_ref_idx_active[LIST_1]; i++) {
142*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &temp); //!< luma_weight_flag_l1
143*437bfbebSnyanmisaka if (temp) {
144*437bfbebSnyanmisaka READ_SE(p_bitctx, &se_tmp); //!< slice->wp_weight[LIST_1][i][0]
145*437bfbebSnyanmisaka READ_SE(p_bitctx, &se_tmp); //!< slice->wp_offset[LIST_1][i][0]
146*437bfbebSnyanmisaka }
147*437bfbebSnyanmisaka if (currSlice->active_sps->chroma_format_idc) {
148*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &temp); //!< chroma_weight_flag_l1
149*437bfbebSnyanmisaka for (j = 1; j < 3; j++) {
150*437bfbebSnyanmisaka if (temp) { // chroma_weight_flag_l1
151*437bfbebSnyanmisaka READ_SE(p_bitctx, &se_tmp); //!< slice->wp_weight[LIST_1][i][j]
152*437bfbebSnyanmisaka READ_SE(p_bitctx, &se_tmp); //!< slice->wp_offset[LIST_1][i][j]
153*437bfbebSnyanmisaka }
154*437bfbebSnyanmisaka }
155*437bfbebSnyanmisaka }
156*437bfbebSnyanmisaka }
157*437bfbebSnyanmisaka }
158*437bfbebSnyanmisaka
159*437bfbebSnyanmisaka return ret = MPP_OK;
160*437bfbebSnyanmisaka __BITREAD_ERR:
161*437bfbebSnyanmisaka return ret = p_bitctx->ret;
162*437bfbebSnyanmisaka }
163*437bfbebSnyanmisaka
dec_ref_pic_marking(H264_SLICE_t * pSlice)164*437bfbebSnyanmisaka static MPP_RET dec_ref_pic_marking(H264_SLICE_t *pSlice)
165*437bfbebSnyanmisaka {
166*437bfbebSnyanmisaka RK_U32 val = 0;
167*437bfbebSnyanmisaka MPP_RET ret = MPP_ERR_UNKNOW;
168*437bfbebSnyanmisaka RK_U32 drpm_used_bits = 0;
169*437bfbebSnyanmisaka RK_U32 emulation_prevention = 0;
170*437bfbebSnyanmisaka H264_DRPM_t *tmp_drpm = NULL, *tmp_drpm2 = NULL;
171*437bfbebSnyanmisaka H264dVideoCtx_t *p_Vid = pSlice->p_Vid;
172*437bfbebSnyanmisaka BitReadCtx_t *p_bitctx = &pSlice->p_Cur->bitctx;
173*437bfbebSnyanmisaka
174*437bfbebSnyanmisaka drpm_used_bits = p_bitctx->used_bits;
175*437bfbebSnyanmisaka emulation_prevention = p_bitctx->emulation_prevention_bytes_;
176*437bfbebSnyanmisaka pSlice->drpm_used_bitlen = 0;
177*437bfbebSnyanmisaka
178*437bfbebSnyanmisaka if (pSlice->idr_flag ||
179*437bfbebSnyanmisaka (pSlice->svc_extension_flag == 0 && pSlice->mvcExt.non_idr_flag == 0)) {
180*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &pSlice->no_output_of_prior_pics_flag);
181*437bfbebSnyanmisaka p_Vid->no_output_of_prior_pics_flag = pSlice->no_output_of_prior_pics_flag;
182*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &pSlice->long_term_reference_flag);
183*437bfbebSnyanmisaka } else {
184*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &pSlice->adaptive_ref_pic_buffering_flag);
185*437bfbebSnyanmisaka
186*437bfbebSnyanmisaka if (pSlice->adaptive_ref_pic_buffering_flag) {
187*437bfbebSnyanmisaka RK_U32 i = 0;
188*437bfbebSnyanmisaka
189*437bfbebSnyanmisaka for (i = 0; i < MAX_MARKING_TIMES; i++) {
190*437bfbebSnyanmisaka if (!pSlice->p_Cur->dec_ref_pic_marking_buffer[i])
191*437bfbebSnyanmisaka pSlice->p_Cur->dec_ref_pic_marking_buffer[i] = mpp_calloc(H264_DRPM_t, 1);
192*437bfbebSnyanmisaka tmp_drpm = pSlice->p_Cur->dec_ref_pic_marking_buffer[i];
193*437bfbebSnyanmisaka tmp_drpm->Next = NULL;
194*437bfbebSnyanmisaka READ_UE(p_bitctx, &val); //!< mmco
195*437bfbebSnyanmisaka tmp_drpm->memory_management_control_operation = val;
196*437bfbebSnyanmisaka if (val == 0)
197*437bfbebSnyanmisaka break;
198*437bfbebSnyanmisaka
199*437bfbebSnyanmisaka if ((val == 1) || (val == 3)) {
200*437bfbebSnyanmisaka READ_UE(p_bitctx, &tmp_drpm->difference_of_pic_nums_minus1);
201*437bfbebSnyanmisaka }
202*437bfbebSnyanmisaka if (val == 2) {
203*437bfbebSnyanmisaka READ_UE(p_bitctx, &tmp_drpm->long_term_pic_num);
204*437bfbebSnyanmisaka }
205*437bfbebSnyanmisaka if ((val == 3) || (val == 6)) {
206*437bfbebSnyanmisaka READ_UE(p_bitctx, &tmp_drpm->long_term_frame_idx);
207*437bfbebSnyanmisaka }
208*437bfbebSnyanmisaka if (val == 4) {
209*437bfbebSnyanmisaka READ_UE(p_bitctx, &tmp_drpm->max_long_term_frame_idx_plus1);
210*437bfbebSnyanmisaka }
211*437bfbebSnyanmisaka // add command
212*437bfbebSnyanmisaka if (pSlice->dec_ref_pic_marking_buffer == NULL) {
213*437bfbebSnyanmisaka pSlice->dec_ref_pic_marking_buffer = tmp_drpm;
214*437bfbebSnyanmisaka } else {
215*437bfbebSnyanmisaka tmp_drpm2 = pSlice->dec_ref_pic_marking_buffer;
216*437bfbebSnyanmisaka while (tmp_drpm2->Next != NULL) {
217*437bfbebSnyanmisaka tmp_drpm2 = tmp_drpm2->Next;
218*437bfbebSnyanmisaka }
219*437bfbebSnyanmisaka tmp_drpm2->Next = tmp_drpm;
220*437bfbebSnyanmisaka }
221*437bfbebSnyanmisaka }
222*437bfbebSnyanmisaka if (i >= MAX_MARKING_TIMES) {
223*437bfbebSnyanmisaka H264D_ERR("Too many memory management control operations.");
224*437bfbebSnyanmisaka goto __BITREAD_ERR;
225*437bfbebSnyanmisaka }
226*437bfbebSnyanmisaka }
227*437bfbebSnyanmisaka }
228*437bfbebSnyanmisaka
229*437bfbebSnyanmisaka // need to minus emulation prevention bytes(0x000003) we met
230*437bfbebSnyanmisaka emulation_prevention = p_bitctx->emulation_prevention_bytes_ - emulation_prevention;
231*437bfbebSnyanmisaka pSlice->drpm_used_bitlen = p_bitctx->used_bits - drpm_used_bits - (emulation_prevention * 8);
232*437bfbebSnyanmisaka
233*437bfbebSnyanmisaka return ret = MPP_OK;
234*437bfbebSnyanmisaka __BITREAD_ERR:
235*437bfbebSnyanmisaka ret = p_bitctx->ret;
236*437bfbebSnyanmisaka
237*437bfbebSnyanmisaka return ret;
238*437bfbebSnyanmisaka }
239*437bfbebSnyanmisaka
init_slice_parmeters(H264_SLICE_t * currSlice)240*437bfbebSnyanmisaka static void init_slice_parmeters(H264_SLICE_t *currSlice)
241*437bfbebSnyanmisaka {
242*437bfbebSnyanmisaka H264dVideoCtx_t *p_Vid = currSlice->p_Vid;
243*437bfbebSnyanmisaka H264_Nalu_t *cur_nalu = &currSlice->p_Cur->nalu;
244*437bfbebSnyanmisaka
245*437bfbebSnyanmisaka //--- init slice syntax
246*437bfbebSnyanmisaka currSlice->idr_flag = cur_nalu->nalu_type == H264_NALU_TYPE_IDR;
247*437bfbebSnyanmisaka currSlice->nal_reference_idc = cur_nalu->nal_reference_idc;
248*437bfbebSnyanmisaka //!< set ref flag and dpb error flag
249*437bfbebSnyanmisaka {
250*437bfbebSnyanmisaka p_Vid->p_Dec->errctx.used_ref_flag = currSlice->nal_reference_idc ? 1 : 0;
251*437bfbebSnyanmisaka if (currSlice->slice_type == H264_I_SLICE) {
252*437bfbebSnyanmisaka p_Vid->p_Dec->errctx.dpb_err_flag = 0;
253*437bfbebSnyanmisaka }
254*437bfbebSnyanmisaka }
255*437bfbebSnyanmisaka if ((!currSlice->svc_extension_flag) || currSlice->mvcExt.iPrefixNALU) { // MVC or have prefixNALU
256*437bfbebSnyanmisaka currSlice->view_id = currSlice->mvcExt.view_id;
257*437bfbebSnyanmisaka currSlice->inter_view_flag = currSlice->mvcExt.inter_view_flag;
258*437bfbebSnyanmisaka currSlice->anchor_pic_flag = currSlice->mvcExt.anchor_pic_flag;
259*437bfbebSnyanmisaka } else if (currSlice->svc_extension_flag == -1) { // normal AVC
260*437bfbebSnyanmisaka currSlice->view_id = currSlice->mvcExt.valid ? p_Vid->active_subsps->view_id[0] : 0;
261*437bfbebSnyanmisaka currSlice->inter_view_flag = 1;
262*437bfbebSnyanmisaka currSlice->anchor_pic_flag = currSlice->idr_flag;
263*437bfbebSnyanmisaka }
264*437bfbebSnyanmisaka currSlice->layer_id = currSlice->view_id;
265*437bfbebSnyanmisaka if (currSlice->layer_id >= 0) { // if not found, layer_id == -1
266*437bfbebSnyanmisaka currSlice->p_Dpb = p_Vid->p_Dpb_layer[currSlice->layer_id];
267*437bfbebSnyanmisaka }
268*437bfbebSnyanmisaka }
269*437bfbebSnyanmisaka
check_sps_pps(H264_SPS_t * sps,H264_subSPS_t * subset_sps,H264_PPS_t * pps,const MppDecHwCap * hw_info)270*437bfbebSnyanmisaka static MPP_RET check_sps_pps(H264_SPS_t *sps, H264_subSPS_t *subset_sps,
271*437bfbebSnyanmisaka H264_PPS_t *pps, const MppDecHwCap *hw_info)
272*437bfbebSnyanmisaka {
273*437bfbebSnyanmisaka RK_U32 ret = 0;
274*437bfbebSnyanmisaka RK_S32 max_mb_width = MAX_MBW_1080P;
275*437bfbebSnyanmisaka
276*437bfbebSnyanmisaka ret |= (sps->seq_parameter_set_id > 31);
277*437bfbebSnyanmisaka ret |= (sps->separate_colour_plane_flag == 1);
278*437bfbebSnyanmisaka ret |= (sps->chroma_format_idc >= 3);
279*437bfbebSnyanmisaka ret |= (sps->bit_depth_luma_minus8 > 2);
280*437bfbebSnyanmisaka ret |= (sps->bit_depth_chroma_minus8 > 2);
281*437bfbebSnyanmisaka ret |= (sps->log2_max_frame_num_minus4 > 12);
282*437bfbebSnyanmisaka ret |= (sps->pic_order_cnt_type > 2);
283*437bfbebSnyanmisaka ret |= (sps->log2_max_pic_order_cnt_lsb_minus4 > 12);
284*437bfbebSnyanmisaka ret |= (sps->num_ref_frames_in_pic_order_cnt_cycle > 255);
285*437bfbebSnyanmisaka ret |= (sps->max_num_ref_frames > 16);
286*437bfbebSnyanmisaka ret |= (sps->qpprime_y_zero_transform_bypass_flag == 1);
287*437bfbebSnyanmisaka
288*437bfbebSnyanmisaka if (ret) {
289*437bfbebSnyanmisaka H264D_ERR("sps has error, sps_id=%d", sps->seq_parameter_set_id);
290*437bfbebSnyanmisaka goto __FAILED;
291*437bfbebSnyanmisaka }
292*437bfbebSnyanmisaka
293*437bfbebSnyanmisaka if (hw_info && hw_info->cap_8k)
294*437bfbebSnyanmisaka max_mb_width = MAX_MBW_8Kx4K * hw_info->cap_core_num;
295*437bfbebSnyanmisaka else if (hw_info && hw_info->cap_4k)
296*437bfbebSnyanmisaka max_mb_width = MAX_MBW_4Kx2K;
297*437bfbebSnyanmisaka
298*437bfbebSnyanmisaka ret |= (sps->pic_width_in_mbs_minus1 < 3);
299*437bfbebSnyanmisaka if (ret) {
300*437bfbebSnyanmisaka H264D_ERR("sps %d too small width %d\n", sps->seq_parameter_set_id,
301*437bfbebSnyanmisaka (sps->pic_width_in_mbs_minus1 + 1) * 16);
302*437bfbebSnyanmisaka goto __FAILED;
303*437bfbebSnyanmisaka }
304*437bfbebSnyanmisaka ret |= (sps->pic_width_in_mbs_minus1 > max_mb_width);
305*437bfbebSnyanmisaka if (ret) {
306*437bfbebSnyanmisaka H264D_ERR("width %d is larger than soc max support %d\n",
307*437bfbebSnyanmisaka (sps->pic_width_in_mbs_minus1 + 1) * 16, max_mb_width * 16);
308*437bfbebSnyanmisaka goto __FAILED;
309*437bfbebSnyanmisaka }
310*437bfbebSnyanmisaka
311*437bfbebSnyanmisaka if (subset_sps) { //!< MVC
312*437bfbebSnyanmisaka ret |= (subset_sps->num_views_minus1 != 1);
313*437bfbebSnyanmisaka if (subset_sps->num_anchor_refs_l0[0] > 0)
314*437bfbebSnyanmisaka ret |= (subset_sps->anchor_ref_l0[0][0] != subset_sps->view_id[0]);
315*437bfbebSnyanmisaka if (subset_sps->num_anchor_refs_l1[0] > 0)
316*437bfbebSnyanmisaka ret |= (subset_sps->anchor_ref_l1[0][0] != subset_sps->view_id[1]);
317*437bfbebSnyanmisaka if (subset_sps->num_non_anchor_refs_l0[0] > 0)
318*437bfbebSnyanmisaka ret |= (subset_sps->non_anchor_ref_l0[0][0] != subset_sps->view_id[0]);
319*437bfbebSnyanmisaka if (subset_sps->num_non_anchor_refs_l1[0] > 0)
320*437bfbebSnyanmisaka ret |= (subset_sps->non_anchor_ref_l1[0][0] != subset_sps->view_id[1]);
321*437bfbebSnyanmisaka if (ret) {
322*437bfbebSnyanmisaka H264D_ERR("subsps has error, sps_id=%d", sps->seq_parameter_set_id);
323*437bfbebSnyanmisaka goto __FAILED;
324*437bfbebSnyanmisaka }
325*437bfbebSnyanmisaka }
326*437bfbebSnyanmisaka //!< check PPS
327*437bfbebSnyanmisaka ret |= (pps->pic_parameter_set_id > 255);
328*437bfbebSnyanmisaka ret |= (pps->seq_parameter_set_id > 31);
329*437bfbebSnyanmisaka ret |= (pps->num_slice_groups_minus1 > 0);
330*437bfbebSnyanmisaka ret |= (pps->num_ref_idx_l0_default_active_minus1 > 31);
331*437bfbebSnyanmisaka ret |= (pps->num_ref_idx_l1_default_active_minus1 > 31);
332*437bfbebSnyanmisaka ret |= (pps->pic_init_qp_minus26 > 25 || pps->pic_init_qp_minus26 < -(26 + 6 * (RK_S32)sps->bit_depth_luma_minus8));
333*437bfbebSnyanmisaka ret |= (pps->pic_init_qs_minus26 > 25 || pps->pic_init_qs_minus26 < -26);
334*437bfbebSnyanmisaka ret |= (pps->chroma_qp_index_offset > 12 || pps->chroma_qp_index_offset < -12);
335*437bfbebSnyanmisaka ret |= (pps->redundant_pic_cnt_present_flag == 1);
336*437bfbebSnyanmisaka if (ret) {
337*437bfbebSnyanmisaka H264D_ERR("pps has error, sps_id=%d, pps_id", sps->seq_parameter_set_id, pps->pic_parameter_set_id);
338*437bfbebSnyanmisaka goto __FAILED;
339*437bfbebSnyanmisaka }
340*437bfbebSnyanmisaka return MPP_OK;
341*437bfbebSnyanmisaka __FAILED:
342*437bfbebSnyanmisaka return MPP_NOK;
343*437bfbebSnyanmisaka }
344*437bfbebSnyanmisaka
345*437bfbebSnyanmisaka
set_slice_user_parmeters(H264_SLICE_t * currSlice)346*437bfbebSnyanmisaka static MPP_RET set_slice_user_parmeters(H264_SLICE_t *currSlice)
347*437bfbebSnyanmisaka {
348*437bfbebSnyanmisaka MPP_RET ret = MPP_ERR_UNKNOW;
349*437bfbebSnyanmisaka H264_PPS_t *cur_pps = NULL;
350*437bfbebSnyanmisaka H264_SPS_t *cur_sps = NULL;
351*437bfbebSnyanmisaka H264_subSPS_t *cur_subsps = NULL;
352*437bfbebSnyanmisaka H264dVideoCtx_t *p_Vid = currSlice->p_Vid;
353*437bfbebSnyanmisaka
354*437bfbebSnyanmisaka //!< use parameter set
355*437bfbebSnyanmisaka if (currSlice->pic_parameter_set_id < MAXPPS) {
356*437bfbebSnyanmisaka cur_pps = p_Vid->ppsSet[currSlice->pic_parameter_set_id];
357*437bfbebSnyanmisaka cur_pps = (cur_pps && cur_pps->Valid) ? cur_pps : NULL;
358*437bfbebSnyanmisaka }
359*437bfbebSnyanmisaka VAL_CHECK(ret, cur_pps != NULL);
360*437bfbebSnyanmisaka
361*437bfbebSnyanmisaka if (currSlice->mvcExt.valid) {
362*437bfbebSnyanmisaka cur_subsps = p_Vid->subspsSet[cur_pps->seq_parameter_set_id];
363*437bfbebSnyanmisaka // only num view(except base view) > 0, need to combine view id
364*437bfbebSnyanmisaka if (cur_subsps && cur_subsps->Valid && cur_subsps->num_views_minus1 > 0) {
365*437bfbebSnyanmisaka cur_sps = &cur_subsps->sps;
366*437bfbebSnyanmisaka if ((RK_S32)currSlice->mvcExt.view_id == cur_subsps->view_id[0]) { // combine subsps to sps
367*437bfbebSnyanmisaka p_Vid->active_mvc_sps_flag = 0;
368*437bfbebSnyanmisaka cur_subsps = NULL;
369*437bfbebSnyanmisaka cur_sps = p_Vid->spsSet[cur_pps->seq_parameter_set_id];
370*437bfbebSnyanmisaka } else if ((RK_S32)currSlice->mvcExt.view_id == cur_subsps->view_id[1]) {
371*437bfbebSnyanmisaka p_Vid->active_mvc_sps_flag = 1;
372*437bfbebSnyanmisaka }
373*437bfbebSnyanmisaka } else {
374*437bfbebSnyanmisaka p_Vid->active_mvc_sps_flag = 0;
375*437bfbebSnyanmisaka cur_sps = p_Vid->spsSet[cur_pps->seq_parameter_set_id];
376*437bfbebSnyanmisaka cur_subsps = NULL;
377*437bfbebSnyanmisaka }
378*437bfbebSnyanmisaka } else {
379*437bfbebSnyanmisaka p_Vid->active_mvc_sps_flag = 0;
380*437bfbebSnyanmisaka cur_sps = p_Vid->spsSet[cur_pps->seq_parameter_set_id];
381*437bfbebSnyanmisaka cur_subsps = NULL;
382*437bfbebSnyanmisaka }
383*437bfbebSnyanmisaka
384*437bfbebSnyanmisaka if (p_Vid->active_mvc_sps_flag) { // layer_id == 1
385*437bfbebSnyanmisaka cur_subsps = (cur_subsps && cur_subsps->Valid) ? cur_subsps : NULL;
386*437bfbebSnyanmisaka VAL_CHECK(ret, cur_subsps != NULL);
387*437bfbebSnyanmisaka cur_sps = &cur_subsps->sps;
388*437bfbebSnyanmisaka } else { //!< layer_id == 0
389*437bfbebSnyanmisaka cur_subsps = NULL;
390*437bfbebSnyanmisaka cur_sps = (cur_sps && cur_sps->Valid) ? cur_sps : NULL;
391*437bfbebSnyanmisaka }
392*437bfbebSnyanmisaka VAL_CHECK(ret, cur_sps);
393*437bfbebSnyanmisaka VAL_CHECK(ret, check_sps_pps(cur_sps, cur_subsps, cur_pps, p_Vid->p_Dec->hw_info) != MPP_NOK);
394*437bfbebSnyanmisaka
395*437bfbebSnyanmisaka FUN_CHECK(ret = activate_sps(p_Vid, cur_sps, cur_subsps));
396*437bfbebSnyanmisaka FUN_CHECK(ret = activate_pps(p_Vid, cur_pps));
397*437bfbebSnyanmisaka
398*437bfbebSnyanmisaka if (p_Vid->last_sps_id != cur_sps->seq_parameter_set_id ||
399*437bfbebSnyanmisaka p_Vid->last_pps_id != cur_pps->pic_parameter_set_id) {
400*437bfbebSnyanmisaka p_Vid->last_sps_id = cur_sps->seq_parameter_set_id;
401*437bfbebSnyanmisaka p_Vid->last_pps_id = cur_pps->pic_parameter_set_id;
402*437bfbebSnyanmisaka p_Vid->spspps_update = 1;
403*437bfbebSnyanmisaka }
404*437bfbebSnyanmisaka
405*437bfbebSnyanmisaka /* NOTE: the SVC is not supported by hardware, so it is dropped.
406*437bfbebSnyanmisaka * Or svc_extension_flag doesn't equal to -1, it should apply the
407*437bfbebSnyanmisaka * subset_seq_parameter_set_rbsp().
408*437bfbebSnyanmisaka */
409*437bfbebSnyanmisaka if (p_Vid->p_Dec->mvc_valid) {
410*437bfbebSnyanmisaka struct h264_subsps_t *active_subsps = NULL;
411*437bfbebSnyanmisaka
412*437bfbebSnyanmisaka active_subsps = p_Vid->subspsSet[cur_pps->seq_parameter_set_id];
413*437bfbebSnyanmisaka if (active_subsps && active_subsps->Valid)
414*437bfbebSnyanmisaka p_Vid->active_subsps = active_subsps;
415*437bfbebSnyanmisaka else
416*437bfbebSnyanmisaka p_Vid->active_subsps = NULL;
417*437bfbebSnyanmisaka }
418*437bfbebSnyanmisaka
419*437bfbebSnyanmisaka currSlice->active_sps = p_Vid->active_sps;
420*437bfbebSnyanmisaka currSlice->active_pps = p_Vid->active_pps;
421*437bfbebSnyanmisaka
422*437bfbebSnyanmisaka p_Vid->type = currSlice->slice_type;
423*437bfbebSnyanmisaka return MPP_OK;
424*437bfbebSnyanmisaka __FAILED:
425*437bfbebSnyanmisaka return ret;
426*437bfbebSnyanmisaka }
427*437bfbebSnyanmisaka
428*437bfbebSnyanmisaka
429*437bfbebSnyanmisaka /*!
430*437bfbebSnyanmisaka ***********************************************************************
431*437bfbebSnyanmisaka * \brief
432*437bfbebSnyanmisaka * reset current slice buffer
433*437bfbebSnyanmisaka ***********************************************************************
434*437bfbebSnyanmisaka */
435*437bfbebSnyanmisaka //extern "C"
reset_cur_slice(H264dCurCtx_t * p_Cur,H264_SLICE_t * p)436*437bfbebSnyanmisaka MPP_RET reset_cur_slice(H264dCurCtx_t *p_Cur, H264_SLICE_t *p)
437*437bfbebSnyanmisaka {
438*437bfbebSnyanmisaka if (p) {
439*437bfbebSnyanmisaka p->modification_of_pic_nums_idc[LIST_0] = p_Cur->modification_of_pic_nums_idc[LIST_0];
440*437bfbebSnyanmisaka p->abs_diff_pic_num_minus1[LIST_0] = p_Cur->abs_diff_pic_num_minus1[LIST_0];
441*437bfbebSnyanmisaka p->long_term_pic_idx[LIST_0] = p_Cur->long_term_pic_idx[LIST_0];
442*437bfbebSnyanmisaka p->abs_diff_view_idx_minus1[LIST_0] = p_Cur->abs_diff_view_idx_minus1[LIST_0];
443*437bfbebSnyanmisaka
444*437bfbebSnyanmisaka p->modification_of_pic_nums_idc[LIST_1] = p_Cur->modification_of_pic_nums_idc[LIST_1];
445*437bfbebSnyanmisaka p->abs_diff_pic_num_minus1[LIST_1] = p_Cur->abs_diff_pic_num_minus1[LIST_1];
446*437bfbebSnyanmisaka p->long_term_pic_idx[LIST_1] = p_Cur->long_term_pic_idx[LIST_1];
447*437bfbebSnyanmisaka p->abs_diff_view_idx_minus1[LIST_1] = p_Cur->abs_diff_view_idx_minus1[LIST_1];
448*437bfbebSnyanmisaka
449*437bfbebSnyanmisaka p->dec_ref_pic_marking_buffer = NULL;
450*437bfbebSnyanmisaka }
451*437bfbebSnyanmisaka
452*437bfbebSnyanmisaka return MPP_OK;
453*437bfbebSnyanmisaka }
454*437bfbebSnyanmisaka
455*437bfbebSnyanmisaka /*!
456*437bfbebSnyanmisaka ***********************************************************************
457*437bfbebSnyanmisaka * \brief
458*437bfbebSnyanmisaka * parse SEI information
459*437bfbebSnyanmisaka ***********************************************************************
460*437bfbebSnyanmisaka */
461*437bfbebSnyanmisaka //extern "C"
process_slice(H264_SLICE_t * currSlice)462*437bfbebSnyanmisaka MPP_RET process_slice(H264_SLICE_t *currSlice)
463*437bfbebSnyanmisaka {
464*437bfbebSnyanmisaka RK_U32 temp = 0;
465*437bfbebSnyanmisaka RK_U32 poc_used_bits = 0;
466*437bfbebSnyanmisaka RK_U32 emulation_prevention = 0;
467*437bfbebSnyanmisaka MPP_RET ret = MPP_ERR_UNKNOW;
468*437bfbebSnyanmisaka H264dVideoCtx_t *p_Vid = currSlice->p_Vid;
469*437bfbebSnyanmisaka H264dCurCtx_t *p_Cur = currSlice->p_Cur;
470*437bfbebSnyanmisaka BitReadCtx_t *p_bitctx = &p_Cur->bitctx;
471*437bfbebSnyanmisaka RecoveryPoint *recovery = &p_Vid->recovery;
472*437bfbebSnyanmisaka
473*437bfbebSnyanmisaka //!< initial value
474*437bfbebSnyanmisaka currSlice->p_Dpb_layer[0] = p_Vid->p_Dpb_layer[0];
475*437bfbebSnyanmisaka currSlice->p_Dpb_layer[1] = p_Vid->p_Dpb_layer[1];
476*437bfbebSnyanmisaka
477*437bfbebSnyanmisaka //!< read slice head syntax
478*437bfbebSnyanmisaka READ_UE(p_bitctx, &currSlice->start_mb_nr); //!< first_mb_in_slice
479*437bfbebSnyanmisaka READ_UE(p_bitctx, &temp); //!< slice_type
480*437bfbebSnyanmisaka p_Vid->slice_type = currSlice->slice_type = temp % 5;
481*437bfbebSnyanmisaka if (p_Vid->slice_type == H264_SP_SLICE || p_Vid->slice_type == H264_SI_SLICE) {
482*437bfbebSnyanmisaka H264D_WARNNING("sp or si slice not support\n");
483*437bfbebSnyanmisaka goto __FAILED;
484*437bfbebSnyanmisaka }
485*437bfbebSnyanmisaka READ_UE(p_bitctx, &currSlice->pic_parameter_set_id);
486*437bfbebSnyanmisaka init_slice_parmeters(currSlice);
487*437bfbebSnyanmisaka FUN_CHECK(ret = set_slice_user_parmeters(currSlice));
488*437bfbebSnyanmisaka //!< read rest slice header syntax
489*437bfbebSnyanmisaka {
490*437bfbebSnyanmisaka READ_BITS(p_bitctx, currSlice->active_sps->log2_max_frame_num_minus4 + 4, &currSlice->frame_num);
491*437bfbebSnyanmisaka
492*437bfbebSnyanmisaka if (recovery->valid_flag) {
493*437bfbebSnyanmisaka if (!recovery->first_frm_valid) {
494*437bfbebSnyanmisaka recovery->first_frm_id = currSlice->frame_num;
495*437bfbebSnyanmisaka recovery->first_frm_valid = 1;
496*437bfbebSnyanmisaka recovery->recovery_pic_id = recovery->first_frm_id + recovery->recovery_frame_cnt;
497*437bfbebSnyanmisaka H264D_DBG(H264D_DBG_SEI, "First recovery frame found, frame_num %d", currSlice->frame_num);
498*437bfbebSnyanmisaka } else {
499*437bfbebSnyanmisaka // It may be too early to reset recovery point info when frame_num is wrapped
500*437bfbebSnyanmisaka if (recovery->recovery_pic_id % p_Vid->max_frame_num < currSlice->frame_num)
501*437bfbebSnyanmisaka memset(&p_Vid->recovery, 0, sizeof(RecoveryPoint));
502*437bfbebSnyanmisaka }
503*437bfbebSnyanmisaka }
504*437bfbebSnyanmisaka
505*437bfbebSnyanmisaka if (currSlice->active_sps->frame_mbs_only_flag) { //!< user in_slice info
506*437bfbebSnyanmisaka p_Vid->structure = FRAME;
507*437bfbebSnyanmisaka currSlice->field_pic_flag = 0;
508*437bfbebSnyanmisaka currSlice->bottom_field_flag = 0;
509*437bfbebSnyanmisaka } else {
510*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &currSlice->field_pic_flag);
511*437bfbebSnyanmisaka if (currSlice->field_pic_flag) {
512*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &currSlice->bottom_field_flag);
513*437bfbebSnyanmisaka p_Vid->structure = currSlice->bottom_field_flag ? BOTTOM_FIELD : TOP_FIELD;
514*437bfbebSnyanmisaka } else {
515*437bfbebSnyanmisaka p_Vid->structure = FRAME;
516*437bfbebSnyanmisaka currSlice->bottom_field_flag = 0;
517*437bfbebSnyanmisaka }
518*437bfbebSnyanmisaka }
519*437bfbebSnyanmisaka currSlice->structure = p_Vid->structure;
520*437bfbebSnyanmisaka currSlice->mb_aff_frame_flag = currSlice->active_sps->mb_adaptive_frame_field_flag &&
521*437bfbebSnyanmisaka !currSlice->field_pic_flag;
522*437bfbebSnyanmisaka if (currSlice->idr_flag) {
523*437bfbebSnyanmisaka READ_UE(p_bitctx, &currSlice->idr_pic_id);
524*437bfbebSnyanmisaka } else if (currSlice->svc_extension_flag == 0 && currSlice->mvcExt.non_idr_flag == 0) {
525*437bfbebSnyanmisaka READ_UE(p_bitctx, &currSlice->idr_pic_id);
526*437bfbebSnyanmisaka }
527*437bfbebSnyanmisaka poc_used_bits = p_bitctx->used_bits; //!< init poc used bits
528*437bfbebSnyanmisaka emulation_prevention = p_bitctx->emulation_prevention_bytes_;
529*437bfbebSnyanmisaka if (currSlice->active_sps->pic_order_cnt_type == 0) {
530*437bfbebSnyanmisaka READ_BITS(p_bitctx, currSlice->active_sps->log2_max_pic_order_cnt_lsb_minus4 + 4, &currSlice->pic_order_cnt_lsb);
531*437bfbebSnyanmisaka if (currSlice->p_Vid->active_pps->bottom_field_pic_order_in_frame_present_flag == 1
532*437bfbebSnyanmisaka && !currSlice->field_pic_flag) {
533*437bfbebSnyanmisaka READ_SE(p_bitctx, &currSlice->delta_pic_order_cnt_bottom);
534*437bfbebSnyanmisaka } else {
535*437bfbebSnyanmisaka currSlice->delta_pic_order_cnt_bottom = 0;
536*437bfbebSnyanmisaka }
537*437bfbebSnyanmisaka }
538*437bfbebSnyanmisaka if (currSlice->active_sps->pic_order_cnt_type == 1) {
539*437bfbebSnyanmisaka if (!currSlice->active_sps->delta_pic_order_always_zero_flag) {
540*437bfbebSnyanmisaka READ_SE(p_bitctx, &currSlice->delta_pic_order_cnt[0]);
541*437bfbebSnyanmisaka
542*437bfbebSnyanmisaka if (currSlice->p_Vid->active_pps->bottom_field_pic_order_in_frame_present_flag == 1 && !currSlice->field_pic_flag) {
543*437bfbebSnyanmisaka READ_SE(p_bitctx, &currSlice->delta_pic_order_cnt[1]);
544*437bfbebSnyanmisaka } else {
545*437bfbebSnyanmisaka currSlice->delta_pic_order_cnt[1] = 0; //!< set to zero if not in stream
546*437bfbebSnyanmisaka }
547*437bfbebSnyanmisaka } else {
548*437bfbebSnyanmisaka currSlice->delta_pic_order_cnt[0] = 0;
549*437bfbebSnyanmisaka currSlice->delta_pic_order_cnt[1] = 0;
550*437bfbebSnyanmisaka }
551*437bfbebSnyanmisaka }
552*437bfbebSnyanmisaka
553*437bfbebSnyanmisaka // need to minus emulation prevention bytes(0x000003) we met
554*437bfbebSnyanmisaka emulation_prevention = p_bitctx->emulation_prevention_bytes_ - emulation_prevention;
555*437bfbebSnyanmisaka currSlice->poc_used_bitlen = p_bitctx->used_bits - poc_used_bits - (emulation_prevention * 8); //!< calculate poc used bit length
556*437bfbebSnyanmisaka //!< redundant_pic_cnt is missing here
557*437bfbebSnyanmisaka ASSERT(currSlice->p_Vid->active_pps->redundant_pic_cnt_present_flag == 0); // add by dw, high 4:2:2 profile not support
558*437bfbebSnyanmisaka if (currSlice->p_Vid->active_pps->redundant_pic_cnt_present_flag) {
559*437bfbebSnyanmisaka READ_UE(p_bitctx, &currSlice->redundant_pic_cnt);
560*437bfbebSnyanmisaka }
561*437bfbebSnyanmisaka
562*437bfbebSnyanmisaka if (currSlice->slice_type == H264_B_SLICE) {
563*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &currSlice->direct_spatial_mv_pred_flag);
564*437bfbebSnyanmisaka } else {
565*437bfbebSnyanmisaka currSlice->direct_spatial_mv_pred_flag = 0;
566*437bfbebSnyanmisaka }
567*437bfbebSnyanmisaka currSlice->num_ref_idx_active[LIST_0] = currSlice->p_Vid->active_pps->num_ref_idx_l0_default_active_minus1 + 1;
568*437bfbebSnyanmisaka currSlice->num_ref_idx_active[LIST_1] = currSlice->p_Vid->active_pps->num_ref_idx_l1_default_active_minus1 + 1;
569*437bfbebSnyanmisaka
570*437bfbebSnyanmisaka if (currSlice->slice_type == H264_P_SLICE
571*437bfbebSnyanmisaka || currSlice->slice_type == H264_SP_SLICE || currSlice->slice_type == H264_B_SLICE) {
572*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &currSlice->num_ref_idx_override_flag);
573*437bfbebSnyanmisaka if (currSlice->num_ref_idx_override_flag) {
574*437bfbebSnyanmisaka READ_UE(p_bitctx, &currSlice->num_ref_idx_active[LIST_0]);
575*437bfbebSnyanmisaka currSlice->num_ref_idx_active[LIST_0] += 1;
576*437bfbebSnyanmisaka if (currSlice->slice_type == H264_B_SLICE) {
577*437bfbebSnyanmisaka READ_UE(p_bitctx, &currSlice->num_ref_idx_active[LIST_1]);
578*437bfbebSnyanmisaka currSlice->num_ref_idx_active[LIST_1] += 1;
579*437bfbebSnyanmisaka }
580*437bfbebSnyanmisaka }
581*437bfbebSnyanmisaka }
582*437bfbebSnyanmisaka if (currSlice->slice_type != H264_B_SLICE) {
583*437bfbebSnyanmisaka currSlice->num_ref_idx_active[LIST_1] = 0;
584*437bfbebSnyanmisaka }
585*437bfbebSnyanmisaka FUN_CHECK(ret = ref_pic_list_mvc_modification(currSlice));
586*437bfbebSnyanmisaka if ((currSlice->p_Vid->active_pps->weighted_pred_flag
587*437bfbebSnyanmisaka && (currSlice->slice_type == H264_P_SLICE || currSlice->slice_type == H264_SP_SLICE))
588*437bfbebSnyanmisaka || (currSlice->p_Vid->active_pps->weighted_bipred_idc == 1 && (currSlice->slice_type == H264_B_SLICE))) {
589*437bfbebSnyanmisaka FUN_CHECK(ret = pred_weight_table(currSlice));
590*437bfbebSnyanmisaka }
591*437bfbebSnyanmisaka currSlice->drpm_used_bitlen = 0;
592*437bfbebSnyanmisaka if (currSlice->nal_reference_idc) {
593*437bfbebSnyanmisaka FUN_CHECK(ret = dec_ref_pic_marking(currSlice));
594*437bfbebSnyanmisaka }
595*437bfbebSnyanmisaka H264D_DBG(H264D_DBG_PPS_SPS, "[SLICE_HEAD] type=%d, layer_id=%d,sps_id=%d, pps_id=%d, struct=%d, frame_num=%d",
596*437bfbebSnyanmisaka currSlice->slice_type, currSlice->layer_id, currSlice->active_sps->seq_parameter_set_id,
597*437bfbebSnyanmisaka currSlice->active_pps->pic_parameter_set_id, currSlice->structure, currSlice->frame_num);
598*437bfbebSnyanmisaka }
599*437bfbebSnyanmisaka
600*437bfbebSnyanmisaka return ret = MPP_OK;
601*437bfbebSnyanmisaka __BITREAD_ERR:
602*437bfbebSnyanmisaka ret = p_bitctx->ret;
603*437bfbebSnyanmisaka __FAILED:
604*437bfbebSnyanmisaka return ret;
605*437bfbebSnyanmisaka }
606