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