xref: /rockchip-linux_mpp/mpp/codec/dec/avs/avsd_parse.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2015 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka  *
4*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka  * You may obtain a copy of the License at
7*437bfbebSnyanmisaka  *
8*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka  *
10*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka  * limitations under the License.
15*437bfbebSnyanmisaka  */
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #define MODULE_TAG "avsd_parse"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <string.h>
20*437bfbebSnyanmisaka #include <stdlib.h>
21*437bfbebSnyanmisaka 
22*437bfbebSnyanmisaka #include "mpp_mem.h"
23*437bfbebSnyanmisaka #include "mpp_packet_impl.h"
24*437bfbebSnyanmisaka #include "hal_dec_task.h"
25*437bfbebSnyanmisaka 
26*437bfbebSnyanmisaka #include "avsd_api.h"
27*437bfbebSnyanmisaka #include "avsd_parse.h"
28*437bfbebSnyanmisaka 
get_sequence_header(BitReadCtx_t * bitctx,AvsdSeqHeader_t * vsh)29*437bfbebSnyanmisaka static MPP_RET get_sequence_header(BitReadCtx_t *bitctx, AvsdSeqHeader_t *vsh)
30*437bfbebSnyanmisaka {
31*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
32*437bfbebSnyanmisaka     RK_U32 val_temp = 0;
33*437bfbebSnyanmisaka 
34*437bfbebSnyanmisaka     READ_BITS(bitctx, 8, &vsh->profile_id);
35*437bfbebSnyanmisaka     //!< check profile_id
36*437bfbebSnyanmisaka     if (vsh->profile_id != 0x20 && vsh->profile_id != 0x48) {
37*437bfbebSnyanmisaka         ret = MPP_NOK;
38*437bfbebSnyanmisaka         mpp_err_f("profile_id 0x%02x is not supported.\n", vsh->profile_id);
39*437bfbebSnyanmisaka         goto __FAILED;
40*437bfbebSnyanmisaka     }
41*437bfbebSnyanmisaka     READ_BITS(bitctx, 8, &vsh->level_id);
42*437bfbebSnyanmisaka     if (vsh->level_id > 0x42) {
43*437bfbebSnyanmisaka         ret = MPP_NOK;
44*437bfbebSnyanmisaka         mpp_err_f("level_id 0x%02x is not supported.\n", vsh->level_id);
45*437bfbebSnyanmisaka         goto __FAILED;
46*437bfbebSnyanmisaka     }
47*437bfbebSnyanmisaka     READ_ONEBIT(bitctx, &vsh->progressive_sequence);
48*437bfbebSnyanmisaka     READ_BITS(bitctx, 14, &vsh->horizontal_size);
49*437bfbebSnyanmisaka     READ_BITS(bitctx, 14, &vsh->vertical_size);
50*437bfbebSnyanmisaka     READ_BITS(bitctx, 2,  &vsh->chroma_format);
51*437bfbebSnyanmisaka     READ_BITS(bitctx, 3, &vsh->sample_precision);
52*437bfbebSnyanmisaka     READ_BITS(bitctx, 4, &vsh->aspect_ratio);
53*437bfbebSnyanmisaka     READ_BITS(bitctx, 4, &vsh->frame_rate_code);
54*437bfbebSnyanmisaka     READ_BITS(bitctx, 18, &val_temp); //!< bit_rate_high_18
55*437bfbebSnyanmisaka     vsh->bit_rate = val_temp << 12;
56*437bfbebSnyanmisaka     SKIP_BITS(bitctx, 1);
57*437bfbebSnyanmisaka     READ_BITS(bitctx, 12, &val_temp); //!< bit_rate_low_12
58*437bfbebSnyanmisaka     vsh->bit_rate += val_temp;
59*437bfbebSnyanmisaka     READ_ONEBIT(bitctx, &vsh->low_delay);
60*437bfbebSnyanmisaka     SKIP_BITS(bitctx, 1);
61*437bfbebSnyanmisaka     READ_BITS(bitctx, 18, &vsh->bbv_buffer_size);
62*437bfbebSnyanmisaka     READ_BITS(bitctx, 3, &val_temp); //!< reserve 3bits 000
63*437bfbebSnyanmisaka     if (val_temp) {
64*437bfbebSnyanmisaka         AVSD_DBG(AVSD_DBG_WARNNING, "reserver bits error.\n");
65*437bfbebSnyanmisaka     }
66*437bfbebSnyanmisaka     return ret = MPP_OK;
67*437bfbebSnyanmisaka __BITREAD_ERR:
68*437bfbebSnyanmisaka     return ret = bitctx->ret;
69*437bfbebSnyanmisaka __FAILED:
70*437bfbebSnyanmisaka     return ret;
71*437bfbebSnyanmisaka }
72*437bfbebSnyanmisaka 
gen_weight_quant_param(AvsdPicHeader_t * ph)73*437bfbebSnyanmisaka static MPP_RET gen_weight_quant_param(AvsdPicHeader_t *ph)
74*437bfbebSnyanmisaka {
75*437bfbebSnyanmisaka     RK_U32 i = 0;
76*437bfbebSnyanmisaka     RK_U32 *wqp = (RK_U32 *)ph->weighting_quant_param;
77*437bfbebSnyanmisaka 
78*437bfbebSnyanmisaka     RK_U32 weighting_quant_param_default[] = { 128, 98, 106, 116, 116, 128 };
79*437bfbebSnyanmisaka     RK_U32 weighting_quant_param_base1[] = { 135, 143, 143, 160, 160, 213 };
80*437bfbebSnyanmisaka     RK_U32 weighting_quant_param_base2[] = { 128, 98, 106, 116, 116, 128 };
81*437bfbebSnyanmisaka 
82*437bfbebSnyanmisaka     if (ph->weighting_quant_flag == 0) {
83*437bfbebSnyanmisaka         //!< needn't generate this param
84*437bfbebSnyanmisaka         for (i = 0; i < 6; i++) {
85*437bfbebSnyanmisaka             wqp[i] = 128;
86*437bfbebSnyanmisaka         }
87*437bfbebSnyanmisaka         return MPP_OK;
88*437bfbebSnyanmisaka     }
89*437bfbebSnyanmisaka 
90*437bfbebSnyanmisaka     if (ph->weighting_quant_param_index == 0x0) {
91*437bfbebSnyanmisaka         for (i = 0; i < 6; i++) {
92*437bfbebSnyanmisaka             wqp[i] = weighting_quant_param_default[i];
93*437bfbebSnyanmisaka         }
94*437bfbebSnyanmisaka     } else if (ph->weighting_quant_param_index == 0x1) {
95*437bfbebSnyanmisaka         for (i = 0; i < 6; i++) {
96*437bfbebSnyanmisaka             wqp[i] = weighting_quant_param_base1[i] +
97*437bfbebSnyanmisaka                      ph->weighting_quant_param_delta1[i];
98*437bfbebSnyanmisaka         }
99*437bfbebSnyanmisaka     } else if (ph->weighting_quant_param_index == 0x2) {
100*437bfbebSnyanmisaka         for (i = 0; i < 6; i++) {
101*437bfbebSnyanmisaka             wqp[i] = weighting_quant_param_base2[i] +
102*437bfbebSnyanmisaka                      ph->weighting_quant_param_delta2[i];
103*437bfbebSnyanmisaka         }
104*437bfbebSnyanmisaka     } else {
105*437bfbebSnyanmisaka         //!< shouldn't happen
106*437bfbebSnyanmisaka         AVSD_DBG(AVSD_DBG_WARNNING, "Something went wrong.\n");
107*437bfbebSnyanmisaka         for (i = 0; i < 6; i++) {
108*437bfbebSnyanmisaka             wqp[i] = 128;
109*437bfbebSnyanmisaka         }
110*437bfbebSnyanmisaka     }
111*437bfbebSnyanmisaka 
112*437bfbebSnyanmisaka     return MPP_OK;
113*437bfbebSnyanmisaka }
114*437bfbebSnyanmisaka 
get_extend_header(BitReadCtx_t * bitctx,AvsdSeqHeader_t * vsh,AvsdPicHeader_t * ph)115*437bfbebSnyanmisaka static MPP_RET get_extend_header(BitReadCtx_t *bitctx, AvsdSeqHeader_t *vsh, AvsdPicHeader_t *ph)
116*437bfbebSnyanmisaka {
117*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
118*437bfbebSnyanmisaka     RK_U32 i = 0;
119*437bfbebSnyanmisaka 
120*437bfbebSnyanmisaka     READ_ONEBIT(bitctx, &ph->loop_filter_disable);
121*437bfbebSnyanmisaka     if (!ph->loop_filter_disable) {
122*437bfbebSnyanmisaka         READ_ONEBIT(bitctx, &ph->loop_filter_parameter_flag);
123*437bfbebSnyanmisaka         if (ph->loop_filter_parameter_flag) {
124*437bfbebSnyanmisaka             READ_SE(bitctx, &ph->alpha_c_offset);
125*437bfbebSnyanmisaka             READ_SE(bitctx, &ph->beta_offset);
126*437bfbebSnyanmisaka         }
127*437bfbebSnyanmisaka     }
128*437bfbebSnyanmisaka     ph->chroma_quant_param_delta_cb = 0;
129*437bfbebSnyanmisaka     ph->chroma_quant_param_delta_cr = 0;
130*437bfbebSnyanmisaka     for (i = 0; i < 6; i++) {
131*437bfbebSnyanmisaka         ph->weighting_quant_param_delta1[i] = 0;
132*437bfbebSnyanmisaka         ph->weighting_quant_param_delta2[i] = 0;
133*437bfbebSnyanmisaka     }
134*437bfbebSnyanmisaka     if (vsh->profile_id == 0x48) {
135*437bfbebSnyanmisaka         READ_ONEBIT(bitctx, &ph->weighting_quant_flag);
136*437bfbebSnyanmisaka         if (ph->weighting_quant_flag) {
137*437bfbebSnyanmisaka             SKIP_BITS(bitctx, 1);
138*437bfbebSnyanmisaka             READ_ONEBIT(bitctx, &ph->chroma_quant_param_disable);
139*437bfbebSnyanmisaka             if (!ph->chroma_quant_param_disable) {
140*437bfbebSnyanmisaka                 READ_SE(bitctx, &ph->chroma_quant_param_delta_cb);
141*437bfbebSnyanmisaka                 READ_SE(bitctx, &ph->chroma_quant_param_delta_cr);
142*437bfbebSnyanmisaka             }
143*437bfbebSnyanmisaka             READ_BITS(bitctx, 2, &ph->weighting_quant_param_index);
144*437bfbebSnyanmisaka             READ_BITS(bitctx, 2, &ph->weighting_quant_model);
145*437bfbebSnyanmisaka             if (ph->weighting_quant_param_index == 1) {
146*437bfbebSnyanmisaka                 for (i = 0; i < 6; i++) {
147*437bfbebSnyanmisaka                     READ_SE(bitctx, &ph->weighting_quant_param_delta1[i]);
148*437bfbebSnyanmisaka                 }
149*437bfbebSnyanmisaka             } else if (ph->weighting_quant_param_index == 2) {
150*437bfbebSnyanmisaka                 for (i = 0; i < 6; i++) {
151*437bfbebSnyanmisaka                     READ_SE(bitctx, &ph->weighting_quant_param_delta2[i]);
152*437bfbebSnyanmisaka                 }
153*437bfbebSnyanmisaka             }
154*437bfbebSnyanmisaka         }
155*437bfbebSnyanmisaka         gen_weight_quant_param(ph); //!< generate wqP[m][6]
156*437bfbebSnyanmisaka 
157*437bfbebSnyanmisaka         READ_ONEBIT(bitctx, &ph->aec_enable);
158*437bfbebSnyanmisaka     }
159*437bfbebSnyanmisaka 
160*437bfbebSnyanmisaka     return ret = MPP_OK;
161*437bfbebSnyanmisaka __BITREAD_ERR:
162*437bfbebSnyanmisaka     return ret = bitctx->ret;
163*437bfbebSnyanmisaka }
164*437bfbebSnyanmisaka 
get_seq_dispay_ext_header(BitReadCtx_t * bitctx,AvsdSeqExtHeader_t * ext)165*437bfbebSnyanmisaka static MPP_RET get_seq_dispay_ext_header(BitReadCtx_t *bitctx, AvsdSeqExtHeader_t *ext)
166*437bfbebSnyanmisaka {
167*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
168*437bfbebSnyanmisaka     RK_U32 val_temp = 0;
169*437bfbebSnyanmisaka 
170*437bfbebSnyanmisaka     READ_BITS(bitctx, 3, &ext->video_format);
171*437bfbebSnyanmisaka     READ_ONEBIT(bitctx, &ext->sample_range);
172*437bfbebSnyanmisaka     READ_ONEBIT(bitctx, &ext->color_description);
173*437bfbebSnyanmisaka 
174*437bfbebSnyanmisaka     if (ext->color_description) {
175*437bfbebSnyanmisaka         READ_BITS(bitctx, 8, &ext->color_primaries);
176*437bfbebSnyanmisaka         READ_BITS(bitctx, 8, &ext->transfer_characteristics);
177*437bfbebSnyanmisaka         READ_BITS(bitctx, 8, &ext->matrix_coefficients);
178*437bfbebSnyanmisaka     }
179*437bfbebSnyanmisaka     READ_BITS(bitctx, 14, &ext->display_horizontalSize);
180*437bfbebSnyanmisaka     SKIP_BITS(bitctx, 1); //!< marker bit
181*437bfbebSnyanmisaka     READ_BITS(bitctx, 14, &ext->display_verticalSize);
182*437bfbebSnyanmisaka 
183*437bfbebSnyanmisaka     READ_BITS(bitctx, 2, &val_temp); //!< reserve 2 bits
184*437bfbebSnyanmisaka     if (val_temp) {
185*437bfbebSnyanmisaka         AVSD_DBG(AVSD_DBG_WARNNING, "reserve bits not equal to zeros.\n");
186*437bfbebSnyanmisaka     }
187*437bfbebSnyanmisaka     return ret = MPP_OK;
188*437bfbebSnyanmisaka __BITREAD_ERR:
189*437bfbebSnyanmisaka     return ret = bitctx->ret;
190*437bfbebSnyanmisaka }
get_extension_header(BitReadCtx_t * bitctx,AvsdSeqExtHeader_t * ext)191*437bfbebSnyanmisaka static MPP_RET get_extension_header(BitReadCtx_t *bitctx, AvsdSeqExtHeader_t *ext)
192*437bfbebSnyanmisaka {
193*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
194*437bfbebSnyanmisaka     RK_U32 val_temp = 0;
195*437bfbebSnyanmisaka 
196*437bfbebSnyanmisaka     READ_BITS(bitctx, 4, &val_temp); //!< extension_start_code
197*437bfbebSnyanmisaka     switch (val_temp) {
198*437bfbebSnyanmisaka     case SEQUENCE_DISPLAY_EXTENTION:
199*437bfbebSnyanmisaka         FUN_CHECK(ret = get_seq_dispay_ext_header(bitctx, ext));
200*437bfbebSnyanmisaka         break;
201*437bfbebSnyanmisaka 
202*437bfbebSnyanmisaka     default:
203*437bfbebSnyanmisaka         break;
204*437bfbebSnyanmisaka     }
205*437bfbebSnyanmisaka 
206*437bfbebSnyanmisaka     return ret = MPP_OK;
207*437bfbebSnyanmisaka __BITREAD_ERR:
208*437bfbebSnyanmisaka     return ret = bitctx->ret;
209*437bfbebSnyanmisaka __FAILED:
210*437bfbebSnyanmisaka     return ret;
211*437bfbebSnyanmisaka }
212*437bfbebSnyanmisaka 
get_i_picture_header(BitReadCtx_t * bitctx,AvsdSeqHeader_t * vsh,AvsdPicHeader_t * ph)213*437bfbebSnyanmisaka static MPP_RET get_i_picture_header(BitReadCtx_t *bitctx, AvsdSeqHeader_t *vsh, AvsdPicHeader_t *ph)
214*437bfbebSnyanmisaka {
215*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
216*437bfbebSnyanmisaka     RK_U32 val_temp = 0;
217*437bfbebSnyanmisaka     ph->picture_coding_type = I_PICTURE;
218*437bfbebSnyanmisaka 
219*437bfbebSnyanmisaka     READ_BITS(bitctx, 16, &ph->bbv_delay);
220*437bfbebSnyanmisaka     if (vsh->profile_id == 0x48) {
221*437bfbebSnyanmisaka         SKIP_BITS(bitctx, 1);
222*437bfbebSnyanmisaka         READ_BITS(bitctx, 7, &ph->bbv_delay_extension);
223*437bfbebSnyanmisaka     }
224*437bfbebSnyanmisaka     READ_ONEBIT(bitctx, &ph->time_code_flag);
225*437bfbebSnyanmisaka     if (ph->time_code_flag) {
226*437bfbebSnyanmisaka         READ_BITS(bitctx, 24, &ph->time_code);
227*437bfbebSnyanmisaka     }
228*437bfbebSnyanmisaka 
229*437bfbebSnyanmisaka     /* NOTE: only check version on correct I frame not found */
230*437bfbebSnyanmisaka     if (!vsh->version_checked) {
231*437bfbebSnyanmisaka         vsh->version = 0;
232*437bfbebSnyanmisaka         /* check stream version */
233*437bfbebSnyanmisaka         if (vsh->low_delay) {
234*437bfbebSnyanmisaka             vsh->version = 1;
235*437bfbebSnyanmisaka         } else {
236*437bfbebSnyanmisaka             SHOW_BITS(bitctx, 9, &val_temp);
237*437bfbebSnyanmisaka             if (!(val_temp & 1)) {
238*437bfbebSnyanmisaka                 vsh->version = 1;
239*437bfbebSnyanmisaka             } else {
240*437bfbebSnyanmisaka                 SHOW_BITS(bitctx, 11, &val_temp);
241*437bfbebSnyanmisaka                 if (val_temp & 3)
242*437bfbebSnyanmisaka                     vsh->version = 1;
243*437bfbebSnyanmisaka             }
244*437bfbebSnyanmisaka         }
245*437bfbebSnyanmisaka     }
246*437bfbebSnyanmisaka 
247*437bfbebSnyanmisaka     if (vsh->version > 0)
248*437bfbebSnyanmisaka         SKIP_BITS(bitctx, 1);   // marker bit
249*437bfbebSnyanmisaka 
250*437bfbebSnyanmisaka     READ_BITS(bitctx, 8, &ph->picture_distance);
251*437bfbebSnyanmisaka 
252*437bfbebSnyanmisaka     if (vsh->low_delay)
253*437bfbebSnyanmisaka         READ_UE(bitctx, &ph->bbv_check_times);
254*437bfbebSnyanmisaka 
255*437bfbebSnyanmisaka     READ_ONEBIT(bitctx, &ph->progressive_frame);
256*437bfbebSnyanmisaka 
257*437bfbebSnyanmisaka     ph->picture_structure = 1;  // default frame
258*437bfbebSnyanmisaka     if (!ph->progressive_frame)
259*437bfbebSnyanmisaka         READ_ONEBIT(bitctx, &ph->picture_structure);
260*437bfbebSnyanmisaka 
261*437bfbebSnyanmisaka     READ_ONEBIT(bitctx, &ph->top_field_first);
262*437bfbebSnyanmisaka     READ_ONEBIT(bitctx, &ph->repeat_first_field);
263*437bfbebSnyanmisaka     READ_ONEBIT(bitctx, &ph->fixed_picture_qp);
264*437bfbebSnyanmisaka     READ_BITS(bitctx, 6, &ph->picture_qp);
265*437bfbebSnyanmisaka     ph->skip_mode_flag = 0;
266*437bfbebSnyanmisaka     if (!ph->progressive_frame && !ph->picture_structure)
267*437bfbebSnyanmisaka         READ_ONEBIT(bitctx, &ph->skip_mode_flag);
268*437bfbebSnyanmisaka     READ_BITS(bitctx, 4, &val_temp); //!< reserve 4 bits
269*437bfbebSnyanmisaka     if (val_temp) {
270*437bfbebSnyanmisaka         AVSD_DBG(AVSD_DBG_WARNNING, "reserve bits not equal to zeros.\n");
271*437bfbebSnyanmisaka     }
272*437bfbebSnyanmisaka     ph->no_forward_reference_flag = 0;
273*437bfbebSnyanmisaka     ph->pb_field_enhanced_flag = 0;
274*437bfbebSnyanmisaka     ph->weighting_quant_flag = 0;
275*437bfbebSnyanmisaka     ph->aec_enable = 0;
276*437bfbebSnyanmisaka 
277*437bfbebSnyanmisaka     FUN_CHECK(ret = get_extend_header(bitctx, vsh, ph));
278*437bfbebSnyanmisaka 
279*437bfbebSnyanmisaka     return ret = MPP_OK;
280*437bfbebSnyanmisaka __BITREAD_ERR:
281*437bfbebSnyanmisaka     return ret = bitctx->ret;
282*437bfbebSnyanmisaka __FAILED:
283*437bfbebSnyanmisaka     return ret;
284*437bfbebSnyanmisaka }
285*437bfbebSnyanmisaka 
get_pb_picture_header(BitReadCtx_t * bitctx,AvsdSeqHeader_t * vsh,AvsdPicHeader_t * ph)286*437bfbebSnyanmisaka static MPP_RET get_pb_picture_header(BitReadCtx_t *bitctx, AvsdSeqHeader_t *vsh, AvsdPicHeader_t *ph)
287*437bfbebSnyanmisaka {
288*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
289*437bfbebSnyanmisaka     RK_U32 val_temp = 0;
290*437bfbebSnyanmisaka 
291*437bfbebSnyanmisaka     READ_BITS(bitctx, 16, &ph->bbv_delay);
292*437bfbebSnyanmisaka     if (vsh->profile_id == 0x48) {
293*437bfbebSnyanmisaka         SKIP_BITS(bitctx, 1);
294*437bfbebSnyanmisaka         READ_BITS(bitctx, 7, &ph->bbv_delay_extension);
295*437bfbebSnyanmisaka     }
296*437bfbebSnyanmisaka     READ_BITS(bitctx, 2, &ph->picture_coding_type);
297*437bfbebSnyanmisaka     READ_BITS(bitctx, 8, &ph->picture_distance);
298*437bfbebSnyanmisaka     if (vsh->low_delay) {
299*437bfbebSnyanmisaka         READ_UE(bitctx, &ph->bbv_check_times);
300*437bfbebSnyanmisaka     }
301*437bfbebSnyanmisaka     READ_ONEBIT(bitctx, &ph->progressive_frame);
302*437bfbebSnyanmisaka 
303*437bfbebSnyanmisaka     if (!ph->progressive_frame) {
304*437bfbebSnyanmisaka         READ_ONEBIT(bitctx, &ph->picture_structure);
305*437bfbebSnyanmisaka         if (!ph->picture_structure) {
306*437bfbebSnyanmisaka             READ_ONEBIT(bitctx, &ph->advanced_pred_mode_disable);
307*437bfbebSnyanmisaka         }
308*437bfbebSnyanmisaka     } else {
309*437bfbebSnyanmisaka         ph->picture_structure = 1; //!< frame picture
310*437bfbebSnyanmisaka     }
311*437bfbebSnyanmisaka     READ_ONEBIT(bitctx, &ph->top_field_first);
312*437bfbebSnyanmisaka     READ_ONEBIT(bitctx, &ph->repeat_first_field);
313*437bfbebSnyanmisaka     READ_ONEBIT(bitctx, &ph->fixed_picture_qp);
314*437bfbebSnyanmisaka     READ_BITS(bitctx, 6, &ph->picture_qp);
315*437bfbebSnyanmisaka     if (!(ph->picture_coding_type == B_PICTURE && ph->picture_structure == P_PICTURE)) {
316*437bfbebSnyanmisaka         READ_ONEBIT(bitctx, &ph->picture_reference_flag);
317*437bfbebSnyanmisaka     }
318*437bfbebSnyanmisaka     READ_ONEBIT(bitctx, &ph->no_forward_reference_flag);
319*437bfbebSnyanmisaka     READ_ONEBIT(bitctx, &ph->pb_field_enhanced_flag);
320*437bfbebSnyanmisaka     if (vsh->profile_id != 0x48) {
321*437bfbebSnyanmisaka         ph->no_forward_reference_flag = 0;
322*437bfbebSnyanmisaka         ph->pb_field_enhanced_flag = 0;
323*437bfbebSnyanmisaka     }
324*437bfbebSnyanmisaka     ph->weighting_quant_flag = 0;
325*437bfbebSnyanmisaka     ph->aec_enable = 0;
326*437bfbebSnyanmisaka 
327*437bfbebSnyanmisaka     READ_BITS(bitctx, 2, &val_temp); //!< reserve bits
328*437bfbebSnyanmisaka     if (val_temp) {
329*437bfbebSnyanmisaka         AVSD_DBG(AVSD_DBG_WARNNING, "reserve bits not equal to zeros.\n");
330*437bfbebSnyanmisaka     }
331*437bfbebSnyanmisaka     READ_ONEBIT(bitctx, &ph->skip_mode_flag);
332*437bfbebSnyanmisaka 
333*437bfbebSnyanmisaka     FUN_CHECK(ret = get_extend_header(bitctx, vsh, ph));
334*437bfbebSnyanmisaka 
335*437bfbebSnyanmisaka     return ret = MPP_OK;
336*437bfbebSnyanmisaka __BITREAD_ERR:
337*437bfbebSnyanmisaka     return ret = bitctx->ret;
338*437bfbebSnyanmisaka __FAILED:
339*437bfbebSnyanmisaka     return ret;
340*437bfbebSnyanmisaka }
341*437bfbebSnyanmisaka 
reset_one_save(AvsdFrame_t * p)342*437bfbebSnyanmisaka static void reset_one_save(AvsdFrame_t *p)
343*437bfbebSnyanmisaka {
344*437bfbebSnyanmisaka     if (p) {
345*437bfbebSnyanmisaka         RK_U32 idx = p->idx;
346*437bfbebSnyanmisaka 
347*437bfbebSnyanmisaka         memset(p, 0, sizeof(AvsdFrame_t));
348*437bfbebSnyanmisaka         p->idx = idx;
349*437bfbebSnyanmisaka         p->slot_idx = -1;
350*437bfbebSnyanmisaka     }
351*437bfbebSnyanmisaka }
352*437bfbebSnyanmisaka 
get_one_save(AvsdCtx_t * p_dec,HalDecTask * task)353*437bfbebSnyanmisaka static AvsdFrame_t *get_one_save(AvsdCtx_t *p_dec, HalDecTask *task)
354*437bfbebSnyanmisaka {
355*437bfbebSnyanmisaka     RK_U32 i = 0;
356*437bfbebSnyanmisaka     AvsdFrame_t *p_cur = NULL;
357*437bfbebSnyanmisaka 
358*437bfbebSnyanmisaka     for (i = 0; i < MPP_ARRAY_ELEMS(p_dec->mem->save); i++) {
359*437bfbebSnyanmisaka         if (!p_dec->mem->save[i].valid) {
360*437bfbebSnyanmisaka             p_dec->mem->save[i].valid = 1;
361*437bfbebSnyanmisaka             p_cur = &p_dec->mem->save[i];
362*437bfbebSnyanmisaka             break;
363*437bfbebSnyanmisaka         }
364*437bfbebSnyanmisaka     }
365*437bfbebSnyanmisaka     if (!p_cur) {
366*437bfbebSnyanmisaka         mpp_err("mem_save dpb %d slots has not get\n", MPP_ARRAY_ELEMS(p_dec->mem->save));
367*437bfbebSnyanmisaka         goto __FAILED;
368*437bfbebSnyanmisaka     }
369*437bfbebSnyanmisaka     (void)task;
370*437bfbebSnyanmisaka     return p_cur;
371*437bfbebSnyanmisaka __FAILED:
372*437bfbebSnyanmisaka     reset_one_save(p_cur);
373*437bfbebSnyanmisaka 
374*437bfbebSnyanmisaka     return NULL;
375*437bfbebSnyanmisaka }
376*437bfbebSnyanmisaka 
set_frame_unref(AvsdCtx_t * pdec,AvsdFrame_t * p)377*437bfbebSnyanmisaka static MPP_RET set_frame_unref(AvsdCtx_t *pdec, AvsdFrame_t *p)
378*437bfbebSnyanmisaka {
379*437bfbebSnyanmisaka     if (p && p->slot_idx >= 0) {
380*437bfbebSnyanmisaka         mpp_buf_slot_clr_flag(pdec->frame_slots, p->slot_idx, SLOT_CODEC_USE);
381*437bfbebSnyanmisaka         reset_one_save(p);
382*437bfbebSnyanmisaka     }
383*437bfbebSnyanmisaka 
384*437bfbebSnyanmisaka     return MPP_OK;
385*437bfbebSnyanmisaka }
386*437bfbebSnyanmisaka 
387*437bfbebSnyanmisaka 
set_frame_output(AvsdCtx_t * p_dec,AvsdFrame_t * p)388*437bfbebSnyanmisaka MPP_RET set_frame_output(AvsdCtx_t *p_dec, AvsdFrame_t *p)
389*437bfbebSnyanmisaka {
390*437bfbebSnyanmisaka     if (p && p->slot_idx >= 0 && !p->had_display) {
391*437bfbebSnyanmisaka         mpp_buf_slot_set_flag(p_dec->frame_slots, p->slot_idx, SLOT_QUEUE_USE);
392*437bfbebSnyanmisaka         mpp_buf_slot_enqueue(p_dec->frame_slots, p->slot_idx, QUEUE_DISPLAY);
393*437bfbebSnyanmisaka         p->had_display = 1;
394*437bfbebSnyanmisaka     }
395*437bfbebSnyanmisaka 
396*437bfbebSnyanmisaka     return MPP_OK;
397*437bfbebSnyanmisaka }
398*437bfbebSnyanmisaka 
399*437bfbebSnyanmisaka /*!
400*437bfbebSnyanmisaka ***********************************************************************
401*437bfbebSnyanmisaka * \brief
402*437bfbebSnyanmisaka *    reset decoder parameters
403*437bfbebSnyanmisaka ***********************************************************************
404*437bfbebSnyanmisaka */
avsd_reset_parameters(AvsdCtx_t * p_dec)405*437bfbebSnyanmisaka MPP_RET avsd_reset_parameters(AvsdCtx_t *p_dec)
406*437bfbebSnyanmisaka {
407*437bfbebSnyanmisaka     RK_U32 i = 0;
408*437bfbebSnyanmisaka 
409*437bfbebSnyanmisaka     set_frame_output(p_dec, p_dec->dpb[1]);
410*437bfbebSnyanmisaka     set_frame_output(p_dec, p_dec->dpb[0]);
411*437bfbebSnyanmisaka     set_frame_output(p_dec, p_dec->cur);
412*437bfbebSnyanmisaka     set_frame_unref(p_dec, p_dec->dpb[1]);
413*437bfbebSnyanmisaka     set_frame_unref(p_dec, p_dec->dpb[0]);
414*437bfbebSnyanmisaka     set_frame_unref(p_dec, p_dec->cur);
415*437bfbebSnyanmisaka 
416*437bfbebSnyanmisaka     p_dec->cur = NULL;
417*437bfbebSnyanmisaka     p_dec->dpb[0] = NULL;
418*437bfbebSnyanmisaka     p_dec->dpb[1] = NULL;
419*437bfbebSnyanmisaka 
420*437bfbebSnyanmisaka     p_dec->vsh.version_checked = 0;
421*437bfbebSnyanmisaka 
422*437bfbebSnyanmisaka     for (i = 0; i < MPP_ARRAY_ELEMS(p_dec->mem->save); i++) {
423*437bfbebSnyanmisaka         AvsdFrame_t *frm = &p_dec->mem->save[i];
424*437bfbebSnyanmisaka 
425*437bfbebSnyanmisaka         memset(frm, 0, sizeof(*frm));
426*437bfbebSnyanmisaka         frm->idx = i;
427*437bfbebSnyanmisaka         frm->slot_idx = -1;
428*437bfbebSnyanmisaka     }
429*437bfbebSnyanmisaka 
430*437bfbebSnyanmisaka     return MPP_OK;
431*437bfbebSnyanmisaka }
432*437bfbebSnyanmisaka 
433*437bfbebSnyanmisaka /*!
434*437bfbebSnyanmisaka ***********************************************************************
435*437bfbebSnyanmisaka * \brief
436*437bfbebSnyanmisaka *    set refer
437*437bfbebSnyanmisaka ***********************************************************************
438*437bfbebSnyanmisaka */
avsd_set_dpb(AvsdCtx_t * p_dec,HalDecTask * task)439*437bfbebSnyanmisaka MPP_RET avsd_set_dpb(AvsdCtx_t *p_dec, HalDecTask *task)
440*437bfbebSnyanmisaka {
441*437bfbebSnyanmisaka     MppFrame mframe = NULL;
442*437bfbebSnyanmisaka     RK_S32 slot_idx = -1;
443*437bfbebSnyanmisaka     AvsdFrame_t *p_cur = p_dec->cur;
444*437bfbebSnyanmisaka 
445*437bfbebSnyanmisaka     //!< set current dpb for decode
446*437bfbebSnyanmisaka     mpp_buf_slot_get_unused(p_dec->frame_slots, &slot_idx);
447*437bfbebSnyanmisaka     if (slot_idx < 0) {
448*437bfbebSnyanmisaka         AVSD_DBG(AVSD_DBG_WARNNING, "error, buf_slot has not get.\n");
449*437bfbebSnyanmisaka         goto __FAILED;
450*437bfbebSnyanmisaka     }
451*437bfbebSnyanmisaka     //!< init current frame data
452*437bfbebSnyanmisaka     p_cur->slot_idx = slot_idx;
453*437bfbebSnyanmisaka     p_cur->pic_type = p_dec->ph.picture_coding_type;
454*437bfbebSnyanmisaka     p_cur->width = p_dec->vsh.horizontal_size;
455*437bfbebSnyanmisaka     p_cur->height = p_dec->vsh.vertical_size;
456*437bfbebSnyanmisaka     p_cur->hor_stride = MPP_ALIGN(p_dec->vsh.horizontal_size, 16);
457*437bfbebSnyanmisaka     p_cur->ver_stride = MPP_ALIGN(p_dec->vsh.vertical_size, 16);
458*437bfbebSnyanmisaka     p_cur->pts = mpp_packet_get_pts(task->input_packet);
459*437bfbebSnyanmisaka     p_cur->dts = mpp_packet_get_dts(task->input_packet);
460*437bfbebSnyanmisaka     //!< set frame info
461*437bfbebSnyanmisaka     mpp_frame_init(&mframe);
462*437bfbebSnyanmisaka     mpp_frame_set_fmt(mframe, MPP_FMT_YUV420SP);
463*437bfbebSnyanmisaka     mpp_frame_set_hor_stride(mframe, p_cur->hor_stride);  // before crop
464*437bfbebSnyanmisaka     mpp_frame_set_ver_stride(mframe, p_cur->ver_stride);
465*437bfbebSnyanmisaka     mpp_frame_set_width(mframe, p_cur->width);  // after crop
466*437bfbebSnyanmisaka     mpp_frame_set_height(mframe, p_cur->height);
467*437bfbebSnyanmisaka     mpp_frame_set_pts(mframe, p_cur->pts);
468*437bfbebSnyanmisaka     mpp_frame_set_dts(mframe, p_cur->dts);
469*437bfbebSnyanmisaka     if (p_dec->ph.picture_structure) { //!< data combine 2 field
470*437bfbebSnyanmisaka         p_cur->frame_mode = MPP_FRAME_FLAG_PAIRED_FIELD;
471*437bfbebSnyanmisaka         if (p_dec->ph.top_field_first) {
472*437bfbebSnyanmisaka             p_cur->frame_mode |= MPP_FRAME_FLAG_TOP_FIRST;
473*437bfbebSnyanmisaka         } else {
474*437bfbebSnyanmisaka             p_cur->frame_mode |= MPP_FRAME_FLAG_BOT_FIRST;
475*437bfbebSnyanmisaka         }
476*437bfbebSnyanmisaka     } else { //!< frame picture
477*437bfbebSnyanmisaka         p_cur->frame_mode = MPP_FRAME_FLAG_FRAME;
478*437bfbebSnyanmisaka 
479*437bfbebSnyanmisaka         if (p_dec->init.cfg->base.enable_vproc & MPP_VPROC_MODE_DETECTION) {
480*437bfbebSnyanmisaka             p_cur->frame_mode |= MPP_FRAME_FLAG_DEINTERLACED;
481*437bfbebSnyanmisaka         }
482*437bfbebSnyanmisaka     }
483*437bfbebSnyanmisaka     mpp_frame_set_mode(mframe, p_cur->frame_mode);
484*437bfbebSnyanmisaka     mpp_buf_slot_set_prop(p_dec->frame_slots, slot_idx, SLOT_FRAME, mframe);
485*437bfbebSnyanmisaka     mpp_frame_deinit(&mframe);
486*437bfbebSnyanmisaka 
487*437bfbebSnyanmisaka     mpp_buf_slot_set_flag(p_dec->frame_slots, p_cur->slot_idx, SLOT_CODEC_USE);
488*437bfbebSnyanmisaka     mpp_buf_slot_set_flag(p_dec->frame_slots, p_cur->slot_idx, SLOT_HAL_OUTPUT);
489*437bfbebSnyanmisaka 
490*437bfbebSnyanmisaka     //!< set task
491*437bfbebSnyanmisaka     task->output = p_dec->cur->slot_idx;
492*437bfbebSnyanmisaka     //!< set task refers
493*437bfbebSnyanmisaka     if (p_dec->dpb[0] && p_dec->dpb[0]->slot_idx >= 0 &&
494*437bfbebSnyanmisaka         (p_dec->dpb[0]->slot_idx != p_dec->cur->slot_idx)) {
495*437bfbebSnyanmisaka         mpp_buf_slot_set_flag(p_dec->frame_slots, p_dec->dpb[0]->slot_idx, SLOT_HAL_INPUT);
496*437bfbebSnyanmisaka         if (p_dec->ph.picture_coding_type == B_PICTURE) {
497*437bfbebSnyanmisaka             task->refer[1] = p_dec->dpb[0]->slot_idx;
498*437bfbebSnyanmisaka         } else {
499*437bfbebSnyanmisaka             task->refer[0] = p_dec->dpb[0]->slot_idx;
500*437bfbebSnyanmisaka         }
501*437bfbebSnyanmisaka     }
502*437bfbebSnyanmisaka     if (p_dec->dpb[1] && p_dec->dpb[1]->slot_idx >= 0 &&
503*437bfbebSnyanmisaka         (p_dec->dpb[1]->slot_idx != p_dec->cur->slot_idx)) {
504*437bfbebSnyanmisaka         mpp_buf_slot_set_flag(p_dec->frame_slots, p_dec->dpb[1]->slot_idx, SLOT_HAL_INPUT);
505*437bfbebSnyanmisaka         if (p_dec->ph.picture_coding_type == B_PICTURE) {
506*437bfbebSnyanmisaka             task->refer[0] = p_dec->dpb[1]->slot_idx;
507*437bfbebSnyanmisaka         } else {
508*437bfbebSnyanmisaka             task->refer[1] = p_dec->dpb[1]->slot_idx;
509*437bfbebSnyanmisaka         }
510*437bfbebSnyanmisaka     }
511*437bfbebSnyanmisaka 
512*437bfbebSnyanmisaka     //!< set ref flag and mark error
513*437bfbebSnyanmisaka     if (p_dec->ph.picture_coding_type == I_PICTURE) {
514*437bfbebSnyanmisaka         task->flags.used_for_ref = 1;
515*437bfbebSnyanmisaka         task->flags.ref_err = 0;
516*437bfbebSnyanmisaka     } else if (p_dec->ph.picture_coding_type == P_PICTURE) {
517*437bfbebSnyanmisaka         task->flags.used_for_ref = 1;
518*437bfbebSnyanmisaka         if (task->refer[0] >= 0) {
519*437bfbebSnyanmisaka             mpp_buf_slot_get_prop(p_dec->frame_slots, task->refer[0], SLOT_FRAME_PTR, &mframe);
520*437bfbebSnyanmisaka             if (mframe)
521*437bfbebSnyanmisaka                 task->flags.ref_err |= mpp_frame_get_errinfo(mframe);
522*437bfbebSnyanmisaka         }
523*437bfbebSnyanmisaka     } else if (p_dec->ph.picture_coding_type == B_PICTURE) {
524*437bfbebSnyanmisaka         task->flags.used_for_ref = 0;
525*437bfbebSnyanmisaka         if (task->refer[0] >= 0) {
526*437bfbebSnyanmisaka             mpp_buf_slot_get_prop(p_dec->frame_slots, task->refer[0], SLOT_FRAME_PTR, &mframe);
527*437bfbebSnyanmisaka             if (mframe)
528*437bfbebSnyanmisaka                 task->flags.ref_err |= mpp_frame_get_errinfo(mframe);
529*437bfbebSnyanmisaka         }
530*437bfbebSnyanmisaka         if (task->refer[1] >= 0) {
531*437bfbebSnyanmisaka             mpp_buf_slot_get_prop(p_dec->frame_slots, task->refer[1], SLOT_FRAME_PTR, &mframe);
532*437bfbebSnyanmisaka             if (mframe)
533*437bfbebSnyanmisaka                 task->flags.ref_err |= mpp_frame_get_errinfo(mframe);
534*437bfbebSnyanmisaka         }
535*437bfbebSnyanmisaka     }
536*437bfbebSnyanmisaka 
537*437bfbebSnyanmisaka     return MPP_OK;
538*437bfbebSnyanmisaka __FAILED:
539*437bfbebSnyanmisaka     return MPP_NOK;
540*437bfbebSnyanmisaka }
541*437bfbebSnyanmisaka 
542*437bfbebSnyanmisaka /*!
543*437bfbebSnyanmisaka ***********************************************************************
544*437bfbebSnyanmisaka * \brief
545*437bfbebSnyanmisaka *    commit buffer to hal
546*437bfbebSnyanmisaka ***********************************************************************
547*437bfbebSnyanmisaka */
avsd_commit_syntaxs(AvsdSyntax_t * syn,HalDecTask * task)548*437bfbebSnyanmisaka MPP_RET avsd_commit_syntaxs(AvsdSyntax_t *syn, HalDecTask *task)
549*437bfbebSnyanmisaka {
550*437bfbebSnyanmisaka     task->syntax.number = 1;
551*437bfbebSnyanmisaka     task->syntax.data = syn;
552*437bfbebSnyanmisaka 
553*437bfbebSnyanmisaka     return MPP_OK;
554*437bfbebSnyanmisaka }
555*437bfbebSnyanmisaka 
556*437bfbebSnyanmisaka /*!
557*437bfbebSnyanmisaka ***********************************************************************
558*437bfbebSnyanmisaka * \brief
559*437bfbebSnyanmisaka *    commit buffer to hal
560*437bfbebSnyanmisaka ***********************************************************************
561*437bfbebSnyanmisaka */
avsd_update_dpb(AvsdCtx_t * p_dec)562*437bfbebSnyanmisaka MPP_RET avsd_update_dpb(AvsdCtx_t *p_dec)
563*437bfbebSnyanmisaka {
564*437bfbebSnyanmisaka     if (p_dec->ph.picture_coding_type != B_PICTURE) {
565*437bfbebSnyanmisaka         set_frame_output(p_dec, p_dec->dpb[0]);
566*437bfbebSnyanmisaka         set_frame_unref(p_dec, p_dec->dpb[1]);
567*437bfbebSnyanmisaka         p_dec->dpb[1] = p_dec->dpb[0];
568*437bfbebSnyanmisaka         p_dec->dpb[0] = p_dec->cur;
569*437bfbebSnyanmisaka         p_dec->cur = NULL;
570*437bfbebSnyanmisaka     } else {
571*437bfbebSnyanmisaka         set_frame_output(p_dec, p_dec->cur);
572*437bfbebSnyanmisaka         set_frame_unref(p_dec, p_dec->cur);
573*437bfbebSnyanmisaka         p_dec->cur = NULL;
574*437bfbebSnyanmisaka     }
575*437bfbebSnyanmisaka 
576*437bfbebSnyanmisaka     return MPP_OK;
577*437bfbebSnyanmisaka }
578*437bfbebSnyanmisaka 
579*437bfbebSnyanmisaka /*!
580*437bfbebSnyanmisaka ***********************************************************************
581*437bfbebSnyanmisaka * \brief
582*437bfbebSnyanmisaka *    fill parameters
583*437bfbebSnyanmisaka ***********************************************************************
584*437bfbebSnyanmisaka */
avsd_fill_parameters(AvsdCtx_t * p_dec,AvsdSyntax_t * syn)585*437bfbebSnyanmisaka MPP_RET avsd_fill_parameters(AvsdCtx_t *p_dec, AvsdSyntax_t *syn)
586*437bfbebSnyanmisaka {
587*437bfbebSnyanmisaka     RK_S32 i = 0;
588*437bfbebSnyanmisaka     PicParams_Avsd *pp = &syn->pp;
589*437bfbebSnyanmisaka 
590*437bfbebSnyanmisaka     //!< sequence header
591*437bfbebSnyanmisaka     pp->profileId           = p_dec->vsh.profile_id;
592*437bfbebSnyanmisaka     pp->levelId             = p_dec->vsh.level_id;
593*437bfbebSnyanmisaka     pp->progressiveSequence = p_dec->vsh.progressive_sequence;
594*437bfbebSnyanmisaka     pp->horizontalSize      = p_dec->vsh.horizontal_size;
595*437bfbebSnyanmisaka     pp->verticalSize        = p_dec->vsh.vertical_size;
596*437bfbebSnyanmisaka     pp->chromaFormat        = p_dec->vsh.chroma_format;
597*437bfbebSnyanmisaka     pp->aspectRatio         = p_dec->vsh.aspect_ratio;
598*437bfbebSnyanmisaka     pp->frameRateCode       = p_dec->vsh.frame_rate_code;
599*437bfbebSnyanmisaka     pp->bitRateValue        = p_dec->vsh.bit_rate;
600*437bfbebSnyanmisaka     pp->lowDelay            = p_dec->vsh.low_delay;
601*437bfbebSnyanmisaka     pp->bbvBufferSize       = p_dec->vsh.bbv_buffer_size;
602*437bfbebSnyanmisaka 
603*437bfbebSnyanmisaka     //!< sequence display extension header
604*437bfbebSnyanmisaka     pp->videoFormat             = p_dec->ext.video_format;
605*437bfbebSnyanmisaka     pp->sampleRange             = p_dec->ext.sample_range;
606*437bfbebSnyanmisaka     pp->colorDescription        = p_dec->ext.color_description;
607*437bfbebSnyanmisaka     pp->colorPrimaries          = p_dec->ext.color_primaries;
608*437bfbebSnyanmisaka     pp->transferCharacteristics = p_dec->ext.transfer_characteristics;
609*437bfbebSnyanmisaka     pp->matrixCoefficients      = p_dec->ext.matrix_coefficients;
610*437bfbebSnyanmisaka     pp->displayHorizontalSize   = p_dec->ext.display_horizontalSize;
611*437bfbebSnyanmisaka     pp->displayVerticalSize     = p_dec->ext.display_verticalSize;
612*437bfbebSnyanmisaka 
613*437bfbebSnyanmisaka     //!< picture header
614*437bfbebSnyanmisaka     pp->picCodingType           = p_dec->ph.picture_coding_type;
615*437bfbebSnyanmisaka     pp->bbvDelay                = p_dec->ph.bbv_delay;
616*437bfbebSnyanmisaka     pp->bbvDelayExtension       = p_dec->ph.bbv_delay_extension;
617*437bfbebSnyanmisaka     pp->timeCodeFlag            = p_dec->ph.time_code_flag;
618*437bfbebSnyanmisaka     pp->timeCode                = p_dec->ph.time_code;
619*437bfbebSnyanmisaka 
620*437bfbebSnyanmisaka     pp->pictureDistance         = p_dec->ph.picture_distance;
621*437bfbebSnyanmisaka     pp->progressiveFrame        = p_dec->ph.progressive_frame;
622*437bfbebSnyanmisaka     pp->pictureStructure        = p_dec->ph.picture_structure;
623*437bfbebSnyanmisaka     pp->advancedPredModeDisable = p_dec->ph.advanced_pred_mode_disable;
624*437bfbebSnyanmisaka     pp->topFieldFirst           = p_dec->ph.top_field_first;
625*437bfbebSnyanmisaka     pp->repeatFirstField        = p_dec->ph.repeat_first_field;
626*437bfbebSnyanmisaka     pp->fixedPictureQp          = p_dec->ph.fixed_picture_qp;
627*437bfbebSnyanmisaka     pp->pictureQp               = p_dec->ph.picture_qp;
628*437bfbebSnyanmisaka     pp->pictureReferenceFlag    = p_dec->ph.picture_reference_flag;
629*437bfbebSnyanmisaka     pp->skipModeFlag            = p_dec->ph.skip_mode_flag;
630*437bfbebSnyanmisaka     pp->loopFilterDisable       = p_dec->ph.loop_filter_disable;
631*437bfbebSnyanmisaka     pp->alphaOffset             = p_dec->ph.alpha_c_offset;
632*437bfbebSnyanmisaka     pp->betaOffset              = p_dec->ph.beta_offset;
633*437bfbebSnyanmisaka 
634*437bfbebSnyanmisaka     //!< weighting quant, AVS Plus stuff
635*437bfbebSnyanmisaka     pp->weightingQuantFlag = p_dec->ph.weighting_quant_flag;
636*437bfbebSnyanmisaka     pp->chromaQuantParamDisable = p_dec->ph.chroma_quant_param_disable;
637*437bfbebSnyanmisaka     pp->chromaQuantParamDeltaCb = p_dec->ph.chroma_quant_param_delta_cb;
638*437bfbebSnyanmisaka     pp->chromaQuantParamDeltaCr = p_dec->ph.chroma_quant_param_delta_cr;
639*437bfbebSnyanmisaka     pp->weightingQuantParamIndex = p_dec->ph.weighting_quant_param_index;
640*437bfbebSnyanmisaka     pp->weightingQuantModel = p_dec->ph.weighting_quant_model;
641*437bfbebSnyanmisaka     for (i = 0; i < 6; i++) {
642*437bfbebSnyanmisaka         pp->weightingQuantParamDelta1[i] = p_dec->ph.weighting_quant_param_delta1[i];
643*437bfbebSnyanmisaka         pp->weightingQuantParamDelta2[i] = p_dec->ph.weighting_quant_param_delta2[i];
644*437bfbebSnyanmisaka         pp->weightingQuantParam[i] = p_dec->ph.weighting_quant_param[i];
645*437bfbebSnyanmisaka     }
646*437bfbebSnyanmisaka     //!< advance entropy coding
647*437bfbebSnyanmisaka     pp->aecEnable = p_dec->ph.aec_enable;
648*437bfbebSnyanmisaka 
649*437bfbebSnyanmisaka     //!< picture enhance
650*437bfbebSnyanmisaka     pp->noForwardReferenceFlag = p_dec->ph.no_forward_reference_flag;
651*437bfbebSnyanmisaka     pp->pbFieldEnhancedFlag = p_dec->ph.pb_field_enhanced_flag;
652*437bfbebSnyanmisaka 
653*437bfbebSnyanmisaka     //!< set stream offset
654*437bfbebSnyanmisaka     syn->bitstream_size = p_dec->cur->stream_len;
655*437bfbebSnyanmisaka     syn->bitstream_offset = p_dec->cur->stream_offset;
656*437bfbebSnyanmisaka 
657*437bfbebSnyanmisaka     return MPP_OK;
658*437bfbebSnyanmisaka }
659*437bfbebSnyanmisaka /*!
660*437bfbebSnyanmisaka ***********************************************************************
661*437bfbebSnyanmisaka * \brief
662*437bfbebSnyanmisaka *    prepare function for parser
663*437bfbebSnyanmisaka ***********************************************************************
664*437bfbebSnyanmisaka */
avsd_parser_split(AvsdCtx_t * p,MppPacket * dst,MppPacket * src)665*437bfbebSnyanmisaka MPP_RET avsd_parser_split(AvsdCtx_t *p, MppPacket *dst, MppPacket *src)
666*437bfbebSnyanmisaka {
667*437bfbebSnyanmisaka     MPP_RET ret = MPP_NOK;
668*437bfbebSnyanmisaka     AVSD_PARSE_TRACE("In.\n");
669*437bfbebSnyanmisaka 
670*437bfbebSnyanmisaka     RK_U8 *src_buf = (RK_U8 *)mpp_packet_get_pos(src);
671*437bfbebSnyanmisaka     RK_U32 src_len = (RK_U32)mpp_packet_get_length(src);
672*437bfbebSnyanmisaka     RK_U32 src_eos = mpp_packet_get_eos(src);
673*437bfbebSnyanmisaka     RK_S64 src_pts = mpp_packet_get_pts(src);
674*437bfbebSnyanmisaka     RK_S64 src_dts = mpp_packet_get_dts(src);
675*437bfbebSnyanmisaka     RK_U8 *dst_buf = (RK_U8 *)mpp_packet_get_data(dst);
676*437bfbebSnyanmisaka     RK_U32 dst_len = (RK_U32)mpp_packet_get_length(dst);
677*437bfbebSnyanmisaka     RK_U32 src_pos = 0;
678*437bfbebSnyanmisaka 
679*437bfbebSnyanmisaka     // find the began of the vop
680*437bfbebSnyanmisaka     if (!p->vop_header_found) {
681*437bfbebSnyanmisaka         // add last startcode to the new frame data
682*437bfbebSnyanmisaka         if ((dst_len < sizeof(p->state))
683*437bfbebSnyanmisaka             && ((p->state & 0x00FFFFFF) == 0x000001)) {
684*437bfbebSnyanmisaka             dst_buf[0] = 0;
685*437bfbebSnyanmisaka             dst_buf[1] = 0;
686*437bfbebSnyanmisaka             dst_buf[2] = 1;
687*437bfbebSnyanmisaka             dst_len = 3;
688*437bfbebSnyanmisaka         }
689*437bfbebSnyanmisaka         while (src_pos < src_len) {
690*437bfbebSnyanmisaka             p->state = (p->state << 8) | src_buf[src_pos];
691*437bfbebSnyanmisaka             dst_buf[dst_len++] = src_buf[src_pos++];
692*437bfbebSnyanmisaka             if (p->state == I_PICUTRE_START_CODE ||
693*437bfbebSnyanmisaka                 p->state == PB_PICUTRE_START_CODE) {
694*437bfbebSnyanmisaka                 p->vop_header_found = 1;
695*437bfbebSnyanmisaka                 mpp_packet_set_pts(dst, src_pts);
696*437bfbebSnyanmisaka                 mpp_packet_set_dts(dst, src_dts);
697*437bfbebSnyanmisaka                 break;
698*437bfbebSnyanmisaka             }
699*437bfbebSnyanmisaka         }
700*437bfbebSnyanmisaka     }
701*437bfbebSnyanmisaka 
702*437bfbebSnyanmisaka     // find the end of the vop
703*437bfbebSnyanmisaka     if (p->vop_header_found) {
704*437bfbebSnyanmisaka         while (src_pos < src_len) {
705*437bfbebSnyanmisaka             p->state = (p->state << 8) | src_buf[src_pos];
706*437bfbebSnyanmisaka             dst_buf[dst_len++] = src_buf[src_pos++];
707*437bfbebSnyanmisaka             if ((p->state & 0x00FFFFFF) == 0x000001) {
708*437bfbebSnyanmisaka                 if (src_buf[src_pos] > (SLICE_MAX_START_CODE & 0xFF) &&
709*437bfbebSnyanmisaka                     src_buf[src_pos] != (USER_DATA_CODE & 0xFF)) {
710*437bfbebSnyanmisaka                     dst_len -= 3;
711*437bfbebSnyanmisaka                     p->vop_header_found = 0;
712*437bfbebSnyanmisaka                     ret = MPP_OK; // split complete
713*437bfbebSnyanmisaka                     break;
714*437bfbebSnyanmisaka                 }
715*437bfbebSnyanmisaka             }
716*437bfbebSnyanmisaka         }
717*437bfbebSnyanmisaka     }
718*437bfbebSnyanmisaka     // the last packet
719*437bfbebSnyanmisaka     if (src_eos && src_pos >= src_len) {
720*437bfbebSnyanmisaka         mpp_packet_set_eos(dst);
721*437bfbebSnyanmisaka         ret = MPP_OK;
722*437bfbebSnyanmisaka     }
723*437bfbebSnyanmisaka 
724*437bfbebSnyanmisaka     AVSD_DBG(AVSD_DBG_INPUT, "[pkt_in] vop_header_found= %d, dst_len=%d, src_pos=%d\n",
725*437bfbebSnyanmisaka              p->vop_header_found, dst_len, src_pos);
726*437bfbebSnyanmisaka     // reset the src and dst
727*437bfbebSnyanmisaka     mpp_packet_set_length(dst, dst_len);
728*437bfbebSnyanmisaka     mpp_packet_set_pos(src, src_buf + src_pos);
729*437bfbebSnyanmisaka 
730*437bfbebSnyanmisaka     AVSD_PARSE_TRACE("out.\n");
731*437bfbebSnyanmisaka 
732*437bfbebSnyanmisaka     return ret;
733*437bfbebSnyanmisaka }
734*437bfbebSnyanmisaka /*!
735*437bfbebSnyanmisaka ***********************************************************************
736*437bfbebSnyanmisaka * \brief
737*437bfbebSnyanmisaka *    parse stream which ha function for parser
738*437bfbebSnyanmisaka ***********************************************************************
739*437bfbebSnyanmisaka */
avsd_parse_stream(AvsdCtx_t * p_dec,HalDecTask * task)740*437bfbebSnyanmisaka MPP_RET avsd_parse_stream(AvsdCtx_t *p_dec, HalDecTask *task)
741*437bfbebSnyanmisaka {
742*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
743*437bfbebSnyanmisaka     RK_U32 startcode = 0xFF;
744*437bfbebSnyanmisaka     RK_U32 pic_type = 0;
745*437bfbebSnyanmisaka     RK_U32 got_slice = 0;
746*437bfbebSnyanmisaka 
747*437bfbebSnyanmisaka     RK_U8 *data = (RK_U8 *)mpp_packet_get_data(task->input_packet);
748*437bfbebSnyanmisaka     RK_S32 length = (RK_S32)mpp_packet_get_length(task->input_packet);
749*437bfbebSnyanmisaka 
750*437bfbebSnyanmisaka     mpp_set_bitread_ctx(p_dec->bx, data, length);
751*437bfbebSnyanmisaka     AVSD_DBG(AVSD_DBG_SYNTAX, "bytes_left_=%d\n", p_dec->bx->bytes_left_);
752*437bfbebSnyanmisaka     while (p_dec->bx->bytes_left_ && !got_slice) {
753*437bfbebSnyanmisaka         RK_S32 tmp = 0;
754*437bfbebSnyanmisaka         mpp_align_get_bits(p_dec->bx);
755*437bfbebSnyanmisaka         mpp_read_bits(p_dec->bx, 8, &tmp);
756*437bfbebSnyanmisaka         startcode = (startcode << 8) | tmp;
757*437bfbebSnyanmisaka         if ((startcode & 0xFFFFFF00) != 0x100)
758*437bfbebSnyanmisaka             continue;
759*437bfbebSnyanmisaka         AVSD_DBG(AVSD_DBG_SYNTAX, "startcode=%08x\n", startcode);
760*437bfbebSnyanmisaka 
761*437bfbebSnyanmisaka         // when has not got sequence header, then do nothing
762*437bfbebSnyanmisaka         if (!p_dec->got_vsh &&
763*437bfbebSnyanmisaka             startcode != VIDEO_SEQUENCE_START_CODE) {
764*437bfbebSnyanmisaka             AVSD_DBG(AVSD_DBG_WARNNING, "when has not got sequence header, then do nothing\n");
765*437bfbebSnyanmisaka             continue;
766*437bfbebSnyanmisaka         }
767*437bfbebSnyanmisaka         //continue;
768*437bfbebSnyanmisaka         switch (startcode) {
769*437bfbebSnyanmisaka         case VIDEO_SEQUENCE_START_CODE:
770*437bfbebSnyanmisaka             ret = get_sequence_header(p_dec->bx, &p_dec->vsh);
771*437bfbebSnyanmisaka             if (ret == MPP_OK) {
772*437bfbebSnyanmisaka                 p_dec->got_vsh = 1;
773*437bfbebSnyanmisaka             }
774*437bfbebSnyanmisaka             AVSD_DBG(AVSD_DBG_WARNNING, "got vsh %d\n", p_dec->got_vsh);
775*437bfbebSnyanmisaka             break;
776*437bfbebSnyanmisaka         case VIDEO_SEQUENCE_END_CODE:
777*437bfbebSnyanmisaka             break;
778*437bfbebSnyanmisaka         case USER_DATA_CODE:
779*437bfbebSnyanmisaka             break;
780*437bfbebSnyanmisaka         case VIDEO_EDIT_CODE:
781*437bfbebSnyanmisaka             p_dec->vec_flag = 0;
782*437bfbebSnyanmisaka             break;
783*437bfbebSnyanmisaka         case I_PICUTRE_START_CODE:
784*437bfbebSnyanmisaka             AVSD_DBG(AVSD_DBG_WARNNING, "got I picture start code\n");
785*437bfbebSnyanmisaka             if (!p_dec->got_keyframe) {
786*437bfbebSnyanmisaka                 avsd_reset_parameters(p_dec);
787*437bfbebSnyanmisaka                 p_dec->got_keyframe = 1;
788*437bfbebSnyanmisaka             }
789*437bfbebSnyanmisaka             ret = get_i_picture_header(p_dec->bx, &p_dec->vsh, &p_dec->ph);
790*437bfbebSnyanmisaka             if (ret == MPP_OK) {
791*437bfbebSnyanmisaka                 p_dec->cur = get_one_save(p_dec, task);
792*437bfbebSnyanmisaka                 p_dec->got_ph = 1;
793*437bfbebSnyanmisaka             }
794*437bfbebSnyanmisaka             p_dec->cur->pic_type = pic_type = I_PICTURE;
795*437bfbebSnyanmisaka             p_dec->vec_flag++;
796*437bfbebSnyanmisaka             break;
797*437bfbebSnyanmisaka         case EXTENSION_START_CODE:
798*437bfbebSnyanmisaka             ret = get_extension_header(p_dec->bx, &p_dec->ext);
799*437bfbebSnyanmisaka             break;
800*437bfbebSnyanmisaka         case PB_PICUTRE_START_CODE:
801*437bfbebSnyanmisaka             AVSD_DBG(AVSD_DBG_WARNNING, "got PB picture start code\n");
802*437bfbebSnyanmisaka             if (!p_dec->got_keyframe) {
803*437bfbebSnyanmisaka                 avsd_reset_parameters(p_dec);
804*437bfbebSnyanmisaka                 break;
805*437bfbebSnyanmisaka             }
806*437bfbebSnyanmisaka             ret = get_pb_picture_header(p_dec->bx, &p_dec->vsh, &p_dec->ph);
807*437bfbebSnyanmisaka             if (ret == MPP_OK) {
808*437bfbebSnyanmisaka                 p_dec->cur = get_one_save(p_dec, task);
809*437bfbebSnyanmisaka                 p_dec->got_ph = 1;
810*437bfbebSnyanmisaka             }
811*437bfbebSnyanmisaka             p_dec->cur->pic_type = pic_type = p_dec->ph.picture_coding_type;
812*437bfbebSnyanmisaka             p_dec->vec_flag += (p_dec->vec_flag == 1 && pic_type == P_PICTURE);
813*437bfbebSnyanmisaka             break;
814*437bfbebSnyanmisaka         default:
815*437bfbebSnyanmisaka             if (p_dec->cur
816*437bfbebSnyanmisaka                 && startcode >= SLICE_MIN_START_CODE
817*437bfbebSnyanmisaka                 && startcode <= SLICE_MAX_START_CODE) {
818*437bfbebSnyanmisaka                 got_slice = 1;
819*437bfbebSnyanmisaka                 p_dec->cur->stream_len = length;
820*437bfbebSnyanmisaka                 p_dec->cur->stream_offset = p_dec->bx->used_bits / 8 - 4;
821*437bfbebSnyanmisaka                 task->valid = p_dec->got_vsh && p_dec->got_ph;
822*437bfbebSnyanmisaka                 AVSD_DBG(AVSD_DBG_SYNTAX, "offset=%d,got_vsh=%d, got_ph=%d, task->valid=%d\n",
823*437bfbebSnyanmisaka                          p_dec->cur->stream_offset, p_dec->got_vsh, p_dec->got_ph, task->valid);
824*437bfbebSnyanmisaka             }
825*437bfbebSnyanmisaka 
826*437bfbebSnyanmisaka             if (p_dec->disable_error)
827*437bfbebSnyanmisaka                 break;
828*437bfbebSnyanmisaka 
829*437bfbebSnyanmisaka             if ((pic_type == P_PICTURE && !p_dec->dpb[0]) ||
830*437bfbebSnyanmisaka                 (pic_type == B_PICTURE && !p_dec->dpb[0]) ||
831*437bfbebSnyanmisaka                 (pic_type == B_PICTURE && !p_dec->dpb[1] && !p_dec->vsh.low_delay) ||
832*437bfbebSnyanmisaka                 (pic_type == P_PICTURE && p_dec->vec_flag < 1) ||
833*437bfbebSnyanmisaka                 (pic_type == B_PICTURE && p_dec->vec_flag < 2)) {
834*437bfbebSnyanmisaka                 AVSD_DBG(AVSD_DBG_REF, "missing refer frame.\n");
835*437bfbebSnyanmisaka                 if (!p_dec->disable_error)
836*437bfbebSnyanmisaka                     goto __FAILED;
837*437bfbebSnyanmisaka             }
838*437bfbebSnyanmisaka             break;
839*437bfbebSnyanmisaka         }
840*437bfbebSnyanmisaka     }
841*437bfbebSnyanmisaka 
842*437bfbebSnyanmisaka     if (!task->valid)
843*437bfbebSnyanmisaka         goto __FAILED;
844*437bfbebSnyanmisaka 
845*437bfbebSnyanmisaka     return MPP_OK;
846*437bfbebSnyanmisaka __FAILED:
847*437bfbebSnyanmisaka     task->valid = 0;
848*437bfbebSnyanmisaka     reset_one_save(p_dec->cur);
849*437bfbebSnyanmisaka     return MPP_NOK;
850*437bfbebSnyanmisaka }
851