xref: /rockchip-linux_mpp/mpp/codec/dec/h265/h265d_ps.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  *
3*437bfbebSnyanmisaka  * Copyright 2015 Rockchip Electronics Co. LTD
4*437bfbebSnyanmisaka  *
5*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
6*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
7*437bfbebSnyanmisaka  * You may obtain a copy of the License at
8*437bfbebSnyanmisaka  *
9*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
10*437bfbebSnyanmisaka  *
11*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
12*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
13*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
15*437bfbebSnyanmisaka  * limitations under the License.
16*437bfbebSnyanmisaka  */
17*437bfbebSnyanmisaka 
18*437bfbebSnyanmisaka /*
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