1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka *
3*437bfbebSnyanmisaka * Copyright 2021 Rockchip Electronics Co. LTD
4*437bfbebSnyanmisaka *
5*437bfbebSnyanmisaka * Licensed under the Apache License, Version 2.0 (the "License");
6*437bfbebSnyanmisaka * you may not use this file except in compliance with the License.
7*437bfbebSnyanmisaka * You may obtain a copy of the License at
8*437bfbebSnyanmisaka *
9*437bfbebSnyanmisaka * http://www.apache.org/licenses/LICENSE-2.0
10*437bfbebSnyanmisaka *
11*437bfbebSnyanmisaka * Unless required by applicable law or agreed to in writing, software
12*437bfbebSnyanmisaka * distributed under the License is distributed on an "AS IS" BASIS,
13*437bfbebSnyanmisaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*437bfbebSnyanmisaka * See the License for the specific language governing permissions and
15*437bfbebSnyanmisaka * limitations under the License.
16*437bfbebSnyanmisaka */
17*437bfbebSnyanmisaka
18*437bfbebSnyanmisaka #define MODULE_TAG "avs2d_ps"
19*437bfbebSnyanmisaka
20*437bfbebSnyanmisaka #include <string.h>
21*437bfbebSnyanmisaka #include <stdlib.h>
22*437bfbebSnyanmisaka
23*437bfbebSnyanmisaka #include "mpp_mem.h"
24*437bfbebSnyanmisaka #include "mpp_log.h"
25*437bfbebSnyanmisaka #include "mpp_debug.h"
26*437bfbebSnyanmisaka #include "mpp_packet_impl.h"
27*437bfbebSnyanmisaka #include "hal_task.h"
28*437bfbebSnyanmisaka
29*437bfbebSnyanmisaka #include "avs2d_api.h"
30*437bfbebSnyanmisaka #include "avs2d_ps.h"
31*437bfbebSnyanmisaka
32*437bfbebSnyanmisaka static const RK_U32 wq_param_default[2][6] = {
33*437bfbebSnyanmisaka { 67, 71, 71, 80, 80, 106},
34*437bfbebSnyanmisaka { 64, 49, 53, 58, 58, 64 }
35*437bfbebSnyanmisaka };
36*437bfbebSnyanmisaka
37*437bfbebSnyanmisaka static const RK_U32 g_WqMDefault4x4[16] = {
38*437bfbebSnyanmisaka 64, 64, 64, 68,
39*437bfbebSnyanmisaka 64, 64, 68, 72,
40*437bfbebSnyanmisaka 64, 68, 76, 80,
41*437bfbebSnyanmisaka 72, 76, 84, 96
42*437bfbebSnyanmisaka };
43*437bfbebSnyanmisaka
44*437bfbebSnyanmisaka static const RK_U32 g_WqMDefault8x8[64] = {
45*437bfbebSnyanmisaka 64, 64, 64, 64, 68, 68, 72, 76,
46*437bfbebSnyanmisaka 64, 64, 64, 68, 72, 76, 84, 92,
47*437bfbebSnyanmisaka 64, 64, 68, 72, 76, 80, 88, 100,
48*437bfbebSnyanmisaka 64, 68, 72, 80, 84, 92, 100, 28,
49*437bfbebSnyanmisaka 68, 72, 80, 84, 92, 104, 112, 128,
50*437bfbebSnyanmisaka 76, 80, 84, 92, 104, 116, 132, 152,
51*437bfbebSnyanmisaka 96, 100, 104, 116, 124, 140, 164, 188,
52*437bfbebSnyanmisaka 104, 108, 116, 128, 152, 172, 192, 216
53*437bfbebSnyanmisaka };
54*437bfbebSnyanmisaka
55*437bfbebSnyanmisaka static const RK_U8 WeightQuantModel[4][64] = {
56*437bfbebSnyanmisaka // l a b c d h
57*437bfbebSnyanmisaka // 0 1 2 3 4 5
58*437bfbebSnyanmisaka {
59*437bfbebSnyanmisaka // Mode 0
60*437bfbebSnyanmisaka 0, 0, 0, 4, 4, 4, 5, 5,
61*437bfbebSnyanmisaka 0, 0, 3, 3, 3, 3, 5, 5,
62*437bfbebSnyanmisaka 0, 3, 2, 2, 1, 1, 5, 5,
63*437bfbebSnyanmisaka 4, 3, 2, 2, 1, 5, 5, 5,
64*437bfbebSnyanmisaka 4, 3, 1, 1, 5, 5, 5, 5,
65*437bfbebSnyanmisaka 4, 3, 1, 5, 5, 5, 5, 5,
66*437bfbebSnyanmisaka 5, 5, 5, 5, 5, 5, 5, 5,
67*437bfbebSnyanmisaka 5, 5, 5, 5, 5, 5, 5, 5
68*437bfbebSnyanmisaka }, {
69*437bfbebSnyanmisaka // Mode 1
70*437bfbebSnyanmisaka 0, 0, 0, 4, 4, 4, 5, 5,
71*437bfbebSnyanmisaka 0, 0, 4, 4, 4, 4, 5, 5,
72*437bfbebSnyanmisaka 0, 3, 2, 2, 2, 1, 5, 5,
73*437bfbebSnyanmisaka 3, 3, 2, 2, 1, 5, 5, 5,
74*437bfbebSnyanmisaka 3, 3, 2, 1, 5, 5, 5, 5,
75*437bfbebSnyanmisaka 3, 3, 1, 5, 5, 5, 5, 5,
76*437bfbebSnyanmisaka 5, 5, 5, 5, 5, 5, 5, 5,
77*437bfbebSnyanmisaka 5, 5, 5, 5, 5, 5, 5, 5
78*437bfbebSnyanmisaka }, {
79*437bfbebSnyanmisaka // Mode 2
80*437bfbebSnyanmisaka 0, 0, 0, 4, 4, 3, 5, 5,
81*437bfbebSnyanmisaka 0, 0, 4, 4, 3, 2, 5, 5,
82*437bfbebSnyanmisaka 0, 4, 4, 3, 2, 1, 5, 5,
83*437bfbebSnyanmisaka 4, 4, 3, 2, 1, 5, 5, 5,
84*437bfbebSnyanmisaka 4, 3, 2, 1, 5, 5, 5, 5,
85*437bfbebSnyanmisaka 3, 2, 1, 5, 5, 5, 5, 5,
86*437bfbebSnyanmisaka 5, 5, 5, 5, 5, 5, 5, 5,
87*437bfbebSnyanmisaka 5, 5, 5, 5, 5, 5, 5, 5
88*437bfbebSnyanmisaka }, {
89*437bfbebSnyanmisaka // Mode 3
90*437bfbebSnyanmisaka 0, 0, 0, 3, 2, 1, 5, 5,
91*437bfbebSnyanmisaka 0, 0, 4, 3, 2, 1, 5, 5,
92*437bfbebSnyanmisaka 0, 4, 4, 3, 2, 1, 5, 5,
93*437bfbebSnyanmisaka 3, 3, 3, 3, 2, 5, 5, 5,
94*437bfbebSnyanmisaka 2, 2, 2, 2, 5, 5, 5, 5,
95*437bfbebSnyanmisaka 1, 1, 1, 5, 5, 5, 5, 5,
96*437bfbebSnyanmisaka 5, 5, 5, 5, 5, 5, 5, 5,
97*437bfbebSnyanmisaka 5, 5, 5, 5, 5, 5, 5, 5
98*437bfbebSnyanmisaka }
99*437bfbebSnyanmisaka };
100*437bfbebSnyanmisaka
101*437bfbebSnyanmisaka static const RK_U8 WeightQuantModel4x4[4][16] = {
102*437bfbebSnyanmisaka // l a b c d h
103*437bfbebSnyanmisaka // 0 1 2 3 4 5
104*437bfbebSnyanmisaka {
105*437bfbebSnyanmisaka // Mode 0
106*437bfbebSnyanmisaka 0, 4, 3, 5,
107*437bfbebSnyanmisaka 4, 2, 1, 5,
108*437bfbebSnyanmisaka 3, 1, 1, 5,
109*437bfbebSnyanmisaka 5, 5, 5, 5
110*437bfbebSnyanmisaka }, {
111*437bfbebSnyanmisaka // Mode 1
112*437bfbebSnyanmisaka 0, 4, 4, 5,
113*437bfbebSnyanmisaka 3, 2, 2, 5,
114*437bfbebSnyanmisaka 3, 2, 1, 5,
115*437bfbebSnyanmisaka 5, 5, 5, 5
116*437bfbebSnyanmisaka }, {
117*437bfbebSnyanmisaka // Mode 2
118*437bfbebSnyanmisaka 0, 4, 3, 5,
119*437bfbebSnyanmisaka 4, 3, 2, 5,
120*437bfbebSnyanmisaka 3, 2, 1, 5,
121*437bfbebSnyanmisaka 5, 5, 5, 5
122*437bfbebSnyanmisaka }, {
123*437bfbebSnyanmisaka // Mode 3
124*437bfbebSnyanmisaka 0, 3, 1, 5,
125*437bfbebSnyanmisaka 3, 4, 2, 5,
126*437bfbebSnyanmisaka 1, 2, 2, 5,
127*437bfbebSnyanmisaka 5, 5, 5, 5
128*437bfbebSnyanmisaka }
129*437bfbebSnyanmisaka };
130*437bfbebSnyanmisaka
wq_get_default_matrix(RK_U32 sizeId)131*437bfbebSnyanmisaka static const RK_U32 *wq_get_default_matrix(RK_U32 sizeId)
132*437bfbebSnyanmisaka {
133*437bfbebSnyanmisaka return (sizeId == 0) ? g_WqMDefault4x4 : g_WqMDefault8x8;
134*437bfbebSnyanmisaka }
135*437bfbebSnyanmisaka
wq_init_frame_quant_param(Avs2dCtx_t * p_dec)136*437bfbebSnyanmisaka static void wq_init_frame_quant_param(Avs2dCtx_t *p_dec)
137*437bfbebSnyanmisaka {
138*437bfbebSnyanmisaka RK_U32 i, j, k;
139*437bfbebSnyanmisaka Avs2dPicHeader_t *ph = &p_dec->ph;
140*437bfbebSnyanmisaka
141*437bfbebSnyanmisaka if (!p_dec->enable_wq || ph->pic_wq_data_index != 1) {
142*437bfbebSnyanmisaka return;
143*437bfbebSnyanmisaka }
144*437bfbebSnyanmisaka
145*437bfbebSnyanmisaka //<! determine weight quant param
146*437bfbebSnyanmisaka if (ph->wq_param_index == 0) {
147*437bfbebSnyanmisaka for (i = 0; i < WQP_SIZE; i++) {
148*437bfbebSnyanmisaka ph->pic_wq_param[i] = wq_param_default[DETAILED][i];
149*437bfbebSnyanmisaka }
150*437bfbebSnyanmisaka } else if (ph->wq_param_index == 1) {
151*437bfbebSnyanmisaka for (i = 0; i < WQP_SIZE; i++) {
152*437bfbebSnyanmisaka ph->pic_wq_param[i] = ph->wq_param_delta1[i] + wq_param_default[UNDETAILED][i];
153*437bfbebSnyanmisaka }
154*437bfbebSnyanmisaka } else if (ph->wq_param_index == 2) {
155*437bfbebSnyanmisaka for (i = 0; i < WQP_SIZE; i++) {
156*437bfbebSnyanmisaka ph->pic_wq_param[i] = ph->wq_param_delta2[i] + wq_param_default[DETAILED][i];
157*437bfbebSnyanmisaka }
158*437bfbebSnyanmisaka }
159*437bfbebSnyanmisaka
160*437bfbebSnyanmisaka //!< reconstruct the weighting matrix
161*437bfbebSnyanmisaka for (j = 0; j < 8; j++) {
162*437bfbebSnyanmisaka for (i = 0; i < 8; i++) {
163*437bfbebSnyanmisaka k = WeightQuantModel[ph->wq_model][j * 8 + i];
164*437bfbebSnyanmisaka ph->pic_wq_matrix[1][j * 8 + i] = ph->pic_wq_param[k];
165*437bfbebSnyanmisaka }
166*437bfbebSnyanmisaka }
167*437bfbebSnyanmisaka
168*437bfbebSnyanmisaka for (j = 0; j < 4; j++) {
169*437bfbebSnyanmisaka for (i = 0; i < 4; i++) {
170*437bfbebSnyanmisaka k = WeightQuantModel4x4[ph->wq_model][j * 4 + i];
171*437bfbebSnyanmisaka ph->pic_wq_matrix[0][j * 4 + i] = ph->pic_wq_param[k];
172*437bfbebSnyanmisaka }
173*437bfbebSnyanmisaka }
174*437bfbebSnyanmisaka }
175*437bfbebSnyanmisaka
wq_update_frame_matrix(Avs2dCtx_t * p_dec)176*437bfbebSnyanmisaka static void wq_update_frame_matrix(Avs2dCtx_t *p_dec)
177*437bfbebSnyanmisaka {
178*437bfbebSnyanmisaka RK_U32 i, j;
179*437bfbebSnyanmisaka RK_U32 size_id, wqm_size;
180*437bfbebSnyanmisaka RK_U32 (*frm_wqm)[64];
181*437bfbebSnyanmisaka
182*437bfbebSnyanmisaka Avs2dSeqHeader_t *vsh = &p_dec->vsh;
183*437bfbebSnyanmisaka Avs2dPicHeader_t *ph = &p_dec->ph;
184*437bfbebSnyanmisaka RK_U32 (*cur_wqm)[64] = p_dec->cur_wq_matrix;
185*437bfbebSnyanmisaka
186*437bfbebSnyanmisaka mpp_assert(ph->pic_wq_data_index <= 2);
187*437bfbebSnyanmisaka
188*437bfbebSnyanmisaka if (!p_dec->enable_wq) {
189*437bfbebSnyanmisaka for (size_id = 0; size_id < 2; size_id++) {
190*437bfbebSnyanmisaka for (i = 0; i < 64; i++) {
191*437bfbebSnyanmisaka cur_wqm[size_id][i] = 64;
192*437bfbebSnyanmisaka }
193*437bfbebSnyanmisaka }
194*437bfbebSnyanmisaka } else {
195*437bfbebSnyanmisaka if (ph->pic_wq_data_index == 0) {
196*437bfbebSnyanmisaka frm_wqm = vsh->seq_wq_matrix;
197*437bfbebSnyanmisaka } else {
198*437bfbebSnyanmisaka frm_wqm = ph->pic_wq_matrix;
199*437bfbebSnyanmisaka }
200*437bfbebSnyanmisaka
201*437bfbebSnyanmisaka for (size_id = 0; size_id < 2; size_id++) {
202*437bfbebSnyanmisaka wqm_size = MPP_MIN(1 << (size_id + 2), 8);
203*437bfbebSnyanmisaka for (i = 0; i < wqm_size; i++) {
204*437bfbebSnyanmisaka for (j = 0; j < wqm_size; j++) {
205*437bfbebSnyanmisaka cur_wqm[size_id][i * wqm_size + j] = frm_wqm[size_id][i * wqm_size + j];
206*437bfbebSnyanmisaka }
207*437bfbebSnyanmisaka }
208*437bfbebSnyanmisaka }
209*437bfbebSnyanmisaka }
210*437bfbebSnyanmisaka }
211*437bfbebSnyanmisaka
parse_sequence_wqm(BitReadCtx_t * bitctx,Avs2dSeqHeader_t * vsh)212*437bfbebSnyanmisaka static MPP_RET parse_sequence_wqm(BitReadCtx_t *bitctx, Avs2dSeqHeader_t *vsh)
213*437bfbebSnyanmisaka {
214*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
215*437bfbebSnyanmisaka RK_U8 load_seq_wquant_data_flag;
216*437bfbebSnyanmisaka RK_U32 i, j, size_id, wqm_size;
217*437bfbebSnyanmisaka const RK_U32 *seq_wqm;
218*437bfbebSnyanmisaka
219*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &load_seq_wquant_data_flag);
220*437bfbebSnyanmisaka
221*437bfbebSnyanmisaka for (size_id = 0; size_id < 2; size_id++) {
222*437bfbebSnyanmisaka wqm_size = MPP_MIN(1 << (size_id + 2), 8);
223*437bfbebSnyanmisaka if (load_seq_wquant_data_flag == 1) {
224*437bfbebSnyanmisaka for (j = 0; j < wqm_size; j++) {
225*437bfbebSnyanmisaka for (i = 0; i < wqm_size; i++) {
226*437bfbebSnyanmisaka READ_UE(bitctx, &vsh->seq_wq_matrix[size_id][j * wqm_size + i]);
227*437bfbebSnyanmisaka }
228*437bfbebSnyanmisaka }
229*437bfbebSnyanmisaka } else if (load_seq_wquant_data_flag == 0) {
230*437bfbebSnyanmisaka seq_wqm = wq_get_default_matrix(size_id);
231*437bfbebSnyanmisaka for (i = 0; i < (wqm_size * wqm_size); i++) {
232*437bfbebSnyanmisaka vsh->seq_wq_matrix[size_id][i] = seq_wqm[i];
233*437bfbebSnyanmisaka }
234*437bfbebSnyanmisaka }
235*437bfbebSnyanmisaka }
236*437bfbebSnyanmisaka
237*437bfbebSnyanmisaka return ret;
238*437bfbebSnyanmisaka __BITREAD_ERR:
239*437bfbebSnyanmisaka return ret = bitctx->ret;
240*437bfbebSnyanmisaka }
241*437bfbebSnyanmisaka
parse_one_rps(BitReadCtx_t * bitctx,Avs2dRps_t * rps)242*437bfbebSnyanmisaka static MPP_RET parse_one_rps(BitReadCtx_t *bitctx, Avs2dRps_t *rps)
243*437bfbebSnyanmisaka {
244*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
245*437bfbebSnyanmisaka RK_U32 j;
246*437bfbebSnyanmisaka
247*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("In");
248*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &rps->refered_by_others);
249*437bfbebSnyanmisaka
250*437bfbebSnyanmisaka READ_BITS(bitctx, 3, &rps->num_of_ref);
251*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("refered_by_others_flag %d, num_Of_ref %d", rps->refered_by_others, rps->num_of_ref);
252*437bfbebSnyanmisaka if (rps->num_of_ref > AVS2_MAX_REFS) {
253*437bfbebSnyanmisaka ret = MPP_NOK;
254*437bfbebSnyanmisaka mpp_err_f("invalid ref num(%d).\n", rps->num_of_ref);
255*437bfbebSnyanmisaka goto __FAILED;
256*437bfbebSnyanmisaka }
257*437bfbebSnyanmisaka for (j = 0; j < rps->num_of_ref; j++) {
258*437bfbebSnyanmisaka READ_BITS(bitctx, 6, &rps->ref_pic[j]);
259*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("delta_doi_of_ref_pic[%d]=%d", j, rps->ref_pic[j]);
260*437bfbebSnyanmisaka }
261*437bfbebSnyanmisaka
262*437bfbebSnyanmisaka READ_BITS(bitctx, 3, &rps->num_to_remove);
263*437bfbebSnyanmisaka for (j = 0; j < rps->num_to_remove; j++) {
264*437bfbebSnyanmisaka READ_BITS(bitctx, 6, &rps->remove_pic[j]);
265*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("num_of_removed_pic[%d]=%d", j, rps->remove_pic[j]);
266*437bfbebSnyanmisaka }
267*437bfbebSnyanmisaka
268*437bfbebSnyanmisaka READ_MARKER_BIT(bitctx);
269*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Out ret %d\n", ret);
270*437bfbebSnyanmisaka return ret;
271*437bfbebSnyanmisaka __BITREAD_ERR:
272*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Out Bit read Err\n");
273*437bfbebSnyanmisaka return ret = bitctx->ret;
274*437bfbebSnyanmisaka __FAILED:
275*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Out Failed\n");
276*437bfbebSnyanmisaka return ret;
277*437bfbebSnyanmisaka }
278*437bfbebSnyanmisaka
avs2d_parse_sequence_header(Avs2dCtx_t * p_dec)279*437bfbebSnyanmisaka MPP_RET avs2d_parse_sequence_header(Avs2dCtx_t *p_dec)
280*437bfbebSnyanmisaka {
281*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
282*437bfbebSnyanmisaka RK_U32 i;
283*437bfbebSnyanmisaka RK_U32 val_temp = 0;
284*437bfbebSnyanmisaka Avs2dRps_t *rps = NULL;
285*437bfbebSnyanmisaka BitReadCtx_t *bitctx = &p_dec->bitctx;
286*437bfbebSnyanmisaka Avs2dSeqHeader_t *vsh = &p_dec->vsh;
287*437bfbebSnyanmisaka
288*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Bitread buf %p, data %p, buf_len %d, left %d\n", bitctx->buf, bitctx->data_, bitctx->buf_len, bitctx->bytes_left_);
289*437bfbebSnyanmisaka memset(vsh, 0, sizeof(Avs2dSeqHeader_t));
290*437bfbebSnyanmisaka READ_BITS(bitctx, 8, &vsh->profile_id);
291*437bfbebSnyanmisaka //!< check profile_id
292*437bfbebSnyanmisaka if (vsh->profile_id != 0x12 && vsh->profile_id != 0x20 && vsh->profile_id != 0x22) {
293*437bfbebSnyanmisaka ret = MPP_NOK;
294*437bfbebSnyanmisaka mpp_err_f("profile_id 0x%02x is not supported.\n", vsh->profile_id);
295*437bfbebSnyanmisaka goto __FAILED;
296*437bfbebSnyanmisaka }
297*437bfbebSnyanmisaka READ_BITS(bitctx, 8, &vsh->level_id);
298*437bfbebSnyanmisaka if (vsh->level_id > 0x6A) {
299*437bfbebSnyanmisaka ret = MPP_NOK;
300*437bfbebSnyanmisaka mpp_err_f("level_id 0x%02x is not supported.\n", vsh->level_id);
301*437bfbebSnyanmisaka goto __FAILED;
302*437bfbebSnyanmisaka }
303*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &vsh->progressive_sequence);
304*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &vsh->field_coded_sequence);
305*437bfbebSnyanmisaka READ_BITS(bitctx, 14, &vsh->horizontal_size);
306*437bfbebSnyanmisaka READ_BITS(bitctx, 14, &vsh->vertical_size);
307*437bfbebSnyanmisaka if (vsh->horizontal_size < 16 || vsh->vertical_size < 16) {
308*437bfbebSnyanmisaka ret = MPP_NOK;
309*437bfbebSnyanmisaka mpp_err_f("invalid sequence width(%d), height(%d).\n",
310*437bfbebSnyanmisaka vsh->horizontal_size, vsh->vertical_size);
311*437bfbebSnyanmisaka goto __FAILED;
312*437bfbebSnyanmisaka }
313*437bfbebSnyanmisaka
314*437bfbebSnyanmisaka READ_BITS(bitctx, 2, &vsh->chroma_format);
315*437bfbebSnyanmisaka if (vsh->chroma_format != CHROMA_420) {
316*437bfbebSnyanmisaka ret = MPP_NOK;
317*437bfbebSnyanmisaka mpp_err_f("chroma_format 0x%02x is not supported.\n", vsh->chroma_format);
318*437bfbebSnyanmisaka goto __FAILED;
319*437bfbebSnyanmisaka }
320*437bfbebSnyanmisaka READ_BITS(bitctx, 3, &vsh->sample_precision);
321*437bfbebSnyanmisaka if (vsh->profile_id == MAIN10_PROFILE) {
322*437bfbebSnyanmisaka READ_BITS(bitctx, 3, &vsh->encoding_precision);
323*437bfbebSnyanmisaka } else {
324*437bfbebSnyanmisaka vsh->encoding_precision = 1;
325*437bfbebSnyanmisaka }
326*437bfbebSnyanmisaka vsh->bit_depth = 6 + (vsh->encoding_precision << 1);
327*437bfbebSnyanmisaka
328*437bfbebSnyanmisaka if (vsh->sample_precision < 1 || vsh->sample_precision > 2) {
329*437bfbebSnyanmisaka ret = MPP_NOK;
330*437bfbebSnyanmisaka mpp_err_f("sample_precision 0x%02x is not supported.\n", vsh->sample_precision);
331*437bfbebSnyanmisaka goto __FAILED;
332*437bfbebSnyanmisaka }
333*437bfbebSnyanmisaka if (vsh->encoding_precision < 1 || vsh->encoding_precision > 2) {
334*437bfbebSnyanmisaka ret = MPP_NOK;
335*437bfbebSnyanmisaka mpp_err_f("encoding_precision 0x%02x is not supported.\n", vsh->encoding_precision);
336*437bfbebSnyanmisaka goto __FAILED;
337*437bfbebSnyanmisaka }
338*437bfbebSnyanmisaka
339*437bfbebSnyanmisaka READ_BITS(bitctx, 4, &vsh->aspect_ratio);
340*437bfbebSnyanmisaka READ_BITS(bitctx, 4, &vsh->frame_rate_code);
341*437bfbebSnyanmisaka READ_BITS(bitctx, 18, &val_temp); //!< bit_rate_lower_18
342*437bfbebSnyanmisaka vsh->bit_rate = val_temp << 12;
343*437bfbebSnyanmisaka READ_MARKER_BIT(bitctx);
344*437bfbebSnyanmisaka READ_BITS(bitctx, 12, &val_temp); //!< bit_rate_upper_12
345*437bfbebSnyanmisaka vsh->bit_rate += val_temp;
346*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &vsh->low_delay);
347*437bfbebSnyanmisaka READ_MARKER_BIT(bitctx);
348*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &vsh->enable_temporal_id);
349*437bfbebSnyanmisaka READ_BITS(bitctx, 18, &vsh->bbv_buffer_size);
350*437bfbebSnyanmisaka READ_BITS(bitctx, 3, &vsh->lcu_size);
351*437bfbebSnyanmisaka if (vsh->lcu_size < 4 || vsh->lcu_size > 6) {
352*437bfbebSnyanmisaka ret = MPP_NOK;
353*437bfbebSnyanmisaka mpp_err_f("invalid lcu size: %d\n", vsh->lcu_size);
354*437bfbebSnyanmisaka goto __FAILED;
355*437bfbebSnyanmisaka }
356*437bfbebSnyanmisaka
357*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &vsh->enable_weighted_quant);
358*437bfbebSnyanmisaka if (vsh->enable_weighted_quant) {
359*437bfbebSnyanmisaka parse_sequence_wqm(bitctx, vsh);
360*437bfbebSnyanmisaka }
361*437bfbebSnyanmisaka
362*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &val_temp);
363*437bfbebSnyanmisaka vsh->enable_background_picture = val_temp ^ 0x01;
364*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &vsh->enable_mhp_skip);
365*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &vsh->enable_dhp);
366*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &vsh->enable_wsm);
367*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &vsh->enable_amp);
368*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &vsh->enable_nsqt);
369*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &vsh->enable_nsip);
370*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &vsh->enable_2nd_transform);
371*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &vsh->enable_sao);
372*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &vsh->enable_alf);
373*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &vsh->enable_pmvr);
374*437bfbebSnyanmisaka READ_MARKER_BIT(bitctx);
375*437bfbebSnyanmisaka
376*437bfbebSnyanmisaka //!< parse rps
377*437bfbebSnyanmisaka READ_BITS(bitctx, 6, &vsh->num_of_rps);
378*437bfbebSnyanmisaka for (i = 0; i < vsh->num_of_rps; i++) {
379*437bfbebSnyanmisaka rps = &vsh->seq_rps[i];
380*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("--------rcs[%d]--------", i);
381*437bfbebSnyanmisaka FUN_CHECK(ret = parse_one_rps(bitctx, rps));
382*437bfbebSnyanmisaka }
383*437bfbebSnyanmisaka
384*437bfbebSnyanmisaka if (vsh->low_delay == 0) {
385*437bfbebSnyanmisaka READ_BITS(bitctx, 5, &vsh->picture_reorder_delay);
386*437bfbebSnyanmisaka } else {
387*437bfbebSnyanmisaka vsh->picture_reorder_delay = 0;
388*437bfbebSnyanmisaka }
389*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &vsh->enable_clf);
390*437bfbebSnyanmisaka READ_BITS(bitctx, 2, &val_temp); //!< reserved 2bits 00
391*437bfbebSnyanmisaka if (val_temp) {
392*437bfbebSnyanmisaka AVS2D_DBG(AVS2D_DBG_WARNNING, "reserver bits error.\n");
393*437bfbebSnyanmisaka }
394*437bfbebSnyanmisaka return ret;
395*437bfbebSnyanmisaka __BITREAD_ERR:
396*437bfbebSnyanmisaka return ret = bitctx->ret;
397*437bfbebSnyanmisaka __FAILED:
398*437bfbebSnyanmisaka return ret;
399*437bfbebSnyanmisaka }
400*437bfbebSnyanmisaka
read_pic_alf_coeff(BitReadCtx_t * bitctx,RK_S32 * alf_coeff)401*437bfbebSnyanmisaka static MPP_RET read_pic_alf_coeff(BitReadCtx_t *bitctx, RK_S32 *alf_coeff)
402*437bfbebSnyanmisaka {
403*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
404*437bfbebSnyanmisaka RK_U32 j;
405*437bfbebSnyanmisaka RK_S32 alf_sum = 0;
406*437bfbebSnyanmisaka
407*437bfbebSnyanmisaka for (j = 0; j < ALF_MAX_COEFS; j++) {
408*437bfbebSnyanmisaka READ_SE(bitctx, &alf_coeff[j]);
409*437bfbebSnyanmisaka if ((j <= 7 && (alf_coeff[j] < -64 || alf_coeff[j] > 63)) ||
410*437bfbebSnyanmisaka (j == 8 && (alf_coeff[j] < -1088 || alf_coeff[j] > 1071))) {
411*437bfbebSnyanmisaka ret = MPP_NOK;
412*437bfbebSnyanmisaka mpp_err_f("invalid alf coeff(%d).\n", alf_coeff[j]);
413*437bfbebSnyanmisaka goto __FAILED;
414*437bfbebSnyanmisaka }
415*437bfbebSnyanmisaka
416*437bfbebSnyanmisaka if (j <= 7) {
417*437bfbebSnyanmisaka alf_sum += (2 * alf_coeff[j]); //!< avs2 9.12.2
418*437bfbebSnyanmisaka }
419*437bfbebSnyanmisaka }
420*437bfbebSnyanmisaka alf_coeff[8] += (64 - alf_sum);
421*437bfbebSnyanmisaka
422*437bfbebSnyanmisaka __BITREAD_ERR:
423*437bfbebSnyanmisaka return ret = bitctx->ret;
424*437bfbebSnyanmisaka __FAILED:
425*437bfbebSnyanmisaka return ret;
426*437bfbebSnyanmisaka }
427*437bfbebSnyanmisaka
parse_pic_alf_params(BitReadCtx_t * bitctx,Avs2dPicHeader_t * ph)428*437bfbebSnyanmisaka static MPP_RET parse_pic_alf_params(BitReadCtx_t *bitctx, Avs2dPicHeader_t *ph)
429*437bfbebSnyanmisaka {
430*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
431*437bfbebSnyanmisaka RK_U32 i;
432*437bfbebSnyanmisaka
433*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &ph->enable_pic_alf_y);
434*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &ph->enable_pic_alf_cb);
435*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &ph->enable_pic_alf_cr);
436*437bfbebSnyanmisaka
437*437bfbebSnyanmisaka if (ph->enable_pic_alf_y) {
438*437bfbebSnyanmisaka RK_U32 pre_symbole = 0;
439*437bfbebSnyanmisaka RK_U32 symbol = 0;
440*437bfbebSnyanmisaka
441*437bfbebSnyanmisaka READ_UE(bitctx, &ph->alf_filter_num);
442*437bfbebSnyanmisaka ph->alf_filter_num += 1;
443*437bfbebSnyanmisaka if (ph->alf_filter_num > ALF_MAX_FILTERS) {
444*437bfbebSnyanmisaka ret = MPP_NOK;
445*437bfbebSnyanmisaka mpp_err_f("invalid alf filter num(%d).\n", ph->alf_filter_num);
446*437bfbebSnyanmisaka goto __FAILED;
447*437bfbebSnyanmisaka }
448*437bfbebSnyanmisaka
449*437bfbebSnyanmisaka for (i = 0; i < ph->alf_filter_num; i++) {
450*437bfbebSnyanmisaka if (i > 0) {
451*437bfbebSnyanmisaka if (ph->alf_filter_num != 16) {
452*437bfbebSnyanmisaka READ_UE(bitctx, &symbol);
453*437bfbebSnyanmisaka } else {
454*437bfbebSnyanmisaka symbol = 1;
455*437bfbebSnyanmisaka }
456*437bfbebSnyanmisaka ph->alf_filter_pattern[symbol + pre_symbole] = 1;
457*437bfbebSnyanmisaka pre_symbole += symbol;
458*437bfbebSnyanmisaka }
459*437bfbebSnyanmisaka
460*437bfbebSnyanmisaka FUN_CHECK(ret = read_pic_alf_coeff(bitctx, ph->alf_coeff_y[i]));
461*437bfbebSnyanmisaka }
462*437bfbebSnyanmisaka
463*437bfbebSnyanmisaka if (pre_symbole > 15) {
464*437bfbebSnyanmisaka ret = MPP_NOK;
465*437bfbebSnyanmisaka mpp_err_f("invalid alf region distance.\n");
466*437bfbebSnyanmisaka goto __FAILED;
467*437bfbebSnyanmisaka }
468*437bfbebSnyanmisaka
469*437bfbebSnyanmisaka //!< @see avs2 9.12.2 eg: 0000111222223333
470*437bfbebSnyanmisaka ph->alf_coeff_idx_tab[0] = 0;
471*437bfbebSnyanmisaka for (i = 1; i < ALF_MAX_FILTERS; i++) {
472*437bfbebSnyanmisaka ph->alf_coeff_idx_tab[i] = (ph->alf_filter_pattern[i]) ?
473*437bfbebSnyanmisaka (ph->alf_coeff_idx_tab[i - 1] + 1) : ph->alf_coeff_idx_tab[i - 1];
474*437bfbebSnyanmisaka }
475*437bfbebSnyanmisaka }
476*437bfbebSnyanmisaka
477*437bfbebSnyanmisaka if (ph->enable_pic_alf_cb) {
478*437bfbebSnyanmisaka FUN_CHECK(ret = read_pic_alf_coeff(bitctx, ph->alf_coeff_cb));
479*437bfbebSnyanmisaka }
480*437bfbebSnyanmisaka
481*437bfbebSnyanmisaka if (ph->enable_pic_alf_cr) {
482*437bfbebSnyanmisaka FUN_CHECK(ret = read_pic_alf_coeff(bitctx, ph->alf_coeff_cr));
483*437bfbebSnyanmisaka }
484*437bfbebSnyanmisaka
485*437bfbebSnyanmisaka __BITREAD_ERR:
486*437bfbebSnyanmisaka return ret = bitctx->ret;
487*437bfbebSnyanmisaka __FAILED:
488*437bfbebSnyanmisaka return ret;
489*437bfbebSnyanmisaka }
490*437bfbebSnyanmisaka
parse_picture_header_comm(Avs2dCtx_t * p_dec)491*437bfbebSnyanmisaka static MPP_RET parse_picture_header_comm(Avs2dCtx_t *p_dec)
492*437bfbebSnyanmisaka {
493*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
494*437bfbebSnyanmisaka RK_U32 i, j;
495*437bfbebSnyanmisaka RK_U32 val_temp = 0;
496*437bfbebSnyanmisaka
497*437bfbebSnyanmisaka BitReadCtx_t *bitctx = &p_dec->bitctx;
498*437bfbebSnyanmisaka Avs2dSeqHeader_t *vsh = &p_dec->vsh;
499*437bfbebSnyanmisaka Avs2dPicHeader_t *ph = &p_dec->ph;
500*437bfbebSnyanmisaka
501*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("In");
502*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &val_temp);
503*437bfbebSnyanmisaka ph->enable_loop_filter = val_temp ^ 0x01;
504*437bfbebSnyanmisaka if (ph->enable_loop_filter) {
505*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &ph->loop_filter_parameter_flag);
506*437bfbebSnyanmisaka if (ph->loop_filter_parameter_flag) {
507*437bfbebSnyanmisaka READ_SE(bitctx, &ph->alpha_c_offset);
508*437bfbebSnyanmisaka READ_SE(bitctx, &ph->beta_offset);
509*437bfbebSnyanmisaka if (ph->alpha_c_offset < -8 || ph->alpha_c_offset > 8 ||
510*437bfbebSnyanmisaka ph->beta_offset < -8 || ph->beta_offset > 8) {
511*437bfbebSnyanmisaka ret = MPP_NOK;
512*437bfbebSnyanmisaka mpp_err_f("invalid alpha_c_offset/beta_offset.\n");
513*437bfbebSnyanmisaka goto __FAILED;
514*437bfbebSnyanmisaka }
515*437bfbebSnyanmisaka } else {
516*437bfbebSnyanmisaka ph->alpha_c_offset = 0;
517*437bfbebSnyanmisaka ph->beta_offset = 0;
518*437bfbebSnyanmisaka }
519*437bfbebSnyanmisaka }
520*437bfbebSnyanmisaka
521*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &val_temp);
522*437bfbebSnyanmisaka ph->enable_chroma_quant_param = val_temp ^ 0x01;
523*437bfbebSnyanmisaka if (ph->enable_chroma_quant_param) {
524*437bfbebSnyanmisaka READ_SE(bitctx, &ph->chroma_quant_param_delta_cb);
525*437bfbebSnyanmisaka READ_SE(bitctx, &ph->chroma_quant_param_delta_cr);
526*437bfbebSnyanmisaka } else {
527*437bfbebSnyanmisaka ph->chroma_quant_param_delta_cb = 0;
528*437bfbebSnyanmisaka ph->chroma_quant_param_delta_cr = 0;
529*437bfbebSnyanmisaka }
530*437bfbebSnyanmisaka if (ph->chroma_quant_param_delta_cb < -16 || ph->chroma_quant_param_delta_cb > 16 ||
531*437bfbebSnyanmisaka ph->chroma_quant_param_delta_cr < -16 || ph->chroma_quant_param_delta_cr > 16) {
532*437bfbebSnyanmisaka ret = MPP_NOK;
533*437bfbebSnyanmisaka mpp_err_f("invalid chrome quant param delta.\n");
534*437bfbebSnyanmisaka goto __FAILED;
535*437bfbebSnyanmisaka }
536*437bfbebSnyanmisaka
537*437bfbebSnyanmisaka p_dec->enable_wq = 0;
538*437bfbebSnyanmisaka if (vsh->enable_weighted_quant) {
539*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &ph->enable_pic_weight_quant);
540*437bfbebSnyanmisaka if (ph->enable_pic_weight_quant) {
541*437bfbebSnyanmisaka p_dec->enable_wq = 1;
542*437bfbebSnyanmisaka READ_BITS(bitctx, 2, &ph->pic_wq_data_index);
543*437bfbebSnyanmisaka if (ph->pic_wq_data_index == 1) {
544*437bfbebSnyanmisaka SKIP_BITS(bitctx, 1);
545*437bfbebSnyanmisaka READ_BITS(bitctx, 2, &ph->wq_param_index);
546*437bfbebSnyanmisaka READ_BITS(bitctx, 2, &ph->wq_model);
547*437bfbebSnyanmisaka if (ph->wq_param_index == 1) {
548*437bfbebSnyanmisaka for (i = 0; i < 6; i++) {
549*437bfbebSnyanmisaka READ_SE(bitctx, &ph->wq_param_delta1[i]);
550*437bfbebSnyanmisaka }
551*437bfbebSnyanmisaka } else if (ph->wq_param_index == 2) {
552*437bfbebSnyanmisaka for (i = 0; i < 6; i++) {
553*437bfbebSnyanmisaka READ_SE(bitctx, &ph->wq_param_delta2[i]);
554*437bfbebSnyanmisaka }
555*437bfbebSnyanmisaka }
556*437bfbebSnyanmisaka } else if (ph->pic_wq_data_index == 2) {
557*437bfbebSnyanmisaka RK_U32 size_id, wqm_size;
558*437bfbebSnyanmisaka for (size_id = 0; size_id < 2; size_id++) {
559*437bfbebSnyanmisaka wqm_size = MPP_MIN(1 << (size_id + 2), 8);
560*437bfbebSnyanmisaka for (j = 0; j < wqm_size; j++) {
561*437bfbebSnyanmisaka for (i = 0; i < wqm_size; i++) {
562*437bfbebSnyanmisaka READ_UE(bitctx, &ph->pic_wq_matrix[size_id][j * wqm_size + i]);
563*437bfbebSnyanmisaka }
564*437bfbebSnyanmisaka }
565*437bfbebSnyanmisaka }
566*437bfbebSnyanmisaka }
567*437bfbebSnyanmisaka
568*437bfbebSnyanmisaka }
569*437bfbebSnyanmisaka }
570*437bfbebSnyanmisaka
571*437bfbebSnyanmisaka if (vsh->enable_alf) {
572*437bfbebSnyanmisaka FUN_CHECK(ret = parse_pic_alf_params(bitctx, ph));
573*437bfbebSnyanmisaka }
574*437bfbebSnyanmisaka
575*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Out, ret %d\n", ret);
576*437bfbebSnyanmisaka return ret;
577*437bfbebSnyanmisaka __BITREAD_ERR:
578*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Out, Bit read Err");
579*437bfbebSnyanmisaka return ret = bitctx->ret;
580*437bfbebSnyanmisaka __FAILED:
581*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Out, Failed");
582*437bfbebSnyanmisaka return ret;
583*437bfbebSnyanmisaka }
584*437bfbebSnyanmisaka
parse_picture_header_intra(Avs2dCtx_t * p_dec)585*437bfbebSnyanmisaka static MPP_RET parse_picture_header_intra(Avs2dCtx_t *p_dec)
586*437bfbebSnyanmisaka {
587*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
588*437bfbebSnyanmisaka RK_U32 predict = 0;
589*437bfbebSnyanmisaka
590*437bfbebSnyanmisaka BitReadCtx_t *bitctx = &p_dec->bitctx;
591*437bfbebSnyanmisaka Avs2dSeqHeader_t *vsh = &p_dec->vsh;
592*437bfbebSnyanmisaka Avs2dPicHeader_t *ph = &p_dec->ph;
593*437bfbebSnyanmisaka RK_U32 last_pic_out_delay = ph->picture_output_delay;
594*437bfbebSnyanmisaka
595*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("In.");
596*437bfbebSnyanmisaka memset(ph, 0, sizeof(Avs2dPicHeader_t));
597*437bfbebSnyanmisaka ph->picture_type = I_PICTURE;
598*437bfbebSnyanmisaka
599*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Bitread buf %p, data %p, buf_len %d, left %d\n", bitctx->buf, bitctx->data_, bitctx->buf_len, bitctx->bytes_left_);
600*437bfbebSnyanmisaka READ_BITS_LONG(bitctx, 32, &ph->bbv_delay);
601*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("bbv_delay %d\n", ph->bbv_delay);
602*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &ph->time_code_flag);
603*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("time_code_flag %d\n", ph->time_code_flag);
604*437bfbebSnyanmisaka if (ph->time_code_flag) {
605*437bfbebSnyanmisaka READ_BITS(bitctx, 24, &ph->time_code);
606*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("time_code %d\n", ph->time_code);
607*437bfbebSnyanmisaka }
608*437bfbebSnyanmisaka
609*437bfbebSnyanmisaka if (vsh->enable_background_picture) {
610*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &ph->background_picture_flag);
611*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("background_picture_flag %d\n", ph->background_picture_flag);
612*437bfbebSnyanmisaka if (ph->background_picture_flag) {
613*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &ph->background_picture_output_flag);
614*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("background_picture_output_flag %d\n", ph->background_picture_output_flag);
615*437bfbebSnyanmisaka if (ph->background_picture_output_flag) {
616*437bfbebSnyanmisaka ph->picture_type = G_PICTURE;
617*437bfbebSnyanmisaka } else {
618*437bfbebSnyanmisaka ph->picture_type = GB_PICTURE;
619*437bfbebSnyanmisaka }
620*437bfbebSnyanmisaka }
621*437bfbebSnyanmisaka }
622*437bfbebSnyanmisaka
623*437bfbebSnyanmisaka READ_BITS(bitctx, 8, &ph->doi);
624*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Picture type %d doi %d\n", ph->picture_type, ph->doi);
625*437bfbebSnyanmisaka if (vsh->enable_temporal_id) {
626*437bfbebSnyanmisaka READ_BITS(bitctx, 3, &ph->temporal_id);
627*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("temporal_id %d\n", ph->temporal_id);
628*437bfbebSnyanmisaka }
629*437bfbebSnyanmisaka
630*437bfbebSnyanmisaka if (vsh->low_delay == 0 && !(ph->background_picture_flag && !ph->background_picture_output_flag)) {
631*437bfbebSnyanmisaka READ_UE(bitctx, &ph->picture_output_delay);
632*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("picture_output_delay %d\n", ph->picture_output_delay);
633*437bfbebSnyanmisaka if (ph->picture_output_delay >= 64) {
634*437bfbebSnyanmisaka ret = MPP_NOK;
635*437bfbebSnyanmisaka mpp_err_f("invalid picture output delay(%d) intra.\n", ph->picture_output_delay);
636*437bfbebSnyanmisaka goto __FAILED;
637*437bfbebSnyanmisaka }
638*437bfbebSnyanmisaka } else {
639*437bfbebSnyanmisaka ph->picture_output_delay = last_pic_out_delay;
640*437bfbebSnyanmisaka }
641*437bfbebSnyanmisaka
642*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &predict);
643*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("predict %d\n", predict);
644*437bfbebSnyanmisaka if (predict) {
645*437bfbebSnyanmisaka RK_U8 rcs_index = 0;
646*437bfbebSnyanmisaka READ_BITS(bitctx, 5, &rcs_index);
647*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("rcs_index %d\n", rcs_index);
648*437bfbebSnyanmisaka p_dec->frm_mgr.cur_rps = vsh->seq_rps[rcs_index];
649*437bfbebSnyanmisaka } else {
650*437bfbebSnyanmisaka FUN_CHECK(ret = parse_one_rps(bitctx, &p_dec->frm_mgr.cur_rps));
651*437bfbebSnyanmisaka }
652*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("num_of_remove %d", p_dec->frm_mgr.cur_rps.num_to_remove);
653*437bfbebSnyanmisaka
654*437bfbebSnyanmisaka if (vsh->low_delay) {
655*437bfbebSnyanmisaka READ_UE(bitctx, &ph->bbv_check_times);
656*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("bbv_check_time %d\n", ph->bbv_check_times);
657*437bfbebSnyanmisaka }
658*437bfbebSnyanmisaka
659*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &ph->progressive_frame);
660*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("progressive_frame %d\n", ph->progressive_frame);
661*437bfbebSnyanmisaka if (!ph->progressive_frame) {
662*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &ph->picture_structure);
663*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("picture_structure %d\n", ph->picture_structure);
664*437bfbebSnyanmisaka } else {
665*437bfbebSnyanmisaka ph->picture_structure = 1; //!< frame picture
666*437bfbebSnyanmisaka }
667*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &ph->top_field_first);
668*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("top_field_first %d\n", ph->top_field_first);
669*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &ph->repeat_first_field);
670*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("repeat_first_field %d\n", ph->repeat_first_field);
671*437bfbebSnyanmisaka if (vsh->field_coded_sequence == 1) { //!< field picture
672*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &ph->is_top_field);
673*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("is_top_field %d\n", ph->is_top_field);
674*437bfbebSnyanmisaka SKIP_BITS(bitctx, 1);
675*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("skip bits\n");
676*437bfbebSnyanmisaka }
677*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &ph->fixed_picture_qp);
678*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("fixed_picture_qp %d\n", ph->fixed_picture_qp);
679*437bfbebSnyanmisaka READ_BITS(bitctx, 7, &ph->picture_qp);
680*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("picture_qp %d\n", ph->picture_qp);
681*437bfbebSnyanmisaka if (ph->picture_qp > (63 + 8 * (vsh->bit_depth - 8))) {
682*437bfbebSnyanmisaka ret = MPP_NOK;
683*437bfbebSnyanmisaka mpp_err_f("invalid picture qp(%d).\n", ph->picture_qp);
684*437bfbebSnyanmisaka goto __FAILED;
685*437bfbebSnyanmisaka }
686*437bfbebSnyanmisaka
687*437bfbebSnyanmisaka FUN_CHECK(ret = parse_picture_header_comm(p_dec));
688*437bfbebSnyanmisaka
689*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Out. ret %d", ret);
690*437bfbebSnyanmisaka return ret;
691*437bfbebSnyanmisaka __BITREAD_ERR:
692*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Out. Bit read ERR");
693*437bfbebSnyanmisaka return ret = bitctx->ret;
694*437bfbebSnyanmisaka __FAILED:
695*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Out. Failed");
696*437bfbebSnyanmisaka return ret;
697*437bfbebSnyanmisaka }
698*437bfbebSnyanmisaka
parse_picture_header_inter(Avs2dCtx_t * p_dec)699*437bfbebSnyanmisaka static MPP_RET parse_picture_header_inter(Avs2dCtx_t *p_dec)
700*437bfbebSnyanmisaka {
701*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
702*437bfbebSnyanmisaka RK_U32 predict = 0;
703*437bfbebSnyanmisaka
704*437bfbebSnyanmisaka BitReadCtx_t *bitctx = &p_dec->bitctx;
705*437bfbebSnyanmisaka Avs2dSeqHeader_t *vsh = &p_dec->vsh;
706*437bfbebSnyanmisaka Avs2dPicHeader_t *ph = &p_dec->ph;
707*437bfbebSnyanmisaka
708*437bfbebSnyanmisaka memset(ph, 0, sizeof(Avs2dPicHeader_t));
709*437bfbebSnyanmisaka READ_BITS_LONG(bitctx, 32, &ph->bbv_delay);
710*437bfbebSnyanmisaka READ_BITS(bitctx, 2, &ph->picture_coding_type);
711*437bfbebSnyanmisaka if (vsh->enable_background_picture) {
712*437bfbebSnyanmisaka if (ph->picture_coding_type == 1) {
713*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &ph->background_pred_flag);
714*437bfbebSnyanmisaka }
715*437bfbebSnyanmisaka
716*437bfbebSnyanmisaka if (ph->picture_coding_type != 2 && !ph->background_pred_flag) {
717*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &ph->background_reference_flag); //!< P/F ref G/GB
718*437bfbebSnyanmisaka }
719*437bfbebSnyanmisaka }
720*437bfbebSnyanmisaka
721*437bfbebSnyanmisaka if (ph->picture_coding_type == 1) {
722*437bfbebSnyanmisaka ph->picture_type = ph->background_pred_flag ? S_PICTURE : P_PICTURE;
723*437bfbebSnyanmisaka } else if (ph->picture_coding_type == 2) {
724*437bfbebSnyanmisaka ph->picture_type = B_PICTURE;
725*437bfbebSnyanmisaka } else if (ph->picture_coding_type == 3) {
726*437bfbebSnyanmisaka ph->picture_type = F_PICTURE;
727*437bfbebSnyanmisaka } else {
728*437bfbebSnyanmisaka ret = MPP_NOK;
729*437bfbebSnyanmisaka mpp_err_f("invalid picture coding type(0).\n");
730*437bfbebSnyanmisaka goto __FAILED;
731*437bfbebSnyanmisaka }
732*437bfbebSnyanmisaka
733*437bfbebSnyanmisaka READ_BITS(bitctx, 8, &ph->doi);
734*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Picture type %d doi %d\n", ph->picture_type, ph->doi);
735*437bfbebSnyanmisaka if (vsh->enable_temporal_id) {
736*437bfbebSnyanmisaka READ_BITS(bitctx, 3, &ph->temporal_id);
737*437bfbebSnyanmisaka }
738*437bfbebSnyanmisaka
739*437bfbebSnyanmisaka if (vsh->low_delay == 0) {
740*437bfbebSnyanmisaka READ_UE(bitctx, &ph->picture_output_delay);
741*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("picture_output_delay %d\n", ph->picture_output_delay);
742*437bfbebSnyanmisaka if (ph->picture_output_delay >= 64) {
743*437bfbebSnyanmisaka ret = MPP_NOK;
744*437bfbebSnyanmisaka mpp_err_f("invalid picture output delay(%d) intra.\n", ph->picture_output_delay);
745*437bfbebSnyanmisaka goto __FAILED;
746*437bfbebSnyanmisaka }
747*437bfbebSnyanmisaka } else {
748*437bfbebSnyanmisaka ph->picture_output_delay = 0;
749*437bfbebSnyanmisaka }
750*437bfbebSnyanmisaka
751*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &predict);
752*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("predict %d\n", predict);
753*437bfbebSnyanmisaka if (predict) {
754*437bfbebSnyanmisaka RK_U8 rcs_index = 0;
755*437bfbebSnyanmisaka READ_BITS(bitctx, 5, &rcs_index);
756*437bfbebSnyanmisaka p_dec->frm_mgr.cur_rps = vsh->seq_rps[rcs_index];
757*437bfbebSnyanmisaka } else {
758*437bfbebSnyanmisaka FUN_CHECK(ret = parse_one_rps(bitctx, &p_dec->frm_mgr.cur_rps));
759*437bfbebSnyanmisaka }
760*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("num_of_remove %d", p_dec->frm_mgr.cur_rps.num_to_remove);
761*437bfbebSnyanmisaka
762*437bfbebSnyanmisaka if (vsh->low_delay) {
763*437bfbebSnyanmisaka READ_UE(bitctx, &ph->bbv_check_times);
764*437bfbebSnyanmisaka }
765*437bfbebSnyanmisaka
766*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &ph->progressive_frame);
767*437bfbebSnyanmisaka if (!ph->progressive_frame) {
768*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &ph->picture_structure);
769*437bfbebSnyanmisaka } else {
770*437bfbebSnyanmisaka ph->picture_structure = 1; //!< frame picture
771*437bfbebSnyanmisaka }
772*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &ph->top_field_first);
773*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &ph->repeat_first_field);
774*437bfbebSnyanmisaka if (vsh->field_coded_sequence == 1) { //!< field picture
775*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &ph->is_top_field);
776*437bfbebSnyanmisaka SKIP_BITS(bitctx, 1);
777*437bfbebSnyanmisaka }
778*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &ph->fixed_picture_qp);
779*437bfbebSnyanmisaka READ_BITS(bitctx, 7, &ph->picture_qp);
780*437bfbebSnyanmisaka if (ph->picture_qp > (63 + 8 * (vsh->bit_depth - 8))) {
781*437bfbebSnyanmisaka ret = MPP_NOK;
782*437bfbebSnyanmisaka mpp_err_f("invalid picture qp(%d).\n", ph->picture_qp);
783*437bfbebSnyanmisaka goto __FAILED;
784*437bfbebSnyanmisaka }
785*437bfbebSnyanmisaka if (ph->picture_coding_type != 2 || ph->picture_structure == 0) {
786*437bfbebSnyanmisaka SKIP_BITS(bitctx, 1);
787*437bfbebSnyanmisaka }
788*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &ph->enable_random_decodable);
789*437bfbebSnyanmisaka
790*437bfbebSnyanmisaka FUN_CHECK(ret = parse_picture_header_comm(p_dec));
791*437bfbebSnyanmisaka
792*437bfbebSnyanmisaka return ret;
793*437bfbebSnyanmisaka __BITREAD_ERR:
794*437bfbebSnyanmisaka return ret = bitctx->ret;
795*437bfbebSnyanmisaka __FAILED:
796*437bfbebSnyanmisaka return ret;
797*437bfbebSnyanmisaka }
798*437bfbebSnyanmisaka
avs2d_parse_picture_header(Avs2dCtx_t * p_dec,RK_U32 startcode)799*437bfbebSnyanmisaka MPP_RET avs2d_parse_picture_header(Avs2dCtx_t *p_dec, RK_U32 startcode)
800*437bfbebSnyanmisaka {
801*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
802*437bfbebSnyanmisaka
803*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("In.");
804*437bfbebSnyanmisaka switch (startcode) {
805*437bfbebSnyanmisaka case AVS2_I_PICTURE_START_CODE:
806*437bfbebSnyanmisaka ret = parse_picture_header_intra(p_dec);
807*437bfbebSnyanmisaka break;
808*437bfbebSnyanmisaka case AVS2_PB_PICTURE_START_CODE:
809*437bfbebSnyanmisaka ret = parse_picture_header_inter(p_dec);
810*437bfbebSnyanmisaka break;
811*437bfbebSnyanmisaka default:
812*437bfbebSnyanmisaka ret = MPP_NOK;
813*437bfbebSnyanmisaka mpp_err_f("invalid picture startcode(%d).\n", startcode);
814*437bfbebSnyanmisaka return ret;
815*437bfbebSnyanmisaka }
816*437bfbebSnyanmisaka
817*437bfbebSnyanmisaka wq_init_frame_quant_param(p_dec);
818*437bfbebSnyanmisaka wq_update_frame_matrix(p_dec);
819*437bfbebSnyanmisaka
820*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Out.");
821*437bfbebSnyanmisaka return ret;
822*437bfbebSnyanmisaka }
823*437bfbebSnyanmisaka
824*437bfbebSnyanmisaka
825