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