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 #include <stdlib.h>
19*437bfbebSnyanmisaka #include <string.h>
20*437bfbebSnyanmisaka
21*437bfbebSnyanmisaka #include "h264d_scalist.h"
22*437bfbebSnyanmisaka
23*437bfbebSnyanmisaka
24*437bfbebSnyanmisaka
25*437bfbebSnyanmisaka static RK_U8 ZZ_SCAN[16] =
26*437bfbebSnyanmisaka { 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15 };
27*437bfbebSnyanmisaka
28*437bfbebSnyanmisaka static RK_U8 ZZ_SCAN8[64] = {
29*437bfbebSnyanmisaka 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5,
30*437bfbebSnyanmisaka 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28,
31*437bfbebSnyanmisaka 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51,
32*437bfbebSnyanmisaka 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63
33*437bfbebSnyanmisaka };
34*437bfbebSnyanmisaka
35*437bfbebSnyanmisaka static RK_S32 Default4x4Intra[H264ScalingList4x4Length] =
36*437bfbebSnyanmisaka { 6, 13, 20, 28, 13, 20, 28, 32, 20, 28, 32, 37, 28, 32, 37, 42 };
37*437bfbebSnyanmisaka
38*437bfbebSnyanmisaka static RK_S32 Default4x4Inter[H264ScalingList4x4Length] =
39*437bfbebSnyanmisaka { 10, 14, 20, 24, 14, 20, 24, 27, 20, 24, 27, 30, 24, 27, 30, 34 };
40*437bfbebSnyanmisaka
41*437bfbebSnyanmisaka static RK_S32 Default8x8Intra[H264ScalingList8x8Length] = {
42*437bfbebSnyanmisaka 6, 10, 13, 16, 18, 23, 25, 27, 10, 11, 16, 18, 23, 25, 27, 29,
43*437bfbebSnyanmisaka 13, 16, 18, 23, 25, 27, 29, 31, 16, 18, 23, 25, 27, 29, 31, 33,
44*437bfbebSnyanmisaka 18, 23, 25, 27, 29, 31, 33, 36, 23, 25, 27, 29, 31, 33, 36, 38,
45*437bfbebSnyanmisaka 25, 27, 29, 31, 33, 36, 38, 40, 27, 29, 31, 33, 36, 38, 40, 42
46*437bfbebSnyanmisaka };
47*437bfbebSnyanmisaka
48*437bfbebSnyanmisaka static RK_S32 Default8x8Inter[H264ScalingList8x8Length] = {
49*437bfbebSnyanmisaka 9, 13, 15, 17, 19, 21, 22, 24, 13, 13, 17, 19, 21, 22, 24, 25,
50*437bfbebSnyanmisaka 15, 17, 19, 21, 22, 24, 25, 27, 17, 19, 21, 22, 24, 25, 27, 28,
51*437bfbebSnyanmisaka 19, 21, 22, 24, 25, 27, 28, 30, 21, 22, 24, 25, 27, 28, 30, 32,
52*437bfbebSnyanmisaka 22, 24, 25, 27, 28, 30, 32, 33, 24, 25, 27, 28, 30, 32, 33, 35
53*437bfbebSnyanmisaka };
54*437bfbebSnyanmisaka
55*437bfbebSnyanmisaka static RK_S32 Default4x4[16] =
56*437bfbebSnyanmisaka { 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 };
57*437bfbebSnyanmisaka
58*437bfbebSnyanmisaka static RK_S32 Default8x8[64] = {
59*437bfbebSnyanmisaka 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
60*437bfbebSnyanmisaka 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
61*437bfbebSnyanmisaka 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
62*437bfbebSnyanmisaka 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16
63*437bfbebSnyanmisaka };
64*437bfbebSnyanmisaka
65*437bfbebSnyanmisaka
set_sps_scanlist_matrix(H264_SPS_t * sps,H264dVideoCtx_t * p_Vid)66*437bfbebSnyanmisaka static void set_sps_scanlist_matrix(H264_SPS_t *sps, H264dVideoCtx_t *p_Vid)
67*437bfbebSnyanmisaka {
68*437bfbebSnyanmisaka RK_S32 i = 0;
69*437bfbebSnyanmisaka
70*437bfbebSnyanmisaka for (i = 0; i < 6; ++i) {
71*437bfbebSnyanmisaka if (!sps->seq_scaling_list_present_flag[i]) { // fall-back rule A
72*437bfbebSnyanmisaka if (i == 0) {
73*437bfbebSnyanmisaka p_Vid->qmatrix[i] = Default4x4Intra;
74*437bfbebSnyanmisaka } else if (i == 3) {
75*437bfbebSnyanmisaka p_Vid->qmatrix[i] = Default4x4Inter;
76*437bfbebSnyanmisaka } else {
77*437bfbebSnyanmisaka p_Vid->qmatrix[i] = p_Vid->qmatrix[i - 1];
78*437bfbebSnyanmisaka }
79*437bfbebSnyanmisaka } else {
80*437bfbebSnyanmisaka if (sps->UseDefaultScalingMatrix4x4Flag[i]) {
81*437bfbebSnyanmisaka
82*437bfbebSnyanmisaka p_Vid->qmatrix[i] = (i < 3) ? Default4x4Intra : Default4x4Inter;
83*437bfbebSnyanmisaka } else {
84*437bfbebSnyanmisaka p_Vid->qmatrix[i] = sps->ScalingList4x4[i];
85*437bfbebSnyanmisaka }
86*437bfbebSnyanmisaka }
87*437bfbebSnyanmisaka }
88*437bfbebSnyanmisaka
89*437bfbebSnyanmisaka for (i = 6; i < ((sps->chroma_format_idc != H264_CHROMA_444) ? 8 : 12); ++i) {
90*437bfbebSnyanmisaka if (!sps->seq_scaling_list_present_flag[i]) { // fall-back rule A
91*437bfbebSnyanmisaka if (i == 6) {
92*437bfbebSnyanmisaka p_Vid->qmatrix[i] = Default8x8Intra;
93*437bfbebSnyanmisaka } else if (i == 7) {
94*437bfbebSnyanmisaka p_Vid->qmatrix[i] = Default8x8Inter;
95*437bfbebSnyanmisaka } else {
96*437bfbebSnyanmisaka p_Vid->qmatrix[i] = p_Vid->qmatrix[i - 2];
97*437bfbebSnyanmisaka }
98*437bfbebSnyanmisaka } else {
99*437bfbebSnyanmisaka if (sps->UseDefaultScalingMatrix8x8Flag[i - 6]) {
100*437bfbebSnyanmisaka
101*437bfbebSnyanmisaka p_Vid->qmatrix[i] = (i == 6 || i == 8 || i == 10) ? Default8x8Intra : Default8x8Inter;
102*437bfbebSnyanmisaka } else {
103*437bfbebSnyanmisaka p_Vid->qmatrix[i] = sps->ScalingList8x8[i - 6];
104*437bfbebSnyanmisaka }
105*437bfbebSnyanmisaka }
106*437bfbebSnyanmisaka }
107*437bfbebSnyanmisaka }
108*437bfbebSnyanmisaka
set_pps_scanlist_matrix(H264_SPS_t * sps,H264_PPS_t * pps,H264dVideoCtx_t * p_Vid)109*437bfbebSnyanmisaka static void set_pps_scanlist_matrix(H264_SPS_t *sps, H264_PPS_t *pps, H264dVideoCtx_t *p_Vid)
110*437bfbebSnyanmisaka {
111*437bfbebSnyanmisaka RK_S32 i = 0;
112*437bfbebSnyanmisaka
113*437bfbebSnyanmisaka for (i = 0; i < 6; ++i) {
114*437bfbebSnyanmisaka if (!pps->pic_scaling_list_present_flag[i]) { // fall-back rule B
115*437bfbebSnyanmisaka if (i == 0) {
116*437bfbebSnyanmisaka if (!sps->seq_scaling_matrix_present_flag) {
117*437bfbebSnyanmisaka p_Vid->qmatrix[i] = Default4x4Intra;
118*437bfbebSnyanmisaka }
119*437bfbebSnyanmisaka } else if (i == 3) {
120*437bfbebSnyanmisaka if (!sps->seq_scaling_matrix_present_flag) {
121*437bfbebSnyanmisaka p_Vid->qmatrix[i] = Default4x4Inter;
122*437bfbebSnyanmisaka }
123*437bfbebSnyanmisaka } else {
124*437bfbebSnyanmisaka p_Vid->qmatrix[i] = p_Vid->qmatrix[i - 1];
125*437bfbebSnyanmisaka }
126*437bfbebSnyanmisaka } else {
127*437bfbebSnyanmisaka if (pps->UseDefaultScalingMatrix4x4Flag[i]) {
128*437bfbebSnyanmisaka p_Vid->qmatrix[i] = (i < 3) ? Default4x4Intra : Default4x4Inter;
129*437bfbebSnyanmisaka } else {
130*437bfbebSnyanmisaka p_Vid->qmatrix[i] = pps->ScalingList4x4[i];
131*437bfbebSnyanmisaka }
132*437bfbebSnyanmisaka }
133*437bfbebSnyanmisaka }
134*437bfbebSnyanmisaka for (i = 6; i < ((sps->chroma_format_idc != H264_CHROMA_444) ? 8 : 12); ++i) {
135*437bfbebSnyanmisaka if (!pps->pic_scaling_list_present_flag[i]) { // fall-back rule B
136*437bfbebSnyanmisaka if (i == 6) {
137*437bfbebSnyanmisaka if (!sps->seq_scaling_matrix_present_flag) {
138*437bfbebSnyanmisaka p_Vid->qmatrix[i] = Default8x8Intra;
139*437bfbebSnyanmisaka }
140*437bfbebSnyanmisaka } else if (i == 7) {
141*437bfbebSnyanmisaka if (!sps->seq_scaling_matrix_present_flag)
142*437bfbebSnyanmisaka p_Vid->qmatrix[i] = Default8x8Inter;
143*437bfbebSnyanmisaka } else
144*437bfbebSnyanmisaka p_Vid->qmatrix[i] = p_Vid->qmatrix[i - 2];
145*437bfbebSnyanmisaka } else {
146*437bfbebSnyanmisaka if (pps->UseDefaultScalingMatrix8x8Flag[i - 6]) {
147*437bfbebSnyanmisaka p_Vid->qmatrix[i] = (i == 6 || i == 8 || i == 10) ? Default8x8Intra : Default8x8Inter;
148*437bfbebSnyanmisaka } else {
149*437bfbebSnyanmisaka p_Vid->qmatrix[i] = pps->ScalingList8x8[i - 6];
150*437bfbebSnyanmisaka }
151*437bfbebSnyanmisaka }
152*437bfbebSnyanmisaka }
153*437bfbebSnyanmisaka }
154*437bfbebSnyanmisaka
155*437bfbebSnyanmisaka /*!
156*437bfbebSnyanmisaka ***********************************************************************
157*437bfbebSnyanmisaka * \brief
158*437bfbebSnyanmisaka * check profile
159*437bfbebSnyanmisaka ***********************************************************************
160*437bfbebSnyanmisaka */
161*437bfbebSnyanmisaka //extern "C"
is_prext_profile(RK_U32 profile_idc)162*437bfbebSnyanmisaka RK_U32 is_prext_profile(RK_U32 profile_idc)
163*437bfbebSnyanmisaka {
164*437bfbebSnyanmisaka return (profile_idc >= H264_PROFILE_HIGH || profile_idc == H264_PROFILE_FREXT_CAVLC444) ? 1 : 0;
165*437bfbebSnyanmisaka }
166*437bfbebSnyanmisaka
167*437bfbebSnyanmisaka /*!
168*437bfbebSnyanmisaka ***********************************************************************
169*437bfbebSnyanmisaka * \brief
170*437bfbebSnyanmisaka * parse sps and process sps
171*437bfbebSnyanmisaka ***********************************************************************
172*437bfbebSnyanmisaka */
173*437bfbebSnyanmisaka //extern "C"
parse_scalingList(BitReadCtx_t * p_bitctx,RK_S32 size,RK_S32 * scaling_list,RK_S32 * use_default)174*437bfbebSnyanmisaka MPP_RET parse_scalingList(BitReadCtx_t *p_bitctx, RK_S32 size, RK_S32 *scaling_list, RK_S32 *use_default)
175*437bfbebSnyanmisaka {
176*437bfbebSnyanmisaka MPP_RET ret = MPP_ERR_UNKNOW;
177*437bfbebSnyanmisaka RK_S32 last_scale = 8;
178*437bfbebSnyanmisaka RK_S32 next_scale = 8;
179*437bfbebSnyanmisaka RK_S32 delta_scale = 0;
180*437bfbebSnyanmisaka RK_S32 j = 0, scanj = 0;
181*437bfbebSnyanmisaka
182*437bfbebSnyanmisaka RK_U8 *zz_scan = (size > 16) ? ZZ_SCAN8 : ZZ_SCAN;
183*437bfbebSnyanmisaka
184*437bfbebSnyanmisaka *use_default = 0;
185*437bfbebSnyanmisaka for (j = 0; j < size; ++j) {
186*437bfbebSnyanmisaka scanj = zz_scan[j];
187*437bfbebSnyanmisaka if (next_scale != 0) {
188*437bfbebSnyanmisaka READ_SE(p_bitctx, &delta_scale);
189*437bfbebSnyanmisaka next_scale = (last_scale + delta_scale + 256) & 0xff;
190*437bfbebSnyanmisaka *use_default = (scanj == 0 && next_scale == 0) ? 1 : 0;
191*437bfbebSnyanmisaka }
192*437bfbebSnyanmisaka scaling_list[scanj] = (next_scale == 0) ? last_scale : next_scale;
193*437bfbebSnyanmisaka last_scale = scaling_list[scanj];
194*437bfbebSnyanmisaka }
195*437bfbebSnyanmisaka
196*437bfbebSnyanmisaka return ret = MPP_OK;
197*437bfbebSnyanmisaka __BITREAD_ERR:
198*437bfbebSnyanmisaka ret = p_bitctx->ret;
199*437bfbebSnyanmisaka return ret;
200*437bfbebSnyanmisaka }
201*437bfbebSnyanmisaka
202*437bfbebSnyanmisaka
203*437bfbebSnyanmisaka /*!
204*437bfbebSnyanmisaka ***********************************************************************
205*437bfbebSnyanmisaka * \brief
206*437bfbebSnyanmisaka * parse sps and process sps
207*437bfbebSnyanmisaka ***********************************************************************
208*437bfbebSnyanmisaka */
209*437bfbebSnyanmisaka //extern "C"
get_max_dec_frame_buf_size(H264_SPS_t * sps)210*437bfbebSnyanmisaka MPP_RET get_max_dec_frame_buf_size(H264_SPS_t *sps)
211*437bfbebSnyanmisaka {
212*437bfbebSnyanmisaka RK_S32 size = 0;
213*437bfbebSnyanmisaka RK_S32 pic_size = 0;
214*437bfbebSnyanmisaka MPP_RET ret = MPP_ERR_UNKNOW;
215*437bfbebSnyanmisaka
216*437bfbebSnyanmisaka
217*437bfbebSnyanmisaka switch (sps->level_idc) {
218*437bfbebSnyanmisaka case 9:
219*437bfbebSnyanmisaka size = 152064;
220*437bfbebSnyanmisaka break;
221*437bfbebSnyanmisaka case 10:
222*437bfbebSnyanmisaka size = 152064;
223*437bfbebSnyanmisaka break;
224*437bfbebSnyanmisaka case 11:
225*437bfbebSnyanmisaka if (sps->constrained_set3_flag && !is_prext_profile(sps->profile_idc)) {
226*437bfbebSnyanmisaka size = 152064;
227*437bfbebSnyanmisaka } else {
228*437bfbebSnyanmisaka size = 345600;
229*437bfbebSnyanmisaka }
230*437bfbebSnyanmisaka break;
231*437bfbebSnyanmisaka case 12:
232*437bfbebSnyanmisaka size = 912384;
233*437bfbebSnyanmisaka break;
234*437bfbebSnyanmisaka case 13:
235*437bfbebSnyanmisaka size = 912384;
236*437bfbebSnyanmisaka break;
237*437bfbebSnyanmisaka case 20:
238*437bfbebSnyanmisaka size = 912384;
239*437bfbebSnyanmisaka break;
240*437bfbebSnyanmisaka case 21:
241*437bfbebSnyanmisaka size = 1824768;
242*437bfbebSnyanmisaka break;
243*437bfbebSnyanmisaka case 22:
244*437bfbebSnyanmisaka size = 3110400;
245*437bfbebSnyanmisaka break;
246*437bfbebSnyanmisaka case 30:
247*437bfbebSnyanmisaka size = 3110400;
248*437bfbebSnyanmisaka break;
249*437bfbebSnyanmisaka case 31:
250*437bfbebSnyanmisaka size = 6912000;
251*437bfbebSnyanmisaka break;
252*437bfbebSnyanmisaka case 32:
253*437bfbebSnyanmisaka size = 7864320;
254*437bfbebSnyanmisaka break;
255*437bfbebSnyanmisaka case 40:
256*437bfbebSnyanmisaka size = 12582912;
257*437bfbebSnyanmisaka break;
258*437bfbebSnyanmisaka case 41:
259*437bfbebSnyanmisaka size = 12582912;
260*437bfbebSnyanmisaka break;
261*437bfbebSnyanmisaka case 42:
262*437bfbebSnyanmisaka size = 13369344;
263*437bfbebSnyanmisaka break;
264*437bfbebSnyanmisaka case 50:
265*437bfbebSnyanmisaka size = 42393600;
266*437bfbebSnyanmisaka break;
267*437bfbebSnyanmisaka case 51:
268*437bfbebSnyanmisaka size = 70778880;
269*437bfbebSnyanmisaka break;
270*437bfbebSnyanmisaka case 52:
271*437bfbebSnyanmisaka size = 70778880;
272*437bfbebSnyanmisaka break;
273*437bfbebSnyanmisaka case 60:
274*437bfbebSnyanmisaka size = 267386880;
275*437bfbebSnyanmisaka break;
276*437bfbebSnyanmisaka case 61:
277*437bfbebSnyanmisaka size = 267386880;
278*437bfbebSnyanmisaka break;
279*437bfbebSnyanmisaka case 62:
280*437bfbebSnyanmisaka size = 267386880;
281*437bfbebSnyanmisaka break;
282*437bfbebSnyanmisaka default:
283*437bfbebSnyanmisaka ASSERT(0); // undefined level
284*437bfbebSnyanmisaka return ret = MPP_NOK;
285*437bfbebSnyanmisaka }
286*437bfbebSnyanmisaka pic_size = (sps->pic_width_in_mbs_minus1 + 1)
287*437bfbebSnyanmisaka * (sps->pic_height_in_map_units_minus1 + 1)
288*437bfbebSnyanmisaka * (sps->frame_mbs_only_flag ? 1 : 2) * 384;
289*437bfbebSnyanmisaka size /= pic_size;
290*437bfbebSnyanmisaka size = MPP_MIN(size, 16);
291*437bfbebSnyanmisaka sps->max_dec_frame_buffering = size;
292*437bfbebSnyanmisaka
293*437bfbebSnyanmisaka return ret = MPP_OK;
294*437bfbebSnyanmisaka }
295*437bfbebSnyanmisaka
296*437bfbebSnyanmisaka /*!
297*437bfbebSnyanmisaka ***********************************************************************
298*437bfbebSnyanmisaka * \brief
299*437bfbebSnyanmisaka * parse sps and process sps
300*437bfbebSnyanmisaka ***********************************************************************
301*437bfbebSnyanmisaka */
302*437bfbebSnyanmisaka //extern "C"
parse_sps_scalinglists(BitReadCtx_t * p_bitctx,H264_SPS_t * sps)303*437bfbebSnyanmisaka MPP_RET parse_sps_scalinglists(BitReadCtx_t *p_bitctx, H264_SPS_t *sps)
304*437bfbebSnyanmisaka {
305*437bfbebSnyanmisaka RK_S32 i = 0;
306*437bfbebSnyanmisaka MPP_RET ret = MPP_ERR_UNKNOW;
307*437bfbebSnyanmisaka // Parse scaling_list4x4.
308*437bfbebSnyanmisaka for (i = 0; i < 6; ++i) {
309*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &sps->seq_scaling_list_present_flag[i]);
310*437bfbebSnyanmisaka
311*437bfbebSnyanmisaka if (sps->seq_scaling_list_present_flag[i]) {
312*437bfbebSnyanmisaka FUN_CHECK(ret = parse_scalingList(p_bitctx, H264ScalingList4x4Length,
313*437bfbebSnyanmisaka sps->ScalingList4x4[i], &sps->UseDefaultScalingMatrix4x4Flag[i]));
314*437bfbebSnyanmisaka }
315*437bfbebSnyanmisaka }
316*437bfbebSnyanmisaka // Parse scaling_list8x8.
317*437bfbebSnyanmisaka for (i = 0; i < ((sps->chroma_format_idc != H264_CHROMA_444) ? 2 : 6); ++i) {
318*437bfbebSnyanmisaka READ_ONEBIT(p_bitctx, &sps->seq_scaling_list_present_flag[6 + i]);
319*437bfbebSnyanmisaka if (sps->seq_scaling_list_present_flag[6 + i]) {
320*437bfbebSnyanmisaka FUN_CHECK(ret = parse_scalingList(p_bitctx, H264ScalingList8x8Length,
321*437bfbebSnyanmisaka sps->ScalingList8x8[i], &sps->UseDefaultScalingMatrix8x8Flag[i]));
322*437bfbebSnyanmisaka }
323*437bfbebSnyanmisaka }
324*437bfbebSnyanmisaka
325*437bfbebSnyanmisaka return ret = MPP_OK;
326*437bfbebSnyanmisaka __BITREAD_ERR:
327*437bfbebSnyanmisaka ret = p_bitctx->ret;
328*437bfbebSnyanmisaka __FAILED:
329*437bfbebSnyanmisaka return ret;
330*437bfbebSnyanmisaka }
331*437bfbebSnyanmisaka /*!
332*437bfbebSnyanmisaka ***********************************************************************
333*437bfbebSnyanmisaka * \brief
334*437bfbebSnyanmisaka * prepare scanlist info to register syntax
335*437bfbebSnyanmisaka ***********************************************************************
336*437bfbebSnyanmisaka */
337*437bfbebSnyanmisaka //extern "C"
prepare_init_scanlist(H264_SLICE_t * currSlice)338*437bfbebSnyanmisaka MPP_RET prepare_init_scanlist(H264_SLICE_t *currSlice)
339*437bfbebSnyanmisaka {
340*437bfbebSnyanmisaka RK_S32 i = 0;
341*437bfbebSnyanmisaka H264_SPS_t *sps = currSlice->p_Vid->active_sps;
342*437bfbebSnyanmisaka H264_PPS_t *pps = currSlice->p_Vid->active_pps;
343*437bfbebSnyanmisaka
344*437bfbebSnyanmisaka if (!pps->pic_scaling_matrix_present_flag && !sps->seq_scaling_matrix_present_flag) {
345*437bfbebSnyanmisaka for (i = 0; i < 12; i++) {
346*437bfbebSnyanmisaka currSlice->p_Vid->qmatrix[i] = (i < 6) ? Default4x4 : Default8x8;
347*437bfbebSnyanmisaka }
348*437bfbebSnyanmisaka } else {
349*437bfbebSnyanmisaka if (sps->seq_scaling_matrix_present_flag) { // check sps first
350*437bfbebSnyanmisaka set_sps_scanlist_matrix(sps, currSlice->p_Vid);
351*437bfbebSnyanmisaka }
352*437bfbebSnyanmisaka if (pps->pic_scaling_matrix_present_flag) { // then check pps
353*437bfbebSnyanmisaka set_pps_scanlist_matrix(sps, pps, currSlice->p_Vid);
354*437bfbebSnyanmisaka }
355*437bfbebSnyanmisaka }
356*437bfbebSnyanmisaka return MPP_OK;
357*437bfbebSnyanmisaka }
358