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