xref: /rockchip-linux_mpp/mpp/codec/dec/h264/h264d_pps.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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_pps"
19*437bfbebSnyanmisaka 
20*437bfbebSnyanmisaka #include <string.h>
21*437bfbebSnyanmisaka 
22*437bfbebSnyanmisaka #include "mpp_err.h"
23*437bfbebSnyanmisaka 
24*437bfbebSnyanmisaka #include "h264d_pps.h"
25*437bfbebSnyanmisaka #include "h264d_scalist.h"
26*437bfbebSnyanmisaka #include "h264d_dpb.h"
27*437bfbebSnyanmisaka 
reset_curpps_data(H264_PPS_t * cur_pps)28*437bfbebSnyanmisaka static void reset_curpps_data(H264_PPS_t *cur_pps)
29*437bfbebSnyanmisaka {
30*437bfbebSnyanmisaka     memset(cur_pps, 0, sizeof(H264_PPS_t));
31*437bfbebSnyanmisaka     cur_pps->seq_parameter_set_id = 0;  // reset
32*437bfbebSnyanmisaka     cur_pps->pic_parameter_set_id = 0;
33*437bfbebSnyanmisaka }
34*437bfbebSnyanmisaka 
parse_pps_calingLists(BitReadCtx_t * p_bitctx,H264_SPS_t * sps,H264_PPS_t * pps)35*437bfbebSnyanmisaka static MPP_RET parse_pps_calingLists(BitReadCtx_t *p_bitctx, H264_SPS_t *sps, H264_PPS_t *pps)
36*437bfbebSnyanmisaka {
37*437bfbebSnyanmisaka     RK_S32 i = 0;
38*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
39*437bfbebSnyanmisaka 
40*437bfbebSnyanmisaka     for (i = 0; i < 6; ++i) {
41*437bfbebSnyanmisaka         READ_ONEBIT(p_bitctx, &pps->pic_scaling_list_present_flag[i]);
42*437bfbebSnyanmisaka 
43*437bfbebSnyanmisaka         if (pps->pic_scaling_list_present_flag[i]) {
44*437bfbebSnyanmisaka             FUN_CHECK (ret = parse_scalingList(p_bitctx, H264ScalingList4x4Length,
45*437bfbebSnyanmisaka                                                pps->ScalingList4x4[i], &pps->UseDefaultScalingMatrix4x4Flag[i]));
46*437bfbebSnyanmisaka         }
47*437bfbebSnyanmisaka     }
48*437bfbebSnyanmisaka     if (pps->transform_8x8_mode_flag) {
49*437bfbebSnyanmisaka         for (i = 0; i < ((sps->chroma_format_idc != 3) ? 2 : 6); ++i) {
50*437bfbebSnyanmisaka             READ_ONEBIT(p_bitctx, &pps->pic_scaling_list_present_flag[i + 6]);
51*437bfbebSnyanmisaka             if (pps->pic_scaling_list_present_flag[i + 6]) {
52*437bfbebSnyanmisaka                 FUN_CHECK(ret = parse_scalingList(p_bitctx, H264ScalingList8x8Length,
53*437bfbebSnyanmisaka                                                   pps->ScalingList8x8[i], &pps->UseDefaultScalingMatrix8x8Flag[i]));
54*437bfbebSnyanmisaka             }
55*437bfbebSnyanmisaka         }
56*437bfbebSnyanmisaka     }
57*437bfbebSnyanmisaka 
58*437bfbebSnyanmisaka     return ret = MPP_OK;
59*437bfbebSnyanmisaka __BITREAD_ERR:
60*437bfbebSnyanmisaka     ret = p_bitctx->ret;
61*437bfbebSnyanmisaka __FAILED:
62*437bfbebSnyanmisaka     return ret;
63*437bfbebSnyanmisaka }
64*437bfbebSnyanmisaka 
parser_pps(BitReadCtx_t * p_bitctx,H264_SPS_t * cur_sps,H264_PPS_t * cur_pps)65*437bfbebSnyanmisaka static MPP_RET parser_pps(BitReadCtx_t *p_bitctx, H264_SPS_t *cur_sps, H264_PPS_t *cur_pps)
66*437bfbebSnyanmisaka {
67*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
68*437bfbebSnyanmisaka 
69*437bfbebSnyanmisaka     READ_UE(p_bitctx, &cur_pps->pic_parameter_set_id);
70*437bfbebSnyanmisaka     READ_UE(p_bitctx, &cur_pps->seq_parameter_set_id);
71*437bfbebSnyanmisaka     //VAL_CHECK(ret, cur_pps->seq_parameter_set_id < 32);
72*437bfbebSnyanmisaka     if (cur_pps->seq_parameter_set_id >= MAXSPS) {
73*437bfbebSnyanmisaka         cur_pps->seq_parameter_set_id = 0;
74*437bfbebSnyanmisaka     }
75*437bfbebSnyanmisaka     if (cur_pps->pic_parameter_set_id >= MAXPPS)    {
76*437bfbebSnyanmisaka         cur_pps->pic_parameter_set_id = 0;
77*437bfbebSnyanmisaka     }
78*437bfbebSnyanmisaka     READ_ONEBIT(p_bitctx, &cur_pps->entropy_coding_mode_flag);
79*437bfbebSnyanmisaka     READ_ONEBIT(p_bitctx, &cur_pps->bottom_field_pic_order_in_frame_present_flag);
80*437bfbebSnyanmisaka 
81*437bfbebSnyanmisaka     READ_UE(p_bitctx, &cur_pps->num_slice_groups_minus1);
82*437bfbebSnyanmisaka     VAL_CHECK(ret, cur_pps->num_slice_groups_minus1 <= 1);
83*437bfbebSnyanmisaka     READ_UE(p_bitctx, &cur_pps->num_ref_idx_l0_default_active_minus1);
84*437bfbebSnyanmisaka     VAL_CHECK(ret, cur_pps->num_ref_idx_l0_default_active_minus1 < 32);
85*437bfbebSnyanmisaka     READ_UE(p_bitctx, &cur_pps->num_ref_idx_l1_default_active_minus1);
86*437bfbebSnyanmisaka     VAL_CHECK(ret, cur_pps->num_ref_idx_l1_default_active_minus1 < 32);
87*437bfbebSnyanmisaka     READ_ONEBIT(p_bitctx, &cur_pps->weighted_pred_flag);
88*437bfbebSnyanmisaka     READ_BITS(p_bitctx, 2, &cur_pps->weighted_bipred_idc);
89*437bfbebSnyanmisaka     VAL_CHECK(ret, cur_pps->weighted_bipred_idc < 3);
90*437bfbebSnyanmisaka     READ_SE(p_bitctx, &cur_pps->pic_init_qp_minus26);
91*437bfbebSnyanmisaka     READ_SE(p_bitctx, &cur_pps->pic_init_qs_minus26);
92*437bfbebSnyanmisaka     READ_SE(p_bitctx, &cur_pps->chroma_qp_index_offset);
93*437bfbebSnyanmisaka     cur_pps->second_chroma_qp_index_offset = cur_pps->chroma_qp_index_offset;
94*437bfbebSnyanmisaka     READ_ONEBIT(p_bitctx, &cur_pps->deblocking_filter_control_present_flag);
95*437bfbebSnyanmisaka     READ_ONEBIT(p_bitctx, &cur_pps->constrained_intra_pred_flag);
96*437bfbebSnyanmisaka     READ_ONEBIT(p_bitctx, &cur_pps->redundant_pic_cnt_present_flag);
97*437bfbebSnyanmisaka     VAL_CHECK(ret , cur_pps->redundant_pic_cnt_present_flag == 0);
98*437bfbebSnyanmisaka 
99*437bfbebSnyanmisaka     if (mpp_has_more_rbsp_data(p_bitctx)) {
100*437bfbebSnyanmisaka         READ_ONEBIT(p_bitctx, &cur_pps->transform_8x8_mode_flag);
101*437bfbebSnyanmisaka         READ_ONEBIT(p_bitctx, &cur_pps->pic_scaling_matrix_present_flag);
102*437bfbebSnyanmisaka         if (cur_pps->pic_scaling_matrix_present_flag) {
103*437bfbebSnyanmisaka             H264D_WARNNING("Picture scaling matrix present.");
104*437bfbebSnyanmisaka             FUN_CHECK(ret = parse_pps_calingLists(p_bitctx, cur_sps, cur_pps));
105*437bfbebSnyanmisaka         }
106*437bfbebSnyanmisaka         READ_SE(p_bitctx, &cur_pps->second_chroma_qp_index_offset);
107*437bfbebSnyanmisaka     } else {
108*437bfbebSnyanmisaka         cur_pps->transform_8x8_mode_flag = 0;
109*437bfbebSnyanmisaka         cur_pps->second_chroma_qp_index_offset = cur_pps->chroma_qp_index_offset;
110*437bfbebSnyanmisaka     }
111*437bfbebSnyanmisaka     cur_pps->Valid = 1;
112*437bfbebSnyanmisaka 
113*437bfbebSnyanmisaka     return ret = MPP_OK;
114*437bfbebSnyanmisaka 
115*437bfbebSnyanmisaka __BITREAD_ERR:
116*437bfbebSnyanmisaka     ret = p_bitctx->ret;
117*437bfbebSnyanmisaka __FAILED:
118*437bfbebSnyanmisaka 
119*437bfbebSnyanmisaka     return ret;
120*437bfbebSnyanmisaka }
121*437bfbebSnyanmisaka 
122*437bfbebSnyanmisaka 
123*437bfbebSnyanmisaka /*!
124*437bfbebSnyanmisaka ***********************************************************************
125*437bfbebSnyanmisaka * \brief
126*437bfbebSnyanmisaka *    parser pps and process pps
127*437bfbebSnyanmisaka ***********************************************************************
128*437bfbebSnyanmisaka */
129*437bfbebSnyanmisaka //extern "C"
process_pps(H264_SLICE_t * currSlice)130*437bfbebSnyanmisaka MPP_RET process_pps(H264_SLICE_t *currSlice)
131*437bfbebSnyanmisaka {
132*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
133*437bfbebSnyanmisaka 
134*437bfbebSnyanmisaka     H264dCurCtx_t *p_Cur = currSlice->p_Cur;
135*437bfbebSnyanmisaka     BitReadCtx_t *p_bitctx = &p_Cur->bitctx;
136*437bfbebSnyanmisaka     H264_PPS_t *cur_pps = &p_Cur->pps;
137*437bfbebSnyanmisaka 
138*437bfbebSnyanmisaka     reset_curpps_data(cur_pps);// reset
139*437bfbebSnyanmisaka 
140*437bfbebSnyanmisaka     FUN_CHECK(ret = parser_pps(p_bitctx, &p_Cur->sps, cur_pps));
141*437bfbebSnyanmisaka     //!< MakePPSavailable
142*437bfbebSnyanmisaka     ASSERT(cur_pps->Valid == 1);
143*437bfbebSnyanmisaka     if (!currSlice->p_Vid->ppsSet[cur_pps->pic_parameter_set_id]) {
144*437bfbebSnyanmisaka         currSlice->p_Vid->ppsSet[cur_pps->pic_parameter_set_id] = mpp_calloc(H264_PPS_t, 1);
145*437bfbebSnyanmisaka     }
146*437bfbebSnyanmisaka 
147*437bfbebSnyanmisaka     memcpy(currSlice->p_Vid->ppsSet[cur_pps->pic_parameter_set_id], cur_pps, sizeof(H264_PPS_t));
148*437bfbebSnyanmisaka     p_Cur->p_Vid->spspps_update = 1;
149*437bfbebSnyanmisaka 
150*437bfbebSnyanmisaka     return ret = MPP_OK;
151*437bfbebSnyanmisaka __FAILED:
152*437bfbebSnyanmisaka     return ret;
153*437bfbebSnyanmisaka }
154*437bfbebSnyanmisaka 
155*437bfbebSnyanmisaka /*!
156*437bfbebSnyanmisaka ***********************************************************************
157*437bfbebSnyanmisaka * \brief
158*437bfbebSnyanmisaka *    prase sps and process sps
159*437bfbebSnyanmisaka ***********************************************************************
160*437bfbebSnyanmisaka */
161*437bfbebSnyanmisaka //extern "C"
activate_pps(H264dVideoCtx_t * p_Vid,H264_PPS_t * pps)162*437bfbebSnyanmisaka MPP_RET activate_pps(H264dVideoCtx_t *p_Vid, H264_PPS_t *pps)
163*437bfbebSnyanmisaka {
164*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
165*437bfbebSnyanmisaka 
166*437bfbebSnyanmisaka     INP_CHECK(ret, !p_Vid && !pps);
167*437bfbebSnyanmisaka     if (p_Vid->active_pps != pps) {
168*437bfbebSnyanmisaka         if (p_Vid->dec_pic) {
169*437bfbebSnyanmisaka             //!< return if the last picture has already been finished
170*437bfbebSnyanmisaka             FUN_CHECK(ret = exit_picture(p_Vid, &p_Vid->dec_pic));
171*437bfbebSnyanmisaka         }
172*437bfbebSnyanmisaka         p_Vid->active_pps = pps;
173*437bfbebSnyanmisaka     }
174*437bfbebSnyanmisaka __RETURN:
175*437bfbebSnyanmisaka     return ret = MPP_OK;
176*437bfbebSnyanmisaka __FAILED:
177*437bfbebSnyanmisaka     return ret;
178*437bfbebSnyanmisaka }
179*437bfbebSnyanmisaka 
180*437bfbebSnyanmisaka /*!
181*437bfbebSnyanmisaka ***********************************************************************
182*437bfbebSnyanmisaka * \brief
183*437bfbebSnyanmisaka *    parser nal prefix
184*437bfbebSnyanmisaka ***********************************************************************
185*437bfbebSnyanmisaka */
186*437bfbebSnyanmisaka //extern "C"
process_prefix(H264_SLICE_t * currSlice)187*437bfbebSnyanmisaka MPP_RET process_prefix(H264_SLICE_t *currSlice)
188*437bfbebSnyanmisaka {
189*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
190*437bfbebSnyanmisaka 
191*437bfbebSnyanmisaka     H264dCurCtx_t *p_Cur = currSlice->p_Cur;
192*437bfbebSnyanmisaka     BitReadCtx_t *p_bitctx = &p_Cur->bitctx;
193*437bfbebSnyanmisaka     H264_PREFIX_t *cur_prefix = &p_Cur->prefix;
194*437bfbebSnyanmisaka 
195*437bfbebSnyanmisaka     if (currSlice->nal_reference_idc) {
196*437bfbebSnyanmisaka         READ_ONEBIT(p_bitctx, &cur_prefix->store_ref_base_pic_flag);
197*437bfbebSnyanmisaka 
198*437bfbebSnyanmisaka         if ((currSlice->svcExt.use_ref_base_pic_flag ||
199*437bfbebSnyanmisaka              cur_prefix->store_ref_base_pic_flag) &&
200*437bfbebSnyanmisaka             !currSlice->svcExt.idr_flag) {
201*437bfbebSnyanmisaka             H264D_LOG("read dec_ref_base_pic_marking\n");
202*437bfbebSnyanmisaka         }
203*437bfbebSnyanmisaka     }
204*437bfbebSnyanmisaka 
205*437bfbebSnyanmisaka     return ret = MPP_OK;
206*437bfbebSnyanmisaka __BITREAD_ERR:
207*437bfbebSnyanmisaka     return p_bitctx->ret;
208*437bfbebSnyanmisaka }
209