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_sps"
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_sps.h"
26*437bfbebSnyanmisaka #include "h264d_scalist.h"
27*437bfbebSnyanmisaka #include "h264d_dpb.h"
28*437bfbebSnyanmisaka
29*437bfbebSnyanmisaka #define MAX_CPB 240000 /* for level 5.1 */
30*437bfbebSnyanmisaka #define MAX_BR 240000 /* for level 5.1 */
31*437bfbebSnyanmisaka
reset_cur_sps_data(H264_SPS_t * cur_sps)32*437bfbebSnyanmisaka static void reset_cur_sps_data(H264_SPS_t *cur_sps)
33*437bfbebSnyanmisaka {
34*437bfbebSnyanmisaka memset(cur_sps, 0, sizeof(H264_SPS_t));
35*437bfbebSnyanmisaka cur_sps->seq_parameter_set_id = 0; // reset
36*437bfbebSnyanmisaka }
37*437bfbebSnyanmisaka
reset_cur_subpps_data(H264_subSPS_t * cur_subpps)38*437bfbebSnyanmisaka static void reset_cur_subpps_data(H264_subSPS_t *cur_subpps)
39*437bfbebSnyanmisaka {
40*437bfbebSnyanmisaka memset(cur_subpps, 0, sizeof(H264_subSPS_t));
41*437bfbebSnyanmisaka cur_subpps->sps.seq_parameter_set_id = 0; // reset
42*437bfbebSnyanmisaka cur_subpps->num_views_minus1 = -1;
43*437bfbebSnyanmisaka cur_subpps->num_level_values_signalled_minus1 = -1;
44*437bfbebSnyanmisaka }
45*437bfbebSnyanmisaka
read_hrd_parameters(BitReadCtx_t * p_bitctx,H264_HRD_t * hrd)46*437bfbebSnyanmisaka static MPP_RET read_hrd_parameters(BitReadCtx_t *p_bitctx, H264_HRD_t *hrd)
47*437bfbebSnyanmisaka {
48*437bfbebSnyanmisaka RK_U32 SchedSelIdx = 0;
49*437bfbebSnyanmisaka MPP_RET ret = MPP_ERR_UNKNOW;
50*437bfbebSnyanmisaka READ_UE(p_bitctx, &hrd->cpb_cnt_minus1);
51*437bfbebSnyanmisaka VAL_CHECK(ret, hrd->cpb_cnt_minus1 < MAXIMUMVALUEOFcpb_cnt);
52*437bfbebSnyanmisaka hrd->cpb_cnt_minus1 += 1;
53*437bfbebSnyanmisaka READ_BITS(p_bitctx, 4, &hrd->bit_rate_scale);
54*437bfbebSnyanmisaka READ_BITS(p_bitctx, 4, &hrd->cpb_size_scale);
55*437bfbebSnyanmisaka for (SchedSelIdx = 0; SchedSelIdx < hrd->cpb_cnt_minus1; SchedSelIdx++) {
56*437bfbebSnyanmisaka READ_UE(p_bitctx, &hrd->bit_rate_value_minus1[SchedSelIdx]);
57*437bfbebSnyanmisaka READ_UE(p_bitctx, &hrd->cpb_size_value_minus1[SchedSelIdx]);
58*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &hrd->cbr_flag[SchedSelIdx]);
59*437bfbebSnyanmisaka }
60*437bfbebSnyanmisaka READ_BITS(p_bitctx, 5, &hrd->initial_cpb_removal_delay_length_minus1);
61*437bfbebSnyanmisaka hrd->initial_cpb_removal_delay_length_minus1 += 1;
62*437bfbebSnyanmisaka READ_BITS(p_bitctx, 5, &hrd->cpb_removal_delay_length_minus1);
63*437bfbebSnyanmisaka hrd->cpb_removal_delay_length_minus1 += 1;
64*437bfbebSnyanmisaka READ_BITS(p_bitctx, 5, &hrd->dpb_output_delay_length_minus1);
65*437bfbebSnyanmisaka hrd->dpb_output_delay_length_minus1 += 1;
66*437bfbebSnyanmisaka READ_BITS(p_bitctx, 5, &hrd->time_offset_length);
67*437bfbebSnyanmisaka
68*437bfbebSnyanmisaka return ret = MPP_OK;
69*437bfbebSnyanmisaka __BITREAD_ERR:
70*437bfbebSnyanmisaka return ret = p_bitctx->ret;
71*437bfbebSnyanmisaka __FAILED:
72*437bfbebSnyanmisaka return ret;
73*437bfbebSnyanmisaka }
74*437bfbebSnyanmisaka
init_VUI(H264_VUI_t * vui)75*437bfbebSnyanmisaka static void init_VUI(H264_VUI_t *vui)
76*437bfbebSnyanmisaka {
77*437bfbebSnyanmisaka vui->matrix_coefficients = 2;
78*437bfbebSnyanmisaka }
79*437bfbebSnyanmisaka
read_VUI(BitReadCtx_t * p_bitctx,H264_VUI_t * vui)80*437bfbebSnyanmisaka static MPP_RET read_VUI(BitReadCtx_t *p_bitctx, H264_VUI_t *vui)
81*437bfbebSnyanmisaka {
82*437bfbebSnyanmisaka MPP_RET ret = MPP_ERR_UNKNOW;
83*437bfbebSnyanmisaka
84*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &vui->aspect_ratio_info_present_flag);
85*437bfbebSnyanmisaka if (vui->aspect_ratio_info_present_flag) {
86*437bfbebSnyanmisaka READ_BITS(p_bitctx, 8, &vui->aspect_ratio_idc);
87*437bfbebSnyanmisaka if (255 == vui->aspect_ratio_idc) {
88*437bfbebSnyanmisaka READ_BITS(p_bitctx, 16, &vui->sar_width);
89*437bfbebSnyanmisaka READ_BITS(p_bitctx, 16, &vui->sar_height);
90*437bfbebSnyanmisaka }
91*437bfbebSnyanmisaka }
92*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &vui->overscan_info_present_flag);
93*437bfbebSnyanmisaka if (vui->overscan_info_present_flag) {
94*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &vui->overscan_appropriate_flag);
95*437bfbebSnyanmisaka }
96*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &vui->video_signal_type_present_flag);
97*437bfbebSnyanmisaka if (vui->video_signal_type_present_flag) {
98*437bfbebSnyanmisaka READ_BITS(p_bitctx, 3, &vui->video_format);
99*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &vui->video_full_range_flag);
100*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &vui->colour_description_present_flag);
101*437bfbebSnyanmisaka if (vui->colour_description_present_flag) {
102*437bfbebSnyanmisaka READ_BITS(p_bitctx, 8, &vui->colour_primaries);
103*437bfbebSnyanmisaka READ_BITS(p_bitctx, 8, &vui->transfer_characteristics);
104*437bfbebSnyanmisaka READ_BITS(p_bitctx, 8, &vui->matrix_coefficients);
105*437bfbebSnyanmisaka if (vui->matrix_coefficients >= MPP_FRAME_SPC_NB)
106*437bfbebSnyanmisaka vui->matrix_coefficients = MPP_FRAME_SPC_UNSPECIFIED;
107*437bfbebSnyanmisaka }
108*437bfbebSnyanmisaka }
109*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &vui->chroma_location_info_present_flag);
110*437bfbebSnyanmisaka if (vui->chroma_location_info_present_flag) {
111*437bfbebSnyanmisaka READ_UE(p_bitctx, &vui->chroma_sample_loc_type_top_field);
112*437bfbebSnyanmisaka READ_UE(p_bitctx, &vui->chroma_sample_loc_type_bottom_field);
113*437bfbebSnyanmisaka }
114*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &vui->timing_info_present_flag);
115*437bfbebSnyanmisaka if (vui->timing_info_present_flag) {
116*437bfbebSnyanmisaka READ_BITS_LONG(p_bitctx, 32, &vui->num_units_in_tick);
117*437bfbebSnyanmisaka READ_BITS_LONG(p_bitctx, 32, &vui->time_scale);
118*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &vui->fixed_frame_rate_flag);
119*437bfbebSnyanmisaka }
120*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &vui->nal_hrd_parameters_present_flag);
121*437bfbebSnyanmisaka if (vui->nal_hrd_parameters_present_flag) {
122*437bfbebSnyanmisaka FUN_CHECK(ret = read_hrd_parameters(p_bitctx, &vui->nal_hrd_parameters));
123*437bfbebSnyanmisaka } else {
124*437bfbebSnyanmisaka vui->nal_hrd_parameters.cpb_cnt_minus1 = 1;
125*437bfbebSnyanmisaka /* MaxBR and MaxCPB should be the values correspondig to the levelIdc
126*437bfbebSnyanmisaka * in the SPS containing these VUI parameters. However, these values
127*437bfbebSnyanmisaka * are not used anywhere and maximum for any level will be used here */
128*437bfbebSnyanmisaka vui->nal_hrd_parameters.bit_rate_value_minus1[0] = 1000 * MAX_BR + 1;
129*437bfbebSnyanmisaka vui->nal_hrd_parameters.cpb_size_value_minus1[0] = 1000 * MAX_CPB + 1;
130*437bfbebSnyanmisaka vui->nal_hrd_parameters.initial_cpb_removal_delay_length_minus1 = 24;
131*437bfbebSnyanmisaka vui->nal_hrd_parameters.cpb_removal_delay_length_minus1 = 24;
132*437bfbebSnyanmisaka vui->nal_hrd_parameters.dpb_output_delay_length_minus1 = 24;
133*437bfbebSnyanmisaka vui->nal_hrd_parameters.time_offset_length = 24;
134*437bfbebSnyanmisaka }
135*437bfbebSnyanmisaka
136*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &vui->vcl_hrd_parameters_present_flag);
137*437bfbebSnyanmisaka if (vui->vcl_hrd_parameters_present_flag) {
138*437bfbebSnyanmisaka FUN_CHECK(ret = read_hrd_parameters(p_bitctx, &vui->vcl_hrd_parameters));
139*437bfbebSnyanmisaka } else {
140*437bfbebSnyanmisaka vui->vcl_hrd_parameters.cpb_cnt_minus1 = 0;
141*437bfbebSnyanmisaka /* MaxBR and MaxCPB should be the values correspondig to the levelIdc
142*437bfbebSnyanmisaka * in the SPS containing these VUI parameters. However, these values
143*437bfbebSnyanmisaka * are not used anywhere and maximum for any level will be used here */
144*437bfbebSnyanmisaka vui->vcl_hrd_parameters.bit_rate_value_minus1[0] = 1000 * MAX_BR + 1;
145*437bfbebSnyanmisaka vui->vcl_hrd_parameters.cpb_size_value_minus1[0] = 1000 * MAX_CPB + 1;
146*437bfbebSnyanmisaka vui->vcl_hrd_parameters.initial_cpb_removal_delay_length_minus1 = 24;
147*437bfbebSnyanmisaka vui->vcl_hrd_parameters.cpb_removal_delay_length_minus1 = 24;
148*437bfbebSnyanmisaka vui->vcl_hrd_parameters.dpb_output_delay_length_minus1 = 24;
149*437bfbebSnyanmisaka vui->vcl_hrd_parameters.time_offset_length = 24;
150*437bfbebSnyanmisaka }
151*437bfbebSnyanmisaka if (vui->nal_hrd_parameters_present_flag || vui->vcl_hrd_parameters_present_flag) {
152*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &vui->low_delay_hrd_flag);
153*437bfbebSnyanmisaka }
154*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &vui->pic_struct_present_flag);
155*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &vui->bitstream_restriction_flag);
156*437bfbebSnyanmisaka if (vui->bitstream_restriction_flag) {
157*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &vui->motion_vectors_over_pic_boundaries_flag);
158*437bfbebSnyanmisaka READ_UE(p_bitctx, &vui->max_bytes_per_pic_denom);
159*437bfbebSnyanmisaka READ_UE(p_bitctx, &vui->max_bits_per_mb_denom);
160*437bfbebSnyanmisaka READ_UE(p_bitctx, &vui->log2_max_mv_length_horizontal);
161*437bfbebSnyanmisaka READ_UE(p_bitctx, &vui->log2_max_mv_length_vertical);
162*437bfbebSnyanmisaka READ_UE(p_bitctx, &vui->num_reorder_frames);
163*437bfbebSnyanmisaka READ_UE(p_bitctx, &vui->max_dec_frame_buffering);
164*437bfbebSnyanmisaka }
165*437bfbebSnyanmisaka
166*437bfbebSnyanmisaka return ret = MPP_OK;
167*437bfbebSnyanmisaka __BITREAD_ERR:
168*437bfbebSnyanmisaka ret = p_bitctx->ret;
169*437bfbebSnyanmisaka __FAILED:
170*437bfbebSnyanmisaka return ret;
171*437bfbebSnyanmisaka }
172*437bfbebSnyanmisaka
parser_sps(BitReadCtx_t * p_bitctx,H264_SPS_t * cur_sps,H264_DecCtx_t * p_Dec)173*437bfbebSnyanmisaka static MPP_RET parser_sps(BitReadCtx_t *p_bitctx, H264_SPS_t *cur_sps, H264_DecCtx_t *p_Dec)
174*437bfbebSnyanmisaka {
175*437bfbebSnyanmisaka RK_S32 i = 0, temp = 0;
176*437bfbebSnyanmisaka MPP_RET ret = MPP_ERR_UNKNOW;
177*437bfbebSnyanmisaka //!< init Fidelity Range Extensions stuff
178*437bfbebSnyanmisaka cur_sps->chroma_format_idc = 1;
179*437bfbebSnyanmisaka cur_sps->bit_depth_luma_minus8 = 0;
180*437bfbebSnyanmisaka cur_sps->bit_depth_chroma_minus8 = 0;
181*437bfbebSnyanmisaka cur_sps->qpprime_y_zero_transform_bypass_flag = 0;
182*437bfbebSnyanmisaka cur_sps->separate_colour_plane_flag = 0;
183*437bfbebSnyanmisaka cur_sps->log2_max_pic_order_cnt_lsb_minus4 = 0;
184*437bfbebSnyanmisaka cur_sps->delta_pic_order_always_zero_flag = 0;
185*437bfbebSnyanmisaka p_Dec->errctx.un_spt_flag = 0; // init unspport flag first
186*437bfbebSnyanmisaka
187*437bfbebSnyanmisaka READ_BITS(p_bitctx, 8, &cur_sps->profile_idc);
188*437bfbebSnyanmisaka VAL_CHECK (ret, (cur_sps->profile_idc == H264_PROFILE_BASELINE)
189*437bfbebSnyanmisaka || (cur_sps->profile_idc == H264_PROFILE_MAIN)
190*437bfbebSnyanmisaka || (cur_sps->profile_idc == H264_PROFILE_EXTENDED)
191*437bfbebSnyanmisaka || (cur_sps->profile_idc == H264_PROFILE_HIGH)
192*437bfbebSnyanmisaka || (cur_sps->profile_idc == H264_PROFILE_HIGH10)
193*437bfbebSnyanmisaka || (cur_sps->profile_idc == H264_PROFILE_HIGH422)
194*437bfbebSnyanmisaka || (cur_sps->profile_idc == H264_PROFILE_HIGH444)
195*437bfbebSnyanmisaka || (cur_sps->profile_idc == H264_PROFILE_FREXT_CAVLC444)
196*437bfbebSnyanmisaka || (cur_sps->profile_idc == H264_PROFILE_MVC_HIGH)
197*437bfbebSnyanmisaka || (cur_sps->profile_idc == H264_PROFILE_STEREO_HIGH)
198*437bfbebSnyanmisaka );
199*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &cur_sps->constrained_set0_flag);
200*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &cur_sps->constrained_set1_flag);
201*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &cur_sps->constrained_set2_flag);
202*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &cur_sps->constrained_set3_flag);
203*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &cur_sps->constrained_set4_flag);
204*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &cur_sps->constrained_set5_flag);
205*437bfbebSnyanmisaka READ_BITS(p_bitctx, 2, &temp); //!< reserved_zero_2bits
206*437bfbebSnyanmisaka ASSERT(temp == 0);
207*437bfbebSnyanmisaka READ_BITS(p_bitctx, 8, &cur_sps->level_idc);
208*437bfbebSnyanmisaka READ_UE(p_bitctx, &cur_sps->seq_parameter_set_id);
209*437bfbebSnyanmisaka if (cur_sps->seq_parameter_set_id >= MAXSPS) {
210*437bfbebSnyanmisaka cur_sps->seq_parameter_set_id = 0;
211*437bfbebSnyanmisaka }
212*437bfbebSnyanmisaka if (cur_sps->profile_idc == 100 || cur_sps->profile_idc == 110
213*437bfbebSnyanmisaka || cur_sps->profile_idc == 122 || cur_sps->profile_idc == 244
214*437bfbebSnyanmisaka || cur_sps->profile_idc == 44 || cur_sps->profile_idc == 83
215*437bfbebSnyanmisaka || cur_sps->profile_idc == 86 || cur_sps->profile_idc == 118
216*437bfbebSnyanmisaka || cur_sps->profile_idc == 128 || cur_sps->profile_idc == 138) {
217*437bfbebSnyanmisaka READ_UE(p_bitctx, &cur_sps->chroma_format_idc);
218*437bfbebSnyanmisaka /* check invalid chroma format idc */
219*437bfbebSnyanmisaka VAL_CHECK (ret, (cur_sps->chroma_format_idc <= H264_CHROMA_444));
220*437bfbebSnyanmisaka /* TODO: check unsupport chroma format by hardware capacity */
221*437bfbebSnyanmisaka if (cur_sps->chroma_format_idc > H264_CHROMA_422) {
222*437bfbebSnyanmisaka H264D_ERR("ERROR: Not support chroma_format_idc %d", cur_sps->chroma_format_idc);
223*437bfbebSnyanmisaka p_Dec->errctx.un_spt_flag = MPP_FRAME_ERR_UNSUPPORT;
224*437bfbebSnyanmisaka goto __FAILED;
225*437bfbebSnyanmisaka }
226*437bfbebSnyanmisaka READ_UE(p_bitctx, &cur_sps->bit_depth_luma_minus8);
227*437bfbebSnyanmisaka ASSERT(cur_sps->bit_depth_luma_minus8 < 7);
228*437bfbebSnyanmisaka READ_UE(p_bitctx, &cur_sps->bit_depth_chroma_minus8);
229*437bfbebSnyanmisaka ASSERT(cur_sps->bit_depth_chroma_minus8 < 7);
230*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &cur_sps->qpprime_y_zero_transform_bypass_flag);
231*437bfbebSnyanmisaka if (cur_sps->qpprime_y_zero_transform_bypass_flag == 1) {
232*437bfbebSnyanmisaka H264D_ERR("ERROR: Not support high 4:4:4 lossless mode");
233*437bfbebSnyanmisaka p_Dec->errctx.un_spt_flag = MPP_FRAME_ERR_UNSUPPORT;
234*437bfbebSnyanmisaka goto __FAILED;
235*437bfbebSnyanmisaka }
236*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &cur_sps->seq_scaling_matrix_present_flag);
237*437bfbebSnyanmisaka if (cur_sps->seq_scaling_matrix_present_flag) {
238*437bfbebSnyanmisaka H264D_WARNNING("Scaling matrix present.");
239*437bfbebSnyanmisaka if (parse_sps_scalinglists(p_bitctx, cur_sps)) {
240*437bfbebSnyanmisaka mpp_log_f(" parse_sps_scaling_list error.");
241*437bfbebSnyanmisaka }
242*437bfbebSnyanmisaka }
243*437bfbebSnyanmisaka }
244*437bfbebSnyanmisaka READ_UE(p_bitctx, &cur_sps->log2_max_frame_num_minus4);
245*437bfbebSnyanmisaka ASSERT(cur_sps->log2_max_frame_num_minus4 < 13);
246*437bfbebSnyanmisaka READ_UE(p_bitctx, &cur_sps->pic_order_cnt_type);
247*437bfbebSnyanmisaka ASSERT(cur_sps->pic_order_cnt_type < 3);
248*437bfbebSnyanmisaka
249*437bfbebSnyanmisaka cur_sps->log2_max_pic_order_cnt_lsb_minus4 = 0;
250*437bfbebSnyanmisaka cur_sps->delta_pic_order_always_zero_flag = 0;
251*437bfbebSnyanmisaka if (0 == cur_sps->pic_order_cnt_type) {
252*437bfbebSnyanmisaka READ_UE(p_bitctx, &cur_sps->log2_max_pic_order_cnt_lsb_minus4);
253*437bfbebSnyanmisaka ASSERT(cur_sps->log2_max_pic_order_cnt_lsb_minus4 < 13);
254*437bfbebSnyanmisaka } else if (1 == cur_sps->pic_order_cnt_type) {
255*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &cur_sps->delta_pic_order_always_zero_flag);
256*437bfbebSnyanmisaka READ_SE(p_bitctx, &cur_sps->offset_for_non_ref_pic);
257*437bfbebSnyanmisaka READ_SE(p_bitctx, &cur_sps->offset_for_top_to_bottom_field);
258*437bfbebSnyanmisaka READ_UE(p_bitctx, &cur_sps->num_ref_frames_in_pic_order_cnt_cycle);
259*437bfbebSnyanmisaka VAL_CHECK(ret, cur_sps->num_ref_frames_in_pic_order_cnt_cycle < 256);
260*437bfbebSnyanmisaka for (i = 0; i < cur_sps->num_ref_frames_in_pic_order_cnt_cycle; ++i) {
261*437bfbebSnyanmisaka READ_SE(p_bitctx, &cur_sps->offset_for_ref_frame[i]);
262*437bfbebSnyanmisaka cur_sps->expected_delta_per_pic_order_cnt_cycle += cur_sps->offset_for_ref_frame[i];
263*437bfbebSnyanmisaka }
264*437bfbebSnyanmisaka }
265*437bfbebSnyanmisaka READ_UE(p_bitctx, &cur_sps->max_num_ref_frames);
266*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &cur_sps->gaps_in_frame_num_value_allowed_flag);
267*437bfbebSnyanmisaka READ_UE(p_bitctx, &cur_sps->pic_width_in_mbs_minus1);
268*437bfbebSnyanmisaka READ_UE(p_bitctx, &cur_sps->pic_height_in_map_units_minus1);
269*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &cur_sps->frame_mbs_only_flag);
270*437bfbebSnyanmisaka if (!cur_sps->frame_mbs_only_flag) {
271*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &cur_sps->mb_adaptive_frame_field_flag);
272*437bfbebSnyanmisaka }
273*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &cur_sps->direct_8x8_inference_flag);
274*437bfbebSnyanmisaka
275*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &cur_sps->frame_cropping_flag);
276*437bfbebSnyanmisaka if (cur_sps->frame_cropping_flag) {
277*437bfbebSnyanmisaka READ_UE(p_bitctx, &cur_sps->frame_crop_left_offset);
278*437bfbebSnyanmisaka READ_UE(p_bitctx, &cur_sps->frame_crop_right_offset);
279*437bfbebSnyanmisaka READ_UE(p_bitctx, &cur_sps->frame_crop_top_offset);
280*437bfbebSnyanmisaka READ_UE(p_bitctx, &cur_sps->frame_crop_bottom_offset);
281*437bfbebSnyanmisaka }
282*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &cur_sps->vui_parameters_present_flag);
283*437bfbebSnyanmisaka
284*437bfbebSnyanmisaka if (cur_sps->vui_parameters_present_flag) {
285*437bfbebSnyanmisaka init_VUI(&cur_sps->vui_seq_parameters);
286*437bfbebSnyanmisaka ret = read_VUI(p_bitctx, &cur_sps->vui_seq_parameters);
287*437bfbebSnyanmisaka }
288*437bfbebSnyanmisaka cur_sps->Valid = 1;
289*437bfbebSnyanmisaka (void)p_Dec;
290*437bfbebSnyanmisaka
291*437bfbebSnyanmisaka return ret = MPP_OK;
292*437bfbebSnyanmisaka __BITREAD_ERR:
293*437bfbebSnyanmisaka ret = p_bitctx->ret;
294*437bfbebSnyanmisaka __FAILED:
295*437bfbebSnyanmisaka return ret;
296*437bfbebSnyanmisaka }
297*437bfbebSnyanmisaka
sps_mvc_extension(BitReadCtx_t * p_bitctx,H264_subSPS_t * subset_sps)298*437bfbebSnyanmisaka static MPP_RET sps_mvc_extension(BitReadCtx_t *p_bitctx, H264_subSPS_t *subset_sps)
299*437bfbebSnyanmisaka {
300*437bfbebSnyanmisaka MPP_RET ret = MPP_ERR_UNKNOW;
301*437bfbebSnyanmisaka RK_S32 i = 0, j = 0, num_views = 0;
302*437bfbebSnyanmisaka
303*437bfbebSnyanmisaka READ_UE(p_bitctx, &subset_sps->num_views_minus1);
304*437bfbebSnyanmisaka VAL_CHECK(ret, subset_sps->num_views_minus1 < 16);
305*437bfbebSnyanmisaka num_views = 1 + subset_sps->num_views_minus1;
306*437bfbebSnyanmisaka //========================
307*437bfbebSnyanmisaka if (num_views > 0) {
308*437bfbebSnyanmisaka subset_sps->view_id = mpp_calloc(RK_S32, num_views);
309*437bfbebSnyanmisaka subset_sps->num_anchor_refs_l0 = mpp_calloc(RK_S32, num_views);
310*437bfbebSnyanmisaka subset_sps->num_anchor_refs_l1 = mpp_calloc(RK_S32, num_views);
311*437bfbebSnyanmisaka subset_sps->anchor_ref_l0 = mpp_calloc(RK_S32*, num_views);
312*437bfbebSnyanmisaka subset_sps->anchor_ref_l1 = mpp_calloc(RK_S32*, num_views);
313*437bfbebSnyanmisaka subset_sps->num_non_anchor_refs_l0 = mpp_calloc(RK_S32, num_views);
314*437bfbebSnyanmisaka subset_sps->num_non_anchor_refs_l1 = mpp_calloc(RK_S32, num_views);
315*437bfbebSnyanmisaka subset_sps->non_anchor_ref_l0 = mpp_calloc(RK_S32*, num_views);
316*437bfbebSnyanmisaka subset_sps->non_anchor_ref_l1 = mpp_calloc(RK_S32*, num_views);
317*437bfbebSnyanmisaka MEM_CHECK(ret, subset_sps->view_id && subset_sps->num_anchor_refs_l0
318*437bfbebSnyanmisaka && subset_sps->num_anchor_refs_l1 && subset_sps->anchor_ref_l0
319*437bfbebSnyanmisaka && subset_sps->anchor_ref_l1 && subset_sps->num_non_anchor_refs_l0
320*437bfbebSnyanmisaka && subset_sps->num_non_anchor_refs_l1 && subset_sps->non_anchor_ref_l0
321*437bfbebSnyanmisaka && subset_sps->non_anchor_ref_l1);
322*437bfbebSnyanmisaka }
323*437bfbebSnyanmisaka for (i = 0; i < num_views; i++) {
324*437bfbebSnyanmisaka READ_UE(p_bitctx, &subset_sps->view_id[i]);
325*437bfbebSnyanmisaka }
326*437bfbebSnyanmisaka for (i = 1; i < num_views; i++) {
327*437bfbebSnyanmisaka READ_UE(p_bitctx, &subset_sps->num_anchor_refs_l0[i]);
328*437bfbebSnyanmisaka if (subset_sps->num_anchor_refs_l0[i]) {
329*437bfbebSnyanmisaka subset_sps->anchor_ref_l0[i] = mpp_calloc(RK_S32, subset_sps->num_anchor_refs_l0[i]);
330*437bfbebSnyanmisaka MEM_CHECK(ret, subset_sps->anchor_ref_l0[i]);
331*437bfbebSnyanmisaka for (j = 0; j < subset_sps->num_anchor_refs_l0[i]; j++) {
332*437bfbebSnyanmisaka READ_UE(p_bitctx, &subset_sps->anchor_ref_l0[i][j]);
333*437bfbebSnyanmisaka }
334*437bfbebSnyanmisaka }
335*437bfbebSnyanmisaka READ_UE(p_bitctx, &subset_sps->num_anchor_refs_l1[i]);
336*437bfbebSnyanmisaka if (subset_sps->num_anchor_refs_l1[i]) {
337*437bfbebSnyanmisaka subset_sps->anchor_ref_l1[i] = mpp_calloc(RK_S32, subset_sps->num_anchor_refs_l1[i]);
338*437bfbebSnyanmisaka MEM_CHECK(ret, subset_sps->anchor_ref_l1[i]);
339*437bfbebSnyanmisaka for (j = 0; j < subset_sps->num_anchor_refs_l1[i]; j++) {
340*437bfbebSnyanmisaka READ_UE(p_bitctx, &subset_sps->anchor_ref_l1[i][j]);
341*437bfbebSnyanmisaka }
342*437bfbebSnyanmisaka }
343*437bfbebSnyanmisaka }
344*437bfbebSnyanmisaka for (i = 1; i < num_views; i++) {
345*437bfbebSnyanmisaka READ_UE(p_bitctx, &subset_sps->num_non_anchor_refs_l0[i]);
346*437bfbebSnyanmisaka if (subset_sps->num_non_anchor_refs_l0[i]) {
347*437bfbebSnyanmisaka subset_sps->non_anchor_ref_l0[i] = mpp_calloc(RK_S32, subset_sps->num_non_anchor_refs_l0[i]);
348*437bfbebSnyanmisaka MEM_CHECK(ret, subset_sps->non_anchor_ref_l0[i]);
349*437bfbebSnyanmisaka for (j = 0; j < subset_sps->num_non_anchor_refs_l0[i]; j++) {
350*437bfbebSnyanmisaka READ_UE(p_bitctx, &subset_sps->non_anchor_ref_l0[i][j]);
351*437bfbebSnyanmisaka }
352*437bfbebSnyanmisaka }
353*437bfbebSnyanmisaka READ_UE(p_bitctx, &subset_sps->num_non_anchor_refs_l1[i]);
354*437bfbebSnyanmisaka if (subset_sps->num_non_anchor_refs_l1[i]) {
355*437bfbebSnyanmisaka subset_sps->non_anchor_ref_l1[i] = mpp_calloc(RK_S32, subset_sps->num_non_anchor_refs_l1[i]);
356*437bfbebSnyanmisaka MEM_CHECK(ret, subset_sps->non_anchor_ref_l1[i]);
357*437bfbebSnyanmisaka
358*437bfbebSnyanmisaka for (j = 0; j < subset_sps->num_non_anchor_refs_l1[i]; j++) {
359*437bfbebSnyanmisaka READ_UE(p_bitctx, &subset_sps->non_anchor_ref_l1[i][j]);
360*437bfbebSnyanmisaka }
361*437bfbebSnyanmisaka }
362*437bfbebSnyanmisaka }
363*437bfbebSnyanmisaka return ret = MPP_OK;
364*437bfbebSnyanmisaka __BITREAD_ERR:
365*437bfbebSnyanmisaka ret = p_bitctx->ret;
366*437bfbebSnyanmisaka __FAILED:
367*437bfbebSnyanmisaka return ret;
368*437bfbebSnyanmisaka }
369*437bfbebSnyanmisaka
parser_subsps_ext(BitReadCtx_t * p_bitctx,H264_subSPS_t * cur_subsps)370*437bfbebSnyanmisaka static MPP_RET parser_subsps_ext(BitReadCtx_t *p_bitctx, H264_subSPS_t *cur_subsps)
371*437bfbebSnyanmisaka {
372*437bfbebSnyanmisaka MPP_RET ret = MPP_ERR_UNKNOW;
373*437bfbebSnyanmisaka
374*437bfbebSnyanmisaka if ((cur_subsps->sps.profile_idc == H264_PROFILE_MVC_HIGH)
375*437bfbebSnyanmisaka || (cur_subsps->sps.profile_idc == H264_PROFILE_STEREO_HIGH)) {
376*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &cur_subsps->bit_equal_to_one);
377*437bfbebSnyanmisaka ASSERT(cur_subsps->bit_equal_to_one == 1);
378*437bfbebSnyanmisaka FUN_CHECK(ret = sps_mvc_extension(p_bitctx, cur_subsps));
379*437bfbebSnyanmisaka
380*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &cur_subsps->mvc_vui_parameters_present_flag);
381*437bfbebSnyanmisaka }
382*437bfbebSnyanmisaka
383*437bfbebSnyanmisaka return ret = MPP_OK;
384*437bfbebSnyanmisaka __BITREAD_ERR:
385*437bfbebSnyanmisaka ret = p_bitctx->ret;
386*437bfbebSnyanmisaka __FAILED:
387*437bfbebSnyanmisaka return ret;
388*437bfbebSnyanmisaka }
389*437bfbebSnyanmisaka
update_video_pars(H264dVideoCtx_t * p_Vid,H264_SPS_t * sps)390*437bfbebSnyanmisaka static void update_video_pars(H264dVideoCtx_t *p_Vid, H264_SPS_t *sps)
391*437bfbebSnyanmisaka {
392*437bfbebSnyanmisaka RK_U32 crop_left = 0, crop_right = 0;
393*437bfbebSnyanmisaka RK_U32 crop_top = 0, crop_bottom = 0;
394*437bfbebSnyanmisaka static const RK_U32 SubWidthC [4] = { 1, 2, 2, 1};
395*437bfbebSnyanmisaka static const RK_U32 SubHeightC [4] = { 1, 2, 1, 1};
396*437bfbebSnyanmisaka
397*437bfbebSnyanmisaka
398*437bfbebSnyanmisaka p_Vid->max_frame_num = 1 << (sps->log2_max_frame_num_minus4 + 4);
399*437bfbebSnyanmisaka p_Vid->PicWidthInMbs = (sps->pic_width_in_mbs_minus1 + 1);
400*437bfbebSnyanmisaka p_Vid->FrameHeightInMbs = (2 - sps->frame_mbs_only_flag) * (sps->pic_height_in_map_units_minus1 + 1);
401*437bfbebSnyanmisaka p_Vid->yuv_format = sps->chroma_format_idc;
402*437bfbebSnyanmisaka p_Vid->frame_mbs_only_flag = sps->frame_mbs_only_flag;
403*437bfbebSnyanmisaka
404*437bfbebSnyanmisaka p_Vid->width = p_Vid->PicWidthInMbs * 16;
405*437bfbebSnyanmisaka p_Vid->height = p_Vid->FrameHeightInMbs * 16;
406*437bfbebSnyanmisaka p_Vid->bit_depth_luma = sps->bit_depth_luma_minus8 + 8;
407*437bfbebSnyanmisaka p_Vid->bit_depth_chroma = sps->bit_depth_chroma_minus8 + 8;
408*437bfbebSnyanmisaka
409*437bfbebSnyanmisaka if (p_Vid->yuv_format == H264_CHROMA_420) {
410*437bfbebSnyanmisaka p_Vid->width_cr = (p_Vid->width >> 1);
411*437bfbebSnyanmisaka p_Vid->height_cr = (p_Vid->height >> 1);
412*437bfbebSnyanmisaka } else if (p_Vid->yuv_format == H264_CHROMA_422) {
413*437bfbebSnyanmisaka p_Vid->width_cr = (p_Vid->width >> 1);
414*437bfbebSnyanmisaka p_Vid->height_cr = p_Vid->height;
415*437bfbebSnyanmisaka }
416*437bfbebSnyanmisaka //!< calculate frame_width_after_crop && frame_height_after_crop
417*437bfbebSnyanmisaka if (sps->frame_cropping_flag) {
418*437bfbebSnyanmisaka crop_left = SubWidthC [sps->chroma_format_idc] * sps->frame_crop_left_offset;
419*437bfbebSnyanmisaka crop_right = SubWidthC [sps->chroma_format_idc] * sps->frame_crop_right_offset;
420*437bfbebSnyanmisaka crop_top = SubHeightC[sps->chroma_format_idc] * ( 2 - sps->frame_mbs_only_flag ) * sps->frame_crop_top_offset;
421*437bfbebSnyanmisaka crop_bottom = SubHeightC[sps->chroma_format_idc] * ( 2 - sps->frame_mbs_only_flag ) * sps->frame_crop_bottom_offset;
422*437bfbebSnyanmisaka } else {
423*437bfbebSnyanmisaka crop_left = crop_right = crop_top = crop_bottom = 0;
424*437bfbebSnyanmisaka }
425*437bfbebSnyanmisaka p_Vid->width_after_crop = p_Vid->width - crop_left - crop_right;
426*437bfbebSnyanmisaka p_Vid->height_after_crop = p_Vid->height - crop_top - crop_bottom;
427*437bfbebSnyanmisaka }
428*437bfbebSnyanmisaka
video_pars_changed(H264dVideoCtx_t * p_Vid,H264_SPS_t * sps,RK_U8 layer_id)429*437bfbebSnyanmisaka static RK_U32 video_pars_changed(H264dVideoCtx_t *p_Vid, H264_SPS_t *sps, RK_U8 layer_id)
430*437bfbebSnyanmisaka {
431*437bfbebSnyanmisaka RK_U32 ret = 0;
432*437bfbebSnyanmisaka
433*437bfbebSnyanmisaka ret |= p_Vid->p_Dpb_layer[layer_id]->num_ref_frames != sps->max_num_ref_frames;
434*437bfbebSnyanmisaka ret |= p_Vid->last_pic_width_in_mbs_minus1[layer_id] != sps->pic_width_in_mbs_minus1;
435*437bfbebSnyanmisaka ret |= p_Vid->last_pic_height_in_map_units_minus1[layer_id] != sps->pic_height_in_map_units_minus1;
436*437bfbebSnyanmisaka ret |= p_Vid->last_profile_idc[layer_id] != sps->profile_idc;
437*437bfbebSnyanmisaka ret |= p_Vid->last_level_idc[layer_id] != sps->level_idc;
438*437bfbebSnyanmisaka ret |= !p_Vid->p_Dpb_layer[layer_id]->init_done;
439*437bfbebSnyanmisaka
440*437bfbebSnyanmisaka return ret;
441*437bfbebSnyanmisaka }
442*437bfbebSnyanmisaka
update_last_video_pars(H264dVideoCtx_t * p_Vid,H264_SPS_t * sps,RK_U8 layer_id)443*437bfbebSnyanmisaka static void update_last_video_pars(H264dVideoCtx_t *p_Vid, H264_SPS_t *sps, RK_U8 layer_id)
444*437bfbebSnyanmisaka {
445*437bfbebSnyanmisaka p_Vid->last_pic_width_in_mbs_minus1[layer_id] = sps->pic_width_in_mbs_minus1;
446*437bfbebSnyanmisaka p_Vid->last_pic_height_in_map_units_minus1[layer_id] = sps->pic_height_in_map_units_minus1;
447*437bfbebSnyanmisaka p_Vid->last_profile_idc[layer_id] = sps->profile_idc;
448*437bfbebSnyanmisaka p_Vid->last_level_idc[layer_id] = sps->level_idc;
449*437bfbebSnyanmisaka }
450*437bfbebSnyanmisaka
451*437bfbebSnyanmisaka /*!
452*437bfbebSnyanmisaka ***********************************************************************
453*437bfbebSnyanmisaka * \brief
454*437bfbebSnyanmisaka * prase sps and process sps
455*437bfbebSnyanmisaka ***********************************************************************
456*437bfbebSnyanmisaka */
457*437bfbebSnyanmisaka //extern "C"
process_sps(H264_SLICE_t * currSlice)458*437bfbebSnyanmisaka MPP_RET process_sps(H264_SLICE_t *currSlice)
459*437bfbebSnyanmisaka {
460*437bfbebSnyanmisaka MPP_RET ret = MPP_ERR_UNKNOW;
461*437bfbebSnyanmisaka
462*437bfbebSnyanmisaka H264dCurCtx_t *p_Cur = currSlice->p_Cur;
463*437bfbebSnyanmisaka BitReadCtx_t *p_bitctx = &p_Cur->bitctx;
464*437bfbebSnyanmisaka H264_SPS_t *cur_sps = &p_Cur->sps;
465*437bfbebSnyanmisaka
466*437bfbebSnyanmisaka reset_cur_sps_data(cur_sps); // reset
467*437bfbebSnyanmisaka //!< parse sps
468*437bfbebSnyanmisaka FUN_CHECK(ret = parser_sps(p_bitctx, cur_sps, currSlice->p_Dec));
469*437bfbebSnyanmisaka //!< decide "max_dec_frame_buffering" for DPB
470*437bfbebSnyanmisaka FUN_CHECK(ret = get_max_dec_frame_buf_size(cur_sps));
471*437bfbebSnyanmisaka //!< make SPS available, copy
472*437bfbebSnyanmisaka if (cur_sps->Valid) {
473*437bfbebSnyanmisaka if (!currSlice->p_Vid->spsSet[cur_sps->seq_parameter_set_id]) {
474*437bfbebSnyanmisaka currSlice->p_Vid->spsSet[cur_sps->seq_parameter_set_id] = mpp_calloc(H264_SPS_t, 1);
475*437bfbebSnyanmisaka }
476*437bfbebSnyanmisaka memcpy(currSlice->p_Vid->spsSet[cur_sps->seq_parameter_set_id],
477*437bfbebSnyanmisaka cur_sps, sizeof(H264_SPS_t));
478*437bfbebSnyanmisaka }
479*437bfbebSnyanmisaka p_Cur->p_Vid->spspps_update = 1;
480*437bfbebSnyanmisaka
481*437bfbebSnyanmisaka return ret = MPP_OK;
482*437bfbebSnyanmisaka __FAILED:
483*437bfbebSnyanmisaka return ret;
484*437bfbebSnyanmisaka }
485*437bfbebSnyanmisaka
486*437bfbebSnyanmisaka
487*437bfbebSnyanmisaka /*!
488*437bfbebSnyanmisaka ***********************************************************************
489*437bfbebSnyanmisaka * \brief
490*437bfbebSnyanmisaka * prase sps and process sps
491*437bfbebSnyanmisaka ***********************************************************************
492*437bfbebSnyanmisaka */
493*437bfbebSnyanmisaka //extern "C"
recycle_subsps(H264_subSPS_t * subset_sps)494*437bfbebSnyanmisaka void recycle_subsps(H264_subSPS_t *subset_sps)
495*437bfbebSnyanmisaka {
496*437bfbebSnyanmisaka RK_S32 i = 0, num_views = 0;
497*437bfbebSnyanmisaka
498*437bfbebSnyanmisaka num_views = 1 + subset_sps->num_views_minus1;
499*437bfbebSnyanmisaka for (i = 1; i < num_views; i++) {
500*437bfbebSnyanmisaka if (subset_sps->num_anchor_refs_l0[i] > 0) {
501*437bfbebSnyanmisaka MPP_FREE(subset_sps->anchor_ref_l0[i]);
502*437bfbebSnyanmisaka }
503*437bfbebSnyanmisaka if (subset_sps->num_anchor_refs_l1[i] > 0) {
504*437bfbebSnyanmisaka MPP_FREE(subset_sps->anchor_ref_l1[i]);
505*437bfbebSnyanmisaka }
506*437bfbebSnyanmisaka if (subset_sps->num_non_anchor_refs_l0[i] > 0) {
507*437bfbebSnyanmisaka MPP_FREE(subset_sps->non_anchor_ref_l0[i]);
508*437bfbebSnyanmisaka }
509*437bfbebSnyanmisaka if (subset_sps->num_non_anchor_refs_l1[i] > 0) {
510*437bfbebSnyanmisaka MPP_FREE(subset_sps->non_anchor_ref_l1[i]);
511*437bfbebSnyanmisaka }
512*437bfbebSnyanmisaka }
513*437bfbebSnyanmisaka if (num_views > 0) {
514*437bfbebSnyanmisaka MPP_FREE(subset_sps->view_id);
515*437bfbebSnyanmisaka MPP_FREE(subset_sps->num_anchor_refs_l0);
516*437bfbebSnyanmisaka MPP_FREE(subset_sps->num_anchor_refs_l1);
517*437bfbebSnyanmisaka MPP_FREE(subset_sps->anchor_ref_l0);
518*437bfbebSnyanmisaka MPP_FREE(subset_sps->anchor_ref_l1);
519*437bfbebSnyanmisaka MPP_FREE(subset_sps->num_non_anchor_refs_l0);
520*437bfbebSnyanmisaka MPP_FREE(subset_sps->num_non_anchor_refs_l1);
521*437bfbebSnyanmisaka MPP_FREE(subset_sps->non_anchor_ref_l0);
522*437bfbebSnyanmisaka MPP_FREE(subset_sps->non_anchor_ref_l1);
523*437bfbebSnyanmisaka }
524*437bfbebSnyanmisaka subset_sps->Valid = 0;
525*437bfbebSnyanmisaka }
526*437bfbebSnyanmisaka
527*437bfbebSnyanmisaka /*!
528*437bfbebSnyanmisaka ***********************************************************************
529*437bfbebSnyanmisaka * \brief
530*437bfbebSnyanmisaka * prase sps and process sps
531*437bfbebSnyanmisaka ***********************************************************************
532*437bfbebSnyanmisaka */
533*437bfbebSnyanmisaka //extern "C"
process_subsps(H264_SLICE_t * currSlice)534*437bfbebSnyanmisaka MPP_RET process_subsps(H264_SLICE_t *currSlice)
535*437bfbebSnyanmisaka {
536*437bfbebSnyanmisaka MPP_RET ret = MPP_ERR_UNKNOW;
537*437bfbebSnyanmisaka
538*437bfbebSnyanmisaka BitReadCtx_t *p_bitctx = &currSlice->p_Cur->bitctx;
539*437bfbebSnyanmisaka H264_subSPS_t *cur_subsps = NULL;
540*437bfbebSnyanmisaka H264_subSPS_t *p_subset = NULL;
541*437bfbebSnyanmisaka
542*437bfbebSnyanmisaka if (!currSlice->p_Cur->subsps)
543*437bfbebSnyanmisaka currSlice->p_Cur->subsps = mpp_calloc(H264_subSPS_t, 1);
544*437bfbebSnyanmisaka
545*437bfbebSnyanmisaka cur_subsps = currSlice->p_Cur->subsps;
546*437bfbebSnyanmisaka reset_cur_subpps_data(cur_subsps); //reset
547*437bfbebSnyanmisaka
548*437bfbebSnyanmisaka FUN_CHECK(ret = parser_sps(p_bitctx, &cur_subsps->sps, currSlice->p_Dec));
549*437bfbebSnyanmisaka FUN_CHECK(ret = parser_subsps_ext(p_bitctx, cur_subsps));
550*437bfbebSnyanmisaka if (cur_subsps->sps.Valid) {
551*437bfbebSnyanmisaka cur_subsps->Valid = 1;
552*437bfbebSnyanmisaka currSlice->p_Vid->profile_idc = cur_subsps->sps.profile_idc;
553*437bfbebSnyanmisaka }
554*437bfbebSnyanmisaka get_max_dec_frame_buf_size(&cur_subsps->sps);
555*437bfbebSnyanmisaka //!< make subSPS available
556*437bfbebSnyanmisaka if (!currSlice->p_Vid->subspsSet[cur_subsps->sps.seq_parameter_set_id])
557*437bfbebSnyanmisaka currSlice->p_Vid->subspsSet[cur_subsps->sps.seq_parameter_set_id] = mpp_calloc(H264_subSPS_t, 1);
558*437bfbebSnyanmisaka p_subset = currSlice->p_Vid->subspsSet[cur_subsps->sps.seq_parameter_set_id];
559*437bfbebSnyanmisaka if (p_subset->Valid) {
560*437bfbebSnyanmisaka recycle_subsps(p_subset);
561*437bfbebSnyanmisaka }
562*437bfbebSnyanmisaka memcpy(p_subset, cur_subsps, sizeof(H264_subSPS_t));
563*437bfbebSnyanmisaka
564*437bfbebSnyanmisaka return ret = MPP_OK;
565*437bfbebSnyanmisaka __FAILED:
566*437bfbebSnyanmisaka recycle_subsps(currSlice->p_Cur->subsps);
567*437bfbebSnyanmisaka
568*437bfbebSnyanmisaka return ret;
569*437bfbebSnyanmisaka }
570*437bfbebSnyanmisaka
571*437bfbebSnyanmisaka /*!
572*437bfbebSnyanmisaka ***********************************************************************
573*437bfbebSnyanmisaka * \brief
574*437bfbebSnyanmisaka * prase sps and process sps
575*437bfbebSnyanmisaka ***********************************************************************
576*437bfbebSnyanmisaka */
577*437bfbebSnyanmisaka //extern "C"
activate_sps(H264dVideoCtx_t * p_Vid,H264_SPS_t * sps,H264_subSPS_t * subset_sps)578*437bfbebSnyanmisaka MPP_RET activate_sps(H264dVideoCtx_t *p_Vid, H264_SPS_t *sps, H264_subSPS_t *subset_sps)
579*437bfbebSnyanmisaka {
580*437bfbebSnyanmisaka MPP_RET ret = MPP_ERR_UNKNOW;
581*437bfbebSnyanmisaka INP_CHECK(ret, !p_Vid && !sps && !subset_sps);
582*437bfbebSnyanmisaka if (p_Vid->dec_pic) {
583*437bfbebSnyanmisaka FUN_CHECK(ret = exit_picture(p_Vid, &p_Vid->dec_pic));
584*437bfbebSnyanmisaka }
585*437bfbebSnyanmisaka if (p_Vid->active_mvc_sps_flag) { // layer_id == 1
586*437bfbebSnyanmisaka p_Vid->active_sps = &subset_sps->sps;
587*437bfbebSnyanmisaka p_Vid->active_subsps = subset_sps;
588*437bfbebSnyanmisaka p_Vid->active_sps_id[0] = 0;
589*437bfbebSnyanmisaka p_Vid->active_sps_id[1] = subset_sps->sps.seq_parameter_set_id;
590*437bfbebSnyanmisaka if (video_pars_changed(p_Vid, p_Vid->active_sps, 1)) {
591*437bfbebSnyanmisaka FUN_CHECK(ret = flush_dpb(p_Vid->p_Dpb_layer[1], 2));
592*437bfbebSnyanmisaka FUN_CHECK(ret = init_dpb(p_Vid, p_Vid->p_Dpb_layer[1], 2));
593*437bfbebSnyanmisaka FUN_CHECK(ret = check_mvc_dpb(p_Vid, p_Vid->p_Dpb_layer[0], p_Vid->p_Dpb_layer[1]));
594*437bfbebSnyanmisaka update_last_video_pars(p_Vid, p_Vid->active_sps, 1);
595*437bfbebSnyanmisaka //!< init frame slots, store frame buffer size
596*437bfbebSnyanmisaka p_Vid->dpb_size[1] = p_Vid->p_Dpb_layer[1]->size;
597*437bfbebSnyanmisaka p_Vid->spspps_update = 1;
598*437bfbebSnyanmisaka if (p_Vid->p_Dec->mvc_valid && p_Vid->p_Dpb_layer[1]->size > 0) {
599*437bfbebSnyanmisaka p_Vid->p_Dpb_layer[0]->size = MPP_MIN(p_Vid->p_Dpb_layer[1]->size, MAX_DPB_SIZE / 2);
600*437bfbebSnyanmisaka p_Vid->dpb_size[0] = p_Vid->p_Dpb_layer[0]->size;
601*437bfbebSnyanmisaka }
602*437bfbebSnyanmisaka }
603*437bfbebSnyanmisaka VAL_CHECK(ret, p_Vid->dpb_size[1] > 0);
604*437bfbebSnyanmisaka } else { //!< layer_id == 0
605*437bfbebSnyanmisaka p_Vid->active_sps = sps;
606*437bfbebSnyanmisaka p_Vid->active_subsps = NULL;
607*437bfbebSnyanmisaka p_Vid->active_sps_id[0] = sps->seq_parameter_set_id;
608*437bfbebSnyanmisaka p_Vid->active_sps_id[1] = 0;
609*437bfbebSnyanmisaka if (video_pars_changed(p_Vid, p_Vid->active_sps, 0)) {
610*437bfbebSnyanmisaka if (!p_Vid->no_output_of_prior_pics_flag) {
611*437bfbebSnyanmisaka FUN_CHECK(ret = flush_dpb(p_Vid->p_Dpb_layer[0], 1));
612*437bfbebSnyanmisaka }
613*437bfbebSnyanmisaka FUN_CHECK(ret = init_dpb(p_Vid, p_Vid->p_Dpb_layer[0], 1));
614*437bfbebSnyanmisaka update_last_video_pars(p_Vid, p_Vid->active_sps, 0);
615*437bfbebSnyanmisaka //!< init frame slots, store frame buffer size
616*437bfbebSnyanmisaka p_Vid->dpb_size[0] = p_Vid->p_Dpb_layer[0]->size;
617*437bfbebSnyanmisaka p_Vid->spspps_update = 1;
618*437bfbebSnyanmisaka }
619*437bfbebSnyanmisaka VAL_CHECK(ret, p_Vid->dpb_size[0] > 0);
620*437bfbebSnyanmisaka }
621*437bfbebSnyanmisaka H264D_DBG(H264D_DBG_DPB_INFO, "[DPB_size] dpb_size[0]=%d, mvc_flag=%d, dpb_size[1]=%d",
622*437bfbebSnyanmisaka p_Vid->dpb_size[0], p_Vid->active_mvc_sps_flag, p_Vid->dpb_size[1]);
623*437bfbebSnyanmisaka update_video_pars(p_Vid, p_Vid->active_sps);
624*437bfbebSnyanmisaka __RETURN:
625*437bfbebSnyanmisaka return ret = MPP_OK;
626*437bfbebSnyanmisaka __FAILED:
627*437bfbebSnyanmisaka return ret;
628*437bfbebSnyanmisaka }
629