xref: /rockchip-linux_mpp/mpp/codec/dec/avs2/avs2d_ps.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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