1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka * Copyright 2021 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 "avs2d_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_log.h"
24*437bfbebSnyanmisaka #include "mpp_packet_impl.h"
25*437bfbebSnyanmisaka #include "hal_task.h"
26*437bfbebSnyanmisaka
27*437bfbebSnyanmisaka #include "avs2d_api.h"
28*437bfbebSnyanmisaka #include "avs2d_dpb.h"
29*437bfbebSnyanmisaka #include "avs2d_parse.h"
30*437bfbebSnyanmisaka #include "avs2d_ps.h"
31*437bfbebSnyanmisaka #include "avs2d_global.h"
32*437bfbebSnyanmisaka
33*437bfbebSnyanmisaka #define AVS2_ISPIC(x) ((x) == 0xB3 || (x) == 0xB6)
34*437bfbebSnyanmisaka #define AVS2_ISUNIT(x) ((x) == 0xB0 || (x) == 0xB1 || (x) == 0xB2 || AVS2_ISPIC(x))
35*437bfbebSnyanmisaka #define AVS2_IS_START_CODE(x) (((x) & 0xffffff00) == 0x100)
36*437bfbebSnyanmisaka
37*437bfbebSnyanmisaka #define AVS2_IS_SLICE_START_CODE(x) ((x) >= AVS2_SLICE_MIN_START_CODE && (x) <= AVS2_SLICE_MAX_START_CODE)
38*437bfbebSnyanmisaka #define AVS2_IS_HEADER(x) ((x) >= AVS2_VIDEO_SEQUENCE_START_CODE && (x) <= AVS2_VIDEO_EDIT_CODE)
39*437bfbebSnyanmisaka #define AVS2_IS_PIC_START_CODE(x) ((x) == AVS2_I_PICTURE_START_CODE || (x) == AVS2_PB_PICTURE_START_CODE)
40*437bfbebSnyanmisaka
41*437bfbebSnyanmisaka /**
42*437bfbebSnyanmisaka * @brief Find start code 00 00 01 xx
43*437bfbebSnyanmisaka *
44*437bfbebSnyanmisaka * Search 01 first and check the previous 2 bytes and the following 1 bytes.
45*437bfbebSnyanmisaka * If it is start code, return the value of start code at U32 as 0x000001xx.
46*437bfbebSnyanmisaka *
47*437bfbebSnyanmisaka * @param buf_start the start of input buffer
48*437bfbebSnyanmisaka * @param buf_end the end of input buffer
49*437bfbebSnyanmisaka * @param pos output value, the position of start code
50*437bfbebSnyanmisaka * @return RK_U32
51*437bfbebSnyanmisaka */
avs2_find_start_code(RK_U8 * buf_start,RK_U8 * buf_end,RK_U8 ** pos)52*437bfbebSnyanmisaka static RK_U32 avs2_find_start_code(RK_U8 *buf_start, RK_U8* buf_end, RK_U8 **pos)
53*437bfbebSnyanmisaka {
54*437bfbebSnyanmisaka RK_U8 *buf_ptr = NULL;
55*437bfbebSnyanmisaka RK_U8 *ptr = buf_start;
56*437bfbebSnyanmisaka RK_U32 remain_size = buf_end - buf_start + 1;
57*437bfbebSnyanmisaka
58*437bfbebSnyanmisaka while (ptr < buf_end) {
59*437bfbebSnyanmisaka buf_ptr = memchr(ptr, 0x01, remain_size);
60*437bfbebSnyanmisaka
61*437bfbebSnyanmisaka if (!buf_ptr) {
62*437bfbebSnyanmisaka return 0;
63*437bfbebSnyanmisaka }
64*437bfbebSnyanmisaka
65*437bfbebSnyanmisaka //check the position of "01"
66*437bfbebSnyanmisaka if ((buf_ptr < buf_end) && (buf_ptr - buf_start > 1) &&
67*437bfbebSnyanmisaka (*(buf_ptr - 1) == 0) && (*(buf_ptr - 2) == 0)) {
68*437bfbebSnyanmisaka //found 00 00 01 xx
69*437bfbebSnyanmisaka *pos = buf_ptr + 1;
70*437bfbebSnyanmisaka return (AVS2_START_CODE | *(buf_ptr + 1));
71*437bfbebSnyanmisaka } else {
72*437bfbebSnyanmisaka // keep search at remaining buffer
73*437bfbebSnyanmisaka remain_size = remain_size - (buf_ptr - ptr + 1);
74*437bfbebSnyanmisaka ptr = buf_ptr + 1;
75*437bfbebSnyanmisaka }
76*437bfbebSnyanmisaka }
77*437bfbebSnyanmisaka
78*437bfbebSnyanmisaka return 0;
79*437bfbebSnyanmisaka }
80*437bfbebSnyanmisaka
avs2_add_nalu_header(Avs2dCtx_t * p_dec,RK_U32 header)81*437bfbebSnyanmisaka static MPP_RET avs2_add_nalu_header(Avs2dCtx_t *p_dec, RK_U32 header)
82*437bfbebSnyanmisaka {
83*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
84*437bfbebSnyanmisaka Avs2dNalu_t *p_nal = NULL;
85*437bfbebSnyanmisaka
86*437bfbebSnyanmisaka if (p_dec->nal_cnt + 1 > p_dec->nal_allocated) {
87*437bfbebSnyanmisaka Avs2dNalu_t *new_buffer = mpp_realloc(p_dec->p_nals, Avs2dNalu_t, p_dec->nal_allocated + MAX_NALU_NUM);
88*437bfbebSnyanmisaka
89*437bfbebSnyanmisaka if (!new_buffer) {
90*437bfbebSnyanmisaka mpp_err_f("Realloc NALU buffer failed, could not add more NALU!");
91*437bfbebSnyanmisaka ret = MPP_ERR_NOMEM;
92*437bfbebSnyanmisaka } else {
93*437bfbebSnyanmisaka p_dec->p_nals = new_buffer;
94*437bfbebSnyanmisaka memset(&p_dec->p_nals[p_dec->nal_allocated], 0, MAX_NALU_NUM * sizeof(Avs2dNalu_t));
95*437bfbebSnyanmisaka p_dec->nal_allocated += MAX_NALU_NUM;
96*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Realloc NALU buffer, current allocated %d", p_dec->nal_allocated);
97*437bfbebSnyanmisaka }
98*437bfbebSnyanmisaka }
99*437bfbebSnyanmisaka
100*437bfbebSnyanmisaka p_nal = p_dec->p_nals + p_dec->nal_cnt;
101*437bfbebSnyanmisaka p_nal->header = header;
102*437bfbebSnyanmisaka p_nal->length = 0;
103*437bfbebSnyanmisaka p_nal->data_pos = 0;
104*437bfbebSnyanmisaka p_nal->eof = 0;
105*437bfbebSnyanmisaka
106*437bfbebSnyanmisaka p_dec->nal_cnt++;
107*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("add header 0x%x, nal_cnt %d", header, p_dec->nal_cnt);
108*437bfbebSnyanmisaka
109*437bfbebSnyanmisaka return ret;
110*437bfbebSnyanmisaka }
111*437bfbebSnyanmisaka
112*437bfbebSnyanmisaka /**
113*437bfbebSnyanmisaka * @brief store nalu startcode and data
114*437bfbebSnyanmisaka * TODO If nalu data isn't appear right after startcode, it may go wrong
115*437bfbebSnyanmisaka *
116*437bfbebSnyanmisaka * @param p_dec
117*437bfbebSnyanmisaka * @param p_start
118*437bfbebSnyanmisaka * @param len
119*437bfbebSnyanmisaka * @param start_code
120*437bfbebSnyanmisaka * @return MPP_RET
121*437bfbebSnyanmisaka */
store_nalu(Avs2dCtx_t * p_dec,RK_U8 * p_start,RK_U32 len,RK_U32 start_code)122*437bfbebSnyanmisaka static MPP_RET store_nalu(Avs2dCtx_t *p_dec, RK_U8 *p_start, RK_U32 len, RK_U32 start_code)
123*437bfbebSnyanmisaka {
124*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
125*437bfbebSnyanmisaka Avs2dNalu_t *p_nalu = &p_dec->p_nals[p_dec->nal_cnt - 1];
126*437bfbebSnyanmisaka Avs2dStreamBuf_t *p_header = NULL;;
127*437bfbebSnyanmisaka RK_U32 add_size = SZ_1K;
128*437bfbebSnyanmisaka RK_U8 *data_ptr = NULL;
129*437bfbebSnyanmisaka
130*437bfbebSnyanmisaka if (AVS2_IS_SLICE_START_CODE(start_code)) {
131*437bfbebSnyanmisaka p_header = p_dec->p_stream;
132*437bfbebSnyanmisaka add_size = SZ_512K;
133*437bfbebSnyanmisaka } else if (AVS2_IS_HEADER(start_code)) {
134*437bfbebSnyanmisaka p_header = p_dec->p_header;
135*437bfbebSnyanmisaka add_size = SZ_1K;
136*437bfbebSnyanmisaka }
137*437bfbebSnyanmisaka
138*437bfbebSnyanmisaka if ((p_header->len + len) > p_header->size) {
139*437bfbebSnyanmisaka mpp_log_f("realloc %p p_header->pbuf, size %d, len %d %d", p_header->pbuf, p_header->size, p_header->len, len);
140*437bfbebSnyanmisaka RK_U32 new_size = p_header->size + add_size + len;
141*437bfbebSnyanmisaka RK_U8 * new_buffer = mpp_realloc(p_header->pbuf, RK_U8, new_size);
142*437bfbebSnyanmisaka mpp_log_f("realloc %p, size %d", p_header->pbuf, new_size);
143*437bfbebSnyanmisaka if (!new_buffer) {
144*437bfbebSnyanmisaka mpp_err_f("Realloc header buffer with size %d failed", new_size);
145*437bfbebSnyanmisaka return MPP_ERR_NOMEM;
146*437bfbebSnyanmisaka } else {
147*437bfbebSnyanmisaka p_header->pbuf = new_buffer;
148*437bfbebSnyanmisaka memset(p_header->pbuf + p_header->size, 0, new_size - p_header->size);
149*437bfbebSnyanmisaka p_header->size = new_size;
150*437bfbebSnyanmisaka }
151*437bfbebSnyanmisaka }
152*437bfbebSnyanmisaka
153*437bfbebSnyanmisaka data_ptr = p_header->pbuf + p_header->len;
154*437bfbebSnyanmisaka
155*437bfbebSnyanmisaka if (p_nalu->length == 0) {
156*437bfbebSnyanmisaka p_nalu->data_pos = p_header->len;
157*437bfbebSnyanmisaka }
158*437bfbebSnyanmisaka
159*437bfbebSnyanmisaka if (len > 0) {
160*437bfbebSnyanmisaka memcpy(data_ptr, p_start, len);
161*437bfbebSnyanmisaka p_nalu->length += len;
162*437bfbebSnyanmisaka p_header->len += len;
163*437bfbebSnyanmisaka }
164*437bfbebSnyanmisaka
165*437bfbebSnyanmisaka return ret;
166*437bfbebSnyanmisaka }
167*437bfbebSnyanmisaka
168*437bfbebSnyanmisaka /**
169*437bfbebSnyanmisaka * @brief Once got a new frame, reset previous stored nalu data an buffer
170*437bfbebSnyanmisaka *
171*437bfbebSnyanmisaka * @param p_dec
172*437bfbebSnyanmisaka * @return MPP_RET
173*437bfbebSnyanmisaka */
reset_nalu_buf(Avs2dCtx_t * p_dec)174*437bfbebSnyanmisaka static MPP_RET reset_nalu_buf(Avs2dCtx_t *p_dec)
175*437bfbebSnyanmisaka {
176*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
177*437bfbebSnyanmisaka
178*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("In.");
179*437bfbebSnyanmisaka p_dec->prev_start_code = 0;
180*437bfbebSnyanmisaka p_dec->new_frame_flag = 0;
181*437bfbebSnyanmisaka
182*437bfbebSnyanmisaka memset(p_dec->prev_tail_data, 0xff, AVS2D_PACKET_SPLIT_CHECKER_BUFFER_SIZE);
183*437bfbebSnyanmisaka
184*437bfbebSnyanmisaka if (p_dec->p_stream) {
185*437bfbebSnyanmisaka memset(p_dec->p_stream->pbuf, 0, p_dec->p_stream->size);
186*437bfbebSnyanmisaka p_dec->p_stream->len = 0;
187*437bfbebSnyanmisaka }
188*437bfbebSnyanmisaka
189*437bfbebSnyanmisaka if (p_dec->p_header) {
190*437bfbebSnyanmisaka memset(p_dec->p_header->pbuf, 0, p_dec->p_header->size);
191*437bfbebSnyanmisaka p_dec->p_header->len = 0;
192*437bfbebSnyanmisaka }
193*437bfbebSnyanmisaka
194*437bfbebSnyanmisaka if (p_dec->p_nals) {
195*437bfbebSnyanmisaka memset(p_dec->p_nals, 0, sizeof(Avs2dNalu_t) * p_dec->nal_allocated);
196*437bfbebSnyanmisaka p_dec->nal_cnt = 0;
197*437bfbebSnyanmisaka }
198*437bfbebSnyanmisaka
199*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Out.");
200*437bfbebSnyanmisaka return ret;
201*437bfbebSnyanmisaka }
202*437bfbebSnyanmisaka
parse_seq_dispay_ext_header(BitReadCtx_t * bitctx,Avs2dSeqExtHeader_t * exh)203*437bfbebSnyanmisaka static MPP_RET parse_seq_dispay_ext_header(BitReadCtx_t *bitctx, Avs2dSeqExtHeader_t *exh)
204*437bfbebSnyanmisaka {
205*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
206*437bfbebSnyanmisaka
207*437bfbebSnyanmisaka READ_BITS(bitctx, 3, &exh->video_format);
208*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &exh->sample_range);
209*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &exh->color_description);
210*437bfbebSnyanmisaka
211*437bfbebSnyanmisaka if (exh->color_description) {
212*437bfbebSnyanmisaka READ_BITS(bitctx, 8, &exh->color_primaries);
213*437bfbebSnyanmisaka READ_BITS(bitctx, 8, &exh->transfer_characteristics);
214*437bfbebSnyanmisaka READ_BITS(bitctx, 8, &exh->matrix_coefficients);
215*437bfbebSnyanmisaka }
216*437bfbebSnyanmisaka READ_BITS(bitctx, 14, &exh->display_horizontal_size);
217*437bfbebSnyanmisaka READ_MARKER_BIT(bitctx);
218*437bfbebSnyanmisaka READ_BITS(bitctx, 14, &exh->display_vertical_size);
219*437bfbebSnyanmisaka
220*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &exh->td_mode_flag);
221*437bfbebSnyanmisaka if (exh->td_mode_flag) {
222*437bfbebSnyanmisaka READ_BITS(bitctx, 8, &exh->td_packing_mode);
223*437bfbebSnyanmisaka READ_ONEBIT(bitctx, &exh->view_reverse_flag);
224*437bfbebSnyanmisaka }
225*437bfbebSnyanmisaka
226*437bfbebSnyanmisaka return ret;
227*437bfbebSnyanmisaka __BITREAD_ERR:
228*437bfbebSnyanmisaka return ret = bitctx->ret;
229*437bfbebSnyanmisaka }
230*437bfbebSnyanmisaka
parse_mastering_display_and_content_meta(BitReadCtx_t * bitctx,MppFrameMasteringDisplayMetadata * display_meta,MppFrameContentLightMetadata * content_light)231*437bfbebSnyanmisaka static MPP_RET parse_mastering_display_and_content_meta(BitReadCtx_t *bitctx,
232*437bfbebSnyanmisaka MppFrameMasteringDisplayMetadata *display_meta,
233*437bfbebSnyanmisaka MppFrameContentLightMetadata *content_light)
234*437bfbebSnyanmisaka {
235*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
236*437bfbebSnyanmisaka RK_U32 i = 0;
237*437bfbebSnyanmisaka RK_U16 value;
238*437bfbebSnyanmisaka
239*437bfbebSnyanmisaka /* display metadata */
240*437bfbebSnyanmisaka for (i = 0; i < 3; i++) {
241*437bfbebSnyanmisaka READ_BITS(bitctx, 16, &value);
242*437bfbebSnyanmisaka READ_MARKER_BIT(bitctx);
243*437bfbebSnyanmisaka display_meta->display_primaries[i][0] = value;
244*437bfbebSnyanmisaka READ_BITS(bitctx, 16, &value);
245*437bfbebSnyanmisaka READ_MARKER_BIT(bitctx);
246*437bfbebSnyanmisaka display_meta->display_primaries[i][1] = value;
247*437bfbebSnyanmisaka }
248*437bfbebSnyanmisaka READ_BITS(bitctx, 16, &value);
249*437bfbebSnyanmisaka READ_MARKER_BIT(bitctx);
250*437bfbebSnyanmisaka display_meta->white_point[0] = value;
251*437bfbebSnyanmisaka READ_BITS(bitctx, 16, &value);
252*437bfbebSnyanmisaka READ_MARKER_BIT(bitctx);
253*437bfbebSnyanmisaka display_meta->white_point[1] = value;
254*437bfbebSnyanmisaka READ_BITS(bitctx, 16, &value);
255*437bfbebSnyanmisaka READ_MARKER_BIT(bitctx);
256*437bfbebSnyanmisaka display_meta->max_luminance = value;
257*437bfbebSnyanmisaka READ_BITS(bitctx, 16, &value);
258*437bfbebSnyanmisaka READ_MARKER_BIT(bitctx);
259*437bfbebSnyanmisaka display_meta->min_luminance = value;
260*437bfbebSnyanmisaka
261*437bfbebSnyanmisaka /* content light */
262*437bfbebSnyanmisaka READ_BITS(bitctx, 16, &value);
263*437bfbebSnyanmisaka READ_MARKER_BIT(bitctx);
264*437bfbebSnyanmisaka content_light->MaxCLL = value;
265*437bfbebSnyanmisaka READ_BITS(bitctx, 16, &value);
266*437bfbebSnyanmisaka READ_MARKER_BIT(bitctx);
267*437bfbebSnyanmisaka content_light->MaxFALL = value;
268*437bfbebSnyanmisaka
269*437bfbebSnyanmisaka SKIP_BITS(bitctx, 16);
270*437bfbebSnyanmisaka
271*437bfbebSnyanmisaka return ret;
272*437bfbebSnyanmisaka __BITREAD_ERR:
273*437bfbebSnyanmisaka return ret = bitctx->ret;
274*437bfbebSnyanmisaka }
275*437bfbebSnyanmisaka
parse_hdr_dynamic_meta_extension(BitReadCtx_t * bitctx,MppFrameHdrDynamicMeta * hdr_meta)276*437bfbebSnyanmisaka static MPP_RET parse_hdr_dynamic_meta_extension(BitReadCtx_t *bitctx, MppFrameHdrDynamicMeta *hdr_meta)
277*437bfbebSnyanmisaka {
278*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
279*437bfbebSnyanmisaka RK_S32 country_code, provider_code;
280*437bfbebSnyanmisaka RK_U16 terminal_provide_oriented_code;
281*437bfbebSnyanmisaka (void)hdr_meta;
282*437bfbebSnyanmisaka /* hdr_dynamic_metadata_type */
283*437bfbebSnyanmisaka SKIP_BITS(bitctx, 4);
284*437bfbebSnyanmisaka READ_BITS(bitctx, 8, &country_code);
285*437bfbebSnyanmisaka READ_BITS(bitctx, 16, &provider_code);
286*437bfbebSnyanmisaka READ_BITS(bitctx, 16, &terminal_provide_oriented_code);
287*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("country_code=%d provider_code=%d terminal_provider_code %d\n",
288*437bfbebSnyanmisaka country_code, provider_code, terminal_provide_oriented_code);
289*437bfbebSnyanmisaka
290*437bfbebSnyanmisaka //TODO: copy dynamic data
291*437bfbebSnyanmisaka
292*437bfbebSnyanmisaka return ret;
293*437bfbebSnyanmisaka __BITREAD_ERR:
294*437bfbebSnyanmisaka return ret = bitctx->ret;
295*437bfbebSnyanmisaka }
296*437bfbebSnyanmisaka
parse_extension_header(Avs2dCtx_t * p_dec,BitReadCtx_t * bitctx)297*437bfbebSnyanmisaka static MPP_RET parse_extension_header(Avs2dCtx_t *p_dec, BitReadCtx_t *bitctx)
298*437bfbebSnyanmisaka {
299*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
300*437bfbebSnyanmisaka RK_U32 val_temp = 0;
301*437bfbebSnyanmisaka
302*437bfbebSnyanmisaka READ_BITS(bitctx, 4, &val_temp); //!< extension_start_code
303*437bfbebSnyanmisaka switch (val_temp) {
304*437bfbebSnyanmisaka case AVS2_SEQUENCE_DISPLAY_EXT_ID:
305*437bfbebSnyanmisaka FUN_CHECK(ret = parse_seq_dispay_ext_header(bitctx, &p_dec->exh));
306*437bfbebSnyanmisaka p_dec->got_exh = 1;
307*437bfbebSnyanmisaka if (p_dec->exh.transfer_characteristics == MPP_FRAME_TRC_BT2020_10 ||
308*437bfbebSnyanmisaka p_dec->exh.transfer_characteristics == MPP_FRAME_TRC_BT1361_ECG)
309*437bfbebSnyanmisaka p_dec->is_hdr = 1;
310*437bfbebSnyanmisaka break;
311*437bfbebSnyanmisaka case AVS2_MASTERING_DISPLAY_AND_CONTENT_METADATA_EXT_ID:
312*437bfbebSnyanmisaka FUN_CHECK(ret = parse_mastering_display_and_content_meta(bitctx,
313*437bfbebSnyanmisaka &p_dec->display_meta,
314*437bfbebSnyanmisaka &p_dec->content_light));
315*437bfbebSnyanmisaka p_dec->is_hdr = 1;
316*437bfbebSnyanmisaka break;
317*437bfbebSnyanmisaka case AVS2_HDR_DYNAMIC_METADATA_EXT_ID:
318*437bfbebSnyanmisaka FUN_CHECK(ret = parse_hdr_dynamic_meta_extension(bitctx, p_dec->hdr_dynamic_meta));
319*437bfbebSnyanmisaka break;
320*437bfbebSnyanmisaka default:
321*437bfbebSnyanmisaka break;
322*437bfbebSnyanmisaka }
323*437bfbebSnyanmisaka
324*437bfbebSnyanmisaka return ret;
325*437bfbebSnyanmisaka __BITREAD_ERR:
326*437bfbebSnyanmisaka return ret = bitctx->ret;
327*437bfbebSnyanmisaka __FAILED:
328*437bfbebSnyanmisaka return ret;
329*437bfbebSnyanmisaka }
330*437bfbebSnyanmisaka
avs2d_reset_parser(Avs2dCtx_t * p_dec)331*437bfbebSnyanmisaka MPP_RET avs2d_reset_parser(Avs2dCtx_t *p_dec)
332*437bfbebSnyanmisaka {
333*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("In.");
334*437bfbebSnyanmisaka p_dec->got_vsh = 0;
335*437bfbebSnyanmisaka p_dec->got_exh = 0;
336*437bfbebSnyanmisaka p_dec->got_keyframe = 0;
337*437bfbebSnyanmisaka p_dec->enable_wq = 0;
338*437bfbebSnyanmisaka p_dec->new_frame_flag = 0;
339*437bfbebSnyanmisaka p_dec->new_seq_flag = 0;
340*437bfbebSnyanmisaka reset_nalu_buf(p_dec);
341*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Out.");
342*437bfbebSnyanmisaka
343*437bfbebSnyanmisaka return MPP_OK;
344*437bfbebSnyanmisaka }
345*437bfbebSnyanmisaka
346*437bfbebSnyanmisaka /*!
347*437bfbebSnyanmisaka ***********************************************************************
348*437bfbebSnyanmisaka * \brief
349*437bfbebSnyanmisaka * commit buffer to hal
350*437bfbebSnyanmisaka ***********************************************************************
351*437bfbebSnyanmisaka */
avs2d_commit_syntaxs(Avs2dSyntax_t * syntax,HalDecTask * task)352*437bfbebSnyanmisaka MPP_RET avs2d_commit_syntaxs(Avs2dSyntax_t *syntax, HalDecTask *task)
353*437bfbebSnyanmisaka {
354*437bfbebSnyanmisaka task->syntax.number = 1;
355*437bfbebSnyanmisaka task->syntax.data = syntax;
356*437bfbebSnyanmisaka
357*437bfbebSnyanmisaka return MPP_OK;
358*437bfbebSnyanmisaka }
359*437bfbebSnyanmisaka
avs2d_fill_parameters(Avs2dCtx_t * p_dec,Avs2dSyntax_t * syntax)360*437bfbebSnyanmisaka MPP_RET avs2d_fill_parameters(Avs2dCtx_t *p_dec, Avs2dSyntax_t *syntax)
361*437bfbebSnyanmisaka {
362*437bfbebSnyanmisaka RK_S32 i = 0;
363*437bfbebSnyanmisaka Avs2dSeqHeader_t *vsh = &p_dec->vsh;
364*437bfbebSnyanmisaka Avs2dPicHeader_t *ph = &p_dec->ph;
365*437bfbebSnyanmisaka Avs2dFrameMgr_t *mgr = &p_dec->frm_mgr;
366*437bfbebSnyanmisaka PicParams_Avs2d *pp = &syntax->pp;
367*437bfbebSnyanmisaka RefParams_Avs2d *refp = &syntax->refp;
368*437bfbebSnyanmisaka AlfParams_Avs2d *alfp = &syntax->alfp;
369*437bfbebSnyanmisaka WqmParams_Avs2d *wqmp = &syntax->wqmp;
370*437bfbebSnyanmisaka
371*437bfbebSnyanmisaka //!< sequence header
372*437bfbebSnyanmisaka pp->chroma_format_idc = vsh->chroma_format;
373*437bfbebSnyanmisaka pp->pic_width_in_luma_samples = MPP_ALIGN(vsh->horizontal_size, 8);
374*437bfbebSnyanmisaka pp->pic_height_in_luma_samples = MPP_ALIGN(vsh->vertical_size, 8);
375*437bfbebSnyanmisaka pp->bit_depth_luma_minus8 = vsh->bit_depth - 8;
376*437bfbebSnyanmisaka pp->bit_depth_chroma_minus8 = vsh->bit_depth - 8;
377*437bfbebSnyanmisaka pp->lcu_size = vsh->lcu_size;
378*437bfbebSnyanmisaka pp->progressive_sequence = vsh->progressive_sequence;
379*437bfbebSnyanmisaka pp->field_coded_sequence = vsh->field_coded_sequence;
380*437bfbebSnyanmisaka pp->multi_hypothesis_skip_enable_flag = vsh->enable_mhp_skip;
381*437bfbebSnyanmisaka pp->dual_hypothesis_prediction_enable_flag = vsh->enable_dhp;
382*437bfbebSnyanmisaka pp->weighted_skip_enable_flag = vsh->enable_wsm;
383*437bfbebSnyanmisaka pp->asymmetrc_motion_partitions_enable_flag = vsh->enable_amp;
384*437bfbebSnyanmisaka pp->nonsquare_quadtree_transform_enable_flag = vsh->enable_nsqt;
385*437bfbebSnyanmisaka pp->nonsquare_intra_prediction_enable_flag = vsh->enable_nsip;
386*437bfbebSnyanmisaka pp->secondary_transform_enable_flag = vsh->enable_2nd_transform;
387*437bfbebSnyanmisaka pp->sample_adaptive_offset_enable_flag = vsh->enable_sao;
388*437bfbebSnyanmisaka pp->adaptive_loop_filter_enable_flag = vsh->enable_alf;
389*437bfbebSnyanmisaka pp->pmvr_enable_flag = vsh->enable_pmvr;
390*437bfbebSnyanmisaka pp->cross_slice_loopfilter_enable_flag = vsh->enable_clf;
391*437bfbebSnyanmisaka
392*437bfbebSnyanmisaka //!< picture header
393*437bfbebSnyanmisaka pp->picture_type = ph->picture_type;
394*437bfbebSnyanmisaka pp->scene_reference_enable_flag = ph->background_reference_flag;
395*437bfbebSnyanmisaka pp->bottom_field_picture_flag = (vsh->field_coded_sequence) && (!ph->is_top_field);
396*437bfbebSnyanmisaka // pp->bottom_field_picture_flag = !ph->is_top_field;
397*437bfbebSnyanmisaka pp->fixed_picture_qp = ph->fixed_picture_qp;
398*437bfbebSnyanmisaka pp->picture_qp = ph->picture_qp;
399*437bfbebSnyanmisaka pp->loop_filter_disable_flag = !ph->enable_loop_filter;
400*437bfbebSnyanmisaka pp->alpha_c_offset = ph->alpha_c_offset;
401*437bfbebSnyanmisaka pp->beta_offset = ph->beta_offset;
402*437bfbebSnyanmisaka
403*437bfbebSnyanmisaka //!< current poc
404*437bfbebSnyanmisaka pp->cur_poc = ph->poi;
405*437bfbebSnyanmisaka
406*437bfbebSnyanmisaka //!< picture reference params
407*437bfbebSnyanmisaka refp->ref_pic_num = mgr->num_of_ref;
408*437bfbebSnyanmisaka memset(refp->ref_poc_list, -1, sizeof(refp->ref_poc_list));
409*437bfbebSnyanmisaka for (i = 0; i < mgr->num_of_ref; i++) {
410*437bfbebSnyanmisaka refp->ref_poc_list[i] = mgr->refs[i] ? mgr->refs[i]->poi : -1;
411*437bfbebSnyanmisaka }
412*437bfbebSnyanmisaka
413*437bfbebSnyanmisaka //!< picture alf params
414*437bfbebSnyanmisaka alfp->enable_pic_alf_y = ph->enable_pic_alf_y;
415*437bfbebSnyanmisaka alfp->enable_pic_alf_cb = ph->enable_pic_alf_cb;
416*437bfbebSnyanmisaka alfp->enable_pic_alf_cr = ph->enable_pic_alf_cr;
417*437bfbebSnyanmisaka alfp->alf_filter_num_minus1 = (ph->alf_filter_num > 0) ? (ph->alf_filter_num - 1) : 0;
418*437bfbebSnyanmisaka memcpy(alfp->alf_coeff_idx_tab, ph->alf_coeff_idx_tab, sizeof(ph->alf_coeff_idx_tab));
419*437bfbebSnyanmisaka memcpy(alfp->alf_coeff_y, ph->alf_coeff_y, sizeof(ph->alf_coeff_y));
420*437bfbebSnyanmisaka memcpy(alfp->alf_coeff_cb, ph->alf_coeff_cb, sizeof(ph->alf_coeff_cb));
421*437bfbebSnyanmisaka memcpy(alfp->alf_coeff_cr, ph->alf_coeff_cr, sizeof(ph->alf_coeff_cr));
422*437bfbebSnyanmisaka
423*437bfbebSnyanmisaka //!< picture wqm params
424*437bfbebSnyanmisaka wqmp->pic_weight_quant_enable_flag = p_dec->enable_wq;
425*437bfbebSnyanmisaka wqmp->chroma_quant_param_delta_cb = ph->chroma_quant_param_delta_cb;
426*437bfbebSnyanmisaka wqmp->chroma_quant_param_delta_cr = ph->chroma_quant_param_delta_cr;
427*437bfbebSnyanmisaka memcpy(wqmp->wq_matrix, p_dec->cur_wq_matrix, sizeof(p_dec->cur_wq_matrix));
428*437bfbebSnyanmisaka
429*437bfbebSnyanmisaka return MPP_OK;
430*437bfbebSnyanmisaka }
431*437bfbebSnyanmisaka
avs2_split_nalu(Avs2dCtx_t * p_dec,RK_U8 * buf_start,RK_U32 buf_length,RK_U32 over_read,RK_U32 * remain)432*437bfbebSnyanmisaka MPP_RET avs2_split_nalu(Avs2dCtx_t *p_dec, RK_U8 *buf_start, RK_U32 buf_length, RK_U32 over_read, RK_U32 *remain)
433*437bfbebSnyanmisaka {
434*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
435*437bfbebSnyanmisaka
436*437bfbebSnyanmisaka RK_U8 *start_code_ptr = NULL;
437*437bfbebSnyanmisaka RK_U32 start_code = 0;
438*437bfbebSnyanmisaka RK_U32 nalu_len = 0;
439*437bfbebSnyanmisaka
440*437bfbebSnyanmisaka RK_U8 *buf_end;
441*437bfbebSnyanmisaka
442*437bfbebSnyanmisaka buf_end = buf_start + buf_length - 1;
443*437bfbebSnyanmisaka
444*437bfbebSnyanmisaka start_code = avs2_find_start_code(buf_start, buf_end, &start_code_ptr);
445*437bfbebSnyanmisaka
446*437bfbebSnyanmisaka if (start_code_ptr) {
447*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Found start_code 0x%08x at offset 0x%08x, prev_starcode 0x%08x\n",
448*437bfbebSnyanmisaka start_code, start_code_ptr - buf_start, p_dec->prev_start_code);
449*437bfbebSnyanmisaka if (!p_dec->new_seq_flag) {
450*437bfbebSnyanmisaka if (start_code == AVS2_VIDEO_SEQUENCE_START_CODE) {
451*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Found the first video_sequence_start_code");
452*437bfbebSnyanmisaka p_dec->nal_cnt = 0;
453*437bfbebSnyanmisaka avs2_add_nalu_header(p_dec, AVS2_VIDEO_SEQUENCE_START_CODE);
454*437bfbebSnyanmisaka p_dec->new_seq_flag = 1;
455*437bfbebSnyanmisaka p_dec->prev_start_code = AVS2_VIDEO_SEQUENCE_START_CODE;
456*437bfbebSnyanmisaka } else {
457*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Skip start code before first video_sequence_start_code");
458*437bfbebSnyanmisaka }
459*437bfbebSnyanmisaka
460*437bfbebSnyanmisaka *remain = buf_end - start_code_ptr;
461*437bfbebSnyanmisaka } else {
462*437bfbebSnyanmisaka if (start_code == AVS2_VIDEO_SEQUENCE_START_CODE) {
463*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Found repeated video_sequence_start_code");
464*437bfbebSnyanmisaka }
465*437bfbebSnyanmisaka
466*437bfbebSnyanmisaka if (AVS2_IS_START_CODE(p_dec->prev_start_code) && p_dec->prev_start_code != AVS2_USER_DATA_START_CODE) {
467*437bfbebSnyanmisaka nalu_len = start_code_ptr - buf_start - 3;
468*437bfbebSnyanmisaka if (nalu_len > over_read) {
469*437bfbebSnyanmisaka store_nalu(p_dec, buf_start + over_read, nalu_len - over_read, p_dec->prev_start_code);
470*437bfbebSnyanmisaka }
471*437bfbebSnyanmisaka }
472*437bfbebSnyanmisaka
473*437bfbebSnyanmisaka if (AVS2_IS_SLICE_START_CODE(p_dec->prev_start_code) && !AVS2_IS_SLICE_START_CODE(start_code)) {
474*437bfbebSnyanmisaka p_dec->new_frame_flag = 1;
475*437bfbebSnyanmisaka p_dec->p_nals[p_dec->nal_cnt - 1].eof = 1;
476*437bfbebSnyanmisaka *remain = buf_end - start_code_ptr + 4;
477*437bfbebSnyanmisaka } else {
478*437bfbebSnyanmisaka if (start_code != AVS2_USER_DATA_START_CODE)
479*437bfbebSnyanmisaka avs2_add_nalu_header(p_dec, start_code);
480*437bfbebSnyanmisaka
481*437bfbebSnyanmisaka // need to put slice start code to stream buffer
482*437bfbebSnyanmisaka if (AVS2_IS_SLICE_START_CODE(start_code)) {
483*437bfbebSnyanmisaka store_nalu(p_dec, start_code_ptr - 3, 4, start_code);
484*437bfbebSnyanmisaka } else if (start_code == AVS2_VIDEO_SEQUENCE_END_CODE) {
485*437bfbebSnyanmisaka p_dec->p_nals[p_dec->nal_cnt - 1].eof = 1;
486*437bfbebSnyanmisaka }
487*437bfbebSnyanmisaka
488*437bfbebSnyanmisaka *remain = buf_end - start_code_ptr;
489*437bfbebSnyanmisaka }
490*437bfbebSnyanmisaka
491*437bfbebSnyanmisaka p_dec->prev_start_code = start_code;
492*437bfbebSnyanmisaka }
493*437bfbebSnyanmisaka } else {
494*437bfbebSnyanmisaka if (!p_dec->new_seq_flag) {
495*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Skip data code before first video_sequence_start_code");
496*437bfbebSnyanmisaka } else {
497*437bfbebSnyanmisaka if (AVS2_IS_START_CODE(p_dec->prev_start_code)) {
498*437bfbebSnyanmisaka nalu_len = buf_length;
499*437bfbebSnyanmisaka if (nalu_len > over_read) {
500*437bfbebSnyanmisaka store_nalu(p_dec, buf_start + over_read, nalu_len - over_read, p_dec->prev_start_code);
501*437bfbebSnyanmisaka }
502*437bfbebSnyanmisaka }
503*437bfbebSnyanmisaka }
504*437bfbebSnyanmisaka
505*437bfbebSnyanmisaka *remain = 0;
506*437bfbebSnyanmisaka }
507*437bfbebSnyanmisaka
508*437bfbebSnyanmisaka return ret;
509*437bfbebSnyanmisaka }
510*437bfbebSnyanmisaka
avs2d_parse_prepare_split(Avs2dCtx_t * p_dec,MppPacket * pkt,HalDecTask * task)511*437bfbebSnyanmisaka MPP_RET avs2d_parse_prepare_split(Avs2dCtx_t *p_dec, MppPacket *pkt, HalDecTask *task)
512*437bfbebSnyanmisaka {
513*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
514*437bfbebSnyanmisaka RK_U8 *p_curdata = NULL;
515*437bfbebSnyanmisaka RK_U8 *p_start = NULL;
516*437bfbebSnyanmisaka RK_U8 *p_end = NULL;
517*437bfbebSnyanmisaka RK_U32 pkt_length = 0;
518*437bfbebSnyanmisaka RK_U32 first_read_length = 0;
519*437bfbebSnyanmisaka
520*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("In.");
521*437bfbebSnyanmisaka
522*437bfbebSnyanmisaka pkt_length = (RK_U32) mpp_packet_get_length(pkt);
523*437bfbebSnyanmisaka
524*437bfbebSnyanmisaka p_curdata = p_start = (RK_U8 *) mpp_packet_get_pos(pkt);
525*437bfbebSnyanmisaka p_end = p_start + pkt_length - 1;
526*437bfbebSnyanmisaka
527*437bfbebSnyanmisaka // Combine last packet data
528*437bfbebSnyanmisaka first_read_length = (pkt_length >= 4) ? 4 : pkt_length;
529*437bfbebSnyanmisaka memcpy(p_dec->prev_tail_data + 3, p_curdata, first_read_length);
530*437bfbebSnyanmisaka
531*437bfbebSnyanmisaka RK_U32 remain = 0;
532*437bfbebSnyanmisaka
533*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("previous data[0~3]=%02x %02x %02x, first_read_length %d\n",
534*437bfbebSnyanmisaka p_dec->prev_tail_data[0], p_dec->prev_tail_data[1],
535*437bfbebSnyanmisaka p_dec->prev_tail_data[2], first_read_length);
536*437bfbebSnyanmisaka ret = avs2_split_nalu(p_dec, p_dec->prev_tail_data,
537*437bfbebSnyanmisaka AVS2D_PACKET_SPLIT_CHECKER_BUFFER_SIZE,
538*437bfbebSnyanmisaka AVS2D_PACKET_SPLIT_LAST_KEPT_LENGTH,
539*437bfbebSnyanmisaka &remain);
540*437bfbebSnyanmisaka p_curdata = p_start + first_read_length - remain;
541*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("remian length %d\n", remain);
542*437bfbebSnyanmisaka
543*437bfbebSnyanmisaka remain = 0;
544*437bfbebSnyanmisaka
545*437bfbebSnyanmisaka while (p_curdata < p_end) {
546*437bfbebSnyanmisaka ret = avs2_split_nalu(p_dec, p_curdata, p_end - p_curdata + 1, 0, &remain);
547*437bfbebSnyanmisaka
548*437bfbebSnyanmisaka if (ret) {
549*437bfbebSnyanmisaka break;
550*437bfbebSnyanmisaka } else {
551*437bfbebSnyanmisaka p_curdata = p_end - remain + 1;
552*437bfbebSnyanmisaka }
553*437bfbebSnyanmisaka
554*437bfbebSnyanmisaka if (p_dec->new_frame_flag || (p_dec->nal_cnt > 1 && p_dec->p_nals[p_dec->nal_cnt - 1].eof == 1)) {
555*437bfbebSnyanmisaka task->valid = 1;
556*437bfbebSnyanmisaka break;
557*437bfbebSnyanmisaka }
558*437bfbebSnyanmisaka }
559*437bfbebSnyanmisaka
560*437bfbebSnyanmisaka mpp_packet_set_pos(pkt, p_curdata);
561*437bfbebSnyanmisaka
562*437bfbebSnyanmisaka if (remain == 0) {
563*437bfbebSnyanmisaka memset(p_dec->prev_tail_data, 0xff, 3);
564*437bfbebSnyanmisaka
565*437bfbebSnyanmisaka if (pkt_length >= 3) {
566*437bfbebSnyanmisaka p_dec->prev_tail_data[0] = p_end[0];
567*437bfbebSnyanmisaka p_dec->prev_tail_data[1] = p_end[-1];
568*437bfbebSnyanmisaka p_dec->prev_tail_data[2] = p_end[-2];
569*437bfbebSnyanmisaka }
570*437bfbebSnyanmisaka }
571*437bfbebSnyanmisaka
572*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Out.");
573*437bfbebSnyanmisaka return ret;
574*437bfbebSnyanmisaka }
575*437bfbebSnyanmisaka
576*437bfbebSnyanmisaka /**
577*437bfbebSnyanmisaka * @brief Every packet is a complete frame.
578*437bfbebSnyanmisaka * So we don't have to do combine data from different packet.
579*437bfbebSnyanmisaka *
580*437bfbebSnyanmisaka * @param p_dec
581*437bfbebSnyanmisaka * @param pkt
582*437bfbebSnyanmisaka * @param task
583*437bfbebSnyanmisaka * @return MPP_RET
584*437bfbebSnyanmisaka */
avs2d_parse_prepare_fast(Avs2dCtx_t * p_dec,MppPacket * pkt,HalDecTask * task)585*437bfbebSnyanmisaka MPP_RET avs2d_parse_prepare_fast(Avs2dCtx_t *p_dec, MppPacket *pkt, HalDecTask *task)
586*437bfbebSnyanmisaka {
587*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
588*437bfbebSnyanmisaka RK_U8 *p_curdata = NULL;
589*437bfbebSnyanmisaka RK_U8 *p_start = NULL;
590*437bfbebSnyanmisaka RK_U8 *p_end = NULL;
591*437bfbebSnyanmisaka RK_U32 pkt_length = 0;
592*437bfbebSnyanmisaka RK_U32 remain = 0;
593*437bfbebSnyanmisaka
594*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("In.");
595*437bfbebSnyanmisaka
596*437bfbebSnyanmisaka pkt_length = (RK_U32) mpp_packet_get_length(pkt);
597*437bfbebSnyanmisaka
598*437bfbebSnyanmisaka p_curdata = p_start = (RK_U8 *) mpp_packet_get_pos(pkt);
599*437bfbebSnyanmisaka p_end = p_start + pkt_length - 1;
600*437bfbebSnyanmisaka
601*437bfbebSnyanmisaka while (p_curdata < p_end) {
602*437bfbebSnyanmisaka ret = avs2_split_nalu(p_dec, p_curdata, p_end - p_curdata + 1, 0, &remain);
603*437bfbebSnyanmisaka
604*437bfbebSnyanmisaka if (ret) {
605*437bfbebSnyanmisaka break;
606*437bfbebSnyanmisaka } else {
607*437bfbebSnyanmisaka p_curdata = p_end - remain + 1;
608*437bfbebSnyanmisaka }
609*437bfbebSnyanmisaka
610*437bfbebSnyanmisaka if (p_dec->new_frame_flag || (p_dec->nal_cnt && (p_dec->p_nals[p_dec->nal_cnt - 1].eof == 1))
611*437bfbebSnyanmisaka || p_curdata >= p_end) {
612*437bfbebSnyanmisaka task->valid = 1;
613*437bfbebSnyanmisaka break;
614*437bfbebSnyanmisaka }
615*437bfbebSnyanmisaka }
616*437bfbebSnyanmisaka
617*437bfbebSnyanmisaka // sequence_end_code and video_edit_code at the end of a packet will be ignored.
618*437bfbebSnyanmisaka mpp_packet_set_pos(pkt, p_end + 1);
619*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("after split, remain %d, task->valid %d\n", remain, task->valid);
620*437bfbebSnyanmisaka
621*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Out.");
622*437bfbebSnyanmisaka return ret;
623*437bfbebSnyanmisaka }
624*437bfbebSnyanmisaka
avs2d_parse_stream(Avs2dCtx_t * p_dec,HalDecTask * task)625*437bfbebSnyanmisaka MPP_RET avs2d_parse_stream(Avs2dCtx_t *p_dec, HalDecTask *task)
626*437bfbebSnyanmisaka {
627*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
628*437bfbebSnyanmisaka Avs2dNalu_t *p_nalu = p_dec->p_nals;
629*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("In.");
630*437bfbebSnyanmisaka RK_U32 i = 0;
631*437bfbebSnyanmisaka for (i = 0 ; i < p_dec->nal_cnt; i++) {
632*437bfbebSnyanmisaka RK_U32 startcode = p_nalu->header;
633*437bfbebSnyanmisaka
634*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("start code[%d] 0x%08x\n", i, startcode);
635*437bfbebSnyanmisaka if (!AVS2_IS_SLICE_START_CODE(startcode)) {
636*437bfbebSnyanmisaka RK_U8 *data_ptr = p_dec->p_header->pbuf + p_nalu->data_pos;
637*437bfbebSnyanmisaka memset(&p_dec->bitctx, 0, sizeof(BitReadCtx_t));
638*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("bitread ctx, pos %d, length %d\n", p_nalu->data_pos, p_nalu->length);
639*437bfbebSnyanmisaka mpp_set_bitread_ctx(&p_dec->bitctx, data_ptr, p_nalu->length);
640*437bfbebSnyanmisaka mpp_set_bitread_pseudo_code_type(&p_dec->bitctx, PSEUDO_CODE_AVS2);
641*437bfbebSnyanmisaka }
642*437bfbebSnyanmisaka
643*437bfbebSnyanmisaka switch (startcode) {
644*437bfbebSnyanmisaka case AVS2_VIDEO_SEQUENCE_START_CODE:
645*437bfbebSnyanmisaka ret = avs2d_parse_sequence_header(p_dec);
646*437bfbebSnyanmisaka if (ret == MPP_OK) {
647*437bfbebSnyanmisaka p_dec->got_vsh = 1;
648*437bfbebSnyanmisaka
649*437bfbebSnyanmisaka if (p_dec->new_seq_flag && !p_dec->frm_mgr.initial_flag) {
650*437bfbebSnyanmisaka avs2d_dpb_create(p_dec);
651*437bfbebSnyanmisaka }
652*437bfbebSnyanmisaka }
653*437bfbebSnyanmisaka p_dec->got_exh = 0;
654*437bfbebSnyanmisaka break;
655*437bfbebSnyanmisaka case AVS2_I_PICTURE_START_CODE:
656*437bfbebSnyanmisaka case AVS2_PB_PICTURE_START_CODE:
657*437bfbebSnyanmisaka ret = avs2d_parse_picture_header(p_dec, startcode);
658*437bfbebSnyanmisaka break;
659*437bfbebSnyanmisaka case AVS2_EXTENSION_START_CODE:
660*437bfbebSnyanmisaka ret = parse_extension_header(p_dec, &p_dec->bitctx);
661*437bfbebSnyanmisaka break;
662*437bfbebSnyanmisaka case AVS2_USER_DATA_START_CODE:
663*437bfbebSnyanmisaka case AVS2_VIDEO_SEQUENCE_END_CODE:
664*437bfbebSnyanmisaka case AVS2_VIDEO_EDIT_CODE:
665*437bfbebSnyanmisaka break;
666*437bfbebSnyanmisaka default:
667*437bfbebSnyanmisaka if (AVS2_IS_SLICE_START_CODE(startcode)) {
668*437bfbebSnyanmisaka task->valid = 1;
669*437bfbebSnyanmisaka }
670*437bfbebSnyanmisaka
671*437bfbebSnyanmisaka break;
672*437bfbebSnyanmisaka }
673*437bfbebSnyanmisaka
674*437bfbebSnyanmisaka p_nalu++;
675*437bfbebSnyanmisaka }
676*437bfbebSnyanmisaka
677*437bfbebSnyanmisaka reset_nalu_buf(p_dec);
678*437bfbebSnyanmisaka
679*437bfbebSnyanmisaka AVS2D_PARSE_TRACE("Out. task->valid = %d", task->valid);
680*437bfbebSnyanmisaka return ret;
681*437bfbebSnyanmisaka }
682