xref: /rockchip-linux_mpp/mpp/codec/dec/avs/avsd_api.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2015 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka  *
4*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka  * You may obtain a copy of the License at
7*437bfbebSnyanmisaka  *
8*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka  *
10*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka  * limitations under the License.
15*437bfbebSnyanmisaka  */
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #define MODULE_TAG "avsd_api"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <stdio.h>
20*437bfbebSnyanmisaka #include <stdlib.h>
21*437bfbebSnyanmisaka #include <string.h>
22*437bfbebSnyanmisaka 
23*437bfbebSnyanmisaka #include "mpp_env.h"
24*437bfbebSnyanmisaka #include "mpp_mem.h"
25*437bfbebSnyanmisaka #include "mpp_debug.h"
26*437bfbebSnyanmisaka #include "mpp_packet_impl.h"
27*437bfbebSnyanmisaka 
28*437bfbebSnyanmisaka #include "avsd_syntax.h"
29*437bfbebSnyanmisaka #include "avsd_api.h"
30*437bfbebSnyanmisaka #include "avsd_parse.h"
31*437bfbebSnyanmisaka #include "mpp_dec_cb_param.h"
32*437bfbebSnyanmisaka 
33*437bfbebSnyanmisaka RK_U32 avsd_parse_debug = 0;
34*437bfbebSnyanmisaka 
35*437bfbebSnyanmisaka 
36*437bfbebSnyanmisaka /*!
37*437bfbebSnyanmisaka ***********************************************************************
38*437bfbebSnyanmisaka * \brief
39*437bfbebSnyanmisaka *   free all buffer
40*437bfbebSnyanmisaka ***********************************************************************
41*437bfbebSnyanmisaka */
avsd_deinit(void * decoder)42*437bfbebSnyanmisaka MPP_RET avsd_deinit(void *decoder)
43*437bfbebSnyanmisaka {
44*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
45*437bfbebSnyanmisaka     AvsdCtx_t *p_dec = (AvsdCtx_t *)decoder;
46*437bfbebSnyanmisaka 
47*437bfbebSnyanmisaka     INP_CHECK(ret, !decoder);
48*437bfbebSnyanmisaka     AVSD_PARSE_TRACE("In.");
49*437bfbebSnyanmisaka 
50*437bfbebSnyanmisaka     mpp_packet_deinit(&p_dec->task_pkt);
51*437bfbebSnyanmisaka     MPP_FREE(p_dec->streambuf);
52*437bfbebSnyanmisaka     MPP_FREE(p_dec->mem);
53*437bfbebSnyanmisaka 
54*437bfbebSnyanmisaka __RETURN:
55*437bfbebSnyanmisaka     (void)decoder;
56*437bfbebSnyanmisaka     AVSD_PARSE_TRACE("Out.");
57*437bfbebSnyanmisaka     return ret = MPP_OK;
58*437bfbebSnyanmisaka }
59*437bfbebSnyanmisaka 
60*437bfbebSnyanmisaka /*!
61*437bfbebSnyanmisaka ***********************************************************************
62*437bfbebSnyanmisaka * \brief
63*437bfbebSnyanmisaka *   alloc all buffer
64*437bfbebSnyanmisaka ***********************************************************************
65*437bfbebSnyanmisaka */
66*437bfbebSnyanmisaka 
avsd_init(void * decoder,ParserCfg * init)67*437bfbebSnyanmisaka static MPP_RET avsd_init(void *decoder, ParserCfg *init)
68*437bfbebSnyanmisaka {
69*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
70*437bfbebSnyanmisaka     RK_S32 i = 0;
71*437bfbebSnyanmisaka     AvsdCtx_t *p_dec = (AvsdCtx_t *)decoder;
72*437bfbebSnyanmisaka 
73*437bfbebSnyanmisaka     AVSD_PARSE_TRACE("In.");
74*437bfbebSnyanmisaka     INP_CHECK(ret, !p_dec);
75*437bfbebSnyanmisaka 
76*437bfbebSnyanmisaka     memset(p_dec, 0, sizeof(AvsdCtx_t));
77*437bfbebSnyanmisaka     mpp_env_get_u32("avsd_debug", &avsd_parse_debug, 0);
78*437bfbebSnyanmisaka     //!< restore init parameters
79*437bfbebSnyanmisaka     p_dec->init = *init;
80*437bfbebSnyanmisaka     p_dec->frame_slots = init->frame_slots;
81*437bfbebSnyanmisaka     p_dec->packet_slots = init->packet_slots;
82*437bfbebSnyanmisaka     //!< decoder parameters
83*437bfbebSnyanmisaka     mpp_buf_slot_setup(p_dec->frame_slots, 12);
84*437bfbebSnyanmisaka     p_dec->mem = mpp_calloc(AvsdMemory_t, 1);
85*437bfbebSnyanmisaka     MEM_CHECK(ret, p_dec->mem);
86*437bfbebSnyanmisaka 
87*437bfbebSnyanmisaka     p_dec->syn = &p_dec->mem->syntax;
88*437bfbebSnyanmisaka     p_dec->stream_size = MAX_STREAM_SIZE;
89*437bfbebSnyanmisaka     p_dec->streambuf = mpp_malloc(RK_U8, p_dec->stream_size);
90*437bfbebSnyanmisaka     MEM_CHECK(ret, p_dec->streambuf);
91*437bfbebSnyanmisaka     mpp_packet_init(&p_dec->task_pkt, p_dec->streambuf, p_dec->stream_size);
92*437bfbebSnyanmisaka 
93*437bfbebSnyanmisaka     mpp_packet_set_length(p_dec->task_pkt, 0);
94*437bfbebSnyanmisaka     MEM_CHECK(ret, p_dec->task_pkt);
95*437bfbebSnyanmisaka     for (i = 0; i < 3; i++) {
96*437bfbebSnyanmisaka         AvsdFrame_t *frm = &p_dec->mem->save[i];
97*437bfbebSnyanmisaka 
98*437bfbebSnyanmisaka         memset(frm, 0, sizeof(*frm));
99*437bfbebSnyanmisaka         frm->idx = i;
100*437bfbebSnyanmisaka         frm->slot_idx = -1;
101*437bfbebSnyanmisaka     }
102*437bfbebSnyanmisaka     p_dec->bx = &p_dec->mem->bitctx;
103*437bfbebSnyanmisaka     p_dec->need_split = 1;
104*437bfbebSnyanmisaka 
105*437bfbebSnyanmisaka __RETURN:
106*437bfbebSnyanmisaka     AVSD_PARSE_TRACE("Out.");
107*437bfbebSnyanmisaka     return ret = MPP_OK;
108*437bfbebSnyanmisaka __FAILED:
109*437bfbebSnyanmisaka     avsd_deinit(decoder);
110*437bfbebSnyanmisaka 
111*437bfbebSnyanmisaka     return ret;
112*437bfbebSnyanmisaka }
113*437bfbebSnyanmisaka 
114*437bfbebSnyanmisaka /*!
115*437bfbebSnyanmisaka ***********************************************************************
116*437bfbebSnyanmisaka * \brief
117*437bfbebSnyanmisaka *   reset
118*437bfbebSnyanmisaka ***********************************************************************
119*437bfbebSnyanmisaka */
avsd_reset(void * decoder)120*437bfbebSnyanmisaka static MPP_RET avsd_reset(void *decoder)
121*437bfbebSnyanmisaka {
122*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
123*437bfbebSnyanmisaka     AvsdCtx_t *p_dec = (AvsdCtx_t *)decoder;
124*437bfbebSnyanmisaka 
125*437bfbebSnyanmisaka     AVSD_PARSE_TRACE("In.");
126*437bfbebSnyanmisaka 
127*437bfbebSnyanmisaka     avsd_reset_parameters(p_dec);
128*437bfbebSnyanmisaka     p_dec->got_vsh = 0;
129*437bfbebSnyanmisaka     p_dec->got_ph = 0;
130*437bfbebSnyanmisaka     p_dec->got_keyframe = 0;
131*437bfbebSnyanmisaka     p_dec->vec_flag = 0;
132*437bfbebSnyanmisaka     p_dec->got_eos = 0;
133*437bfbebSnyanmisaka     p_dec->left_length = 0;
134*437bfbebSnyanmisaka     p_dec->state = 0xFFFFFFFF;
135*437bfbebSnyanmisaka     p_dec->vop_header_found = 0;
136*437bfbebSnyanmisaka 
137*437bfbebSnyanmisaka     mpp_packet_set_length(p_dec->task_pkt, 0);
138*437bfbebSnyanmisaka     mpp_packet_set_flag(p_dec->task_pkt, 0);
139*437bfbebSnyanmisaka 
140*437bfbebSnyanmisaka     AVSD_PARSE_TRACE("Out.");
141*437bfbebSnyanmisaka 
142*437bfbebSnyanmisaka     return ret = MPP_OK;
143*437bfbebSnyanmisaka }
144*437bfbebSnyanmisaka 
145*437bfbebSnyanmisaka /*!
146*437bfbebSnyanmisaka ***********************************************************************
147*437bfbebSnyanmisaka * \brief
148*437bfbebSnyanmisaka *   flush
149*437bfbebSnyanmisaka ***********************************************************************
150*437bfbebSnyanmisaka */
avsd_flush(void * decoder)151*437bfbebSnyanmisaka static MPP_RET avsd_flush(void *decoder)
152*437bfbebSnyanmisaka {
153*437bfbebSnyanmisaka     AvsdCtx_t *p_dec = (AvsdCtx_t *)decoder;
154*437bfbebSnyanmisaka 
155*437bfbebSnyanmisaka     AVSD_PARSE_TRACE("In.");
156*437bfbebSnyanmisaka 
157*437bfbebSnyanmisaka     set_frame_output(p_dec, p_dec->dpb[1]);
158*437bfbebSnyanmisaka     set_frame_output(p_dec, p_dec->dpb[0]);
159*437bfbebSnyanmisaka     set_frame_output(p_dec, p_dec->cur);
160*437bfbebSnyanmisaka 
161*437bfbebSnyanmisaka     p_dec->got_eos = 0;
162*437bfbebSnyanmisaka 
163*437bfbebSnyanmisaka     AVSD_PARSE_TRACE("Out.");
164*437bfbebSnyanmisaka 
165*437bfbebSnyanmisaka     return MPP_OK;
166*437bfbebSnyanmisaka }
167*437bfbebSnyanmisaka 
168*437bfbebSnyanmisaka /*!
169*437bfbebSnyanmisaka ***********************************************************************
170*437bfbebSnyanmisaka * \brief
171*437bfbebSnyanmisaka *   control/perform
172*437bfbebSnyanmisaka ***********************************************************************
173*437bfbebSnyanmisaka */
avsd_control(void * decoder,MpiCmd cmd_type,void * param)174*437bfbebSnyanmisaka static MPP_RET avsd_control(void *decoder, MpiCmd cmd_type, void *param)
175*437bfbebSnyanmisaka {
176*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
177*437bfbebSnyanmisaka     AvsdCtx_t *p_dec = (AvsdCtx_t *)decoder;
178*437bfbebSnyanmisaka 
179*437bfbebSnyanmisaka     AVSD_PARSE_TRACE("In.");
180*437bfbebSnyanmisaka 
181*437bfbebSnyanmisaka     switch (cmd_type) {
182*437bfbebSnyanmisaka     case MPP_DEC_SET_DISABLE_ERROR: {
183*437bfbebSnyanmisaka         p_dec->disable_error = *((RK_U32 *)param);
184*437bfbebSnyanmisaka     } break;
185*437bfbebSnyanmisaka     case MPP_DEC_SET_DIS_ERR_CLR_MARK: {
186*437bfbebSnyanmisaka         p_dec->dis_err_clr_mark = *((RK_U32 *)param);
187*437bfbebSnyanmisaka     } break;
188*437bfbebSnyanmisaka     default : {
189*437bfbebSnyanmisaka     } break;
190*437bfbebSnyanmisaka     }
191*437bfbebSnyanmisaka 
192*437bfbebSnyanmisaka     AVSD_PARSE_TRACE("Out.");
193*437bfbebSnyanmisaka     return ret = MPP_OK;
194*437bfbebSnyanmisaka }
195*437bfbebSnyanmisaka 
196*437bfbebSnyanmisaka 
197*437bfbebSnyanmisaka /*!
198*437bfbebSnyanmisaka ***********************************************************************
199*437bfbebSnyanmisaka * \brief
200*437bfbebSnyanmisaka *   prepare
201*437bfbebSnyanmisaka ***********************************************************************
202*437bfbebSnyanmisaka */
avsd_prepare(void * decoder,MppPacket pkt,HalDecTask * task)203*437bfbebSnyanmisaka static MPP_RET avsd_prepare(void *decoder, MppPacket pkt, HalDecTask *task)
204*437bfbebSnyanmisaka {
205*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
206*437bfbebSnyanmisaka 
207*437bfbebSnyanmisaka     AVSD_PARSE_TRACE("In.");
208*437bfbebSnyanmisaka     INP_CHECK(ret, !decoder && !pkt && !task);
209*437bfbebSnyanmisaka 
210*437bfbebSnyanmisaka     AvsdCtx_t *p_dec = (AvsdCtx_t *)decoder;
211*437bfbebSnyanmisaka     RK_U8 *pos = mpp_packet_get_pos(pkt);
212*437bfbebSnyanmisaka     size_t length = mpp_packet_get_length(pkt);
213*437bfbebSnyanmisaka     RK_U32 eos = mpp_packet_get_eos(pkt);
214*437bfbebSnyanmisaka 
215*437bfbebSnyanmisaka     task->valid = 0;
216*437bfbebSnyanmisaka     if (p_dec->got_eos) {
217*437bfbebSnyanmisaka         AVSD_DBG(AVSD_DBG_INPUT, "got eos packet.\n");
218*437bfbebSnyanmisaka         mpp_packet_set_length(pkt, 0);
219*437bfbebSnyanmisaka         goto __RETURN;
220*437bfbebSnyanmisaka     }
221*437bfbebSnyanmisaka     AVSD_DBG(AVSD_DBG_INPUT, "[pkt_in] pts=%lld, eos=%d, len=%d, pkt_no=%d\n",
222*437bfbebSnyanmisaka              mpp_packet_get_pts(pkt), eos, (RK_U32)length, (RK_U32)p_dec->pkt_no);
223*437bfbebSnyanmisaka     p_dec->pkt_no++;
224*437bfbebSnyanmisaka 
225*437bfbebSnyanmisaka     if (mpp_packet_get_eos(pkt)) {
226*437bfbebSnyanmisaka         if (mpp_packet_get_length(pkt) < 4) {
227*437bfbebSnyanmisaka             avsd_flush(decoder);
228*437bfbebSnyanmisaka         }
229*437bfbebSnyanmisaka         p_dec->got_eos = 1;
230*437bfbebSnyanmisaka         task->flags.eos = p_dec->got_eos;
231*437bfbebSnyanmisaka         goto __RETURN;
232*437bfbebSnyanmisaka     }
233*437bfbebSnyanmisaka     if (mpp_packet_get_length(pkt) > MAX_STREAM_SIZE) {
234*437bfbebSnyanmisaka         AVSD_DBG(AVSD_DBG_ERROR, "[pkt_in_timeUs] input error, stream too large");
235*437bfbebSnyanmisaka         mpp_packet_set_length(pkt, 0);
236*437bfbebSnyanmisaka         ret = MPP_NOK;
237*437bfbebSnyanmisaka         goto __RETURN;
238*437bfbebSnyanmisaka     }
239*437bfbebSnyanmisaka 
240*437bfbebSnyanmisaka     mpp_packet_set_length(p_dec->task_pkt, p_dec->left_length);
241*437bfbebSnyanmisaka 
242*437bfbebSnyanmisaka     RK_U32 total_length = MPP_ALIGN(p_dec->left_length + length, 16) + 64;
243*437bfbebSnyanmisaka     if (total_length > p_dec->stream_size) {
244*437bfbebSnyanmisaka         do {
245*437bfbebSnyanmisaka             p_dec->stream_size <<= 1;
246*437bfbebSnyanmisaka         } while (total_length > p_dec->stream_size);
247*437bfbebSnyanmisaka 
248*437bfbebSnyanmisaka         RK_U8 *dst = mpp_malloc_size(RK_U8, p_dec->stream_size);
249*437bfbebSnyanmisaka         mpp_assert(dst);
250*437bfbebSnyanmisaka 
251*437bfbebSnyanmisaka         if (p_dec->left_length > 0) {
252*437bfbebSnyanmisaka             memcpy(dst, p_dec->streambuf, p_dec->left_length);
253*437bfbebSnyanmisaka         }
254*437bfbebSnyanmisaka         mpp_free(p_dec->streambuf);
255*437bfbebSnyanmisaka         p_dec->streambuf = dst;
256*437bfbebSnyanmisaka 
257*437bfbebSnyanmisaka         mpp_packet_set_data(p_dec->task_pkt, p_dec->streambuf);
258*437bfbebSnyanmisaka         mpp_packet_set_size(p_dec->task_pkt, p_dec->stream_size);
259*437bfbebSnyanmisaka     }
260*437bfbebSnyanmisaka 
261*437bfbebSnyanmisaka     if (!p_dec->need_split) {
262*437bfbebSnyanmisaka         p_dec->got_eos = eos;
263*437bfbebSnyanmisaka         // empty eos packet
264*437bfbebSnyanmisaka         if (eos && (length < 4)) {
265*437bfbebSnyanmisaka             avsd_flush(decoder);
266*437bfbebSnyanmisaka             goto __RETURN;
267*437bfbebSnyanmisaka         }
268*437bfbebSnyanmisaka         // copy packet direct
269*437bfbebSnyanmisaka         memcpy(p_dec->streambuf, pos, length);
270*437bfbebSnyanmisaka         mpp_packet_set_data(p_dec->task_pkt, p_dec->streambuf);
271*437bfbebSnyanmisaka         mpp_packet_set_length(p_dec->task_pkt, length);
272*437bfbebSnyanmisaka         mpp_packet_set_pts(p_dec->task_pkt, mpp_packet_get_pts(pkt));
273*437bfbebSnyanmisaka         mpp_packet_set_dts(p_dec->task_pkt, mpp_packet_get_dts(pkt));
274*437bfbebSnyanmisaka         // set input packet length to 0 here
275*437bfbebSnyanmisaka         mpp_packet_set_length(pkt, 0);
276*437bfbebSnyanmisaka         /* this step will enable the task and goto parse stage */
277*437bfbebSnyanmisaka         task->valid = 1;
278*437bfbebSnyanmisaka     } else {
279*437bfbebSnyanmisaka         /* Split packet mode */
280*437bfbebSnyanmisaka         if (MPP_OK == avsd_parser_split(p_dec, p_dec->task_pkt, pkt)) {
281*437bfbebSnyanmisaka             p_dec->left_length = 0;
282*437bfbebSnyanmisaka             task->valid = 1;
283*437bfbebSnyanmisaka         } else {
284*437bfbebSnyanmisaka             task->valid = 0;
285*437bfbebSnyanmisaka             p_dec->left_length = mpp_packet_get_length(p_dec->task_pkt);
286*437bfbebSnyanmisaka         }
287*437bfbebSnyanmisaka         p_dec->got_eos = mpp_packet_get_eos(p_dec->task_pkt);
288*437bfbebSnyanmisaka     }
289*437bfbebSnyanmisaka     task->input_packet = p_dec->task_pkt;
290*437bfbebSnyanmisaka     task->flags.eos = p_dec->got_eos;
291*437bfbebSnyanmisaka 
292*437bfbebSnyanmisaka __RETURN:
293*437bfbebSnyanmisaka     AVSD_PARSE_TRACE("Out.");
294*437bfbebSnyanmisaka     return ret = MPP_OK;
295*437bfbebSnyanmisaka }
296*437bfbebSnyanmisaka /*!
297*437bfbebSnyanmisaka ***********************************************************************
298*437bfbebSnyanmisaka * \brief
299*437bfbebSnyanmisaka *   parser
300*437bfbebSnyanmisaka ***********************************************************************
301*437bfbebSnyanmisaka */
avsd_parse(void * decoder,HalDecTask * task)302*437bfbebSnyanmisaka static MPP_RET avsd_parse(void *decoder, HalDecTask *task)
303*437bfbebSnyanmisaka {
304*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
305*437bfbebSnyanmisaka     AvsdCtx_t *p_dec = (AvsdCtx_t *)decoder;
306*437bfbebSnyanmisaka     AVSD_PARSE_TRACE("In.");
307*437bfbebSnyanmisaka 
308*437bfbebSnyanmisaka     task->valid = 0;
309*437bfbebSnyanmisaka     memset(task->refer, -1, sizeof(task->refer));
310*437bfbebSnyanmisaka 
311*437bfbebSnyanmisaka     avsd_parse_stream(p_dec, task);
312*437bfbebSnyanmisaka     if (task->valid) {
313*437bfbebSnyanmisaka         avsd_fill_parameters(p_dec, p_dec->syn);
314*437bfbebSnyanmisaka         avsd_set_dpb(p_dec, task);
315*437bfbebSnyanmisaka 
316*437bfbebSnyanmisaka         avsd_commit_syntaxs(p_dec->syn, task);
317*437bfbebSnyanmisaka         avsd_update_dpb(p_dec);
318*437bfbebSnyanmisaka     }
319*437bfbebSnyanmisaka     AVSD_PARSE_TRACE("Out.");
320*437bfbebSnyanmisaka 
321*437bfbebSnyanmisaka     return ret = MPP_OK;
322*437bfbebSnyanmisaka }
323*437bfbebSnyanmisaka /*!
324*437bfbebSnyanmisaka ***********************************************************************
325*437bfbebSnyanmisaka * \brief
326*437bfbebSnyanmisaka *   callback
327*437bfbebSnyanmisaka ***********************************************************************
328*437bfbebSnyanmisaka */
avsd_callback(void * decoder,void * info)329*437bfbebSnyanmisaka static MPP_RET avsd_callback(void *decoder, void *info)
330*437bfbebSnyanmisaka {
331*437bfbebSnyanmisaka     MPP_RET ret = MPP_ERR_UNKNOW;
332*437bfbebSnyanmisaka     AvsdCtx_t *p_dec = (AvsdCtx_t *)decoder;
333*437bfbebSnyanmisaka     DecCbHalDone *ctx = (DecCbHalDone *)info;
334*437bfbebSnyanmisaka     MppFrame mframe = NULL;
335*437bfbebSnyanmisaka     HalDecTask *task_dec = (HalDecTask *)ctx->task;
336*437bfbebSnyanmisaka 
337*437bfbebSnyanmisaka     AVSD_PARSE_TRACE("In.");
338*437bfbebSnyanmisaka 
339*437bfbebSnyanmisaka     mpp_buf_slot_get_prop(p_dec->frame_slots, task_dec->output, SLOT_FRAME_PTR, &mframe);
340*437bfbebSnyanmisaka     if (mframe) {
341*437bfbebSnyanmisaka         if (ctx->hard_err || task_dec->flags.ref_err) {
342*437bfbebSnyanmisaka             if (task_dec->flags.used_for_ref) {
343*437bfbebSnyanmisaka                 mpp_frame_set_errinfo(mframe, MPP_FRAME_FLAG_PAIRED_FIELD);
344*437bfbebSnyanmisaka             } else {
345*437bfbebSnyanmisaka                 mpp_frame_set_discard(mframe, MPP_FRAME_FLAG_PAIRED_FIELD);
346*437bfbebSnyanmisaka             }
347*437bfbebSnyanmisaka         }
348*437bfbebSnyanmisaka     }
349*437bfbebSnyanmisaka 
350*437bfbebSnyanmisaka     if (!ctx->hard_err && p_dec->ph.picture_coding_type == I_PICTURE)
351*437bfbebSnyanmisaka         p_dec->vsh.version_checked = 1;
352*437bfbebSnyanmisaka 
353*437bfbebSnyanmisaka     AVSD_PARSE_TRACE("Out.");
354*437bfbebSnyanmisaka 
355*437bfbebSnyanmisaka     return ret = MPP_OK;
356*437bfbebSnyanmisaka }
357*437bfbebSnyanmisaka /*!
358*437bfbebSnyanmisaka ***********************************************************************
359*437bfbebSnyanmisaka * \brief
360*437bfbebSnyanmisaka *   api struct interface
361*437bfbebSnyanmisaka ***********************************************************************
362*437bfbebSnyanmisaka */
363*437bfbebSnyanmisaka const ParserApi api_avsd_parser = {
364*437bfbebSnyanmisaka     .name = "avsd_parse",
365*437bfbebSnyanmisaka     .coding = MPP_VIDEO_CodingAVS,
366*437bfbebSnyanmisaka     .ctx_size = sizeof(AvsdCtx_t),
367*437bfbebSnyanmisaka     .flag = 0,
368*437bfbebSnyanmisaka     .init = avsd_init,
369*437bfbebSnyanmisaka     .deinit = avsd_deinit,
370*437bfbebSnyanmisaka     .prepare = avsd_prepare,
371*437bfbebSnyanmisaka     .parse = avsd_parse,
372*437bfbebSnyanmisaka     .reset = avsd_reset,
373*437bfbebSnyanmisaka     .flush = avsd_flush,
374*437bfbebSnyanmisaka     .control = avsd_control,
375*437bfbebSnyanmisaka     .callback = avsd_callback,
376*437bfbebSnyanmisaka };
377*437bfbebSnyanmisaka 
378*437bfbebSnyanmisaka const ParserApi api_avsd_plus_parser = {
379*437bfbebSnyanmisaka     .name = "avsd_parse",
380*437bfbebSnyanmisaka     .coding = MPP_VIDEO_CodingAVSPLUS,
381*437bfbebSnyanmisaka     .ctx_size = sizeof(AvsdCtx_t),
382*437bfbebSnyanmisaka     .flag = 0,
383*437bfbebSnyanmisaka     .init = avsd_init,
384*437bfbebSnyanmisaka     .deinit = avsd_deinit,
385*437bfbebSnyanmisaka     .prepare = avsd_prepare,
386*437bfbebSnyanmisaka     .parse = avsd_parse,
387*437bfbebSnyanmisaka     .reset = avsd_reset,
388*437bfbebSnyanmisaka     .flush = avsd_flush,
389*437bfbebSnyanmisaka     .control = avsd_control,
390*437bfbebSnyanmisaka     .callback = avsd_callback,
391*437bfbebSnyanmisaka };
392