1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun *
3*4882a593Smuzhiyun * Copyright 2015 Rockchip Electronics Co. LTD
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Licensed under the Apache License, Version 2.0 (the "License");
6*4882a593Smuzhiyun * you may not use this file except in compliance with the License.
7*4882a593Smuzhiyun * You may obtain a copy of the License at
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * http://www.apache.org/licenses/LICENSE-2.0
10*4882a593Smuzhiyun *
11*4882a593Smuzhiyun * Unless required by applicable law or agreed to in writing, software
12*4882a593Smuzhiyun * distributed under the License is distributed on an "AS IS" BASIS,
13*4882a593Smuzhiyun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*4882a593Smuzhiyun * See the License for the specific language governing permissions and
15*4882a593Smuzhiyun * limitations under the License.
16*4882a593Smuzhiyun */
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun /*
19*4882a593Smuzhiyun * @file h265d_ps.c
20*4882a593Smuzhiyun * @brief
21*4882a593Smuzhiyun * @author csy(csy@rock-chips.com)
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun * @version 1.0.0
24*4882a593Smuzhiyun * @history
25*4882a593Smuzhiyun * 2015.7.15 : Create
26*4882a593Smuzhiyun */
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun #define MODULE_TAG "H265PARSER_PS"
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun #include "mpp_mem.h"
31*4882a593Smuzhiyun #include "mpp_bitread.h"
32*4882a593Smuzhiyun #include "h265d_parser.h"
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun static const RK_U8 default_scaling_list_intra[] = {
35*4882a593Smuzhiyun 16, 16, 16, 16, 17, 18, 21, 24,
36*4882a593Smuzhiyun 16, 16, 16, 16, 17, 19, 22, 25,
37*4882a593Smuzhiyun 16, 16, 17, 18, 20, 22, 25, 29,
38*4882a593Smuzhiyun 16, 16, 18, 21, 24, 27, 31, 36,
39*4882a593Smuzhiyun 17, 17, 20, 24, 30, 35, 41, 47,
40*4882a593Smuzhiyun 18, 19, 22, 27, 35, 44, 54, 65,
41*4882a593Smuzhiyun 21, 22, 25, 31, 41, 54, 70, 88,
42*4882a593Smuzhiyun 24, 25, 29, 36, 47, 65, 88, 115
43*4882a593Smuzhiyun };
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun static const RK_U8 default_scaling_list_inter[] = {
46*4882a593Smuzhiyun 16, 16, 16, 16, 17, 18, 20, 24,
47*4882a593Smuzhiyun 16, 16, 16, 17, 18, 20, 24, 25,
48*4882a593Smuzhiyun 16, 16, 17, 18, 20, 24, 25, 28,
49*4882a593Smuzhiyun 16, 17, 18, 20, 24, 25, 28, 33,
50*4882a593Smuzhiyun 17, 18, 20, 24, 25, 28, 33, 41,
51*4882a593Smuzhiyun 18, 20, 24, 25, 28, 33, 41, 54,
52*4882a593Smuzhiyun 20, 24, 25, 28, 33, 41, 54, 71,
53*4882a593Smuzhiyun 24, 25, 28, 33, 41, 54, 71, 91
54*4882a593Smuzhiyun };
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun static const MppRational_t vui_sar[] = {
57*4882a593Smuzhiyun { 0, 1 },
58*4882a593Smuzhiyun { 1, 1 },
59*4882a593Smuzhiyun { 12, 11 },
60*4882a593Smuzhiyun { 10, 11 },
61*4882a593Smuzhiyun { 16, 11 },
62*4882a593Smuzhiyun { 40, 33 },
63*4882a593Smuzhiyun { 24, 11 },
64*4882a593Smuzhiyun { 20, 11 },
65*4882a593Smuzhiyun { 32, 11 },
66*4882a593Smuzhiyun { 80, 33 },
67*4882a593Smuzhiyun { 18, 11 },
68*4882a593Smuzhiyun { 15, 11 },
69*4882a593Smuzhiyun { 64, 33 },
70*4882a593Smuzhiyun { 160, 99 },
71*4882a593Smuzhiyun { 4, 3 },
72*4882a593Smuzhiyun { 3, 2 },
73*4882a593Smuzhiyun { 2, 1 },
74*4882a593Smuzhiyun };
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun const RK_U8 mpp_hevc_diag_scan4x4_x[16] = {
77*4882a593Smuzhiyun 0, 0, 1, 0,
78*4882a593Smuzhiyun 1, 2, 0, 1,
79*4882a593Smuzhiyun 2, 3, 1, 2,
80*4882a593Smuzhiyun 3, 2, 3, 3,
81*4882a593Smuzhiyun };
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun const RK_U8 mpp_hevc_diag_scan4x4_y[16] = {
84*4882a593Smuzhiyun 0, 1, 0, 2,
85*4882a593Smuzhiyun 1, 0, 3, 2,
86*4882a593Smuzhiyun 1, 0, 3, 2,
87*4882a593Smuzhiyun 1, 3, 2, 3,
88*4882a593Smuzhiyun };
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun const RK_U8 mpp_hevc_diag_scan8x8_x[64] = {
91*4882a593Smuzhiyun 0, 0, 1, 0,
92*4882a593Smuzhiyun 1, 2, 0, 1,
93*4882a593Smuzhiyun 2, 3, 0, 1,
94*4882a593Smuzhiyun 2, 3, 4, 0,
95*4882a593Smuzhiyun 1, 2, 3, 4,
96*4882a593Smuzhiyun 5, 0, 1, 2,
97*4882a593Smuzhiyun 3, 4, 5, 6,
98*4882a593Smuzhiyun 0, 1, 2, 3,
99*4882a593Smuzhiyun 4, 5, 6, 7,
100*4882a593Smuzhiyun 1, 2, 3, 4,
101*4882a593Smuzhiyun 5, 6, 7, 2,
102*4882a593Smuzhiyun 3, 4, 5, 6,
103*4882a593Smuzhiyun 7, 3, 4, 5,
104*4882a593Smuzhiyun 6, 7, 4, 5,
105*4882a593Smuzhiyun 6, 7, 5, 6,
106*4882a593Smuzhiyun 7, 6, 7, 7,
107*4882a593Smuzhiyun };
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun const RK_U8 mpp_hevc_diag_scan8x8_y[64] = {
110*4882a593Smuzhiyun 0, 1, 0, 2,
111*4882a593Smuzhiyun 1, 0, 3, 2,
112*4882a593Smuzhiyun 1, 0, 4, 3,
113*4882a593Smuzhiyun 2, 1, 0, 5,
114*4882a593Smuzhiyun 4, 3, 2, 1,
115*4882a593Smuzhiyun 0, 6, 5, 4,
116*4882a593Smuzhiyun 3, 2, 1, 0,
117*4882a593Smuzhiyun 7, 6, 5, 4,
118*4882a593Smuzhiyun 3, 2, 1, 0,
119*4882a593Smuzhiyun 7, 6, 5, 4,
120*4882a593Smuzhiyun 3, 2, 1, 7,
121*4882a593Smuzhiyun 6, 5, 4, 3,
122*4882a593Smuzhiyun 2, 7, 6, 5,
123*4882a593Smuzhiyun 4, 3, 7, 6,
124*4882a593Smuzhiyun 5, 4, 7, 6,
125*4882a593Smuzhiyun 5, 7, 6, 7,
126*4882a593Smuzhiyun };
127*4882a593Smuzhiyun
mpp_hevc_decode_short_term_rps(HEVCContext * s,ShortTermRPS * rps,const HEVCSPS * sps,RK_S32 is_slice_header)128*4882a593Smuzhiyun int mpp_hevc_decode_short_term_rps(HEVCContext *s, ShortTermRPS *rps,
129*4882a593Smuzhiyun const HEVCSPS *sps, RK_S32 is_slice_header)
130*4882a593Smuzhiyun {
131*4882a593Smuzhiyun HEVCLocalContext *lc = s->HEVClc;
132*4882a593Smuzhiyun RK_U8 rps_predict = 0;
133*4882a593Smuzhiyun RK_S32 delta_poc;
134*4882a593Smuzhiyun RK_S32 k0 = 0;
135*4882a593Smuzhiyun RK_S32 k1 = 0;
136*4882a593Smuzhiyun RK_S32 k = 0;
137*4882a593Smuzhiyun RK_S32 i;
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun BitReadCtx_t *gb = &lc->gb;
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun if (rps != sps->st_rps && sps->nb_st_rps)
142*4882a593Smuzhiyun READ_ONEBIT(gb, &rps_predict);
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun if (rps_predict) {
145*4882a593Smuzhiyun const ShortTermRPS *rps_ridx;
146*4882a593Smuzhiyun RK_S32 delta_rps, abs_delta_rps;
147*4882a593Smuzhiyun RK_U8 use_delta_flag = 0;
148*4882a593Smuzhiyun RK_U8 delta_rps_sign;
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun if (is_slice_header) {
151*4882a593Smuzhiyun RK_U32 delta_idx = 0;
152*4882a593Smuzhiyun READ_UE(gb, &delta_idx);
153*4882a593Smuzhiyun delta_idx = delta_idx + 1;
154*4882a593Smuzhiyun if (delta_idx > sps->nb_st_rps) {
155*4882a593Smuzhiyun mpp_err(
156*4882a593Smuzhiyun "Invalid value of delta_idx in slice header RPS: %d > %d.\n",
157*4882a593Smuzhiyun delta_idx, sps->nb_st_rps);
158*4882a593Smuzhiyun return MPP_ERR_STREAM;
159*4882a593Smuzhiyun }
160*4882a593Smuzhiyun rps_ridx = &sps->st_rps[sps->nb_st_rps - delta_idx];
161*4882a593Smuzhiyun } else
162*4882a593Smuzhiyun rps_ridx = &sps->st_rps[rps - sps->st_rps - 1];
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun READ_BITS(gb, 1, &delta_rps_sign);
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun READ_UE(gb, &abs_delta_rps);
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun abs_delta_rps = abs_delta_rps + 1;
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun delta_rps = (1 - (delta_rps_sign << 1)) * abs_delta_rps;
171*4882a593Smuzhiyun for (i = 0; i <= rps_ridx->num_delta_pocs; i++) {
172*4882a593Smuzhiyun RK_S32 used = 0;
173*4882a593Smuzhiyun READ_ONEBIT(gb, &used);
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun rps->used[k] = used;
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun if (!used)
178*4882a593Smuzhiyun READ_ONEBIT(gb, &use_delta_flag);
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun if (used || use_delta_flag) {
181*4882a593Smuzhiyun if (i < rps_ridx->num_delta_pocs)
182*4882a593Smuzhiyun delta_poc = delta_rps + rps_ridx->delta_poc[i];
183*4882a593Smuzhiyun else
184*4882a593Smuzhiyun delta_poc = delta_rps;
185*4882a593Smuzhiyun rps->delta_poc[k] = delta_poc;
186*4882a593Smuzhiyun if (delta_poc < 0)
187*4882a593Smuzhiyun k0++;
188*4882a593Smuzhiyun else
189*4882a593Smuzhiyun k1++;
190*4882a593Smuzhiyun k++;
191*4882a593Smuzhiyun }
192*4882a593Smuzhiyun }
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun rps->num_delta_pocs = k;
195*4882a593Smuzhiyun rps->num_negative_pics = k0;
196*4882a593Smuzhiyun // sort in increasing order (smallest first)
197*4882a593Smuzhiyun if (rps->num_delta_pocs != 0) {
198*4882a593Smuzhiyun RK_S32 used, tmp;
199*4882a593Smuzhiyun for (i = 1; i < rps->num_delta_pocs; i++) {
200*4882a593Smuzhiyun delta_poc = rps->delta_poc[i];
201*4882a593Smuzhiyun used = rps->used[i];
202*4882a593Smuzhiyun for (k = i - 1; k >= 0; k--) {
203*4882a593Smuzhiyun tmp = rps->delta_poc[k];
204*4882a593Smuzhiyun if (delta_poc < tmp) {
205*4882a593Smuzhiyun rps->delta_poc[k + 1] = tmp;
206*4882a593Smuzhiyun rps->used[k + 1] = rps->used[k];
207*4882a593Smuzhiyun rps->delta_poc[k] = delta_poc;
208*4882a593Smuzhiyun rps->used[k] = used;
209*4882a593Smuzhiyun }
210*4882a593Smuzhiyun }
211*4882a593Smuzhiyun }
212*4882a593Smuzhiyun }
213*4882a593Smuzhiyun if ((rps->num_negative_pics >> 1) != 0) {
214*4882a593Smuzhiyun RK_S32 used;
215*4882a593Smuzhiyun k = rps->num_negative_pics - 1;
216*4882a593Smuzhiyun // flip the negative values to largest first
217*4882a593Smuzhiyun for (i = 0; (RK_U32)i < rps->num_negative_pics >> 1; i++) {
218*4882a593Smuzhiyun delta_poc = rps->delta_poc[i];
219*4882a593Smuzhiyun used = rps->used[i];
220*4882a593Smuzhiyun rps->delta_poc[i] = rps->delta_poc[k];
221*4882a593Smuzhiyun rps->used[i] = rps->used[k];
222*4882a593Smuzhiyun rps->delta_poc[k] = delta_poc;
223*4882a593Smuzhiyun rps->used[k] = used;
224*4882a593Smuzhiyun k--;
225*4882a593Smuzhiyun }
226*4882a593Smuzhiyun }
227*4882a593Smuzhiyun } else {
228*4882a593Smuzhiyun RK_U32 prev, nb_positive_pics;
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun READ_UE(gb, &rps->num_negative_pics);
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun READ_UE(gb, &nb_positive_pics);
233*4882a593Smuzhiyun
234*4882a593Smuzhiyun if (rps->num_negative_pics >= MAX_REFS ||
235*4882a593Smuzhiyun nb_positive_pics >= MAX_REFS) {
236*4882a593Smuzhiyun mpp_err( "Too many refs in a short term RPS.\n");
237*4882a593Smuzhiyun return MPP_ERR_STREAM;
238*4882a593Smuzhiyun }
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun rps->num_delta_pocs = rps->num_negative_pics + nb_positive_pics;
241*4882a593Smuzhiyun if (rps->num_delta_pocs) {
242*4882a593Smuzhiyun prev = 0;
243*4882a593Smuzhiyun for (i = 0; (RK_U32)i < rps->num_negative_pics; i++) {
244*4882a593Smuzhiyun READ_UE(gb, &delta_poc);
245*4882a593Smuzhiyun delta_poc += 1;
246*4882a593Smuzhiyun prev -= delta_poc;
247*4882a593Smuzhiyun rps->delta_poc[i] = prev;
248*4882a593Smuzhiyun READ_ONEBIT(gb, &rps->used[i]);
249*4882a593Smuzhiyun }
250*4882a593Smuzhiyun prev = 0;
251*4882a593Smuzhiyun for (i = 0; (RK_U32)i < nb_positive_pics; i++) {
252*4882a593Smuzhiyun READ_UE(gb, &delta_poc);
253*4882a593Smuzhiyun delta_poc = delta_poc + 1;
254*4882a593Smuzhiyun prev += delta_poc;
255*4882a593Smuzhiyun rps->delta_poc[rps->num_negative_pics + i] = prev;
256*4882a593Smuzhiyun READ_ONEBIT(gb, &rps->used[rps->num_negative_pics + i]);
257*4882a593Smuzhiyun }
258*4882a593Smuzhiyun }
259*4882a593Smuzhiyun }
260*4882a593Smuzhiyun return 0;
261*4882a593Smuzhiyun __BITREAD_ERR:
262*4882a593Smuzhiyun return MPP_ERR_STREAM;
263*4882a593Smuzhiyun }
264*4882a593Smuzhiyun
265*4882a593Smuzhiyun
decode_profile_tier_level(HEVCContext * s,PTLCommon * ptl)266*4882a593Smuzhiyun static RK_S32 decode_profile_tier_level(HEVCContext *s, PTLCommon *ptl)
267*4882a593Smuzhiyun {
268*4882a593Smuzhiyun int i;
269*4882a593Smuzhiyun HEVCLocalContext *lc = s->HEVClc;
270*4882a593Smuzhiyun BitReadCtx_t *gb = &lc->gb;
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun READ_BITS(gb, 2, &ptl->profile_space);
273*4882a593Smuzhiyun READ_ONEBIT(gb, &ptl->tier_flag);
274*4882a593Smuzhiyun READ_BITS(gb, 5, &ptl->profile_idc);
275*4882a593Smuzhiyun
276*4882a593Smuzhiyun if (ptl->profile_idc == MPP_PROFILE_HEVC_MAIN)
277*4882a593Smuzhiyun h265d_dbg(H265D_DBG_GLOBAL, "Main profile bitstream\n");
278*4882a593Smuzhiyun else if (ptl->profile_idc == MPP_PROFILE_HEVC_MAIN_10)
279*4882a593Smuzhiyun h265d_dbg(H265D_DBG_GLOBAL, "Main 10 profile bitstream\n");
280*4882a593Smuzhiyun else if (ptl->profile_idc == MPP_PROFILE_HEVC_MAIN_STILL_PICTURE)
281*4882a593Smuzhiyun h265d_dbg(H265D_DBG_GLOBAL, "Main Still Picture profile bitstream\n");
282*4882a593Smuzhiyun else
283*4882a593Smuzhiyun mpp_log("Unknown HEVC profile: %d\n", ptl->profile_idc);
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun for (i = 0; i < 32; i++)
286*4882a593Smuzhiyun READ_ONEBIT(gb, & ptl->profile_compatibility_flag[i]);
287*4882a593Smuzhiyun READ_ONEBIT(gb, &ptl->progressive_source_flag);
288*4882a593Smuzhiyun READ_ONEBIT(gb, &ptl->interlaced_source_flag);
289*4882a593Smuzhiyun READ_ONEBIT(gb, &ptl->non_packed_constraint_flag);
290*4882a593Smuzhiyun READ_ONEBIT(gb, &ptl->frame_only_constraint_flag);
291*4882a593Smuzhiyun
292*4882a593Smuzhiyun SKIP_BITS(gb, 16); // XXX_reserved_zero_44bits[0..15]
293*4882a593Smuzhiyun SKIP_BITS(gb, 16); // XXX_reserved_zero_44bits[16..31]
294*4882a593Smuzhiyun SKIP_BITS(gb, 12); // XXX_reserved_zero_44bits[32..43]
295*4882a593Smuzhiyun return 0;
296*4882a593Smuzhiyun __BITREAD_ERR:
297*4882a593Smuzhiyun return MPP_ERR_STREAM;
298*4882a593Smuzhiyun }
299*4882a593Smuzhiyun
parse_ptl(HEVCContext * s,PTL * ptl,int max_num_sub_layers)300*4882a593Smuzhiyun static RK_S32 parse_ptl(HEVCContext *s, PTL *ptl, int max_num_sub_layers)
301*4882a593Smuzhiyun {
302*4882a593Smuzhiyun RK_S32 i;
303*4882a593Smuzhiyun HEVCLocalContext *lc = s->HEVClc;
304*4882a593Smuzhiyun BitReadCtx_t *gb = &lc->gb;
305*4882a593Smuzhiyun decode_profile_tier_level(s, &ptl->general_ptl);
306*4882a593Smuzhiyun READ_BITS(gb, 8, &ptl->general_ptl.level_idc);
307*4882a593Smuzhiyun
308*4882a593Smuzhiyun for (i = 0; i < max_num_sub_layers - 1; i++) {
309*4882a593Smuzhiyun READ_ONEBIT(gb, &ptl->sub_layer_profile_present_flag[i]);
310*4882a593Smuzhiyun READ_ONEBIT(gb, &ptl->sub_layer_level_present_flag[i]);
311*4882a593Smuzhiyun }
312*4882a593Smuzhiyun if (max_num_sub_layers - 1 > 0)
313*4882a593Smuzhiyun for (i = max_num_sub_layers - 1; i < 8; i++)
314*4882a593Smuzhiyun SKIP_BITS(gb, 2); // reserved_zero_2bits[i]
315*4882a593Smuzhiyun for (i = 0; i < max_num_sub_layers - 1; i++) {
316*4882a593Smuzhiyun if (ptl->sub_layer_profile_present_flag[i])
317*4882a593Smuzhiyun decode_profile_tier_level(s, &ptl->sub_layer_ptl[i]);
318*4882a593Smuzhiyun if (ptl->sub_layer_level_present_flag[i])
319*4882a593Smuzhiyun READ_BITS(gb, 8, &ptl->sub_layer_ptl[i].level_idc);
320*4882a593Smuzhiyun }
321*4882a593Smuzhiyun
322*4882a593Smuzhiyun return 0;
323*4882a593Smuzhiyun __BITREAD_ERR:
324*4882a593Smuzhiyun return MPP_ERR_STREAM;
325*4882a593Smuzhiyun }
326*4882a593Smuzhiyun
decode_sublayer_hrd(HEVCContext * s,unsigned int nb_cpb,int subpic_params_present)327*4882a593Smuzhiyun static RK_S32 decode_sublayer_hrd(HEVCContext *s, unsigned int nb_cpb,
328*4882a593Smuzhiyun int subpic_params_present)
329*4882a593Smuzhiyun {
330*4882a593Smuzhiyun BitReadCtx_t *gb = &s->HEVClc->gb;
331*4882a593Smuzhiyun RK_U32 i, value;
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun for (i = 0; i < nb_cpb; i++) {
334*4882a593Smuzhiyun READ_UE(gb, &value); // bit_rate_value_minus1
335*4882a593Smuzhiyun READ_UE(gb, &value); // cpb_size_value_minus1
336*4882a593Smuzhiyun
337*4882a593Smuzhiyun if (subpic_params_present) {
338*4882a593Smuzhiyun READ_UE(gb, &value); // cpb_size_du_value_minus1
339*4882a593Smuzhiyun READ_UE(gb, &value); // bit_rate_du_value_minus1
340*4882a593Smuzhiyun }
341*4882a593Smuzhiyun SKIP_BITS(gb, 1); // cbr_flag
342*4882a593Smuzhiyun }
343*4882a593Smuzhiyun return 0;
344*4882a593Smuzhiyun __BITREAD_ERR:
345*4882a593Smuzhiyun return MPP_ERR_STREAM;
346*4882a593Smuzhiyun }
347*4882a593Smuzhiyun
decode_hrd(HEVCContext * s,int common_inf_present,int max_sublayers)348*4882a593Smuzhiyun static RK_S32 decode_hrd(HEVCContext *s, int common_inf_present,
349*4882a593Smuzhiyun int max_sublayers)
350*4882a593Smuzhiyun {
351*4882a593Smuzhiyun BitReadCtx_t *gb = &s->HEVClc->gb;
352*4882a593Smuzhiyun int nal_params_present = 0, vcl_params_present = 0;
353*4882a593Smuzhiyun int subpic_params_present = 0;
354*4882a593Smuzhiyun int i;
355*4882a593Smuzhiyun
356*4882a593Smuzhiyun if (common_inf_present) {
357*4882a593Smuzhiyun READ_ONEBIT(gb, &nal_params_present);
358*4882a593Smuzhiyun READ_ONEBIT(gb, &vcl_params_present);
359*4882a593Smuzhiyun
360*4882a593Smuzhiyun if (nal_params_present || vcl_params_present) {
361*4882a593Smuzhiyun READ_ONEBIT(gb, &subpic_params_present);
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun if (subpic_params_present) {
364*4882a593Smuzhiyun SKIP_BITS(gb, 8); // tick_divisor_minus2
365*4882a593Smuzhiyun SKIP_BITS(gb, 5); // du_cpb_removal_delay_increment_length_minus1
366*4882a593Smuzhiyun SKIP_BITS(gb, 1); // sub_pic_cpb_params_in_pic_timing_sei_flag
367*4882a593Smuzhiyun SKIP_BITS(gb, 5); // dpb_output_delay_du_length_minus1
368*4882a593Smuzhiyun }
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun SKIP_BITS(gb, 4); // bit_rate_scale
371*4882a593Smuzhiyun SKIP_BITS(gb, 4); // cpb_size_scale
372*4882a593Smuzhiyun
373*4882a593Smuzhiyun if (subpic_params_present)
374*4882a593Smuzhiyun SKIP_BITS(gb, 4); // cpb_size_du_scale
375*4882a593Smuzhiyun
376*4882a593Smuzhiyun SKIP_BITS(gb, 5); // initial_cpb_removal_delay_length_minus1
377*4882a593Smuzhiyun SKIP_BITS(gb, 5); // au_cpb_removal_delay_length_minus1
378*4882a593Smuzhiyun SKIP_BITS(gb, 5); // dpb_output_delay_length_minus1
379*4882a593Smuzhiyun }
380*4882a593Smuzhiyun }
381*4882a593Smuzhiyun
382*4882a593Smuzhiyun for (i = 0; i < max_sublayers; i++) {
383*4882a593Smuzhiyun RK_S32 low_delay = 0;
384*4882a593Smuzhiyun RK_U32 nb_cpb = 1;
385*4882a593Smuzhiyun RK_S32 fixed_rate = 0;
386*4882a593Smuzhiyun RK_S32 value = 0;
387*4882a593Smuzhiyun
388*4882a593Smuzhiyun READ_ONEBIT(gb, &fixed_rate);
389*4882a593Smuzhiyun
390*4882a593Smuzhiyun if (!fixed_rate)
391*4882a593Smuzhiyun READ_ONEBIT(gb, &fixed_rate);
392*4882a593Smuzhiyun
393*4882a593Smuzhiyun if (fixed_rate)
394*4882a593Smuzhiyun READ_UE(gb, &value); // elemental_duration_in_tc_minus1
395*4882a593Smuzhiyun else
396*4882a593Smuzhiyun READ_ONEBIT(gb, &low_delay);
397*4882a593Smuzhiyun
398*4882a593Smuzhiyun if (!low_delay) {
399*4882a593Smuzhiyun READ_UE(gb, &nb_cpb);
400*4882a593Smuzhiyun nb_cpb = nb_cpb + 1;
401*4882a593Smuzhiyun }
402*4882a593Smuzhiyun
403*4882a593Smuzhiyun if (nal_params_present)
404*4882a593Smuzhiyun decode_sublayer_hrd(s, nb_cpb, subpic_params_present);
405*4882a593Smuzhiyun if (vcl_params_present)
406*4882a593Smuzhiyun decode_sublayer_hrd(s, nb_cpb, subpic_params_present);
407*4882a593Smuzhiyun }
408*4882a593Smuzhiyun return 0;
409*4882a593Smuzhiyun __BITREAD_ERR:
410*4882a593Smuzhiyun return MPP_ERR_STREAM;
411*4882a593Smuzhiyun }
412*4882a593Smuzhiyun
413*4882a593Smuzhiyun
414*4882a593Smuzhiyun #ifdef VPS_EXTENSION
parse_vps_extension(HEVCContext * s,HEVCVPS * vps)415*4882a593Smuzhiyun static RK_S32 parse_vps_extension (HEVCContext *s, HEVCVPS *vps)
416*4882a593Smuzhiyun {
417*4882a593Smuzhiyun RK_S32 i, j;
418*4882a593Smuzhiyun RK_S32 value = 0;
419*4882a593Smuzhiyun BitReadCtx_t *gb = &s->HEVClc->gb;
420*4882a593Smuzhiyun #ifdef VPS_EXTN_MASK_AND_DIM_INFO
421*4882a593Smuzhiyun RK_S32 numScalabilityTypes = 0;
422*4882a593Smuzhiyun READ_ONEBIT(gb, &vps->avc_base_layer_flag);
423*4882a593Smuzhiyun READ_ONEBIT(gb, &vps->splitting_flag);
424*4882a593Smuzhiyun
425*4882a593Smuzhiyun for (i = 0; i < MAX_VPS_NUM_SCALABILITY_TYPES; i++) {
426*4882a593Smuzhiyun READ_ONEBIT(gb, &vps->scalability_mask[i]);
427*4882a593Smuzhiyun numScalabilityTypes += vps->scalability_mask[i];
428*4882a593Smuzhiyun if ( i != 1 && vps->scalability_mask[i] != 0) {
429*4882a593Smuzhiyun mpp_err( "Multiview and reserved masks are not used in this version of software \n");
430*4882a593Smuzhiyun }
431*4882a593Smuzhiyun }
432*4882a593Smuzhiyun
433*4882a593Smuzhiyun vps->m_numScalabilityTypes = numScalabilityTypes;
434*4882a593Smuzhiyun for (i = 0; i < numScalabilityTypes; i++) {
435*4882a593Smuzhiyun READ_BITS(gb, 3, &vps->dimension_id_len[i]);
436*4882a593Smuzhiyun vps->dimension_id_len[i] = vps->dimension_id_len[i] + 1;
437*4882a593Smuzhiyun }
438*4882a593Smuzhiyun
439*4882a593Smuzhiyun if (vps->splitting_flag) {
440*4882a593Smuzhiyun int numBits = 0;
441*4882a593Smuzhiyun for (i = 0; i < numScalabilityTypes; i++) {
442*4882a593Smuzhiyun numBits += vps->dimension_id_len[i];
443*4882a593Smuzhiyun }
444*4882a593Smuzhiyun if (numBits > 6)
445*4882a593Smuzhiyun mpp_err( "numBits>6 \n");
446*4882a593Smuzhiyun }
447*4882a593Smuzhiyun
448*4882a593Smuzhiyun READ_ONEBIT(gb, &vps->nuh_layer_id_present_flag);
449*4882a593Smuzhiyun vps->layer_id_in_nuh[0] = 0;
450*4882a593Smuzhiyun vps->m_layerIdInVps[0] = 0;
451*4882a593Smuzhiyun
452*4882a593Smuzhiyun for (i = 1; i < vps->vps_max_layers; i++) {
453*4882a593Smuzhiyun if (vps->nuh_layer_id_present_flag ) {
454*4882a593Smuzhiyun READ_BITS(gb, 6, vps->layer_id_in_nuh[i]);
455*4882a593Smuzhiyun } else {
456*4882a593Smuzhiyun vps->layer_id_in_nuh[i] = i;
457*4882a593Smuzhiyun }
458*4882a593Smuzhiyun vps->m_layerIdInVps[vps->layer_id_in_nuh[i]] = i;
459*4882a593Smuzhiyun for (j = 0; j < numScalabilityTypes; j++) {
460*4882a593Smuzhiyun READ_BITS(gb, vps->dimension_id_len[j], &vps->dimension_id[i][j]);
461*4882a593Smuzhiyun }
462*4882a593Smuzhiyun }
463*4882a593Smuzhiyun
464*4882a593Smuzhiyun #endif
465*4882a593Smuzhiyun #ifdef VPS_MOVE_DIR_DEPENDENCY_FLAG
466*4882a593Smuzhiyun #ifdef VPS_EXTN_DIRECT_REF_LAYERS
467*4882a593Smuzhiyun vps->m_numDirectRefLayers[0] = 0;
468*4882a593Smuzhiyun for ( i = 1; i <= vps->vps_max_layers - 1; i++) {
469*4882a593Smuzhiyun RK_S32 numDirectRefLayers = 0;
470*4882a593Smuzhiyun for ( j = 0; j < i; j++) {
471*4882a593Smuzhiyun READ_ONEBIT(gb, &vps->direct_dependency_flag[i][j]);
472*4882a593Smuzhiyun if (vps->direct_dependency_flag[i][j]) {
473*4882a593Smuzhiyun vps->m_refLayerId[i][numDirectRefLayers] = j;
474*4882a593Smuzhiyun numDirectRefLayers++;
475*4882a593Smuzhiyun }
476*4882a593Smuzhiyun }
477*4882a593Smuzhiyun
478*4882a593Smuzhiyun vps->m_numDirectRefLayers[i] = numDirectRefLayers;
479*4882a593Smuzhiyun }
480*4882a593Smuzhiyun #endif
481*4882a593Smuzhiyun #endif
482*4882a593Smuzhiyun #ifdef VPS_EXTN_PROFILE_INFO
483*4882a593Smuzhiyun #ifdef VPS_PROFILE_OUTPUT_LAYERS
484*4882a593Smuzhiyun READ_BITS(gb, 10, value);
485*4882a593Smuzhiyun if ( value != (vps->vps_num_layer_sets - 1)) { //vps_number_layer_sets_minus1
486*4882a593Smuzhiyun mpp_err( "Erro vps_number_layer_sets_minus1 != vps->vps_num_layer_sets-1 \n");
487*4882a593Smuzhiyun }
488*4882a593Smuzhiyun READ_BITS(gb, 6, &vps->vps_num_profile_tier_level);
489*4882a593Smuzhiyun vps->vps_num_profile_tier_level = vps->vps_num_profile_tier_level + 1;
490*4882a593Smuzhiyun vps->PTLExt = mpp_malloc(PTL*, vps->vps_num_profile_tier_level); // TO DO add free
491*4882a593Smuzhiyun
492*4882a593Smuzhiyun for (i = 1; i <= vps->vps_num_profile_tier_level - 1; i++)
493*4882a593Smuzhiyun #else
494*4882a593Smuzhiyun vps->PTLExt = mpp_malloc(PTL*, vps->vps_num_layer_sets); // TO DO add free
495*4882a593Smuzhiyun for (i = 1; i <= vps->vps_num_layer_sets - 1; i++)
496*4882a593Smuzhiyun #endif
497*4882a593Smuzhiyun {
498*4882a593Smuzhiyun READ_ONEBIT(gb, &vps->vps_profile_present_flag[i]);
499*4882a593Smuzhiyun if ( !vps->vps_profile_present_flag[i] ) {
500*4882a593Smuzhiyun #ifdef VPS_PROFILE_OUTPUT_LAYERS
501*4882a593Smuzhiyun READ_BITS(gb, 6, &vps->profile_ref[i])
502*4882a593Smuzhiyun
503*4882a593Smuzhiyun vps->profile_ref[i] = vps->profile_ref[i] + 1;
504*4882a593Smuzhiyun
505*4882a593Smuzhiyun #else
506*4882a593Smuzhiyun READ_UE(gb, &vps->profile_ref[i]);
507*4882a593Smuzhiyun #endif
508*4882a593Smuzhiyun vps->PTLExt[i] = mpp_malloc(PTL, 1); // TO DO add free
509*4882a593Smuzhiyun memcpy(vps->PTLExt[i], vps->PTLExt[vps->profile_ref[i]], sizeof(PTL));
510*4882a593Smuzhiyun }
511*4882a593Smuzhiyun vps->PTLExt[i] = mpp_malloc(PTL, 1); // TO DO add free
512*4882a593Smuzhiyun parse_ptl(s, vps->PTLExt[i], vps->vps_max_sub_layers);
513*4882a593Smuzhiyun }
514*4882a593Smuzhiyun #endif
515*4882a593Smuzhiyun
516*4882a593Smuzhiyun #ifdef VPS_PROFILE_OUTPUT_LAYERS
517*4882a593Smuzhiyun READ_ONEBIT(gb, &vps->more_output_layer_sets_than_default_flag );
518*4882a593Smuzhiyun RK_S32 numOutputLayerSets = 0;
519*4882a593Smuzhiyun if (! vps->more_output_layer_sets_than_default_flag ) {
520*4882a593Smuzhiyun numOutputLayerSets = vps->vps_num_layer_sets;
521*4882a593Smuzhiyun } else {
522*4882a593Smuzhiyun READ_BITS(gb, 10, &vps->num_add_output_layer_sets);
523*4882a593Smuzhiyun numOutputLayerSets = vps->vps_num_layer_sets + vps->num_add_output_layer_sets;
524*4882a593Smuzhiyun }
525*4882a593Smuzhiyun if (numOutputLayerSets > 1) {
526*4882a593Smuzhiyun READ_ONEBIT(gb, &vps->default_one_target_output_layer_flag);
527*4882a593Smuzhiyun }
528*4882a593Smuzhiyun vps->m_numOutputLayerSets = numOutputLayerSets;
529*4882a593Smuzhiyun for (i = 1; i < numOutputLayerSets; i++) {
530*4882a593Smuzhiyun if ( i > (vps->vps_num_layer_sets - 1) ) {
531*4882a593Smuzhiyun RK_S32 numBits = 1, lsIdx;
532*4882a593Smuzhiyun while ((1 << numBits) < (vps->vps_num_layer_sets - 1)) {
533*4882a593Smuzhiyun numBits++;
534*4882a593Smuzhiyun }
535*4882a593Smuzhiyun READ_BITS(gb, numBits, &vps->output_layer_set_idx[i]);
536*4882a593Smuzhiyun vps->output_layer_set_idx[i] = vps->output_layer_set_idx[i] + 1;
537*4882a593Smuzhiyun lsIdx = vps->output_layer_set_idx[i];
538*4882a593Smuzhiyun for (j = 0; j < vps->m_numLayerInIdList[lsIdx] - 1; j++) {
539*4882a593Smuzhiyun READ_ONEBIT(gb, &vps->output_layer_flag[i][j]);
540*4882a593Smuzhiyun }
541*4882a593Smuzhiyun } else {
542*4882a593Smuzhiyun int lsIdx = i;
543*4882a593Smuzhiyun if ( vps->default_one_target_output_layer_flag ) {
544*4882a593Smuzhiyun for (j = 0; j < vps->m_numLayerInIdList[lsIdx]; j++) {
545*4882a593Smuzhiyun vps->output_layer_flag[i][j] = (j == (vps->m_numLayerInIdList[lsIdx] - 1));
546*4882a593Smuzhiyun }
547*4882a593Smuzhiyun } else {
548*4882a593Smuzhiyun for (j = 0; j < vps->m_numLayerInIdList[lsIdx]; j++) {
549*4882a593Smuzhiyun vps->output_layer_flag[i][j] = 1;
550*4882a593Smuzhiyun }
551*4882a593Smuzhiyun }
552*4882a593Smuzhiyun }
553*4882a593Smuzhiyun int numBits = 1;
554*4882a593Smuzhiyun while ((1 << numBits) < (vps->vps_num_profile_tier_level)) {
555*4882a593Smuzhiyun numBits++;
556*4882a593Smuzhiyun }
557*4882a593Smuzhiyun READ_BITS(gb, numBits, &vps->profile_level_tier_idx[i]);
558*4882a593Smuzhiyun }
559*4882a593Smuzhiyun #endif
560*4882a593Smuzhiyun #ifdef JCTVC_M0458_INTERLAYER_RPS_SIG
561*4882a593Smuzhiyun READ_ONEBIT(gb, &vps->max_one_active_ref_layer_flag);
562*4882a593Smuzhiyun #endif
563*4882a593Smuzhiyun }
564*4882a593Smuzhiyun #endif
compare_vps(HEVCVPS * openhevc_vps,HEVCVPS * vps)565*4882a593Smuzhiyun static RK_S32 compare_vps(HEVCVPS *openhevc_vps, HEVCVPS *vps)
566*4882a593Smuzhiyun {
567*4882a593Smuzhiyun
568*4882a593Smuzhiyun if (openhevc_vps->vps_temporal_id_nesting_flag !=
569*4882a593Smuzhiyun vps->vps_temporal_id_nesting_flag) {
570*4882a593Smuzhiyun mpp_log("vps_temporal_id_nesting_flag diff\n");
571*4882a593Smuzhiyun return -1;
572*4882a593Smuzhiyun }
573*4882a593Smuzhiyun
574*4882a593Smuzhiyun if (openhevc_vps->vps_max_layers != vps->vps_max_layers) {
575*4882a593Smuzhiyun mpp_log("vps_max_layers diff\n");
576*4882a593Smuzhiyun return -1;
577*4882a593Smuzhiyun }
578*4882a593Smuzhiyun
579*4882a593Smuzhiyun if (openhevc_vps->vps_max_sub_layers != vps->vps_max_sub_layers) {
580*4882a593Smuzhiyun mpp_log("vps_max_sub_layers diff\n");
581*4882a593Smuzhiyun return -1;
582*4882a593Smuzhiyun }
583*4882a593Smuzhiyun if (openhevc_vps->vps_sub_layer_ordering_info_present_flag !=
584*4882a593Smuzhiyun vps->vps_sub_layer_ordering_info_present_flag) {
585*4882a593Smuzhiyun mpp_log("vps_sub_layer_ordering_info_present_flag diff\n");
586*4882a593Smuzhiyun return -1;
587*4882a593Smuzhiyun }
588*4882a593Smuzhiyun
589*4882a593Smuzhiyun if (openhevc_vps->vps_max_layer_id != vps->vps_max_layer_id) {
590*4882a593Smuzhiyun
591*4882a593Smuzhiyun mpp_log("vps_max_layer_id diff\n");
592*4882a593Smuzhiyun return -1;
593*4882a593Smuzhiyun }
594*4882a593Smuzhiyun
595*4882a593Smuzhiyun if (openhevc_vps->vps_num_layer_sets != vps->vps_num_layer_sets) {
596*4882a593Smuzhiyun
597*4882a593Smuzhiyun mpp_log("vps_num_layer_sets diff\n");
598*4882a593Smuzhiyun return -1;
599*4882a593Smuzhiyun }
600*4882a593Smuzhiyun if (openhevc_vps->vps_timing_info_present_flag !=
601*4882a593Smuzhiyun vps->vps_timing_info_present_flag) {
602*4882a593Smuzhiyun
603*4882a593Smuzhiyun mpp_log("vps_timing_info_present_flag diff\n");
604*4882a593Smuzhiyun return -1;
605*4882a593Smuzhiyun }
606*4882a593Smuzhiyun if (openhevc_vps->vps_num_units_in_tick !=
607*4882a593Smuzhiyun vps->vps_num_units_in_tick) {
608*4882a593Smuzhiyun mpp_log("vps_num_units_in_tick diff\n");
609*4882a593Smuzhiyun return -1;
610*4882a593Smuzhiyun }
611*4882a593Smuzhiyun
612*4882a593Smuzhiyun if ( openhevc_vps->vps_time_scale !=
613*4882a593Smuzhiyun vps->vps_time_scale) {
614*4882a593Smuzhiyun mpp_log("vps_time_scale diff\n");
615*4882a593Smuzhiyun return -1;
616*4882a593Smuzhiyun }
617*4882a593Smuzhiyun if (openhevc_vps->vps_poc_proportional_to_timing_flag !=
618*4882a593Smuzhiyun vps->vps_poc_proportional_to_timing_flag) {
619*4882a593Smuzhiyun mpp_log("vps_poc_proportional_to_timing_flag \n");
620*4882a593Smuzhiyun return -1;
621*4882a593Smuzhiyun }
622*4882a593Smuzhiyun if (openhevc_vps->vps_num_ticks_poc_diff_one !=
623*4882a593Smuzhiyun vps->vps_num_ticks_poc_diff_one) {
624*4882a593Smuzhiyun mpp_log("vps_poc_proportional_to_timing_flag \n");
625*4882a593Smuzhiyun return -1;
626*4882a593Smuzhiyun }
627*4882a593Smuzhiyun
628*4882a593Smuzhiyun if (openhevc_vps->vps_num_hrd_parameters
629*4882a593Smuzhiyun != vps->vps_num_hrd_parameters) {
630*4882a593Smuzhiyun mpp_log("vps_num_hrd_parameters \n");
631*4882a593Smuzhiyun return -1;
632*4882a593Smuzhiyun }
633*4882a593Smuzhiyun return 0;
634*4882a593Smuzhiyun }
635*4882a593Smuzhiyun
compare_sps(HEVCSPS * openhevc_sps,HEVCSPS * sps)636*4882a593Smuzhiyun static RK_S32 compare_sps(HEVCSPS *openhevc_sps, HEVCSPS *sps)
637*4882a593Smuzhiyun {
638*4882a593Smuzhiyun if (openhevc_sps->vps_id != sps->vps_id) {
639*4882a593Smuzhiyun mpp_log("vps_id diff\n");
640*4882a593Smuzhiyun return -1;
641*4882a593Smuzhiyun }
642*4882a593Smuzhiyun if (openhevc_sps->sps_id != sps->sps_id) {
643*4882a593Smuzhiyun mpp_log("sps_id diff\n");
644*4882a593Smuzhiyun return -1;
645*4882a593Smuzhiyun }
646*4882a593Smuzhiyun if (openhevc_sps->chroma_format_idc != sps->chroma_format_idc) {
647*4882a593Smuzhiyun mpp_log("chroma_format_idc diff\n");
648*4882a593Smuzhiyun return -1;
649*4882a593Smuzhiyun }
650*4882a593Smuzhiyun if (openhevc_sps->separate_colour_plane_flag
651*4882a593Smuzhiyun != sps->separate_colour_plane_flag) {
652*4882a593Smuzhiyun mpp_log("separate_colour_plane_flag diff\n");
653*4882a593Smuzhiyun return -1;
654*4882a593Smuzhiyun }
655*4882a593Smuzhiyun
656*4882a593Smuzhiyun if (openhevc_sps->output_width != sps->output_width) {
657*4882a593Smuzhiyun mpp_log("output_width diff\n");
658*4882a593Smuzhiyun return -1;
659*4882a593Smuzhiyun }
660*4882a593Smuzhiyun if (openhevc_sps->output_height != sps->output_height) {
661*4882a593Smuzhiyun mpp_log("output_height diff\n");
662*4882a593Smuzhiyun return -1;
663*4882a593Smuzhiyun }
664*4882a593Smuzhiyun
665*4882a593Smuzhiyun if (openhevc_sps->bit_depth != sps->bit_depth) {
666*4882a593Smuzhiyun mpp_log("bit_depth diff\n");
667*4882a593Smuzhiyun return -1;
668*4882a593Smuzhiyun }
669*4882a593Smuzhiyun if (openhevc_sps->bit_depth_chroma != sps->bit_depth_chroma) {
670*4882a593Smuzhiyun mpp_log("bit_depth_chroma diff\n");
671*4882a593Smuzhiyun return -1;
672*4882a593Smuzhiyun }
673*4882a593Smuzhiyun if (openhevc_sps->pixel_shift != sps->pixel_shift) {
674*4882a593Smuzhiyun mpp_log("pixel_shift diff\n");
675*4882a593Smuzhiyun return -1;
676*4882a593Smuzhiyun }
677*4882a593Smuzhiyun // openhevc_sps->pix_fmt;
678*4882a593Smuzhiyun
679*4882a593Smuzhiyun if (openhevc_sps->log2_max_poc_lsb != sps->log2_max_poc_lsb) {
680*4882a593Smuzhiyun mpp_log("log2_max_poc_lsb diff\n");
681*4882a593Smuzhiyun return -1;
682*4882a593Smuzhiyun }
683*4882a593Smuzhiyun if (openhevc_sps->pcm_enabled_flag != sps->pcm_enabled_flag) {
684*4882a593Smuzhiyun mpp_log("pcm_enabled_flag diff\n");
685*4882a593Smuzhiyun return -1;
686*4882a593Smuzhiyun }
687*4882a593Smuzhiyun
688*4882a593Smuzhiyun if (openhevc_sps->max_sub_layers != sps->max_sub_layers) {
689*4882a593Smuzhiyun mpp_log("max_sub_layers diff\n");
690*4882a593Smuzhiyun return -1;
691*4882a593Smuzhiyun }
692*4882a593Smuzhiyun
693*4882a593Smuzhiyun if (openhevc_sps->scaling_list_enable_flag != sps->scaling_list_enable_flag) {
694*4882a593Smuzhiyun mpp_log("scaling_list_enable_flag diff\n");
695*4882a593Smuzhiyun return -1;
696*4882a593Smuzhiyun }
697*4882a593Smuzhiyun
698*4882a593Smuzhiyun if (openhevc_sps->nb_st_rps != sps->nb_st_rps) {
699*4882a593Smuzhiyun mpp_log("nb_st_rps diff\n");
700*4882a593Smuzhiyun return -1;
701*4882a593Smuzhiyun }
702*4882a593Smuzhiyun
703*4882a593Smuzhiyun if (openhevc_sps->amp_enabled_flag != sps->amp_enabled_flag) {
704*4882a593Smuzhiyun mpp_log(" amp_enabled_flag diff openhevc %d != %d\n", openhevc_sps->amp_enabled_flag, sps->amp_enabled_flag);
705*4882a593Smuzhiyun return -1;
706*4882a593Smuzhiyun }
707*4882a593Smuzhiyun if (openhevc_sps->sao_enabled != sps->sao_enabled) {
708*4882a593Smuzhiyun mpp_log("sao_enabled diff\n");
709*4882a593Smuzhiyun return -1;
710*4882a593Smuzhiyun }
711*4882a593Smuzhiyun
712*4882a593Smuzhiyun if (openhevc_sps->long_term_ref_pics_present_flag
713*4882a593Smuzhiyun != sps->long_term_ref_pics_present_flag) {
714*4882a593Smuzhiyun mpp_log("long_term_ref_pics_present_flag diff\n");
715*4882a593Smuzhiyun return -1;
716*4882a593Smuzhiyun }
717*4882a593Smuzhiyun if (openhevc_sps->num_long_term_ref_pics_sps !=
718*4882a593Smuzhiyun sps->num_long_term_ref_pics_sps) {
719*4882a593Smuzhiyun mpp_log("num_long_term_ref_pics_sps diff\n");
720*4882a593Smuzhiyun return -1;
721*4882a593Smuzhiyun }
722*4882a593Smuzhiyun
723*4882a593Smuzhiyun if (openhevc_sps->sps_temporal_mvp_enabled_flag !=
724*4882a593Smuzhiyun sps->sps_temporal_mvp_enabled_flag) {
725*4882a593Smuzhiyun mpp_log("sps_temporal_mvp_enabled_flag diff\n");
726*4882a593Smuzhiyun return -1;
727*4882a593Smuzhiyun }
728*4882a593Smuzhiyun if (openhevc_sps->sps_strong_intra_smoothing_enable_flag !=
729*4882a593Smuzhiyun sps->sps_strong_intra_smoothing_enable_flag) {
730*4882a593Smuzhiyun mpp_log("sps_strong_intra_smoothing_enable_flag diff\n");
731*4882a593Smuzhiyun return -1;
732*4882a593Smuzhiyun }
733*4882a593Smuzhiyun
734*4882a593Smuzhiyun if (openhevc_sps->log2_min_cb_size != sps->log2_min_cb_size) {
735*4882a593Smuzhiyun mpp_log("log2_min_cb_size diff\n");
736*4882a593Smuzhiyun return -1;
737*4882a593Smuzhiyun }
738*4882a593Smuzhiyun if (openhevc_sps->log2_diff_max_min_coding_block_size !=
739*4882a593Smuzhiyun sps->log2_diff_max_min_coding_block_size) {
740*4882a593Smuzhiyun mpp_log("log2_diff_max_min_coding_block_size diff\n");
741*4882a593Smuzhiyun return -1;
742*4882a593Smuzhiyun }
743*4882a593Smuzhiyun if (openhevc_sps->log2_min_tb_size != sps->log2_min_tb_size) {
744*4882a593Smuzhiyun mpp_log("log2_min_tb_size diff\n");
745*4882a593Smuzhiyun return -1;
746*4882a593Smuzhiyun }
747*4882a593Smuzhiyun if (openhevc_sps->log2_max_trafo_size != sps->log2_max_trafo_size) {
748*4882a593Smuzhiyun mpp_log("log2_max_trafo_size diff\n");
749*4882a593Smuzhiyun return -1;
750*4882a593Smuzhiyun }
751*4882a593Smuzhiyun if (openhevc_sps->log2_ctb_size != sps->log2_ctb_size) {
752*4882a593Smuzhiyun mpp_log("log2_ctb_size diff\n");
753*4882a593Smuzhiyun return -1;
754*4882a593Smuzhiyun }
755*4882a593Smuzhiyun if (openhevc_sps->log2_min_pu_size != sps->log2_min_pu_size) {
756*4882a593Smuzhiyun mpp_log("log2_min_pu_size diff\n");
757*4882a593Smuzhiyun return -1;
758*4882a593Smuzhiyun }
759*4882a593Smuzhiyun
760*4882a593Smuzhiyun if (openhevc_sps->max_transform_hierarchy_depth_inter !=
761*4882a593Smuzhiyun sps->max_transform_hierarchy_depth_inter) {
762*4882a593Smuzhiyun mpp_log("max_transform_hierarchy_depth_inter diff\n");
763*4882a593Smuzhiyun return -1;
764*4882a593Smuzhiyun }
765*4882a593Smuzhiyun if (openhevc_sps->max_transform_hierarchy_depth_intra !=
766*4882a593Smuzhiyun sps->max_transform_hierarchy_depth_intra) {
767*4882a593Smuzhiyun mpp_log("max_transform_hierarchy_depth_intra diff\n");
768*4882a593Smuzhiyun return -1;
769*4882a593Smuzhiyun }
770*4882a593Smuzhiyun
771*4882a593Smuzhiyun if (openhevc_sps->width != sps->width) {
772*4882a593Smuzhiyun mpp_log("width diff\n");
773*4882a593Smuzhiyun return -1;
774*4882a593Smuzhiyun }
775*4882a593Smuzhiyun
776*4882a593Smuzhiyun if (openhevc_sps->height != sps->height) {
777*4882a593Smuzhiyun mpp_log("height diff\n");
778*4882a593Smuzhiyun return -1;
779*4882a593Smuzhiyun }
780*4882a593Smuzhiyun
781*4882a593Smuzhiyun if (openhevc_sps->ctb_width != sps->ctb_width) {
782*4882a593Smuzhiyun mpp_log("ctb_width diff\n");
783*4882a593Smuzhiyun return -1;
784*4882a593Smuzhiyun }
785*4882a593Smuzhiyun
786*4882a593Smuzhiyun if ( openhevc_sps->ctb_height != sps->ctb_height) {
787*4882a593Smuzhiyun mpp_log("ctb_height diff\n");
788*4882a593Smuzhiyun return -1;
789*4882a593Smuzhiyun }
790*4882a593Smuzhiyun
791*4882a593Smuzhiyun if (openhevc_sps->ctb_size != sps->ctb_size) {
792*4882a593Smuzhiyun mpp_log("ctb_size diff\n");
793*4882a593Smuzhiyun return -1;
794*4882a593Smuzhiyun }
795*4882a593Smuzhiyun
796*4882a593Smuzhiyun if (openhevc_sps->min_cb_width != sps->min_cb_width) {
797*4882a593Smuzhiyun mpp_log("min_cb_width diff\n");
798*4882a593Smuzhiyun return -1;
799*4882a593Smuzhiyun }
800*4882a593Smuzhiyun
801*4882a593Smuzhiyun if (openhevc_sps->min_cb_height != sps->min_cb_height) {
802*4882a593Smuzhiyun mpp_log("min_cb_height diff\n");
803*4882a593Smuzhiyun return -1;
804*4882a593Smuzhiyun }
805*4882a593Smuzhiyun
806*4882a593Smuzhiyun if (openhevc_sps->min_tb_width != sps->min_tb_width) {
807*4882a593Smuzhiyun mpp_log("min_tb_width diff\n");
808*4882a593Smuzhiyun return -1;
809*4882a593Smuzhiyun }
810*4882a593Smuzhiyun
811*4882a593Smuzhiyun if (openhevc_sps->min_tb_height != sps->min_tb_height) {
812*4882a593Smuzhiyun mpp_log("min_tb_height diff\n");
813*4882a593Smuzhiyun return -1;
814*4882a593Smuzhiyun }
815*4882a593Smuzhiyun
816*4882a593Smuzhiyun if (openhevc_sps->min_pu_width != sps->min_pu_width) {
817*4882a593Smuzhiyun mpp_log("min_pu_width diff\n");
818*4882a593Smuzhiyun return -1;
819*4882a593Smuzhiyun }
820*4882a593Smuzhiyun
821*4882a593Smuzhiyun if (openhevc_sps->min_pu_height != sps->min_pu_height) {
822*4882a593Smuzhiyun mpp_log("min_pu_height diff\n");
823*4882a593Smuzhiyun return -1;
824*4882a593Smuzhiyun }
825*4882a593Smuzhiyun
826*4882a593Smuzhiyun if (openhevc_sps->qp_bd_offset != sps->qp_bd_offset) {
827*4882a593Smuzhiyun mpp_log("qp_bd_offset diff \n");
828*4882a593Smuzhiyun return -1;
829*4882a593Smuzhiyun }
830*4882a593Smuzhiyun return 0;
831*4882a593Smuzhiyun }
832*4882a593Smuzhiyun
compare_pps(HEVCPPS * openhevc_pps,HEVCPPS * pps)833*4882a593Smuzhiyun static RK_S32 compare_pps(HEVCPPS *openhevc_pps, HEVCPPS *pps)
834*4882a593Smuzhiyun {
835*4882a593Smuzhiyun
836*4882a593Smuzhiyun if (openhevc_pps->sps_id != pps->sps_id) {
837*4882a593Smuzhiyun mpp_log("sps_id diff \n");
838*4882a593Smuzhiyun return -1;
839*4882a593Smuzhiyun }
840*4882a593Smuzhiyun
841*4882a593Smuzhiyun if (openhevc_pps->pps_id != pps->pps_id) {
842*4882a593Smuzhiyun mpp_log("pps_id diff \n");
843*4882a593Smuzhiyun return -1;
844*4882a593Smuzhiyun }
845*4882a593Smuzhiyun
846*4882a593Smuzhiyun if (openhevc_pps->sign_data_hiding_flag != pps->sign_data_hiding_flag) {
847*4882a593Smuzhiyun mpp_log("sign_data_hiding_flag diff \n");
848*4882a593Smuzhiyun return -1;
849*4882a593Smuzhiyun }
850*4882a593Smuzhiyun
851*4882a593Smuzhiyun if (openhevc_pps->cabac_init_present_flag != pps->cabac_init_present_flag) {
852*4882a593Smuzhiyun mpp_log("cabac_init_present_flag diff \n");
853*4882a593Smuzhiyun return -1;
854*4882a593Smuzhiyun }
855*4882a593Smuzhiyun
856*4882a593Smuzhiyun if (openhevc_pps->num_ref_idx_l0_default_active != pps->num_ref_idx_l0_default_active) {
857*4882a593Smuzhiyun mpp_log("num_ref_idx_l0_default_active diff \n");
858*4882a593Smuzhiyun return -1;
859*4882a593Smuzhiyun }
860*4882a593Smuzhiyun if (openhevc_pps->num_ref_idx_l1_default_active != pps->num_ref_idx_l1_default_active) {
861*4882a593Smuzhiyun mpp_log("num_ref_idx_l1_default_active diff \n");
862*4882a593Smuzhiyun return -1;
863*4882a593Smuzhiyun }
864*4882a593Smuzhiyun if (openhevc_pps->pic_init_qp_minus26 != pps->pic_init_qp_minus26) {
865*4882a593Smuzhiyun mpp_log("pic_init_qp_minus26 diff \n");
866*4882a593Smuzhiyun return -1;
867*4882a593Smuzhiyun }
868*4882a593Smuzhiyun
869*4882a593Smuzhiyun if (openhevc_pps->constrained_intra_pred_flag != pps->constrained_intra_pred_flag) {
870*4882a593Smuzhiyun mpp_log("constrained_intra_pred_flag diff \n");
871*4882a593Smuzhiyun return -1;
872*4882a593Smuzhiyun }
873*4882a593Smuzhiyun if (openhevc_pps->transform_skip_enabled_flag != pps->transform_skip_enabled_flag) {
874*4882a593Smuzhiyun mpp_log("transform_skip_enabled_flag diff \n");
875*4882a593Smuzhiyun return -1;
876*4882a593Smuzhiyun }
877*4882a593Smuzhiyun
878*4882a593Smuzhiyun if (openhevc_pps->cu_qp_delta_enabled_flag != pps->cu_qp_delta_enabled_flag) {
879*4882a593Smuzhiyun mpp_log("cu_qp_delta_enabled_flag diff \n");
880*4882a593Smuzhiyun return -1;
881*4882a593Smuzhiyun }
882*4882a593Smuzhiyun if (openhevc_pps->diff_cu_qp_delta_depth != pps->diff_cu_qp_delta_depth) {
883*4882a593Smuzhiyun mpp_log("diff_cu_qp_delta_depth diff \n");
884*4882a593Smuzhiyun return -1;
885*4882a593Smuzhiyun }
886*4882a593Smuzhiyun
887*4882a593Smuzhiyun if (openhevc_pps->cb_qp_offset != pps->cb_qp_offset) {
888*4882a593Smuzhiyun mpp_log("cb_qp_offset diff \n");
889*4882a593Smuzhiyun return -1;
890*4882a593Smuzhiyun }
891*4882a593Smuzhiyun
892*4882a593Smuzhiyun if (openhevc_pps->cr_qp_offset != pps->cr_qp_offset) {
893*4882a593Smuzhiyun mpp_log("cr_qp_offset diff \n");
894*4882a593Smuzhiyun return -1;
895*4882a593Smuzhiyun }
896*4882a593Smuzhiyun
897*4882a593Smuzhiyun if (openhevc_pps->pic_slice_level_chroma_qp_offsets_present_flag !=
898*4882a593Smuzhiyun pps->pic_slice_level_chroma_qp_offsets_present_flag) {
899*4882a593Smuzhiyun mpp_log("pic_slice_level_chroma_qp_offsets_present_flag diff \n");
900*4882a593Smuzhiyun return -1;
901*4882a593Smuzhiyun }
902*4882a593Smuzhiyun if (openhevc_pps->weighted_pred_flag != pps->weighted_pred_flag) {
903*4882a593Smuzhiyun mpp_log("weighted_pred_flag diff \n");
904*4882a593Smuzhiyun return -1;
905*4882a593Smuzhiyun }
906*4882a593Smuzhiyun if (openhevc_pps->weighted_bipred_flag != pps->weighted_bipred_flag) {
907*4882a593Smuzhiyun mpp_log("weighted_bipred_flag diff \n");
908*4882a593Smuzhiyun return -1;
909*4882a593Smuzhiyun }
910*4882a593Smuzhiyun if (openhevc_pps->output_flag_present_flag != pps->output_flag_present_flag) {
911*4882a593Smuzhiyun mpp_log("output_flag_present_flag diff \n");
912*4882a593Smuzhiyun return -1;
913*4882a593Smuzhiyun }
914*4882a593Smuzhiyun if (openhevc_pps->transquant_bypass_enable_flag !=
915*4882a593Smuzhiyun pps->transquant_bypass_enable_flag) {
916*4882a593Smuzhiyun mpp_log("transquant_bypass_enable_flag diff \n");
917*4882a593Smuzhiyun return -1;
918*4882a593Smuzhiyun }
919*4882a593Smuzhiyun
920*4882a593Smuzhiyun if (openhevc_pps->dependent_slice_segments_enabled_flag !=
921*4882a593Smuzhiyun pps->dependent_slice_segments_enabled_flag) {
922*4882a593Smuzhiyun mpp_log("dependent_slice_segments_enabled_flag diff \n");
923*4882a593Smuzhiyun return -1;
924*4882a593Smuzhiyun }
925*4882a593Smuzhiyun if (openhevc_pps->tiles_enabled_flag != pps->tiles_enabled_flag) {
926*4882a593Smuzhiyun mpp_log("tiles_enabled_flag diff \n");
927*4882a593Smuzhiyun return -1;
928*4882a593Smuzhiyun }
929*4882a593Smuzhiyun if (openhevc_pps->entropy_coding_sync_enabled_flag !=
930*4882a593Smuzhiyun pps->entropy_coding_sync_enabled_flag) {
931*4882a593Smuzhiyun mpp_log("entropy_coding_sync_enabled_flag diff \n");
932*4882a593Smuzhiyun return -1;
933*4882a593Smuzhiyun }
934*4882a593Smuzhiyun
935*4882a593Smuzhiyun if (openhevc_pps->num_tile_columns != pps->num_tile_columns) {
936*4882a593Smuzhiyun mpp_log("num_tile_columns diff \n");
937*4882a593Smuzhiyun return -1;
938*4882a593Smuzhiyun }
939*4882a593Smuzhiyun if (openhevc_pps->num_tile_rows != pps->num_tile_rows) {
940*4882a593Smuzhiyun mpp_log("num_tile_rows diff \n");
941*4882a593Smuzhiyun return -1;
942*4882a593Smuzhiyun }
943*4882a593Smuzhiyun if (openhevc_pps->uniform_spacing_flag != pps->uniform_spacing_flag) {
944*4882a593Smuzhiyun mpp_log("qp_bd_offset diff \n");
945*4882a593Smuzhiyun return -1;
946*4882a593Smuzhiyun }
947*4882a593Smuzhiyun if (openhevc_pps->loop_filter_across_tiles_enabled_flag !=
948*4882a593Smuzhiyun pps->loop_filter_across_tiles_enabled_flag) {
949*4882a593Smuzhiyun mpp_log("loop_filter_across_tiles_enabled_flag diff \n");
950*4882a593Smuzhiyun return -1;
951*4882a593Smuzhiyun }
952*4882a593Smuzhiyun
953*4882a593Smuzhiyun if (openhevc_pps->seq_loop_filter_across_slices_enabled_flag !=
954*4882a593Smuzhiyun pps->seq_loop_filter_across_slices_enabled_flag) {
955*4882a593Smuzhiyun mpp_log("seq_loop_filter_across_slices_enabled_flag diff \n");
956*4882a593Smuzhiyun return -1;
957*4882a593Smuzhiyun }
958*4882a593Smuzhiyun
959*4882a593Smuzhiyun if (openhevc_pps->deblocking_filter_control_present_flag !=
960*4882a593Smuzhiyun pps->deblocking_filter_control_present_flag) {
961*4882a593Smuzhiyun mpp_log("deblocking_filter_control_present_flag diff \n");
962*4882a593Smuzhiyun return -1;
963*4882a593Smuzhiyun }
964*4882a593Smuzhiyun if (openhevc_pps->deblocking_filter_override_enabled_flag !=
965*4882a593Smuzhiyun pps->deblocking_filter_override_enabled_flag) {
966*4882a593Smuzhiyun mpp_log("deblocking_filter_override_enabled_flag diff \n");
967*4882a593Smuzhiyun return -1;
968*4882a593Smuzhiyun }
969*4882a593Smuzhiyun if (openhevc_pps->disable_dbf != pps->disable_dbf) {
970*4882a593Smuzhiyun mpp_log("disable_dbf diff \n");
971*4882a593Smuzhiyun return -1;
972*4882a593Smuzhiyun }
973*4882a593Smuzhiyun if (openhevc_pps->beta_offset != pps->beta_offset) {
974*4882a593Smuzhiyun mpp_log("beta_offset diff \n");
975*4882a593Smuzhiyun return -1;
976*4882a593Smuzhiyun }
977*4882a593Smuzhiyun if (openhevc_pps->tc_offset != pps->tc_offset) {
978*4882a593Smuzhiyun mpp_log("tc_offset diff \n");
979*4882a593Smuzhiyun return -1;
980*4882a593Smuzhiyun }
981*4882a593Smuzhiyun
982*4882a593Smuzhiyun if (openhevc_pps->scaling_list_data_present_flag !=
983*4882a593Smuzhiyun pps->scaling_list_data_present_flag) {
984*4882a593Smuzhiyun mpp_log("scaling_list_data_present_flag diff \n");
985*4882a593Smuzhiyun return -1;
986*4882a593Smuzhiyun }
987*4882a593Smuzhiyun
988*4882a593Smuzhiyun if (openhevc_pps->lists_modification_present_flag !=
989*4882a593Smuzhiyun pps->lists_modification_present_flag) {
990*4882a593Smuzhiyun mpp_log("lists_modification_present_flag diff \n");
991*4882a593Smuzhiyun return -1;
992*4882a593Smuzhiyun }
993*4882a593Smuzhiyun if (openhevc_pps->log2_parallel_merge_level != pps->log2_parallel_merge_level) {
994*4882a593Smuzhiyun mpp_log("log2_parallel_merge_level diff \n");
995*4882a593Smuzhiyun return -1;
996*4882a593Smuzhiyun }
997*4882a593Smuzhiyun if (openhevc_pps->num_extra_slice_header_bits !=
998*4882a593Smuzhiyun pps->num_extra_slice_header_bits) {
999*4882a593Smuzhiyun mpp_log("num_extra_slice_header_bits diff \n");
1000*4882a593Smuzhiyun return -1;
1001*4882a593Smuzhiyun }
1002*4882a593Smuzhiyun #if 0
1003*4882a593Smuzhiyun if (openhevc_pps->slice_header_extension_present_flag !=
1004*4882a593Smuzhiyun pps->slice_header_extension_present_flag) {
1005*4882a593Smuzhiyun mpp_log("slice_header_extension_present_flag diff \n");
1006*4882a593Smuzhiyun return -1;
1007*4882a593Smuzhiyun }
1008*4882a593Smuzhiyun
1009*4882a593Smuzhiyun if (openhevc_pps->pps_extension_flag != pps->pps_extension_flag) {
1010*4882a593Smuzhiyun mpp_log("pps_extension_flag diff \n");
1011*4882a593Smuzhiyun return -1;
1012*4882a593Smuzhiyun }
1013*4882a593Smuzhiyun if (openhevc_pps->pps_extension_data_flag != pps->pps_extension_data_flag) {
1014*4882a593Smuzhiyun mpp_log("pps_extension_data_flag diff \n");
1015*4882a593Smuzhiyun return -1;
1016*4882a593Smuzhiyun }
1017*4882a593Smuzhiyun #endif
1018*4882a593Smuzhiyun return 0;
1019*4882a593Smuzhiyun
1020*4882a593Smuzhiyun }
1021*4882a593Smuzhiyun
1022*4882a593Smuzhiyun
1023*4882a593Smuzhiyun
mpp_hevc_decode_nal_vps(HEVCContext * s)1024*4882a593Smuzhiyun int mpp_hevc_decode_nal_vps(HEVCContext *s)
1025*4882a593Smuzhiyun {
1026*4882a593Smuzhiyun RK_S32 i, j;
1027*4882a593Smuzhiyun BitReadCtx_t *gb = &s->HEVClc->gb;
1028*4882a593Smuzhiyun RK_U32 vps_id = 0;
1029*4882a593Smuzhiyun HEVCVPS *vps = NULL;
1030*4882a593Smuzhiyun RK_U8 *vps_buf = mpp_calloc(RK_U8, sizeof(HEVCVPS));
1031*4882a593Smuzhiyun RK_S32 value = 0;
1032*4882a593Smuzhiyun
1033*4882a593Smuzhiyun if (!vps_buf)
1034*4882a593Smuzhiyun return MPP_ERR_NOMEM;
1035*4882a593Smuzhiyun vps = (HEVCVPS*)vps_buf;
1036*4882a593Smuzhiyun
1037*4882a593Smuzhiyun h265d_dbg(H265D_DBG_FUNCTION, "Decoding VPS\n");
1038*4882a593Smuzhiyun
1039*4882a593Smuzhiyun READ_BITS(gb, 4, &vps_id);
1040*4882a593Smuzhiyun
1041*4882a593Smuzhiyun h265d_dbg(H265D_DBG_VPS, "vps_id = 0x%x", vps_id);
1042*4882a593Smuzhiyun
1043*4882a593Smuzhiyun if (vps_id >= MAX_VPS_COUNT) {
1044*4882a593Smuzhiyun mpp_err( "VPS id out of range: %d\n", vps_id);
1045*4882a593Smuzhiyun goto err;
1046*4882a593Smuzhiyun }
1047*4882a593Smuzhiyun READ_BITS(gb, 2, &value);
1048*4882a593Smuzhiyun if (value != 3) { // vps_reserved_three_2bits
1049*4882a593Smuzhiyun mpp_err( "vps_reserved_three_2bits is not three\n");
1050*4882a593Smuzhiyun goto err;
1051*4882a593Smuzhiyun }
1052*4882a593Smuzhiyun
1053*4882a593Smuzhiyun READ_BITS(gb, 6, &vps->vps_max_layers);
1054*4882a593Smuzhiyun vps->vps_max_layers = vps->vps_max_layers + 1;
1055*4882a593Smuzhiyun
1056*4882a593Smuzhiyun READ_BITS(gb, 3, &vps->vps_max_sub_layers);
1057*4882a593Smuzhiyun vps->vps_max_sub_layers = vps->vps_max_sub_layers + 1;
1058*4882a593Smuzhiyun
1059*4882a593Smuzhiyun READ_ONEBIT(gb, & vps->vps_temporal_id_nesting_flag);
1060*4882a593Smuzhiyun READ_BITS(gb, 16, &value);
1061*4882a593Smuzhiyun
1062*4882a593Smuzhiyun if (value != 0xffff) { // vps_reserved_ffff_16bits
1063*4882a593Smuzhiyun mpp_err( "vps_reserved_ffff_16bits is not 0xffff\n");
1064*4882a593Smuzhiyun goto err;
1065*4882a593Smuzhiyun }
1066*4882a593Smuzhiyun
1067*4882a593Smuzhiyun if (vps->vps_max_sub_layers > MAX_SUB_LAYERS) {
1068*4882a593Smuzhiyun mpp_err( "vps_max_sub_layers out of range: %d\n",
1069*4882a593Smuzhiyun vps->vps_max_sub_layers);
1070*4882a593Smuzhiyun goto err;
1071*4882a593Smuzhiyun }
1072*4882a593Smuzhiyun
1073*4882a593Smuzhiyun parse_ptl(s, &vps->ptl, vps->vps_max_sub_layers);
1074*4882a593Smuzhiyun
1075*4882a593Smuzhiyun READ_ONEBIT(gb, &vps->vps_sub_layer_ordering_info_present_flag);
1076*4882a593Smuzhiyun
1077*4882a593Smuzhiyun i = vps->vps_sub_layer_ordering_info_present_flag ? 0 : vps->vps_max_sub_layers - 1;
1078*4882a593Smuzhiyun for (; i < vps->vps_max_sub_layers; i++) {
1079*4882a593Smuzhiyun READ_UE(gb, &vps->vps_max_dec_pic_buffering[i]);
1080*4882a593Smuzhiyun vps->vps_max_dec_pic_buffering[i] = vps->vps_max_dec_pic_buffering[i] + 1;
1081*4882a593Smuzhiyun READ_UE(gb, &vps->vps_num_reorder_pics[i]);
1082*4882a593Smuzhiyun READ_UE(gb, &vps->vps_max_latency_increase[i]);
1083*4882a593Smuzhiyun vps->vps_max_latency_increase[i] = vps->vps_max_latency_increase[i] - 1;
1084*4882a593Smuzhiyun
1085*4882a593Smuzhiyun if (vps->vps_max_dec_pic_buffering[i] > MAX_DPB_SIZE) {
1086*4882a593Smuzhiyun mpp_err( "vps_max_dec_pic_buffering_minus1 out of range: %d\n",
1087*4882a593Smuzhiyun vps->vps_max_dec_pic_buffering[i] - 1);
1088*4882a593Smuzhiyun goto err;
1089*4882a593Smuzhiyun }
1090*4882a593Smuzhiyun if (vps->vps_num_reorder_pics[i] > vps->vps_max_dec_pic_buffering[i] - 1) {
1091*4882a593Smuzhiyun mpp_err( "vps_max_num_reorder_pics out of range: %d\n",
1092*4882a593Smuzhiyun vps->vps_num_reorder_pics[i]);
1093*4882a593Smuzhiyun goto err;
1094*4882a593Smuzhiyun }
1095*4882a593Smuzhiyun }
1096*4882a593Smuzhiyun
1097*4882a593Smuzhiyun READ_BITS(gb, 6, &vps->vps_max_layer_id);
1098*4882a593Smuzhiyun READ_UE(gb, &vps->vps_num_layer_sets);
1099*4882a593Smuzhiyun vps->vps_num_layer_sets += 1;
1100*4882a593Smuzhiyun for (i = 1; i < vps->vps_num_layer_sets; i++)
1101*4882a593Smuzhiyun for (j = 0; j <= vps->vps_max_layer_id; j++)
1102*4882a593Smuzhiyun SKIP_BITS(gb, 1); // layer_id_included_flag[i][j]
1103*4882a593Smuzhiyun
1104*4882a593Smuzhiyun READ_ONEBIT(gb, &vps->vps_timing_info_present_flag);
1105*4882a593Smuzhiyun if (vps->vps_timing_info_present_flag) {
1106*4882a593Smuzhiyun mpp_read_longbits(gb, 32, &vps->vps_num_units_in_tick);
1107*4882a593Smuzhiyun mpp_read_longbits(gb, 32, &vps->vps_time_scale);
1108*4882a593Smuzhiyun READ_ONEBIT(gb, &vps->vps_poc_proportional_to_timing_flag);
1109*4882a593Smuzhiyun if (vps->vps_poc_proportional_to_timing_flag) {
1110*4882a593Smuzhiyun READ_UE(gb, &vps->vps_num_ticks_poc_diff_one);
1111*4882a593Smuzhiyun vps->vps_num_ticks_poc_diff_one += 1;
1112*4882a593Smuzhiyun }
1113*4882a593Smuzhiyun READ_UE(gb, &vps->vps_num_hrd_parameters);
1114*4882a593Smuzhiyun for (i = 0; i < vps->vps_num_hrd_parameters; i++) {
1115*4882a593Smuzhiyun RK_S32 common_inf_present = 1;
1116*4882a593Smuzhiyun RK_S32 hrd_layer_set_idx = 0;
1117*4882a593Smuzhiyun
1118*4882a593Smuzhiyun READ_UE(gb, &hrd_layer_set_idx); // hrd_layer_set_idx
1119*4882a593Smuzhiyun if (i)
1120*4882a593Smuzhiyun READ_ONEBIT(gb, &common_inf_present);
1121*4882a593Smuzhiyun decode_hrd(s, common_inf_present, vps->vps_max_sub_layers);
1122*4882a593Smuzhiyun }
1123*4882a593Smuzhiyun }
1124*4882a593Smuzhiyun
1125*4882a593Smuzhiyun // READ_ONEBIT(gb, &vps->vps_extension_flag);
1126*4882a593Smuzhiyun
1127*4882a593Smuzhiyun #ifdef VPS_EXTENSION
1128*4882a593Smuzhiyun if (vps->vps_extension_flag) { // vps_extension_flag
1129*4882a593Smuzhiyun parse_vps_extension(s, vps);
1130*4882a593Smuzhiyun }
1131*4882a593Smuzhiyun #endif
1132*4882a593Smuzhiyun if (s->h265dctx->compare_info != NULL) {
1133*4882a593Smuzhiyun CurrentFameInf_t *info = (CurrentFameInf_t *)s->h265dctx->compare_info;
1134*4882a593Smuzhiyun HEVCVPS *openhevc_vps = (HEVCVPS*)&info->vps[vps_id];
1135*4882a593Smuzhiyun mpp_log("compare_vps in \n");
1136*4882a593Smuzhiyun if (compare_vps(openhevc_vps, (HEVCVPS*)vps_buf) < 0) {
1137*4882a593Smuzhiyun mpp_err("compare_vps return error \n");
1138*4882a593Smuzhiyun mpp_assert(0);
1139*4882a593Smuzhiyun return -1;
1140*4882a593Smuzhiyun }
1141*4882a593Smuzhiyun mpp_log("compare_vps ok \n");
1142*4882a593Smuzhiyun }
1143*4882a593Smuzhiyun
1144*4882a593Smuzhiyun if (s->vps_list[vps_id] &&
1145*4882a593Smuzhiyun !memcmp(s->vps_list[vps_id], vps_buf, sizeof(HEVCVPS))) {
1146*4882a593Smuzhiyun mpp_free(vps_buf);
1147*4882a593Smuzhiyun } else {
1148*4882a593Smuzhiyun if (s->vps_list[vps_id] != NULL) {
1149*4882a593Smuzhiyun mpp_free(s->vps_list[vps_id]);
1150*4882a593Smuzhiyun }
1151*4882a593Smuzhiyun s->vps_list[vps_id] = vps_buf;
1152*4882a593Smuzhiyun s->ps_need_upate = 1;
1153*4882a593Smuzhiyun }
1154*4882a593Smuzhiyun
1155*4882a593Smuzhiyun return 0;
1156*4882a593Smuzhiyun __BITREAD_ERR:
1157*4882a593Smuzhiyun err:
1158*4882a593Smuzhiyun mpp_free(vps_buf);
1159*4882a593Smuzhiyun return MPP_ERR_STREAM;
1160*4882a593Smuzhiyun }
1161*4882a593Smuzhiyun
1162*4882a593Smuzhiyun
decode_vui(HEVCContext * s,HEVCSPS * sps)1163*4882a593Smuzhiyun static RK_S32 decode_vui(HEVCContext *s, HEVCSPS *sps)
1164*4882a593Smuzhiyun {
1165*4882a593Smuzhiyun VUI *vui = &sps->vui;
1166*4882a593Smuzhiyun BitReadCtx_t *gb = &s->HEVClc->gb;
1167*4882a593Smuzhiyun RK_S32 sar_present;
1168*4882a593Smuzhiyun
1169*4882a593Smuzhiyun h265d_dbg(H265D_DBG_FUNCTION, "Decoding VUI\n");
1170*4882a593Smuzhiyun
1171*4882a593Smuzhiyun vui->colour_primaries = MPP_FRAME_PRI_UNSPECIFIED;
1172*4882a593Smuzhiyun vui->transfer_characteristic = MPP_FRAME_TRC_UNSPECIFIED;
1173*4882a593Smuzhiyun vui->matrix_coeffs = MPP_FRAME_SPC_UNSPECIFIED;
1174*4882a593Smuzhiyun
1175*4882a593Smuzhiyun READ_ONEBIT(gb, &sar_present);
1176*4882a593Smuzhiyun if (sar_present) {
1177*4882a593Smuzhiyun RK_U8 sar_idx = 0;
1178*4882a593Smuzhiyun READ_BITS(gb, 8, &sar_idx);
1179*4882a593Smuzhiyun if (sar_idx < MPP_ARRAY_ELEMS(vui_sar))
1180*4882a593Smuzhiyun vui->sar = vui_sar[sar_idx];
1181*4882a593Smuzhiyun else if (sar_idx == 255) {
1182*4882a593Smuzhiyun READ_BITS(gb, 16, &vui->sar.num);
1183*4882a593Smuzhiyun READ_BITS(gb, 16, &vui->sar.den);
1184*4882a593Smuzhiyun } else
1185*4882a593Smuzhiyun mpp_log("Unknown SAR index: %u.\n", sar_idx);
1186*4882a593Smuzhiyun }
1187*4882a593Smuzhiyun
1188*4882a593Smuzhiyun READ_ONEBIT(gb, &vui->overscan_info_present_flag);
1189*4882a593Smuzhiyun if (vui->overscan_info_present_flag)
1190*4882a593Smuzhiyun READ_ONEBIT(gb, &vui->overscan_appropriate_flag);
1191*4882a593Smuzhiyun
1192*4882a593Smuzhiyun READ_ONEBIT(gb, &vui->video_signal_type_present_flag);
1193*4882a593Smuzhiyun if (vui->video_signal_type_present_flag) {
1194*4882a593Smuzhiyun READ_BITS(gb, 3, & vui->video_format);
1195*4882a593Smuzhiyun READ_ONEBIT(gb, &vui->video_full_range_flag);
1196*4882a593Smuzhiyun READ_ONEBIT(gb, &vui->colour_description_present_flag);
1197*4882a593Smuzhiyun
1198*4882a593Smuzhiyun if (vui->colour_description_present_flag) {
1199*4882a593Smuzhiyun READ_BITS(gb, 8, &vui->colour_primaries);
1200*4882a593Smuzhiyun READ_BITS(gb, 8, &vui->transfer_characteristic);
1201*4882a593Smuzhiyun READ_BITS(gb, 8, &vui->matrix_coeffs);
1202*4882a593Smuzhiyun
1203*4882a593Smuzhiyun // Set invalid values to "unspecified"
1204*4882a593Smuzhiyun // if (vui->colour_primaries >= RKCOL_PRI_NB)
1205*4882a593Smuzhiyun // vui->colour_primaries = RKCOL_PRI_UNSPECIFIED;
1206*4882a593Smuzhiyun // if (vui->transfer_characteristic >= RKCOL_TRC_NB)
1207*4882a593Smuzhiyun // vui->transfer_characteristic = RKCOL_TRC_UNSPECIFIED;
1208*4882a593Smuzhiyun if (vui->transfer_characteristic == MPP_FRAME_TRC_SMPTEST2084 ||
1209*4882a593Smuzhiyun vui->transfer_characteristic == MPP_FRAME_TRC_ARIB_STD_B67)
1210*4882a593Smuzhiyun s->is_hdr = 1;
1211*4882a593Smuzhiyun if (vui->matrix_coeffs >= MPP_FRAME_SPC_NB)
1212*4882a593Smuzhiyun vui->matrix_coeffs = MPP_FRAME_SPC_UNSPECIFIED;
1213*4882a593Smuzhiyun }
1214*4882a593Smuzhiyun }
1215*4882a593Smuzhiyun
1216*4882a593Smuzhiyun READ_ONEBIT(gb, &vui->chroma_loc_info_present_flag );
1217*4882a593Smuzhiyun if (vui->chroma_loc_info_present_flag) {
1218*4882a593Smuzhiyun READ_UE(gb, &vui->chroma_sample_loc_type_top_field);
1219*4882a593Smuzhiyun READ_UE(gb, &vui->chroma_sample_loc_type_bottom_field);
1220*4882a593Smuzhiyun }
1221*4882a593Smuzhiyun
1222*4882a593Smuzhiyun READ_ONEBIT(gb, &vui->neutra_chroma_indication_flag);
1223*4882a593Smuzhiyun READ_ONEBIT(gb, &vui->field_seq_flag);
1224*4882a593Smuzhiyun READ_ONEBIT(gb, &vui->frame_field_info_present_flag);
1225*4882a593Smuzhiyun
1226*4882a593Smuzhiyun READ_ONEBIT(gb, &vui->default_display_window_flag);
1227*4882a593Smuzhiyun if (vui->default_display_window_flag) {
1228*4882a593Smuzhiyun //TODO: * 2 is only valid for 420
1229*4882a593Smuzhiyun READ_UE(gb, &vui->def_disp_win.left_offset);
1230*4882a593Smuzhiyun vui->def_disp_win.left_offset = vui->def_disp_win.left_offset * 2;
1231*4882a593Smuzhiyun
1232*4882a593Smuzhiyun READ_UE(gb, &vui->def_disp_win.right_offset);
1233*4882a593Smuzhiyun vui->def_disp_win.right_offset = vui->def_disp_win.right_offset * 2;
1234*4882a593Smuzhiyun
1235*4882a593Smuzhiyun READ_UE(gb, &vui->def_disp_win.right_offset);
1236*4882a593Smuzhiyun vui->def_disp_win.top_offset = vui->def_disp_win.top_offset * 2;
1237*4882a593Smuzhiyun
1238*4882a593Smuzhiyun READ_UE(gb, &vui->def_disp_win.right_offset);
1239*4882a593Smuzhiyun vui->def_disp_win.bottom_offset = vui->def_disp_win.bottom_offset * 2;
1240*4882a593Smuzhiyun
1241*4882a593Smuzhiyun #if 0
1242*4882a593Smuzhiyun if (s->apply_defdispwin &&
1243*4882a593Smuzhiyun s->h265dctx->flags2 & CODEC_FLAG2_IGNORE_CROP) {
1244*4882a593Smuzhiyun h265d_dbg(H265D_DBG_SPS,
1245*4882a593Smuzhiyun "discarding vui default display window, "
1246*4882a593Smuzhiyun "original values are l:%u r:%u t:%u b:%u\n",
1247*4882a593Smuzhiyun vui->def_disp_win.left_offset,
1248*4882a593Smuzhiyun vui->def_disp_win.right_offset,
1249*4882a593Smuzhiyun vui->def_disp_win.top_offset,
1250*4882a593Smuzhiyun vui->def_disp_win.bottom_offset);
1251*4882a593Smuzhiyun
1252*4882a593Smuzhiyun vui->def_disp_win.left_offset =
1253*4882a593Smuzhiyun vui->def_disp_win.right_offset =
1254*4882a593Smuzhiyun vui->def_disp_win.top_offset =
1255*4882a593Smuzhiyun vui->def_disp_win.bottom_offset = 0;
1256*4882a593Smuzhiyun }
1257*4882a593Smuzhiyun #endif
1258*4882a593Smuzhiyun }
1259*4882a593Smuzhiyun
1260*4882a593Smuzhiyun READ_ONEBIT(gb, &vui->vui_timing_info_present_flag);
1261*4882a593Smuzhiyun
1262*4882a593Smuzhiyun if (vui->vui_timing_info_present_flag) {
1263*4882a593Smuzhiyun mpp_read_longbits(gb, 32, &vui->vui_num_units_in_tick);
1264*4882a593Smuzhiyun mpp_read_longbits(gb, 32, &vui->vui_time_scale);
1265*4882a593Smuzhiyun READ_ONEBIT(gb, &vui->vui_poc_proportional_to_timing_flag);
1266*4882a593Smuzhiyun if (vui->vui_poc_proportional_to_timing_flag)
1267*4882a593Smuzhiyun READ_UE(gb, &vui->vui_num_ticks_poc_diff_one_minus1);
1268*4882a593Smuzhiyun READ_ONEBIT(gb, &vui->vui_hrd_parameters_present_flag);
1269*4882a593Smuzhiyun if (vui->vui_hrd_parameters_present_flag)
1270*4882a593Smuzhiyun decode_hrd(s, 1, sps->max_sub_layers);
1271*4882a593Smuzhiyun }
1272*4882a593Smuzhiyun
1273*4882a593Smuzhiyun READ_ONEBIT(gb, &vui->bitstream_restriction_flag);
1274*4882a593Smuzhiyun if (vui->bitstream_restriction_flag) {
1275*4882a593Smuzhiyun READ_ONEBIT(gb, &vui->tiles_fixed_structure_flag);
1276*4882a593Smuzhiyun READ_ONEBIT(gb, &vui->motion_vectors_over_pic_boundaries_flag);
1277*4882a593Smuzhiyun READ_ONEBIT(gb, &vui->restricted_ref_pic_lists_flag);
1278*4882a593Smuzhiyun READ_UE(gb, &vui->min_spatial_segmentation_idc);
1279*4882a593Smuzhiyun READ_UE(gb, &vui->max_bytes_per_pic_denom);
1280*4882a593Smuzhiyun READ_UE(gb, &vui->max_bits_per_min_cu_denom);
1281*4882a593Smuzhiyun READ_UE(gb, &vui->log2_max_mv_length_horizontal);
1282*4882a593Smuzhiyun READ_UE(gb, &vui->log2_max_mv_length_vertical);
1283*4882a593Smuzhiyun }
1284*4882a593Smuzhiyun return 0;
1285*4882a593Smuzhiyun __BITREAD_ERR:
1286*4882a593Smuzhiyun return MPP_ERR_STREAM;
1287*4882a593Smuzhiyun }
1288*4882a593Smuzhiyun
set_default_scaling_list_data(ScalingList * sl)1289*4882a593Smuzhiyun static void set_default_scaling_list_data(ScalingList *sl)
1290*4882a593Smuzhiyun {
1291*4882a593Smuzhiyun int matrixId;
1292*4882a593Smuzhiyun
1293*4882a593Smuzhiyun for (matrixId = 0; matrixId < 6; matrixId++) {
1294*4882a593Smuzhiyun // 4x4 default is 16
1295*4882a593Smuzhiyun memset(sl->sl[0][matrixId], 16, 16);
1296*4882a593Smuzhiyun sl->sl_dc[0][matrixId] = 16; // default for 16x16
1297*4882a593Smuzhiyun sl->sl_dc[1][matrixId] = 16; // default for 32x32
1298*4882a593Smuzhiyun }
1299*4882a593Smuzhiyun memcpy(sl->sl[1][0], default_scaling_list_intra, 64);
1300*4882a593Smuzhiyun memcpy(sl->sl[1][1], default_scaling_list_intra, 64);
1301*4882a593Smuzhiyun memcpy(sl->sl[1][2], default_scaling_list_intra, 64);
1302*4882a593Smuzhiyun memcpy(sl->sl[1][3], default_scaling_list_inter, 64);
1303*4882a593Smuzhiyun memcpy(sl->sl[1][4], default_scaling_list_inter, 64);
1304*4882a593Smuzhiyun memcpy(sl->sl[1][5], default_scaling_list_inter, 64);
1305*4882a593Smuzhiyun memcpy(sl->sl[2][0], default_scaling_list_intra, 64);
1306*4882a593Smuzhiyun memcpy(sl->sl[2][1], default_scaling_list_intra, 64);
1307*4882a593Smuzhiyun memcpy(sl->sl[2][2], default_scaling_list_intra, 64);
1308*4882a593Smuzhiyun memcpy(sl->sl[2][3], default_scaling_list_inter, 64);
1309*4882a593Smuzhiyun memcpy(sl->sl[2][4], default_scaling_list_inter, 64);
1310*4882a593Smuzhiyun memcpy(sl->sl[2][5], default_scaling_list_inter, 64);
1311*4882a593Smuzhiyun memcpy(sl->sl[3][0], default_scaling_list_intra, 64);
1312*4882a593Smuzhiyun memcpy(sl->sl[3][0], default_scaling_list_intra, 64);
1313*4882a593Smuzhiyun memcpy(sl->sl[3][1], default_scaling_list_intra, 64);
1314*4882a593Smuzhiyun memcpy(sl->sl[3][2], default_scaling_list_intra, 64);
1315*4882a593Smuzhiyun memcpy(sl->sl[3][3], default_scaling_list_inter, 64);
1316*4882a593Smuzhiyun memcpy(sl->sl[3][4], default_scaling_list_inter, 64);
1317*4882a593Smuzhiyun memcpy(sl->sl[3][5], default_scaling_list_inter, 64);
1318*4882a593Smuzhiyun }
1319*4882a593Smuzhiyun
scaling_list_data(HEVCContext * s,ScalingList * sl,HEVCSPS * sps)1320*4882a593Smuzhiyun static int scaling_list_data(HEVCContext *s, ScalingList *sl, HEVCSPS *sps)
1321*4882a593Smuzhiyun {
1322*4882a593Smuzhiyun BitReadCtx_t *gb = &s->HEVClc->gb;
1323*4882a593Smuzhiyun RK_U8 scaling_list_pred_mode_flag;
1324*4882a593Smuzhiyun RK_S32 scaling_list_dc_coef[2][6];
1325*4882a593Smuzhiyun RK_S32 size_id, i, pos;
1326*4882a593Smuzhiyun RK_U32 matrix_id;
1327*4882a593Smuzhiyun
1328*4882a593Smuzhiyun for (size_id = 0; size_id < 4; size_id++)
1329*4882a593Smuzhiyun for (matrix_id = 0; matrix_id < 6; matrix_id += ((size_id == 3) ? 3 : 1)) {
1330*4882a593Smuzhiyun READ_ONEBIT(gb, &scaling_list_pred_mode_flag);
1331*4882a593Smuzhiyun if (!scaling_list_pred_mode_flag) {
1332*4882a593Smuzhiyun RK_U32 delta = 0;
1333*4882a593Smuzhiyun READ_UE(gb, &delta);
1334*4882a593Smuzhiyun /* Only need to handle non-zero delta. Zero means default,
1335*4882a593Smuzhiyun * which should already be in the arrays. */
1336*4882a593Smuzhiyun if (delta) {
1337*4882a593Smuzhiyun // Copy from previous array.
1338*4882a593Smuzhiyun delta *= (size_id == 3) ? 3 : 1;
1339*4882a593Smuzhiyun if (matrix_id < delta) {
1340*4882a593Smuzhiyun mpp_err(
1341*4882a593Smuzhiyun "Invalid delta in scaling list data: %d.\n", delta);
1342*4882a593Smuzhiyun return MPP_ERR_STREAM;
1343*4882a593Smuzhiyun }
1344*4882a593Smuzhiyun
1345*4882a593Smuzhiyun memcpy(sl->sl[size_id][matrix_id],
1346*4882a593Smuzhiyun sl->sl[size_id][matrix_id - delta],
1347*4882a593Smuzhiyun size_id > 0 ? 64 : 16);
1348*4882a593Smuzhiyun if (size_id > 1)
1349*4882a593Smuzhiyun sl->sl_dc[size_id - 2][matrix_id] = sl->sl_dc[size_id - 2][matrix_id - delta];
1350*4882a593Smuzhiyun }
1351*4882a593Smuzhiyun } else {
1352*4882a593Smuzhiyun RK_S32 next_coef, coef_num;
1353*4882a593Smuzhiyun RK_S32 scaling_list_delta_coef;
1354*4882a593Smuzhiyun
1355*4882a593Smuzhiyun next_coef = 8;
1356*4882a593Smuzhiyun coef_num = MPP_MIN(64, 1 << (4 + (size_id << 1)));
1357*4882a593Smuzhiyun if (size_id > 1) {
1358*4882a593Smuzhiyun READ_SE(gb, &scaling_list_dc_coef[size_id - 2][matrix_id]);
1359*4882a593Smuzhiyun scaling_list_dc_coef[size_id - 2][matrix_id] = scaling_list_dc_coef[size_id - 2][matrix_id] + 8;
1360*4882a593Smuzhiyun next_coef = scaling_list_dc_coef[size_id - 2][matrix_id];
1361*4882a593Smuzhiyun sl->sl_dc[size_id - 2][matrix_id] = next_coef;
1362*4882a593Smuzhiyun }
1363*4882a593Smuzhiyun for (i = 0; i < coef_num; i++) {
1364*4882a593Smuzhiyun if (size_id == 0)
1365*4882a593Smuzhiyun pos = 4 * mpp_hevc_diag_scan4x4_y[i] +
1366*4882a593Smuzhiyun mpp_hevc_diag_scan4x4_x[i];
1367*4882a593Smuzhiyun else
1368*4882a593Smuzhiyun pos = 8 * mpp_hevc_diag_scan8x8_y[i] +
1369*4882a593Smuzhiyun mpp_hevc_diag_scan8x8_x[i];
1370*4882a593Smuzhiyun
1371*4882a593Smuzhiyun READ_SE(gb, &scaling_list_delta_coef);
1372*4882a593Smuzhiyun next_coef = (next_coef + scaling_list_delta_coef + 256) % 256;
1373*4882a593Smuzhiyun sl->sl[size_id][matrix_id][pos] = next_coef;
1374*4882a593Smuzhiyun }
1375*4882a593Smuzhiyun }
1376*4882a593Smuzhiyun }
1377*4882a593Smuzhiyun if (sps->chroma_format_idc == 3) {
1378*4882a593Smuzhiyun for (i = 0; i < 64; i++) {
1379*4882a593Smuzhiyun sl->sl[3][1][i] = sl->sl[2][1][i];
1380*4882a593Smuzhiyun sl->sl[3][2][i] = sl->sl[2][2][i];
1381*4882a593Smuzhiyun sl->sl[3][4][i] = sl->sl[2][4][i];
1382*4882a593Smuzhiyun sl->sl[3][5][i] = sl->sl[2][5][i];
1383*4882a593Smuzhiyun }
1384*4882a593Smuzhiyun sl->sl_dc[1][1] = sl->sl_dc[0][1];
1385*4882a593Smuzhiyun sl->sl_dc[1][2] = sl->sl_dc[0][2];
1386*4882a593Smuzhiyun sl->sl_dc[1][4] = sl->sl_dc[0][4];
1387*4882a593Smuzhiyun sl->sl_dc[1][5] = sl->sl_dc[0][5];
1388*4882a593Smuzhiyun }
1389*4882a593Smuzhiyun return 0;
1390*4882a593Smuzhiyun __BITREAD_ERR:
1391*4882a593Smuzhiyun return MPP_ERR_STREAM;
1392*4882a593Smuzhiyun }
1393*4882a593Smuzhiyun
mpp_hevc_decode_nal_sps(HEVCContext * s)1394*4882a593Smuzhiyun RK_S32 mpp_hevc_decode_nal_sps(HEVCContext *s)
1395*4882a593Smuzhiyun {
1396*4882a593Smuzhiyun // const AVPixFmtDescriptor *desc;
1397*4882a593Smuzhiyun BitReadCtx_t *gb = &s->HEVClc->gb;
1398*4882a593Smuzhiyun RK_S32 ret = 0;
1399*4882a593Smuzhiyun RK_U32 sps_id = 0;
1400*4882a593Smuzhiyun RK_S32 log2_diff_max_min_transform_block_size;
1401*4882a593Smuzhiyun RK_S32 bit_depth_chroma, start, vui_present, sublayer_ordering_info;
1402*4882a593Smuzhiyun RK_S32 i;
1403*4882a593Smuzhiyun RK_S32 value = 0;
1404*4882a593Smuzhiyun
1405*4882a593Smuzhiyun HEVCSPS *sps;
1406*4882a593Smuzhiyun RK_U8 *sps_buf = mpp_mem_pool_get(s->sps_pool);
1407*4882a593Smuzhiyun
1408*4882a593Smuzhiyun if (!sps_buf)
1409*4882a593Smuzhiyun return MPP_ERR_NOMEM;
1410*4882a593Smuzhiyun sps = (HEVCSPS*)sps_buf;
1411*4882a593Smuzhiyun
1412*4882a593Smuzhiyun h265d_dbg(H265D_DBG_FUNCTION, "Decoding SPS\n");
1413*4882a593Smuzhiyun
1414*4882a593Smuzhiyun // Coded parameters
1415*4882a593Smuzhiyun
1416*4882a593Smuzhiyun READ_BITS(gb, 4, &sps->vps_id);
1417*4882a593Smuzhiyun if (sps->vps_id >= MAX_VPS_COUNT) {
1418*4882a593Smuzhiyun mpp_err( "VPS id out of range: %d\n", sps->vps_id);
1419*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
1420*4882a593Smuzhiyun goto err;
1421*4882a593Smuzhiyun }
1422*4882a593Smuzhiyun
1423*4882a593Smuzhiyun if (!s->vps_list[sps->vps_id]) {
1424*4882a593Smuzhiyun mpp_err( "VPS %d does not exist\n",
1425*4882a593Smuzhiyun sps->vps_id);
1426*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
1427*4882a593Smuzhiyun goto err;
1428*4882a593Smuzhiyun }
1429*4882a593Smuzhiyun
1430*4882a593Smuzhiyun READ_BITS(gb, 3, &sps->max_sub_layers);
1431*4882a593Smuzhiyun sps->max_sub_layers += 1;
1432*4882a593Smuzhiyun
1433*4882a593Smuzhiyun if (sps->max_sub_layers > MAX_SUB_LAYERS) {
1434*4882a593Smuzhiyun mpp_err( "sps_max_sub_layers out of range: %d\n",
1435*4882a593Smuzhiyun sps->max_sub_layers);
1436*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
1437*4882a593Smuzhiyun goto err;
1438*4882a593Smuzhiyun }
1439*4882a593Smuzhiyun
1440*4882a593Smuzhiyun SKIP_BITS(gb, 1); // temporal_id_nesting_flag
1441*4882a593Smuzhiyun
1442*4882a593Smuzhiyun parse_ptl(s, &sps->ptl, sps->max_sub_layers);
1443*4882a593Smuzhiyun
1444*4882a593Smuzhiyun READ_UE(gb, &sps_id);
1445*4882a593Smuzhiyun sps->sps_id = sps_id;
1446*4882a593Smuzhiyun if (sps_id >= MAX_SPS_COUNT) {
1447*4882a593Smuzhiyun mpp_err( "SPS id out of range: %d\n", sps_id);
1448*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
1449*4882a593Smuzhiyun goto err;
1450*4882a593Smuzhiyun }
1451*4882a593Smuzhiyun
1452*4882a593Smuzhiyun READ_UE(gb, &sps->chroma_format_idc);
1453*4882a593Smuzhiyun if (sps->chroma_format_idc != 1) {
1454*4882a593Smuzhiyun mpp_err("chroma_format_idc != 1\n");
1455*4882a593Smuzhiyun ret = MPP_ERR_PROTOL;
1456*4882a593Smuzhiyun goto err;
1457*4882a593Smuzhiyun }
1458*4882a593Smuzhiyun
1459*4882a593Smuzhiyun if (sps->chroma_format_idc == 3)
1460*4882a593Smuzhiyun READ_ONEBIT(gb, &sps->separate_colour_plane_flag);
1461*4882a593Smuzhiyun
1462*4882a593Smuzhiyun READ_UE(gb, &sps->width);
1463*4882a593Smuzhiyun READ_UE(gb, &sps->height);
1464*4882a593Smuzhiyun
1465*4882a593Smuzhiyun READ_ONEBIT(gb, &value);
1466*4882a593Smuzhiyun
1467*4882a593Smuzhiyun if (value) { // pic_conformance_flag
1468*4882a593Smuzhiyun //TODO: * 2 is only valid for 420
1469*4882a593Smuzhiyun READ_UE(gb, &sps->pic_conf_win.left_offset);
1470*4882a593Smuzhiyun sps->pic_conf_win.left_offset = sps->pic_conf_win.left_offset * 2;
1471*4882a593Smuzhiyun READ_UE(gb, &sps->pic_conf_win.right_offset);
1472*4882a593Smuzhiyun sps->pic_conf_win.right_offset = sps->pic_conf_win.right_offset * 2;
1473*4882a593Smuzhiyun READ_UE(gb, &sps->pic_conf_win.top_offset);
1474*4882a593Smuzhiyun sps->pic_conf_win.top_offset = sps->pic_conf_win.top_offset * 2;
1475*4882a593Smuzhiyun READ_UE(gb, &sps->pic_conf_win.bottom_offset);
1476*4882a593Smuzhiyun sps->pic_conf_win.bottom_offset = sps->pic_conf_win.bottom_offset * 2;
1477*4882a593Smuzhiyun #if 0
1478*4882a593Smuzhiyun if (s->h265dctx->flags2 & CODEC_FLAG2_IGNORE_CROP) {
1479*4882a593Smuzhiyun h265d_dbg(H265D_DBG_SPS,
1480*4882a593Smuzhiyun "discarding sps conformance window, "
1481*4882a593Smuzhiyun "original values are l:%u r:%u t:%u b:%u\n",
1482*4882a593Smuzhiyun sps->pic_conf_win.left_offset,
1483*4882a593Smuzhiyun sps->pic_conf_win.right_offset,
1484*4882a593Smuzhiyun sps->pic_conf_win.top_offset,
1485*4882a593Smuzhiyun sps->pic_conf_win.bottom_offset);
1486*4882a593Smuzhiyun
1487*4882a593Smuzhiyun sps->pic_conf_win.left_offset =
1488*4882a593Smuzhiyun sps->pic_conf_win.right_offset =
1489*4882a593Smuzhiyun sps->pic_conf_win.top_offset =
1490*4882a593Smuzhiyun sps->pic_conf_win.bottom_offset = 0;
1491*4882a593Smuzhiyun }
1492*4882a593Smuzhiyun
1493*4882a593Smuzhiyun #endif
1494*4882a593Smuzhiyun sps->output_window = sps->pic_conf_win;
1495*4882a593Smuzhiyun }
1496*4882a593Smuzhiyun
1497*4882a593Smuzhiyun READ_UE(gb, &sps->bit_depth);
1498*4882a593Smuzhiyun
1499*4882a593Smuzhiyun sps->bit_depth = sps->bit_depth + 8;
1500*4882a593Smuzhiyun READ_UE(gb, &bit_depth_chroma);
1501*4882a593Smuzhiyun bit_depth_chroma = bit_depth_chroma + 8;
1502*4882a593Smuzhiyun sps->bit_depth_chroma = bit_depth_chroma;
1503*4882a593Smuzhiyun if (bit_depth_chroma != sps->bit_depth) {
1504*4882a593Smuzhiyun mpp_err(
1505*4882a593Smuzhiyun "Luma bit depth (%d) is different from chroma bit depth (%d), "
1506*4882a593Smuzhiyun "this is unsupported.\n",
1507*4882a593Smuzhiyun sps->bit_depth, bit_depth_chroma);
1508*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
1509*4882a593Smuzhiyun goto err;
1510*4882a593Smuzhiyun }
1511*4882a593Smuzhiyun
1512*4882a593Smuzhiyun if (sps->chroma_format_idc == 1) {
1513*4882a593Smuzhiyun switch (sps->bit_depth) {
1514*4882a593Smuzhiyun case 8: sps->pix_fmt = MPP_FMT_YUV420SP; break;
1515*4882a593Smuzhiyun case 10: sps->pix_fmt = MPP_FMT_YUV420SP_10BIT; break;
1516*4882a593Smuzhiyun default:
1517*4882a593Smuzhiyun mpp_err( "Unsupported bit depth: %d\n",
1518*4882a593Smuzhiyun sps->bit_depth);
1519*4882a593Smuzhiyun ret = MPP_ERR_PROTOL;
1520*4882a593Smuzhiyun goto err;
1521*4882a593Smuzhiyun }
1522*4882a593Smuzhiyun } else {
1523*4882a593Smuzhiyun mpp_err(
1524*4882a593Smuzhiyun "non-4:2:0 support is currently unspecified.\n");
1525*4882a593Smuzhiyun return MPP_ERR_PROTOL;
1526*4882a593Smuzhiyun }
1527*4882a593Smuzhiyun #if 0
1528*4882a593Smuzhiyun desc = av_pix_fmt_desc_get(sps->pix_fmt);
1529*4882a593Smuzhiyun if (!desc) {
1530*4882a593Smuzhiyun goto err;
1531*4882a593Smuzhiyun }
1532*4882a593Smuzhiyun
1533*4882a593Smuzhiyun sps->hshift[0] = sps->vshift[0] = 0;
1534*4882a593Smuzhiyun sps->hshift[2] = sps->hshift[1] = desc->log2_chroma_w;
1535*4882a593Smuzhiyun sps->vshift[2] = sps->vshift[1] = desc->log2_chroma_h;
1536*4882a593Smuzhiyun #endif
1537*4882a593Smuzhiyun sps->pixel_shift = sps->bit_depth > 8;
1538*4882a593Smuzhiyun
1539*4882a593Smuzhiyun READ_UE(gb, &sps->log2_max_poc_lsb);
1540*4882a593Smuzhiyun sps->log2_max_poc_lsb += 4;
1541*4882a593Smuzhiyun if (sps->log2_max_poc_lsb > 16) {
1542*4882a593Smuzhiyun mpp_err( "log2_max_pic_order_cnt_lsb_minus4 out range: %d\n",
1543*4882a593Smuzhiyun sps->log2_max_poc_lsb - 4);
1544*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
1545*4882a593Smuzhiyun goto err;
1546*4882a593Smuzhiyun }
1547*4882a593Smuzhiyun
1548*4882a593Smuzhiyun READ_ONEBIT(gb, &sublayer_ordering_info);
1549*4882a593Smuzhiyun h265d_dbg(H265D_DBG_SPS, "read bit left %d", gb->num_remaining_bits_in_curr_byte_ + gb->bytes_left_ * 8);
1550*4882a593Smuzhiyun start = sublayer_ordering_info ? 0 : sps->max_sub_layers - 1;
1551*4882a593Smuzhiyun for (i = start; i < sps->max_sub_layers; i++) {
1552*4882a593Smuzhiyun READ_UE(gb, &sps->temporal_layer[i].max_dec_pic_buffering) ;
1553*4882a593Smuzhiyun sps->temporal_layer[i].max_dec_pic_buffering += 1;
1554*4882a593Smuzhiyun READ_UE(gb, &sps->temporal_layer[i].num_reorder_pics);
1555*4882a593Smuzhiyun READ_UE(gb, &sps->temporal_layer[i].max_latency_increase );
1556*4882a593Smuzhiyun sps->temporal_layer[i].max_latency_increase -= 1;
1557*4882a593Smuzhiyun if (sps->temporal_layer[i].max_dec_pic_buffering > MAX_DPB_SIZE) {
1558*4882a593Smuzhiyun mpp_err( "sps_max_dec_pic_buffering_minus1 out of range: %d\n",
1559*4882a593Smuzhiyun sps->temporal_layer[i].max_dec_pic_buffering - 1);
1560*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
1561*4882a593Smuzhiyun goto err;
1562*4882a593Smuzhiyun }
1563*4882a593Smuzhiyun if (sps->temporal_layer[i].num_reorder_pics > sps->temporal_layer[i].max_dec_pic_buffering - 1) {
1564*4882a593Smuzhiyun mpp_err( "sps_max_num_reorder_pics out of range: %d\n",
1565*4882a593Smuzhiyun sps->temporal_layer[i].num_reorder_pics);
1566*4882a593Smuzhiyun if (sps->temporal_layer[i].num_reorder_pics > MAX_DPB_SIZE - 1) {
1567*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
1568*4882a593Smuzhiyun goto err;
1569*4882a593Smuzhiyun }
1570*4882a593Smuzhiyun sps->temporal_layer[i].max_dec_pic_buffering = sps->temporal_layer[i].num_reorder_pics + 1;
1571*4882a593Smuzhiyun }
1572*4882a593Smuzhiyun }
1573*4882a593Smuzhiyun
1574*4882a593Smuzhiyun if (!sublayer_ordering_info) {
1575*4882a593Smuzhiyun for (i = 0; i < start; i++) {
1576*4882a593Smuzhiyun sps->temporal_layer[i].max_dec_pic_buffering = sps->temporal_layer[start].max_dec_pic_buffering;
1577*4882a593Smuzhiyun sps->temporal_layer[i].num_reorder_pics = sps->temporal_layer[start].num_reorder_pics;
1578*4882a593Smuzhiyun sps->temporal_layer[i].max_latency_increase = sps->temporal_layer[start].max_latency_increase;
1579*4882a593Smuzhiyun }
1580*4882a593Smuzhiyun }
1581*4882a593Smuzhiyun
1582*4882a593Smuzhiyun if ((s->picture_struct == MPP_PICTURE_STRUCTURE_TOP_FIELD) ||
1583*4882a593Smuzhiyun (s->picture_struct == MPP_PICTURE_STRUCTURE_BOTTOM_FIELD)) {
1584*4882a593Smuzhiyun for (i = 0; i < sps->max_sub_layers; i++) {
1585*4882a593Smuzhiyun sps->temporal_layer[i].num_reorder_pics += 2;
1586*4882a593Smuzhiyun }
1587*4882a593Smuzhiyun }
1588*4882a593Smuzhiyun
1589*4882a593Smuzhiyun h265d_dbg(H265D_DBG_SPS, "2 read bit left %d", gb->num_remaining_bits_in_curr_byte_ + gb->bytes_left_ * 8);
1590*4882a593Smuzhiyun READ_UE(gb, &sps->log2_min_cb_size) ;
1591*4882a593Smuzhiyun if (sps->log2_min_cb_size > (LOG2_MAX_CU_SIZE - 3)) {
1592*4882a593Smuzhiyun mpp_err( "Invalid value for log2_min_cb_size");
1593*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
1594*4882a593Smuzhiyun goto err;
1595*4882a593Smuzhiyun }
1596*4882a593Smuzhiyun sps->log2_min_cb_size += 3;
1597*4882a593Smuzhiyun
1598*4882a593Smuzhiyun h265d_dbg(H265D_DBG_SPS, "sps->log2_min_cb_size %d", sps->log2_min_cb_size);
1599*4882a593Smuzhiyun READ_UE(gb, &sps->log2_diff_max_min_coding_block_size);
1600*4882a593Smuzhiyun if (sps->log2_diff_max_min_coding_block_size > (LOG2_MAX_CU_SIZE - LOG2_MIN_CU_SIZE)) {
1601*4882a593Smuzhiyun mpp_err( "Invalid value for log2_diff_max_min_coding_block_size");
1602*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
1603*4882a593Smuzhiyun goto err;
1604*4882a593Smuzhiyun }
1605*4882a593Smuzhiyun
1606*4882a593Smuzhiyun h265d_dbg(H265D_DBG_SPS, "sps->log2_diff_max_min_coding_block_size %d", sps->log2_diff_max_min_coding_block_size);
1607*4882a593Smuzhiyun READ_UE(gb, &sps->log2_min_tb_size);
1608*4882a593Smuzhiyun if (sps->log2_min_tb_size > (LOG2_MAX_TU_SIZE - 2)) {
1609*4882a593Smuzhiyun mpp_err( "Invalid value for log2_min_tb_size");
1610*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
1611*4882a593Smuzhiyun goto err;
1612*4882a593Smuzhiyun }
1613*4882a593Smuzhiyun sps->log2_min_tb_size += 2;
1614*4882a593Smuzhiyun
1615*4882a593Smuzhiyun h265d_dbg(H265D_DBG_SPS, "sps->log2_min_tb_size %d", sps->log2_min_tb_size);
1616*4882a593Smuzhiyun READ_UE(gb, &log2_diff_max_min_transform_block_size);
1617*4882a593Smuzhiyun if (log2_diff_max_min_transform_block_size > (LOG2_MAX_TU_SIZE - LOG2_MIN_TU_SIZE)) {
1618*4882a593Smuzhiyun mpp_err( "Invalid value for log2_diff_max_min_transform_block_size");
1619*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
1620*4882a593Smuzhiyun goto err;
1621*4882a593Smuzhiyun }
1622*4882a593Smuzhiyun
1623*4882a593Smuzhiyun
1624*4882a593Smuzhiyun h265d_dbg(H265D_DBG_SPS, "sps->log2_diff_max_min_transform_block_size %d", log2_diff_max_min_transform_block_size);
1625*4882a593Smuzhiyun sps->log2_max_trafo_size = log2_diff_max_min_transform_block_size +
1626*4882a593Smuzhiyun sps->log2_min_tb_size;
1627*4882a593Smuzhiyun
1628*4882a593Smuzhiyun h265d_dbg(H265D_DBG_SPS, "sps->log2_max_trafo_size %d", sps->log2_max_trafo_size);
1629*4882a593Smuzhiyun
1630*4882a593Smuzhiyun if (sps->log2_min_tb_size >= sps->log2_min_cb_size) {
1631*4882a593Smuzhiyun mpp_err( "Invalid value for log2_min_tb_size");
1632*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
1633*4882a593Smuzhiyun goto err;
1634*4882a593Smuzhiyun }
1635*4882a593Smuzhiyun
1636*4882a593Smuzhiyun READ_UE(gb, &sps->max_transform_hierarchy_depth_inter);
1637*4882a593Smuzhiyun READ_UE(gb, &sps->max_transform_hierarchy_depth_intra);
1638*4882a593Smuzhiyun
1639*4882a593Smuzhiyun
1640*4882a593Smuzhiyun READ_ONEBIT(gb, &sps->scaling_list_enable_flag );
1641*4882a593Smuzhiyun
1642*4882a593Smuzhiyun if (sps->scaling_list_enable_flag) {
1643*4882a593Smuzhiyun value = 0;
1644*4882a593Smuzhiyun set_default_scaling_list_data(&sps->scaling_list);
1645*4882a593Smuzhiyun READ_ONEBIT(gb, &value);
1646*4882a593Smuzhiyun if (value) {
1647*4882a593Smuzhiyun ret = scaling_list_data(s, &sps->scaling_list, sps);
1648*4882a593Smuzhiyun if (ret < 0)
1649*4882a593Smuzhiyun goto err;
1650*4882a593Smuzhiyun }
1651*4882a593Smuzhiyun
1652*4882a593Smuzhiyun s->scaling_list_listen[sps_id] = 1;
1653*4882a593Smuzhiyun }
1654*4882a593Smuzhiyun
1655*4882a593Smuzhiyun READ_ONEBIT(gb, &sps->amp_enabled_flag);
1656*4882a593Smuzhiyun READ_ONEBIT(gb, &sps->sao_enabled);
1657*4882a593Smuzhiyun READ_ONEBIT(gb, &sps->pcm_enabled_flag);
1658*4882a593Smuzhiyun
1659*4882a593Smuzhiyun h265d_dbg(H265D_DBG_SPS, "sps->amp_enabled_flag = %d", sps->amp_enabled_flag);
1660*4882a593Smuzhiyun h265d_dbg(H265D_DBG_SPS, "sps->sao_enabled = %d", sps->sao_enabled);
1661*4882a593Smuzhiyun h265d_dbg(H265D_DBG_SPS, "sps->pcm_enabled_flag = %d", sps->pcm_enabled_flag);
1662*4882a593Smuzhiyun
1663*4882a593Smuzhiyun if (sps->pcm_enabled_flag) {
1664*4882a593Smuzhiyun READ_BITS(gb, 4, &sps->pcm.bit_depth);
1665*4882a593Smuzhiyun sps->pcm.bit_depth += 1;
1666*4882a593Smuzhiyun READ_BITS(gb, 4, &sps->pcm.bit_depth_chroma);
1667*4882a593Smuzhiyun sps->pcm.bit_depth_chroma += 1;
1668*4882a593Smuzhiyun READ_UE(gb, &sps->pcm.log2_min_pcm_cb_size );
1669*4882a593Smuzhiyun sps->pcm.log2_min_pcm_cb_size += 3;
1670*4882a593Smuzhiyun READ_UE(gb, &value);
1671*4882a593Smuzhiyun sps->pcm.log2_max_pcm_cb_size = sps->pcm.log2_min_pcm_cb_size + value;
1672*4882a593Smuzhiyun
1673*4882a593Smuzhiyun if (sps->pcm.bit_depth > sps->bit_depth) {
1674*4882a593Smuzhiyun mpp_err(
1675*4882a593Smuzhiyun "PCM bit depth (%d) is greater than normal bit depth (%d)\n",
1676*4882a593Smuzhiyun sps->pcm.bit_depth, sps->bit_depth);
1677*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
1678*4882a593Smuzhiyun goto err;
1679*4882a593Smuzhiyun }
1680*4882a593Smuzhiyun READ_ONEBIT(gb, &sps->pcm.loop_filter_disable_flag);
1681*4882a593Smuzhiyun }
1682*4882a593Smuzhiyun
1683*4882a593Smuzhiyun READ_UE(gb, &sps->nb_st_rps);
1684*4882a593Smuzhiyun if (sps->nb_st_rps > MAX_SHORT_TERM_RPS_COUNT) {
1685*4882a593Smuzhiyun mpp_err( "Too many short term RPS: %d.\n",
1686*4882a593Smuzhiyun sps->nb_st_rps);
1687*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
1688*4882a593Smuzhiyun goto err;
1689*4882a593Smuzhiyun }
1690*4882a593Smuzhiyun for (i = 0; (RK_U32)i < sps->nb_st_rps; i++) {
1691*4882a593Smuzhiyun if ((ret = mpp_hevc_decode_short_term_rps(s, &sps->st_rps[i],
1692*4882a593Smuzhiyun sps, 0)) < 0)
1693*4882a593Smuzhiyun goto err;
1694*4882a593Smuzhiyun }
1695*4882a593Smuzhiyun
1696*4882a593Smuzhiyun READ_ONEBIT(gb, &sps->long_term_ref_pics_present_flag);
1697*4882a593Smuzhiyun if (sps->long_term_ref_pics_present_flag) {
1698*4882a593Smuzhiyun READ_UE(gb, &sps->num_long_term_ref_pics_sps);
1699*4882a593Smuzhiyun for (i = 0; (RK_U8)i < sps->num_long_term_ref_pics_sps; i++) {
1700*4882a593Smuzhiyun READ_BITS(gb, sps->log2_max_poc_lsb, &sps->lt_ref_pic_poc_lsb_sps[i]);
1701*4882a593Smuzhiyun READ_ONEBIT(gb, &sps->used_by_curr_pic_lt_sps_flag[i]);
1702*4882a593Smuzhiyun }
1703*4882a593Smuzhiyun }
1704*4882a593Smuzhiyun
1705*4882a593Smuzhiyun READ_ONEBIT(gb, &sps->sps_temporal_mvp_enabled_flag);
1706*4882a593Smuzhiyun
1707*4882a593Smuzhiyun #ifdef REF_IDX_MFM
1708*4882a593Smuzhiyun if (s->nuh_layer_id > 0)
1709*4882a593Smuzhiyun READ_ONEBIT(gb, &sps->set_mfm_enabled_flag);
1710*4882a593Smuzhiyun #endif
1711*4882a593Smuzhiyun READ_ONEBIT(gb, &sps->sps_strong_intra_smoothing_enable_flag);
1712*4882a593Smuzhiyun
1713*4882a593Smuzhiyun sps->vui.sar.num = 0;
1714*4882a593Smuzhiyun sps->vui.sar.den = 1;
1715*4882a593Smuzhiyun READ_ONEBIT(gb, &vui_present);
1716*4882a593Smuzhiyun if (vui_present)
1717*4882a593Smuzhiyun decode_vui(s, sps);
1718*4882a593Smuzhiyun #ifdef SCALED_REF_LAYER_OFFSETS
1719*4882a593Smuzhiyun if ( s->nuh_layer_id > 0 ) {
1720*4882a593Smuzhiyun READ_SE(gb, &value);
1721*4882a593Smuzhiyun sps->scaled_ref_layer_window.left_offset = (value << 1);
1722*4882a593Smuzhiyun READ_SE(gb, &value);
1723*4882a593Smuzhiyun sps->scaled_ref_layer_window.top_offset = (value << 1);
1724*4882a593Smuzhiyun READ_SE(gb, &value);
1725*4882a593Smuzhiyun sps->scaled_ref_layer_window.right_offset = (value << 1);
1726*4882a593Smuzhiyun READ_SE(gb, &value);
1727*4882a593Smuzhiyun sps->scaled_ref_layer_window.bottom_offset = (value << 1);
1728*4882a593Smuzhiyun }
1729*4882a593Smuzhiyun #endif
1730*4882a593Smuzhiyun
1731*4882a593Smuzhiyun // SKIP_BITS(gb, 1); // sps_extension_flag
1732*4882a593Smuzhiyun
1733*4882a593Smuzhiyun if (s->apply_defdispwin) {
1734*4882a593Smuzhiyun sps->output_window.left_offset += sps->vui.def_disp_win.left_offset;
1735*4882a593Smuzhiyun sps->output_window.right_offset += sps->vui.def_disp_win.right_offset;
1736*4882a593Smuzhiyun sps->output_window.top_offset += sps->vui.def_disp_win.top_offset;
1737*4882a593Smuzhiyun sps->output_window.bottom_offset += sps->vui.def_disp_win.bottom_offset;
1738*4882a593Smuzhiyun }
1739*4882a593Smuzhiyun #if 1
1740*4882a593Smuzhiyun if (sps->output_window.left_offset & (0x1F >> (sps->pixel_shift))) {
1741*4882a593Smuzhiyun sps->output_window.left_offset &= ~(0x1F >> (sps->pixel_shift));
1742*4882a593Smuzhiyun mpp_log("Reducing left output window to %d "
1743*4882a593Smuzhiyun "chroma samples to preserve alignment.\n",
1744*4882a593Smuzhiyun sps->output_window.left_offset);
1745*4882a593Smuzhiyun }
1746*4882a593Smuzhiyun #endif
1747*4882a593Smuzhiyun sps->output_width = sps->width -
1748*4882a593Smuzhiyun (sps->output_window.left_offset + sps->output_window.right_offset);
1749*4882a593Smuzhiyun sps->output_height = sps->height -
1750*4882a593Smuzhiyun (sps->output_window.top_offset + sps->output_window.bottom_offset);
1751*4882a593Smuzhiyun if (sps->output_width <= 0 || sps->output_height <= 0) {
1752*4882a593Smuzhiyun mpp_log("Invalid visible frame dimensions: %dx%d.\n",
1753*4882a593Smuzhiyun sps->output_width, sps->output_height);
1754*4882a593Smuzhiyun #if 0
1755*4882a593Smuzhiyun if (s->h265dctx->err_recognition & AV_EF_EXPLODE) {
1756*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
1757*4882a593Smuzhiyun goto err;
1758*4882a593Smuzhiyun }
1759*4882a593Smuzhiyun #endif
1760*4882a593Smuzhiyun mpp_log("Displaying the whole video surface.\n");
1761*4882a593Smuzhiyun sps->pic_conf_win.left_offset = 0;
1762*4882a593Smuzhiyun sps->pic_conf_win.right_offset = 0;
1763*4882a593Smuzhiyun sps->pic_conf_win.top_offset = 0;
1764*4882a593Smuzhiyun sps->pic_conf_win.bottom_offset = 0;
1765*4882a593Smuzhiyun sps->output_width = sps->width;
1766*4882a593Smuzhiyun sps->output_height = sps->height;
1767*4882a593Smuzhiyun }
1768*4882a593Smuzhiyun
1769*4882a593Smuzhiyun // NOTE: only do this for the first time of parsing sps
1770*4882a593Smuzhiyun // this is for extra data sps/pps parser
1771*4882a593Smuzhiyun if (s->h265dctx->width == 0 && s->h265dctx->height == 0) {
1772*4882a593Smuzhiyun s->h265dctx->width = sps->output_width;
1773*4882a593Smuzhiyun s->h265dctx->height = sps->output_height;
1774*4882a593Smuzhiyun }
1775*4882a593Smuzhiyun
1776*4882a593Smuzhiyun // Inferred parameters
1777*4882a593Smuzhiyun sps->log2_ctb_size = sps->log2_min_cb_size + sps->log2_diff_max_min_coding_block_size;
1778*4882a593Smuzhiyun
1779*4882a593Smuzhiyun h265d_dbg(H265D_DBG_SPS, "sps->log2_min_cb_size = %d sps->log2_diff_max_min_coding_block_size = %d", sps->log2_min_cb_size, sps->log2_diff_max_min_coding_block_size);
1780*4882a593Smuzhiyun
1781*4882a593Smuzhiyun h265d_dbg(H265D_DBG_SPS, "plus sps->log2_ctb_size %d", sps->log2_ctb_size);
1782*4882a593Smuzhiyun sps->log2_min_pu_size = sps->log2_min_cb_size - 1;
1783*4882a593Smuzhiyun
1784*4882a593Smuzhiyun sps->ctb_width = (sps->width + (1 << sps->log2_ctb_size) - 1) >> sps->log2_ctb_size;
1785*4882a593Smuzhiyun sps->ctb_height = (sps->height + (1 << sps->log2_ctb_size) - 1) >> sps->log2_ctb_size;
1786*4882a593Smuzhiyun sps->ctb_size = sps->ctb_width * sps->ctb_height;
1787*4882a593Smuzhiyun
1788*4882a593Smuzhiyun sps->min_cb_width = sps->width >> sps->log2_min_cb_size;
1789*4882a593Smuzhiyun sps->min_cb_height = sps->height >> sps->log2_min_cb_size;
1790*4882a593Smuzhiyun sps->min_tb_width = sps->width >> sps->log2_min_tb_size;
1791*4882a593Smuzhiyun sps->min_tb_height = sps->height >> sps->log2_min_tb_size;
1792*4882a593Smuzhiyun sps->min_pu_width = sps->width >> sps->log2_min_pu_size;
1793*4882a593Smuzhiyun sps->min_pu_height = sps->height >> sps->log2_min_pu_size;
1794*4882a593Smuzhiyun
1795*4882a593Smuzhiyun sps->qp_bd_offset = 6 * (sps->bit_depth - 8);
1796*4882a593Smuzhiyun
1797*4882a593Smuzhiyun if (sps->width & ((1 << sps->log2_min_cb_size) - 1) ||
1798*4882a593Smuzhiyun sps->height & ((1 << sps->log2_min_cb_size) - 1)) {
1799*4882a593Smuzhiyun mpp_err( "Invalid coded frame dimensions.\n");
1800*4882a593Smuzhiyun goto err;
1801*4882a593Smuzhiyun }
1802*4882a593Smuzhiyun
1803*4882a593Smuzhiyun if (sps->log2_ctb_size > MAX_LOG2_CTB_SIZE) {
1804*4882a593Smuzhiyun mpp_err( "CTB size out of range: 2^%d\n", sps->log2_ctb_size);
1805*4882a593Smuzhiyun goto err;
1806*4882a593Smuzhiyun }
1807*4882a593Smuzhiyun if (sps->max_transform_hierarchy_depth_inter > (RK_S32)(sps->log2_ctb_size - sps->log2_min_tb_size)) {
1808*4882a593Smuzhiyun mpp_err( "max_transform_hierarchy_depth_inter out of range: %d\n",
1809*4882a593Smuzhiyun sps->max_transform_hierarchy_depth_inter);
1810*4882a593Smuzhiyun goto err;
1811*4882a593Smuzhiyun }
1812*4882a593Smuzhiyun if (sps->max_transform_hierarchy_depth_intra > (RK_S32)(sps->log2_ctb_size - sps->log2_min_tb_size)) {
1813*4882a593Smuzhiyun mpp_err( "max_transform_hierarchy_depth_intra out of range: %d\n",
1814*4882a593Smuzhiyun sps->max_transform_hierarchy_depth_intra);
1815*4882a593Smuzhiyun goto err;
1816*4882a593Smuzhiyun }
1817*4882a593Smuzhiyun h265d_dbg(H265D_DBG_SPS, "sps->log2_ctb_size %d", sps->log2_ctb_size);
1818*4882a593Smuzhiyun if (sps->log2_max_trafo_size > (RK_U32)MPP_MIN(sps->log2_ctb_size, 5)) {
1819*4882a593Smuzhiyun mpp_err(
1820*4882a593Smuzhiyun "max transform block size out of range: %d\n",
1821*4882a593Smuzhiyun sps->log2_max_trafo_size);
1822*4882a593Smuzhiyun goto err;
1823*4882a593Smuzhiyun }
1824*4882a593Smuzhiyun if (s->h265dctx->compare_info != NULL) {
1825*4882a593Smuzhiyun CurrentFameInf_t *info = (CurrentFameInf_t *)s->h265dctx->compare_info;
1826*4882a593Smuzhiyun HEVCSPS *openhevc_sps = (HEVCSPS *)&info->sps[sps_id];
1827*4882a593Smuzhiyun mpp_log("compare sps in");
1828*4882a593Smuzhiyun if (compare_sps(openhevc_sps, (HEVCSPS *)sps_buf) < 0) {
1829*4882a593Smuzhiyun mpp_err("compare sps with openhevc error found");
1830*4882a593Smuzhiyun mpp_assert(0);
1831*4882a593Smuzhiyun return -1;
1832*4882a593Smuzhiyun }
1833*4882a593Smuzhiyun mpp_log("compare sps ok");
1834*4882a593Smuzhiyun }
1835*4882a593Smuzhiyun #if 0
1836*4882a593Smuzhiyun if (s->h265dctx->debug & FF_DEBUG_BITSTREAM) {
1837*4882a593Smuzhiyun h265d_dbg(H265D_DBG_SPS,
1838*4882a593Smuzhiyun "Parsed SPS: id %d; coded wxh: %dx%d; "
1839*4882a593Smuzhiyun "cropped wxh: %dx%d; pix_fmt: %s.\n",
1840*4882a593Smuzhiyun sps_id, sps->width, sps->height,
1841*4882a593Smuzhiyun sps->output_width, sps->output_height,
1842*4882a593Smuzhiyun av_get_pix_fmt_name(sps->pix_fmt));
1843*4882a593Smuzhiyun }
1844*4882a593Smuzhiyun #endif
1845*4882a593Smuzhiyun /* check if this is a repeat of an already parsed SPS, then keep the
1846*4882a593Smuzhiyun * original one.
1847*4882a593Smuzhiyun * otherwise drop all PPSes that depend on it */
1848*4882a593Smuzhiyun
1849*4882a593Smuzhiyun if (s->sps_list[sps_id] &&
1850*4882a593Smuzhiyun !memcmp(s->sps_list[sps_id], sps_buf, sizeof(HEVCSPS))) {
1851*4882a593Smuzhiyun mpp_mem_pool_put(s->sps_pool, sps_buf);
1852*4882a593Smuzhiyun } else {
1853*4882a593Smuzhiyun for (i = 0; (RK_U32)i < MPP_ARRAY_ELEMS(s->pps_list); i++) {
1854*4882a593Smuzhiyun if (s->pps_list[i] && ((HEVCPPS*)s->pps_list[i])->sps_id == sps_id) {
1855*4882a593Smuzhiyun mpp_hevc_pps_free(s->pps_list[i]);
1856*4882a593Smuzhiyun s->pps_list[i] = NULL;
1857*4882a593Smuzhiyun }
1858*4882a593Smuzhiyun }
1859*4882a593Smuzhiyun if (s->sps_list[sps_id] != NULL)
1860*4882a593Smuzhiyun mpp_mem_pool_put(s->sps_pool, s->sps_list[sps_id]);
1861*4882a593Smuzhiyun s->sps_list[sps_id] = sps_buf;
1862*4882a593Smuzhiyun s->ps_need_upate = 1;
1863*4882a593Smuzhiyun }
1864*4882a593Smuzhiyun
1865*4882a593Smuzhiyun if (s->sps_list[sps_id])
1866*4882a593Smuzhiyun s->sps_list_of_updated[sps_id] = 1;
1867*4882a593Smuzhiyun
1868*4882a593Smuzhiyun return 0;
1869*4882a593Smuzhiyun __BITREAD_ERR:
1870*4882a593Smuzhiyun err:
1871*4882a593Smuzhiyun mpp_mem_pool_put(s->sps_pool, sps_buf);
1872*4882a593Smuzhiyun return ret;
1873*4882a593Smuzhiyun }
1874*4882a593Smuzhiyun
mpp_hevc_pps_free(RK_U8 * data)1875*4882a593Smuzhiyun void mpp_hevc_pps_free(RK_U8 *data)
1876*4882a593Smuzhiyun {
1877*4882a593Smuzhiyun HEVCPPS *pps = (HEVCPPS*)data;
1878*4882a593Smuzhiyun
1879*4882a593Smuzhiyun if (pps) {
1880*4882a593Smuzhiyun MPP_FREE(pps->bufs.column_width);
1881*4882a593Smuzhiyun MPP_FREE(pps->bufs.row_height);
1882*4882a593Smuzhiyun MPP_FREE(pps);
1883*4882a593Smuzhiyun }
1884*4882a593Smuzhiyun }
1885*4882a593Smuzhiyun
mpp_hevc_decode_nal_pps(HEVCContext * s)1886*4882a593Smuzhiyun int mpp_hevc_decode_nal_pps(HEVCContext *s)
1887*4882a593Smuzhiyun {
1888*4882a593Smuzhiyun BitReadCtx_t *gb = &s->HEVClc->gb;
1889*4882a593Smuzhiyun HEVCSPS *sps = NULL;
1890*4882a593Smuzhiyun HEVCPPS *pps = NULL;
1891*4882a593Smuzhiyun HevcPpsBufInfo *bufs = NULL;
1892*4882a593Smuzhiyun RK_S32 buf_size = 0;
1893*4882a593Smuzhiyun RK_S32 new_pps = 0;
1894*4882a593Smuzhiyun RK_U32 pps_id = 0;
1895*4882a593Smuzhiyun RK_S32 ret = 0;
1896*4882a593Smuzhiyun RK_S32 i;
1897*4882a593Smuzhiyun
1898*4882a593Smuzhiyun h265d_dbg(H265D_DBG_FUNCTION, "Decoding PPS\n");
1899*4882a593Smuzhiyun
1900*4882a593Smuzhiyun // Coded parameters
1901*4882a593Smuzhiyun READ_UE(gb, &pps_id);
1902*4882a593Smuzhiyun if (pps_id >= MAX_PPS_COUNT) {
1903*4882a593Smuzhiyun mpp_err( "PPS id out of range: %d\n", pps_id);
1904*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
1905*4882a593Smuzhiyun goto err;
1906*4882a593Smuzhiyun }
1907*4882a593Smuzhiyun
1908*4882a593Smuzhiyun pps = (HEVCPPS *)s->pps_list[pps_id];
1909*4882a593Smuzhiyun if (pps) {
1910*4882a593Smuzhiyun // NOTE: keep tile buffers at the end
1911*4882a593Smuzhiyun memset(pps, 0, sizeof(*pps) - sizeof(pps->bufs));
1912*4882a593Smuzhiyun } else {
1913*4882a593Smuzhiyun pps = (HEVCPPS *)mpp_calloc(RK_U8, sizeof(*pps));
1914*4882a593Smuzhiyun new_pps = 1;
1915*4882a593Smuzhiyun }
1916*4882a593Smuzhiyun
1917*4882a593Smuzhiyun if (!pps)
1918*4882a593Smuzhiyun return MPP_ERR_NOMEM;
1919*4882a593Smuzhiyun
1920*4882a593Smuzhiyun bufs = &pps->bufs;
1921*4882a593Smuzhiyun
1922*4882a593Smuzhiyun pps->pps_id = pps_id;
1923*4882a593Smuzhiyun // Default values
1924*4882a593Smuzhiyun pps->loop_filter_across_tiles_enabled_flag = 1;
1925*4882a593Smuzhiyun pps->num_tile_columns = 1;
1926*4882a593Smuzhiyun pps->num_tile_rows = 1;
1927*4882a593Smuzhiyun pps->uniform_spacing_flag = 1;
1928*4882a593Smuzhiyun pps->disable_dbf = 0;
1929*4882a593Smuzhiyun pps->beta_offset = 0;
1930*4882a593Smuzhiyun pps->tc_offset = 0;
1931*4882a593Smuzhiyun
1932*4882a593Smuzhiyun READ_UE(gb, &pps->sps_id);
1933*4882a593Smuzhiyun if (pps->sps_id >= MAX_SPS_COUNT) {
1934*4882a593Smuzhiyun mpp_err( "SPS id out of range: %d\n", pps->sps_id);
1935*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
1936*4882a593Smuzhiyun goto err;
1937*4882a593Smuzhiyun }
1938*4882a593Smuzhiyun if (!s->sps_list[pps->sps_id]) {
1939*4882a593Smuzhiyun mpp_err( "SPS %u does not exist.\n", pps->sps_id);
1940*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
1941*4882a593Smuzhiyun goto err;
1942*4882a593Smuzhiyun }
1943*4882a593Smuzhiyun sps = (HEVCSPS *)s->sps_list[pps->sps_id];
1944*4882a593Smuzhiyun
1945*4882a593Smuzhiyun h265d_dbg(H265D_DBG_FUNCTION, "Decoding PPS 1\n");
1946*4882a593Smuzhiyun READ_ONEBIT(gb, &pps->dependent_slice_segments_enabled_flag);
1947*4882a593Smuzhiyun READ_ONEBIT(gb, &pps->output_flag_present_flag );
1948*4882a593Smuzhiyun READ_BITS(gb, 3, &pps->num_extra_slice_header_bits);
1949*4882a593Smuzhiyun
1950*4882a593Smuzhiyun READ_ONEBIT(gb, &pps->sign_data_hiding_flag);
1951*4882a593Smuzhiyun
1952*4882a593Smuzhiyun READ_ONEBIT(gb, &pps->cabac_init_present_flag);
1953*4882a593Smuzhiyun
1954*4882a593Smuzhiyun READ_UE(gb, &pps->num_ref_idx_l0_default_active);
1955*4882a593Smuzhiyun pps->num_ref_idx_l0_default_active += 1;
1956*4882a593Smuzhiyun READ_UE(gb, &pps->num_ref_idx_l1_default_active);
1957*4882a593Smuzhiyun pps->num_ref_idx_l1_default_active += 1;
1958*4882a593Smuzhiyun
1959*4882a593Smuzhiyun READ_SE(gb, &pps->pic_init_qp_minus26);
1960*4882a593Smuzhiyun
1961*4882a593Smuzhiyun READ_ONEBIT(gb, & pps->constrained_intra_pred_flag);
1962*4882a593Smuzhiyun READ_ONEBIT(gb, &pps->transform_skip_enabled_flag);
1963*4882a593Smuzhiyun
1964*4882a593Smuzhiyun READ_ONEBIT(gb, &pps->cu_qp_delta_enabled_flag);
1965*4882a593Smuzhiyun pps->diff_cu_qp_delta_depth = 0;
1966*4882a593Smuzhiyun if (pps->cu_qp_delta_enabled_flag)
1967*4882a593Smuzhiyun READ_UE(gb, &pps->diff_cu_qp_delta_depth);
1968*4882a593Smuzhiyun
1969*4882a593Smuzhiyun READ_SE(gb, &pps->cb_qp_offset);
1970*4882a593Smuzhiyun if (pps->cb_qp_offset < -12 || pps->cb_qp_offset > 12) {
1971*4882a593Smuzhiyun mpp_err( "pps_cb_qp_offset out of range: %d\n",
1972*4882a593Smuzhiyun pps->cb_qp_offset);
1973*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
1974*4882a593Smuzhiyun goto err;
1975*4882a593Smuzhiyun }
1976*4882a593Smuzhiyun READ_SE(gb, &pps->cr_qp_offset);
1977*4882a593Smuzhiyun if (pps->cr_qp_offset < -12 || pps->cr_qp_offset > 12) {
1978*4882a593Smuzhiyun mpp_err( "pps_cr_qp_offset out of range: %d\n",
1979*4882a593Smuzhiyun pps->cr_qp_offset);
1980*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
1981*4882a593Smuzhiyun goto err;
1982*4882a593Smuzhiyun }
1983*4882a593Smuzhiyun READ_ONEBIT(gb, &pps->pic_slice_level_chroma_qp_offsets_present_flag);
1984*4882a593Smuzhiyun
1985*4882a593Smuzhiyun READ_ONEBIT(gb, &pps->weighted_pred_flag);
1986*4882a593Smuzhiyun
1987*4882a593Smuzhiyun READ_ONEBIT(gb, &pps->weighted_bipred_flag);
1988*4882a593Smuzhiyun
1989*4882a593Smuzhiyun READ_ONEBIT(gb, &pps->transquant_bypass_enable_flag);
1990*4882a593Smuzhiyun READ_ONEBIT(gb, &pps->tiles_enabled_flag);
1991*4882a593Smuzhiyun READ_ONEBIT(gb, &pps->entropy_coding_sync_enabled_flag);
1992*4882a593Smuzhiyun
1993*4882a593Smuzhiyun // check support solution
1994*4882a593Smuzhiyun if (s->h265dctx->hw_info) {
1995*4882a593Smuzhiyun const MppDecHwCap *hw_info = s->h265dctx->hw_info;
1996*4882a593Smuzhiyun
1997*4882a593Smuzhiyun if (hw_info->cap_lmt_linebuf) {
1998*4882a593Smuzhiyun RK_S32 max_supt_width = PIXW_1080P;
1999*4882a593Smuzhiyun RK_S32 max_supt_height = pps->tiles_enabled_flag ? PIXH_1080P : PIXW_1080P;
2000*4882a593Smuzhiyun
2001*4882a593Smuzhiyun if (hw_info && hw_info->cap_8k) {
2002*4882a593Smuzhiyun max_supt_width = PIXW_8Kx4K;
2003*4882a593Smuzhiyun max_supt_height = pps->tiles_enabled_flag ? PIXH_8Kx4K : PIXW_8Kx4K;
2004*4882a593Smuzhiyun } else if (hw_info && hw_info->cap_4k) {
2005*4882a593Smuzhiyun max_supt_width = PIXW_4Kx2K;
2006*4882a593Smuzhiyun max_supt_height = pps->tiles_enabled_flag ? PIXH_4Kx2K : PIXW_4Kx2K;
2007*4882a593Smuzhiyun }
2008*4882a593Smuzhiyun
2009*4882a593Smuzhiyun if (sps->width > max_supt_width || (sps->height > max_supt_height && pps->tiles_enabled_flag)
2010*4882a593Smuzhiyun || sps->width * sps->height > max_supt_width * max_supt_width) {
2011*4882a593Smuzhiyun mpp_err("cannot support %dx%d, max solution %dx%d\n",
2012*4882a593Smuzhiyun sps->width, sps->height, max_supt_width, max_supt_height);
2013*4882a593Smuzhiyun goto err;
2014*4882a593Smuzhiyun }
2015*4882a593Smuzhiyun } else {
2016*4882a593Smuzhiyun if (sps->width * sps->height > PIXW_8Kx4K * PIXW_8Kx4K * hw_info->cap_core_num) {
2017*4882a593Smuzhiyun mpp_err("cannot support %dx%d, max solution %dx%d\n",
2018*4882a593Smuzhiyun sps->width, sps->height, PIXW_8Kx4K, PIXW_8Kx4K);
2019*4882a593Smuzhiyun goto err;
2020*4882a593Smuzhiyun }
2021*4882a593Smuzhiyun }
2022*4882a593Smuzhiyun }
2023*4882a593Smuzhiyun
2024*4882a593Smuzhiyun if (pps->tiles_enabled_flag) {
2025*4882a593Smuzhiyun READ_UE(gb, &pps->num_tile_columns);
2026*4882a593Smuzhiyun pps->num_tile_columns += 1;
2027*4882a593Smuzhiyun READ_UE(gb, &pps->num_tile_rows);
2028*4882a593Smuzhiyun pps->num_tile_rows += 1;
2029*4882a593Smuzhiyun if (pps->num_tile_columns == 0 ||
2030*4882a593Smuzhiyun pps->num_tile_columns >= sps->width) {
2031*4882a593Smuzhiyun mpp_err( "num_tile_columns_minus1 out of range: %d\n",
2032*4882a593Smuzhiyun pps->num_tile_columns - 1);
2033*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
2034*4882a593Smuzhiyun goto err;
2035*4882a593Smuzhiyun }
2036*4882a593Smuzhiyun if (pps->num_tile_rows == 0 ||
2037*4882a593Smuzhiyun pps->num_tile_rows >= sps->height) {
2038*4882a593Smuzhiyun mpp_err( "num_tile_rows_minus1 out of range: %d\n",
2039*4882a593Smuzhiyun pps->num_tile_rows - 1);
2040*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
2041*4882a593Smuzhiyun goto err;
2042*4882a593Smuzhiyun }
2043*4882a593Smuzhiyun
2044*4882a593Smuzhiyun buf_size = pps->num_tile_columns * sizeof(RK_U32);
2045*4882a593Smuzhiyun if (bufs->column_width_size < buf_size) {
2046*4882a593Smuzhiyun bufs->column_width = mpp_malloc_size(RK_U32, buf_size);
2047*4882a593Smuzhiyun bufs->column_width_size = buf_size;
2048*4882a593Smuzhiyun }
2049*4882a593Smuzhiyun
2050*4882a593Smuzhiyun buf_size = pps->num_tile_rows * sizeof(RK_U32);
2051*4882a593Smuzhiyun if (bufs->row_height_size < buf_size) {
2052*4882a593Smuzhiyun bufs->row_height = mpp_malloc_size(RK_U32, buf_size);
2053*4882a593Smuzhiyun bufs->row_height_size = buf_size;
2054*4882a593Smuzhiyun }
2055*4882a593Smuzhiyun
2056*4882a593Smuzhiyun if (!bufs->column_width || !bufs->row_height) {
2057*4882a593Smuzhiyun ret = MPP_ERR_NOMEM;
2058*4882a593Smuzhiyun goto err;
2059*4882a593Smuzhiyun }
2060*4882a593Smuzhiyun
2061*4882a593Smuzhiyun READ_ONEBIT(gb, &pps->uniform_spacing_flag );
2062*4882a593Smuzhiyun if (!pps->uniform_spacing_flag) {
2063*4882a593Smuzhiyun RK_S32 sum = 0;
2064*4882a593Smuzhiyun for (i = 0; i < pps->num_tile_columns - 1; i++) {
2065*4882a593Smuzhiyun READ_UE(gb, &bufs->column_width[i]);
2066*4882a593Smuzhiyun bufs->column_width[i] += 1;
2067*4882a593Smuzhiyun sum += bufs->column_width[i];
2068*4882a593Smuzhiyun }
2069*4882a593Smuzhiyun if (sum >= sps->ctb_width) {
2070*4882a593Smuzhiyun mpp_err( "Invalid tile widths.\n");
2071*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
2072*4882a593Smuzhiyun goto err;
2073*4882a593Smuzhiyun }
2074*4882a593Smuzhiyun bufs->column_width[pps->num_tile_columns - 1] = sps->ctb_width - sum;
2075*4882a593Smuzhiyun
2076*4882a593Smuzhiyun sum = 0;
2077*4882a593Smuzhiyun for (i = 0; i < pps->num_tile_rows - 1; i++) {
2078*4882a593Smuzhiyun READ_UE(gb, &bufs->row_height[i]);
2079*4882a593Smuzhiyun bufs->row_height[i] += 1;
2080*4882a593Smuzhiyun sum += bufs->row_height[i];
2081*4882a593Smuzhiyun }
2082*4882a593Smuzhiyun if (sum >= sps->ctb_height) {
2083*4882a593Smuzhiyun mpp_err( "Invalid tile heights.\n");
2084*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
2085*4882a593Smuzhiyun goto err;
2086*4882a593Smuzhiyun }
2087*4882a593Smuzhiyun bufs->row_height[pps->num_tile_rows - 1] = sps->ctb_height - sum;
2088*4882a593Smuzhiyun }
2089*4882a593Smuzhiyun READ_ONEBIT(gb, &pps->loop_filter_across_tiles_enabled_flag);
2090*4882a593Smuzhiyun }
2091*4882a593Smuzhiyun
2092*4882a593Smuzhiyun READ_ONEBIT(gb, &pps->seq_loop_filter_across_slices_enabled_flag);
2093*4882a593Smuzhiyun READ_ONEBIT(gb, &pps->deblocking_filter_control_present_flag);
2094*4882a593Smuzhiyun if (pps->deblocking_filter_control_present_flag) {
2095*4882a593Smuzhiyun READ_ONEBIT(gb, &pps->deblocking_filter_override_enabled_flag);
2096*4882a593Smuzhiyun READ_ONEBIT(gb, & pps->disable_dbf);
2097*4882a593Smuzhiyun if (!pps->disable_dbf) {
2098*4882a593Smuzhiyun READ_SE(gb, &pps->beta_offset);
2099*4882a593Smuzhiyun pps->beta_offset = pps->beta_offset * 2;
2100*4882a593Smuzhiyun READ_SE(gb, &pps->tc_offset);
2101*4882a593Smuzhiyun pps->tc_offset = pps->tc_offset * 2;
2102*4882a593Smuzhiyun if (pps->beta_offset / 2 < -6 || pps->beta_offset / 2 > 6) {
2103*4882a593Smuzhiyun mpp_err( "pps_beta_offset_div2 out of range: %d\n",
2104*4882a593Smuzhiyun pps->beta_offset / 2);
2105*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
2106*4882a593Smuzhiyun goto err;
2107*4882a593Smuzhiyun }
2108*4882a593Smuzhiyun if (pps->tc_offset / 2 < -6 || pps->tc_offset / 2 > 6) {
2109*4882a593Smuzhiyun mpp_err( "pps_tc_offset_div2 out of range: %d\n",
2110*4882a593Smuzhiyun pps->tc_offset / 2);
2111*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
2112*4882a593Smuzhiyun goto err;
2113*4882a593Smuzhiyun }
2114*4882a593Smuzhiyun }
2115*4882a593Smuzhiyun }
2116*4882a593Smuzhiyun
2117*4882a593Smuzhiyun READ_ONEBIT(gb, &pps->scaling_list_data_present_flag);
2118*4882a593Smuzhiyun if (pps->scaling_list_data_present_flag) {
2119*4882a593Smuzhiyun set_default_scaling_list_data(&pps->scaling_list);
2120*4882a593Smuzhiyun ret = scaling_list_data(s, &pps->scaling_list, sps);
2121*4882a593Smuzhiyun
2122*4882a593Smuzhiyun if (ret < 0)
2123*4882a593Smuzhiyun goto err;
2124*4882a593Smuzhiyun s->scaling_list_listen[pps_id + 16] = 1;
2125*4882a593Smuzhiyun }
2126*4882a593Smuzhiyun
2127*4882a593Smuzhiyun h265d_dbg(H265D_DBG_PPS, "num bit left %d", gb->num_remaining_bits_in_curr_byte_);
2128*4882a593Smuzhiyun READ_ONEBIT(gb, & pps->lists_modification_present_flag);
2129*4882a593Smuzhiyun
2130*4882a593Smuzhiyun
2131*4882a593Smuzhiyun h265d_dbg(H265D_DBG_PPS, "num bit left %d", gb->num_remaining_bits_in_curr_byte_);
2132*4882a593Smuzhiyun READ_UE(gb, &pps->log2_parallel_merge_level);
2133*4882a593Smuzhiyun
2134*4882a593Smuzhiyun h265d_dbg(H265D_DBG_PPS, "num bit left %d", gb->num_remaining_bits_in_curr_byte_);
2135*4882a593Smuzhiyun pps->log2_parallel_merge_level += 2;
2136*4882a593Smuzhiyun if (pps->log2_parallel_merge_level > sps->log2_ctb_size) {
2137*4882a593Smuzhiyun mpp_err( "log2_parallel_merge_level_minus2 out of range: %d\n",
2138*4882a593Smuzhiyun pps->log2_parallel_merge_level - 2);
2139*4882a593Smuzhiyun ret = MPP_ERR_STREAM;
2140*4882a593Smuzhiyun goto err;
2141*4882a593Smuzhiyun }
2142*4882a593Smuzhiyun READ_ONEBIT(gb, &pps->slice_header_extension_present_flag);
2143*4882a593Smuzhiyun READ_ONEBIT(gb, &pps->pps_extension_flag);
2144*4882a593Smuzhiyun h265d_dbg(H265D_DBG_PPS, "pps_extension_flag %d", pps->pps_extension_flag);
2145*4882a593Smuzhiyun if (pps->pps_extension_flag) {
2146*4882a593Smuzhiyun READ_ONEBIT(gb, &pps->pps_range_extensions_flag);
2147*4882a593Smuzhiyun SKIP_BITS(gb, 7); // pps_extension_7bits
2148*4882a593Smuzhiyun }
2149*4882a593Smuzhiyun
2150*4882a593Smuzhiyun if (s->h265dctx->compare_info != NULL) {
2151*4882a593Smuzhiyun CurrentFameInf_t *info = (CurrentFameInf_t *)s->h265dctx->compare_info;
2152*4882a593Smuzhiyun HEVCPPS *openhevc_pps = (HEVCPPS*)&info->pps[pps_id];
2153*4882a593Smuzhiyun mpp_log("compare pps in");
2154*4882a593Smuzhiyun if (compare_pps(openhevc_pps, (HEVCPPS*)pps) < 0) {
2155*4882a593Smuzhiyun mpp_err("compare pps with openhevc error found");
2156*4882a593Smuzhiyun mpp_assert(0);
2157*4882a593Smuzhiyun return -1;
2158*4882a593Smuzhiyun }
2159*4882a593Smuzhiyun mpp_log("compare pps ok");
2160*4882a593Smuzhiyun }
2161*4882a593Smuzhiyun
2162*4882a593Smuzhiyun // Inferred parameters
2163*4882a593Smuzhiyun if (pps->uniform_spacing_flag) {
2164*4882a593Smuzhiyun buf_size = pps->num_tile_columns * sizeof(RK_U32);
2165*4882a593Smuzhiyun if (bufs->column_width_size < buf_size) {
2166*4882a593Smuzhiyun bufs->column_width = mpp_malloc_size(RK_U32, buf_size);
2167*4882a593Smuzhiyun bufs->column_width_size = buf_size;
2168*4882a593Smuzhiyun }
2169*4882a593Smuzhiyun
2170*4882a593Smuzhiyun buf_size = pps->num_tile_rows * sizeof(RK_U32);
2171*4882a593Smuzhiyun if (bufs->row_height_size < buf_size) {
2172*4882a593Smuzhiyun bufs->row_height = mpp_malloc_size(RK_U32, buf_size);
2173*4882a593Smuzhiyun bufs->row_height_size = buf_size;
2174*4882a593Smuzhiyun }
2175*4882a593Smuzhiyun if (!bufs->column_width || !bufs->row_height) {
2176*4882a593Smuzhiyun ret = MPP_ERR_NOMEM;
2177*4882a593Smuzhiyun goto err;
2178*4882a593Smuzhiyun }
2179*4882a593Smuzhiyun
2180*4882a593Smuzhiyun for (i = 0; i < pps->num_tile_columns; i++) {
2181*4882a593Smuzhiyun bufs->column_width[i] = ((i + 1) * sps->ctb_width) / pps->num_tile_columns -
2182*4882a593Smuzhiyun (i * sps->ctb_width) / pps->num_tile_columns;
2183*4882a593Smuzhiyun }
2184*4882a593Smuzhiyun
2185*4882a593Smuzhiyun for (i = 0; i < pps->num_tile_rows; i++) {
2186*4882a593Smuzhiyun bufs->row_height[i] = ((i + 1) * sps->ctb_height) / pps->num_tile_rows -
2187*4882a593Smuzhiyun (i * sps->ctb_height) / pps->num_tile_rows;
2188*4882a593Smuzhiyun }
2189*4882a593Smuzhiyun }
2190*4882a593Smuzhiyun
2191*4882a593Smuzhiyun s->pps_list[pps_id] = (RK_U8 *)pps;
2192*4882a593Smuzhiyun s->ps_need_upate = 1;
2193*4882a593Smuzhiyun
2194*4882a593Smuzhiyun if (s->pps_list[pps_id])
2195*4882a593Smuzhiyun s->pps_list_of_updated[pps_id] = 1;
2196*4882a593Smuzhiyun
2197*4882a593Smuzhiyun return 0;
2198*4882a593Smuzhiyun __BITREAD_ERR:
2199*4882a593Smuzhiyun err:
2200*4882a593Smuzhiyun if (new_pps)
2201*4882a593Smuzhiyun mpp_hevc_pps_free((RK_U8 *)pps);
2202*4882a593Smuzhiyun
2203*4882a593Smuzhiyun return ret;
2204*4882a593Smuzhiyun }
2205