xref: /rockchip-linux_mpp/mpp/codec/dec/avs2/avs2d_api.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_api"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <stdio.h>
20*437bfbebSnyanmisaka #include <stdlib.h>
21*437bfbebSnyanmisaka #include <string.h>
22*437bfbebSnyanmisaka 
23*437bfbebSnyanmisaka #include "mpp_mem.h"
24*437bfbebSnyanmisaka #include "mpp_log.h"
25*437bfbebSnyanmisaka #include "mpp_debug.h"
26*437bfbebSnyanmisaka #include "mpp_env.h"
27*437bfbebSnyanmisaka #include "mpp_packet_impl.h"
28*437bfbebSnyanmisaka #include "mpp_buffer_impl.h"
29*437bfbebSnyanmisaka 
30*437bfbebSnyanmisaka #include "avs2d_syntax.h"
31*437bfbebSnyanmisaka #include "avs2d_api.h"
32*437bfbebSnyanmisaka #include "avs2d_parse.h"
33*437bfbebSnyanmisaka #include "avs2d_dpb.h"
34*437bfbebSnyanmisaka #include "mpp_dec_cb_param.h"
35*437bfbebSnyanmisaka 
36*437bfbebSnyanmisaka // for avs2d max ctu size 64
rkv_ctu_64_align(RK_U32 val)37*437bfbebSnyanmisaka static RK_U32 rkv_ctu_64_align(RK_U32 val)
38*437bfbebSnyanmisaka {
39*437bfbebSnyanmisaka     return MPP_ALIGN(val, 64);
40*437bfbebSnyanmisaka }
41*437bfbebSnyanmisaka 
42*437bfbebSnyanmisaka RK_U32 avs2d_parse_debug = 0;
43*437bfbebSnyanmisaka 
avs2d_deinit(void * decoder)44*437bfbebSnyanmisaka MPP_RET avs2d_deinit(void *decoder)
45*437bfbebSnyanmisaka {
46*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
47*437bfbebSnyanmisaka     Avs2dCtx_t *p_dec = (Avs2dCtx_t *)decoder;
48*437bfbebSnyanmisaka 
49*437bfbebSnyanmisaka     INP_CHECK(ret, !decoder);
50*437bfbebSnyanmisaka     AVS2D_PARSE_TRACE("In.");
51*437bfbebSnyanmisaka 
52*437bfbebSnyanmisaka     MPP_FREE(p_dec->p_stream->pbuf);
53*437bfbebSnyanmisaka     MPP_FREE(p_dec->p_header->pbuf);
54*437bfbebSnyanmisaka     MPP_FREE(p_dec->mem);
55*437bfbebSnyanmisaka     MPP_FREE(p_dec->p_nals);
56*437bfbebSnyanmisaka     mpp_packet_deinit(&p_dec->task_pkt);
57*437bfbebSnyanmisaka     avs2d_dpb_destroy(p_dec);
58*437bfbebSnyanmisaka 
59*437bfbebSnyanmisaka __RETURN:
60*437bfbebSnyanmisaka     AVS2D_PARSE_TRACE("Out.");
61*437bfbebSnyanmisaka     return ret;
62*437bfbebSnyanmisaka }
63*437bfbebSnyanmisaka 
avs2d_init(void * decoder,ParserCfg * init)64*437bfbebSnyanmisaka MPP_RET avs2d_init(void *decoder, ParserCfg *init)
65*437bfbebSnyanmisaka {
66*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
67*437bfbebSnyanmisaka     Avs2dCtx_t *p_dec = (Avs2dCtx_t *)decoder;
68*437bfbebSnyanmisaka 
69*437bfbebSnyanmisaka     AVS2D_PARSE_TRACE("In.");
70*437bfbebSnyanmisaka     INP_CHECK(ret, !p_dec);
71*437bfbebSnyanmisaka 
72*437bfbebSnyanmisaka     memset(p_dec, 0, sizeof(Avs2dCtx_t));
73*437bfbebSnyanmisaka     mpp_env_get_u32("avs2d_debug", &avs2d_parse_debug, 0);
74*437bfbebSnyanmisaka     //!< restore init parameters
75*437bfbebSnyanmisaka     p_dec->init = *init;
76*437bfbebSnyanmisaka     // p_dec->init.cfg->base.split_parse = 1;
77*437bfbebSnyanmisaka     p_dec->frame_slots = init->frame_slots;
78*437bfbebSnyanmisaka     p_dec->packet_slots = init->packet_slots;
79*437bfbebSnyanmisaka     //!< decoder parameters
80*437bfbebSnyanmisaka     mpp_buf_slot_setup(p_dec->frame_slots, AVS2_MAX_BUF_NUM);
81*437bfbebSnyanmisaka 
82*437bfbebSnyanmisaka     p_dec->mem = mpp_calloc(Avs2dMemory_t, 1);
83*437bfbebSnyanmisaka     MEM_CHECK(ret, p_dec->mem);
84*437bfbebSnyanmisaka     p_dec->p_header = &p_dec->mem->headerbuf;
85*437bfbebSnyanmisaka     p_dec->p_header->size = MAX_HEADER_SIZE;
86*437bfbebSnyanmisaka     p_dec->p_header->pbuf = mpp_calloc(RK_U8, p_dec->p_header->size);
87*437bfbebSnyanmisaka     MEM_CHECK(ret, p_dec->p_header->pbuf);
88*437bfbebSnyanmisaka 
89*437bfbebSnyanmisaka     p_dec->p_stream = &p_dec->mem->streambuf;
90*437bfbebSnyanmisaka     p_dec->p_stream->size = MAX_STREAM_SIZE;
91*437bfbebSnyanmisaka     p_dec->p_stream->pbuf = mpp_calloc(RK_U8, p_dec->p_stream->size);
92*437bfbebSnyanmisaka     MEM_CHECK(ret, p_dec->p_stream->pbuf);
93*437bfbebSnyanmisaka 
94*437bfbebSnyanmisaka     p_dec->p_nals = mpp_calloc(Avs2dNalu_t, MAX_NALU_NUM);
95*437bfbebSnyanmisaka     MEM_CHECK(ret, p_dec->p_nals);
96*437bfbebSnyanmisaka     p_dec->nal_allocated = MAX_NALU_NUM;
97*437bfbebSnyanmisaka     p_dec->nal_cnt = 0;
98*437bfbebSnyanmisaka 
99*437bfbebSnyanmisaka     mpp_packet_init(&p_dec->task_pkt, p_dec->p_stream->pbuf, p_dec->p_stream->size);
100*437bfbebSnyanmisaka     mpp_packet_set_length(p_dec->task_pkt, 0);
101*437bfbebSnyanmisaka     MEM_CHECK(ret, p_dec->task_pkt);
102*437bfbebSnyanmisaka 
103*437bfbebSnyanmisaka     mpp_slots_set_prop(p_dec->frame_slots, SLOTS_WIDTH_ALIGN, rkv_ctu_64_align);
104*437bfbebSnyanmisaka 
105*437bfbebSnyanmisaka __RETURN:
106*437bfbebSnyanmisaka     AVS2D_PARSE_TRACE("Out.");
107*437bfbebSnyanmisaka     return ret;
108*437bfbebSnyanmisaka __FAILED:
109*437bfbebSnyanmisaka     avs2d_deinit(decoder);
110*437bfbebSnyanmisaka 
111*437bfbebSnyanmisaka     return ret;
112*437bfbebSnyanmisaka }
113*437bfbebSnyanmisaka 
avs2d_reset(void * decoder)114*437bfbebSnyanmisaka MPP_RET avs2d_reset(void *decoder)
115*437bfbebSnyanmisaka {
116*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
117*437bfbebSnyanmisaka     Avs2dCtx_t *p_dec = (Avs2dCtx_t *)decoder;
118*437bfbebSnyanmisaka 
119*437bfbebSnyanmisaka     AVS2D_PARSE_TRACE("In.");
120*437bfbebSnyanmisaka 
121*437bfbebSnyanmisaka     //!< flush dpb
122*437bfbebSnyanmisaka     avs2d_dpb_flush(p_dec);
123*437bfbebSnyanmisaka 
124*437bfbebSnyanmisaka     //!< reset parser parameters
125*437bfbebSnyanmisaka     avs2d_reset_parser(p_dec);
126*437bfbebSnyanmisaka 
127*437bfbebSnyanmisaka     //!< reset decoder parameters
128*437bfbebSnyanmisaka     p_dec->pkt_no      = 0;
129*437bfbebSnyanmisaka     p_dec->frame_no    = 0;
130*437bfbebSnyanmisaka     p_dec->has_get_eos = 0;
131*437bfbebSnyanmisaka 
132*437bfbebSnyanmisaka     AVS2D_PARSE_TRACE("Out.");
133*437bfbebSnyanmisaka     return ret;
134*437bfbebSnyanmisaka }
135*437bfbebSnyanmisaka 
avs2d_flush(void * decoder)136*437bfbebSnyanmisaka MPP_RET avs2d_flush(void *decoder)
137*437bfbebSnyanmisaka {
138*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
139*437bfbebSnyanmisaka     Avs2dCtx_t *p_dec = (Avs2dCtx_t *)decoder;
140*437bfbebSnyanmisaka     AVS2D_PARSE_TRACE("In.");
141*437bfbebSnyanmisaka 
142*437bfbebSnyanmisaka     dpb_remove_unused_frame(p_dec);
143*437bfbebSnyanmisaka 
144*437bfbebSnyanmisaka     AVS2D_PARSE_TRACE("Out.");
145*437bfbebSnyanmisaka     return ret;
146*437bfbebSnyanmisaka }
147*437bfbebSnyanmisaka 
avs2d_control(void * decoder,MpiCmd cmd_type,void * param)148*437bfbebSnyanmisaka MPP_RET avs2d_control(void *decoder, MpiCmd cmd_type, void *param)
149*437bfbebSnyanmisaka {
150*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
151*437bfbebSnyanmisaka 
152*437bfbebSnyanmisaka     AVS2D_PARSE_TRACE("In.");
153*437bfbebSnyanmisaka     (void)decoder;
154*437bfbebSnyanmisaka     (void)cmd_type;
155*437bfbebSnyanmisaka     (void)param;
156*437bfbebSnyanmisaka     AVS2D_PARSE_TRACE("Out.");
157*437bfbebSnyanmisaka     return ret;
158*437bfbebSnyanmisaka }
159*437bfbebSnyanmisaka 
160*437bfbebSnyanmisaka 
avs2d_prepare(void * decoder,MppPacket pkt,HalDecTask * task)161*437bfbebSnyanmisaka MPP_RET avs2d_prepare(void *decoder, MppPacket pkt, HalDecTask *task)
162*437bfbebSnyanmisaka {
163*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
164*437bfbebSnyanmisaka     Avs2dCtx_t *p_dec = (Avs2dCtx_t *)decoder;
165*437bfbebSnyanmisaka     RK_S64 pts = -1;
166*437bfbebSnyanmisaka     RK_S64 dts = -1;
167*437bfbebSnyanmisaka     RK_U32 length = 0;
168*437bfbebSnyanmisaka     RK_U32 pkt_eos = 0;
169*437bfbebSnyanmisaka 
170*437bfbebSnyanmisaka     AVS2D_PARSE_TRACE("In.");
171*437bfbebSnyanmisaka     INP_CHECK(ret, !decoder && !pkt && !task);
172*437bfbebSnyanmisaka 
173*437bfbebSnyanmisaka     task->valid = 0;
174*437bfbebSnyanmisaka 
175*437bfbebSnyanmisaka     pkt_eos = mpp_packet_get_eos(pkt);
176*437bfbebSnyanmisaka 
177*437bfbebSnyanmisaka     pts = mpp_packet_get_pts(pkt);
178*437bfbebSnyanmisaka     dts = mpp_packet_get_dts(pkt);
179*437bfbebSnyanmisaka     length = (RK_U32)mpp_packet_get_length(pkt);
180*437bfbebSnyanmisaka 
181*437bfbebSnyanmisaka     AVS2D_DBG(AVS2D_DBG_INPUT, "[pkt_in_timeUs] in_pts=%lld, dts=%lld, len=%d, eos=%d, pkt_no=%lld\n",
182*437bfbebSnyanmisaka               pts, dts, length, pkt_eos, p_dec->pkt_no);
183*437bfbebSnyanmisaka     p_dec->pkt_no++;
184*437bfbebSnyanmisaka 
185*437bfbebSnyanmisaka     AVS2D_DBG(AVS2D_DBG_INPUT, "packet length %d, eos %d\n", length, pkt_eos);
186*437bfbebSnyanmisaka 
187*437bfbebSnyanmisaka     if (pkt_eos) {
188*437bfbebSnyanmisaka         p_dec->has_get_eos = 1;
189*437bfbebSnyanmisaka         task->flags.eos = 1;
190*437bfbebSnyanmisaka     }
191*437bfbebSnyanmisaka 
192*437bfbebSnyanmisaka     if (!length) {
193*437bfbebSnyanmisaka         AVS2D_PARSE_TRACE("Input have no stream.");
194*437bfbebSnyanmisaka         task->valid = 0;
195*437bfbebSnyanmisaka 
196*437bfbebSnyanmisaka         if (pkt_eos)
197*437bfbebSnyanmisaka             avs2d_dpb_flush(p_dec);
198*437bfbebSnyanmisaka 
199*437bfbebSnyanmisaka         goto __RETURN;
200*437bfbebSnyanmisaka     }
201*437bfbebSnyanmisaka 
202*437bfbebSnyanmisaka     if (!p_dec->init.cfg->base.split_parse) {
203*437bfbebSnyanmisaka         ret = avs2d_parse_prepare_fast(p_dec, pkt, task);
204*437bfbebSnyanmisaka     } else {
205*437bfbebSnyanmisaka         ret = avs2d_parse_prepare_split(p_dec, pkt, task);
206*437bfbebSnyanmisaka     }
207*437bfbebSnyanmisaka 
208*437bfbebSnyanmisaka     if (task->valid) {
209*437bfbebSnyanmisaka         //!< bit stream
210*437bfbebSnyanmisaka         RK_U32 align_len = MPP_ALIGN(p_dec->p_stream->len + 32, 16);
211*437bfbebSnyanmisaka 
212*437bfbebSnyanmisaka         mpp_assert(p_dec->p_stream->size > align_len);
213*437bfbebSnyanmisaka         memset(p_dec->p_stream->pbuf + p_dec->p_stream->len,
214*437bfbebSnyanmisaka                0, align_len - p_dec->p_stream->len);
215*437bfbebSnyanmisaka 
216*437bfbebSnyanmisaka         p_dec->syntax.bitstream_size = align_len;
217*437bfbebSnyanmisaka         p_dec->syntax.bitstream = p_dec->p_stream->pbuf;
218*437bfbebSnyanmisaka 
219*437bfbebSnyanmisaka         mpp_packet_set_data(p_dec->task_pkt, p_dec->syntax.bitstream);
220*437bfbebSnyanmisaka         mpp_packet_set_length(p_dec->task_pkt, p_dec->syntax.bitstream_size);
221*437bfbebSnyanmisaka         mpp_packet_set_size(p_dec->task_pkt, p_dec->p_stream->size);
222*437bfbebSnyanmisaka 
223*437bfbebSnyanmisaka         mpp_packet_set_pts(p_dec->task_pkt, mpp_packet_get_pts(pkt));
224*437bfbebSnyanmisaka         mpp_packet_set_dts(p_dec->task_pkt, mpp_packet_get_dts(pkt));
225*437bfbebSnyanmisaka         task->input_packet = p_dec->task_pkt;
226*437bfbebSnyanmisaka 
227*437bfbebSnyanmisaka         p_dec->p_stream->len = 0;
228*437bfbebSnyanmisaka         p_dec->p_header->len = 0;
229*437bfbebSnyanmisaka     } else {
230*437bfbebSnyanmisaka         task->input_packet = NULL;
231*437bfbebSnyanmisaka     }
232*437bfbebSnyanmisaka 
233*437bfbebSnyanmisaka __RETURN:
234*437bfbebSnyanmisaka     AVS2D_PARSE_TRACE("Out.");
235*437bfbebSnyanmisaka     return ret;
236*437bfbebSnyanmisaka }
237*437bfbebSnyanmisaka 
avs2d_parse(void * decoder,HalDecTask * task)238*437bfbebSnyanmisaka MPP_RET avs2d_parse(void *decoder, HalDecTask *task)
239*437bfbebSnyanmisaka {
240*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
241*437bfbebSnyanmisaka     Avs2dCtx_t *p_dec = (Avs2dCtx_t *)decoder;
242*437bfbebSnyanmisaka     AVS2D_PARSE_TRACE("In.");
243*437bfbebSnyanmisaka 
244*437bfbebSnyanmisaka     task->valid = 0;
245*437bfbebSnyanmisaka 
246*437bfbebSnyanmisaka     ret = avs2d_parse_stream(p_dec, task);
247*437bfbebSnyanmisaka     if (ret) {
248*437bfbebSnyanmisaka         mpp_err_f("Parse stream failed!");
249*437bfbebSnyanmisaka     }
250*437bfbebSnyanmisaka     if (task->valid) {
251*437bfbebSnyanmisaka         AVS2D_PARSE_TRACE("-------- Frame %lld--------", p_dec->frame_no);
252*437bfbebSnyanmisaka         avs2d_dpb_insert(p_dec, task);
253*437bfbebSnyanmisaka         avs2d_fill_parameters(p_dec, &p_dec->syntax);
254*437bfbebSnyanmisaka         avs2d_commit_syntaxs(&p_dec->syntax, task);
255*437bfbebSnyanmisaka         AVS2D_PARSE_TRACE("--------------------------");
256*437bfbebSnyanmisaka     } else {
257*437bfbebSnyanmisaka         task->flags.parse_err = 1;
258*437bfbebSnyanmisaka     }
259*437bfbebSnyanmisaka 
260*437bfbebSnyanmisaka     if (p_dec->has_get_eos)
261*437bfbebSnyanmisaka         avs2d_dpb_flush(p_dec);
262*437bfbebSnyanmisaka 
263*437bfbebSnyanmisaka     AVS2D_PARSE_TRACE("Out.");
264*437bfbebSnyanmisaka 
265*437bfbebSnyanmisaka     return ret;
266*437bfbebSnyanmisaka }
267*437bfbebSnyanmisaka 
avs2d_callback(void * decoder,void * info)268*437bfbebSnyanmisaka MPP_RET avs2d_callback(void *decoder, void *info)
269*437bfbebSnyanmisaka {
270*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
271*437bfbebSnyanmisaka     Avs2dCtx_t *p_dec = (Avs2dCtx_t *)decoder;
272*437bfbebSnyanmisaka     DecCbHalDone *ctx = (DecCbHalDone *)info;
273*437bfbebSnyanmisaka     HalDecTask *task_dec = (HalDecTask *)ctx->task;
274*437bfbebSnyanmisaka     MppFrame mframe = NULL;
275*437bfbebSnyanmisaka     MppFrame ref_frm = NULL;
276*437bfbebSnyanmisaka     RK_U32 i = 0;
277*437bfbebSnyanmisaka     RK_U32 error = 0;
278*437bfbebSnyanmisaka     RK_U32 discard = 0;
279*437bfbebSnyanmisaka     RK_U32 ref_used = task_dec->flags.ref_info_valid ? task_dec->flags.ref_used : 0xff;
280*437bfbebSnyanmisaka     RK_U32 ref_used_flag = 0;
281*437bfbebSnyanmisaka 
282*437bfbebSnyanmisaka     AVS2D_PARSE_TRACE("In.");
283*437bfbebSnyanmisaka     mpp_buf_slot_get_prop(p_dec->frame_slots, task_dec->output, SLOT_FRAME_PTR, &mframe);
284*437bfbebSnyanmisaka 
285*437bfbebSnyanmisaka     if (!mframe) {
286*437bfbebSnyanmisaka         ret = MPP_ERR_UNKNOW;
287*437bfbebSnyanmisaka         AVS2D_DBG(AVS2D_DBG_CALLBACK, "[CALLBACK]: failed to get frame\n");
288*437bfbebSnyanmisaka         goto __FAILED;
289*437bfbebSnyanmisaka     }
290*437bfbebSnyanmisaka 
291*437bfbebSnyanmisaka     if (ctx->hard_err || task_dec->flags.ref_err) {
292*437bfbebSnyanmisaka         if (task_dec->flags.used_for_ref) {
293*437bfbebSnyanmisaka             error = 1;
294*437bfbebSnyanmisaka         } else {
295*437bfbebSnyanmisaka             discard = 1;
296*437bfbebSnyanmisaka         }
297*437bfbebSnyanmisaka     } else {
298*437bfbebSnyanmisaka         if (task_dec->flags.ref_miss & ref_used) {
299*437bfbebSnyanmisaka             discard = 1;
300*437bfbebSnyanmisaka             AVS2D_DBG(AVS2D_DBG_CALLBACK, "[CALLBACK]: fake ref used, miss 0x%x used 0x%x\n",
301*437bfbebSnyanmisaka                       task_dec->flags.ref_miss, ref_used);
302*437bfbebSnyanmisaka         }
303*437bfbebSnyanmisaka     }
304*437bfbebSnyanmisaka 
305*437bfbebSnyanmisaka     for (i = 0; i < AVS2_MAX_REFS; i++) {
306*437bfbebSnyanmisaka         if (task_dec->refer[i] < 0)
307*437bfbebSnyanmisaka             continue;
308*437bfbebSnyanmisaka 
309*437bfbebSnyanmisaka         mpp_buf_slot_get_prop(p_dec->frame_slots, task_dec->refer[i], SLOT_FRAME_PTR, &ref_frm);
310*437bfbebSnyanmisaka         if (!ref_frm)
311*437bfbebSnyanmisaka             continue;
312*437bfbebSnyanmisaka 
313*437bfbebSnyanmisaka         ref_used_flag = (ref_used >> i) & 1;
314*437bfbebSnyanmisaka         //TODO: In fast mode, ref list isn't kept sync with task flag.ref_used
315*437bfbebSnyanmisaka         AVS2D_DBG(AVS2D_DBG_CALLBACK, "[CALLBACK]: ref_frm poc %d, err %d, dis %d, ref_used %d\n",
316*437bfbebSnyanmisaka                   mpp_frame_get_poc(ref_frm), mpp_frame_get_errinfo(ref_frm),
317*437bfbebSnyanmisaka                   mpp_frame_get_discard(ref_frm), ref_used_flag);
318*437bfbebSnyanmisaka 
319*437bfbebSnyanmisaka         if (ref_used_flag) {
320*437bfbebSnyanmisaka             discard |= mpp_frame_get_discard(ref_frm);
321*437bfbebSnyanmisaka             error |= mpp_frame_get_errinfo(ref_frm);
322*437bfbebSnyanmisaka         }
323*437bfbebSnyanmisaka     }
324*437bfbebSnyanmisaka 
325*437bfbebSnyanmisaka     mpp_frame_set_errinfo(mframe, error);
326*437bfbebSnyanmisaka     mpp_frame_set_discard(mframe, discard);
327*437bfbebSnyanmisaka 
328*437bfbebSnyanmisaka     AVS2D_DBG(AVS2D_DBG_CALLBACK, "[CALLBACK]: frame poc %d, ref=%d, dpberr=%d, harderr=%d, err:dis=%d:%d\n",
329*437bfbebSnyanmisaka               mpp_frame_get_poc(mframe), task_dec->flags.used_for_ref, task_dec->flags.ref_err,
330*437bfbebSnyanmisaka               ctx->hard_err, error, discard);
331*437bfbebSnyanmisaka 
332*437bfbebSnyanmisaka __FAILED:
333*437bfbebSnyanmisaka     AVS2D_PARSE_TRACE("Out.");
334*437bfbebSnyanmisaka     return ret;
335*437bfbebSnyanmisaka }
336*437bfbebSnyanmisaka 
337*437bfbebSnyanmisaka const ParserApi api_avs2d_parser = {
338*437bfbebSnyanmisaka     .name = "avs2d_parse",
339*437bfbebSnyanmisaka     .coding = MPP_VIDEO_CodingAVS2,
340*437bfbebSnyanmisaka     .ctx_size = sizeof(Avs2dCtx_t),
341*437bfbebSnyanmisaka     .flag = 0,
342*437bfbebSnyanmisaka     .init = avs2d_init,
343*437bfbebSnyanmisaka     .deinit = avs2d_deinit,
344*437bfbebSnyanmisaka     .prepare = avs2d_prepare,
345*437bfbebSnyanmisaka     .parse = avs2d_parse,
346*437bfbebSnyanmisaka     .reset = avs2d_reset,
347*437bfbebSnyanmisaka     .flush = avs2d_flush,
348*437bfbebSnyanmisaka     .control = avs2d_control,
349*437bfbebSnyanmisaka     .callback = avs2d_callback,
350*437bfbebSnyanmisaka };
351