xref: /rockchip-linux_mpp/mpp/codec/dec/mpg4/mpg4d_api.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka *
3*437bfbebSnyanmisaka * Copyright 2015 Rockchip Electronics Co. LTD
4*437bfbebSnyanmisaka *
5*437bfbebSnyanmisaka * Licensed under the Apache License, Version 2.0 (the "License");
6*437bfbebSnyanmisaka * you may not use this file except in compliance with the License.
7*437bfbebSnyanmisaka * You may obtain a copy of the License at
8*437bfbebSnyanmisaka *
9*437bfbebSnyanmisaka *      http://www.apache.org/licenses/LICENSE-2.0
10*437bfbebSnyanmisaka *
11*437bfbebSnyanmisaka * Unless required by applicable law or agreed to in writing, software
12*437bfbebSnyanmisaka * distributed under the License is distributed on an "AS IS" BASIS,
13*437bfbebSnyanmisaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*437bfbebSnyanmisaka * See the License for the specific language governing permissions and
15*437bfbebSnyanmisaka * limitations under the License.
16*437bfbebSnyanmisaka */
17*437bfbebSnyanmisaka 
18*437bfbebSnyanmisaka #define MODULE_TAG "mpg4d_api"
19*437bfbebSnyanmisaka 
20*437bfbebSnyanmisaka #include <string.h>
21*437bfbebSnyanmisaka 
22*437bfbebSnyanmisaka #include "mpp_mem.h"
23*437bfbebSnyanmisaka #include "mpp_debug.h"
24*437bfbebSnyanmisaka #include "mpp_common.h"
25*437bfbebSnyanmisaka 
26*437bfbebSnyanmisaka #include "mpg4d_api.h"
27*437bfbebSnyanmisaka #include "mpg4d_parser.h"
28*437bfbebSnyanmisaka #include "mpp_packet_impl.h"
29*437bfbebSnyanmisaka #include "mpp_dec_cb_param.h"
30*437bfbebSnyanmisaka 
31*437bfbebSnyanmisaka #define MPG4D_INIT_STREAM_SIZE      SZ_64K
32*437bfbebSnyanmisaka 
33*437bfbebSnyanmisaka typedef struct {
34*437bfbebSnyanmisaka     // parameter interact with mpp_dec
35*437bfbebSnyanmisaka     MppBufSlots     frame_slots;
36*437bfbebSnyanmisaka     MppBufSlots     packet_slots;
37*437bfbebSnyanmisaka     RK_S32          task_count;
38*437bfbebSnyanmisaka     RK_U8           *stream;
39*437bfbebSnyanmisaka     size_t          stream_size;
40*437bfbebSnyanmisaka     size_t          left_length;
41*437bfbebSnyanmisaka     MppPacket       task_pkt;
42*437bfbebSnyanmisaka     RK_U32          got_eos;
43*437bfbebSnyanmisaka 
44*437bfbebSnyanmisaka     // runtime parameter
45*437bfbebSnyanmisaka     RK_U32          frame_count;
46*437bfbebSnyanmisaka     MppDecCfgSet    *dec_cfg;
47*437bfbebSnyanmisaka 
48*437bfbebSnyanmisaka     // parser context
49*437bfbebSnyanmisaka     Mpg4dParser     parser;
50*437bfbebSnyanmisaka } Mpg4dCtx;
51*437bfbebSnyanmisaka 
mpg4d_init(void * dec,ParserCfg * cfg)52*437bfbebSnyanmisaka static MPP_RET mpg4d_init(void *dec, ParserCfg *cfg)
53*437bfbebSnyanmisaka {
54*437bfbebSnyanmisaka     Mpg4dParser parser = NULL;
55*437bfbebSnyanmisaka     MppPacket task_pkt = NULL;
56*437bfbebSnyanmisaka     Mpg4dCtx *p;
57*437bfbebSnyanmisaka     MPP_RET ret;
58*437bfbebSnyanmisaka     RK_U8 *stream;
59*437bfbebSnyanmisaka     size_t stream_size = MPG4D_INIT_STREAM_SIZE;
60*437bfbebSnyanmisaka 
61*437bfbebSnyanmisaka     if (NULL == dec) {
62*437bfbebSnyanmisaka         mpp_err_f("found NULL intput dec %p cfg %p\n", dec, cfg);
63*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
64*437bfbebSnyanmisaka     }
65*437bfbebSnyanmisaka 
66*437bfbebSnyanmisaka     stream = mpp_malloc_size(RK_U8, stream_size);
67*437bfbebSnyanmisaka     if (NULL == stream) {
68*437bfbebSnyanmisaka         mpp_err_f("failed to malloc stream buffer size %d\n", stream_size);
69*437bfbebSnyanmisaka         return MPP_ERR_MALLOC;
70*437bfbebSnyanmisaka     }
71*437bfbebSnyanmisaka 
72*437bfbebSnyanmisaka     ret = mpp_packet_init(&task_pkt, stream, stream_size);
73*437bfbebSnyanmisaka     if (ret) {
74*437bfbebSnyanmisaka         mpp_err_f("failed to create mpp_packet for task\n");
75*437bfbebSnyanmisaka         goto ERR_RET;
76*437bfbebSnyanmisaka     }
77*437bfbebSnyanmisaka 
78*437bfbebSnyanmisaka     // reset task packet length to zero
79*437bfbebSnyanmisaka     // NOTE: set length must after set pos
80*437bfbebSnyanmisaka     mpp_packet_set_pos(task_pkt, stream);
81*437bfbebSnyanmisaka     mpp_packet_set_length(task_pkt, 0);
82*437bfbebSnyanmisaka 
83*437bfbebSnyanmisaka     ret = mpp_mpg4_parser_init(&parser, cfg);
84*437bfbebSnyanmisaka     if (ret) {
85*437bfbebSnyanmisaka         mpp_err_f("failed to init parser\n");
86*437bfbebSnyanmisaka         goto ERR_RET;
87*437bfbebSnyanmisaka     }
88*437bfbebSnyanmisaka 
89*437bfbebSnyanmisaka     p = (Mpg4dCtx *)dec;
90*437bfbebSnyanmisaka     p->frame_slots  = cfg->frame_slots;
91*437bfbebSnyanmisaka     p->packet_slots = cfg->packet_slots;
92*437bfbebSnyanmisaka     p->task_count   = 2;
93*437bfbebSnyanmisaka     p->dec_cfg      = cfg->cfg;
94*437bfbebSnyanmisaka     p->stream       = stream;
95*437bfbebSnyanmisaka     p->stream_size  = stream_size;
96*437bfbebSnyanmisaka     p->task_pkt     = task_pkt;
97*437bfbebSnyanmisaka     p->parser       = parser;
98*437bfbebSnyanmisaka     p->left_length  = 0;
99*437bfbebSnyanmisaka     return MPP_OK;
100*437bfbebSnyanmisaka ERR_RET:
101*437bfbebSnyanmisaka     if (task_pkt) {
102*437bfbebSnyanmisaka         mpp_packet_deinit(&task_pkt);
103*437bfbebSnyanmisaka     }
104*437bfbebSnyanmisaka     if (stream) {
105*437bfbebSnyanmisaka         mpp_free(stream);
106*437bfbebSnyanmisaka         stream = NULL;
107*437bfbebSnyanmisaka     }
108*437bfbebSnyanmisaka     return ret;
109*437bfbebSnyanmisaka }
110*437bfbebSnyanmisaka 
mpg4d_deinit(void * dec)111*437bfbebSnyanmisaka static MPP_RET mpg4d_deinit(void *dec)
112*437bfbebSnyanmisaka {
113*437bfbebSnyanmisaka     Mpg4dCtx *p;
114*437bfbebSnyanmisaka     if (NULL == dec) {
115*437bfbebSnyanmisaka         mpp_err_f("found NULL intput\n");
116*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
117*437bfbebSnyanmisaka     }
118*437bfbebSnyanmisaka 
119*437bfbebSnyanmisaka     p = (Mpg4dCtx *)dec;
120*437bfbebSnyanmisaka     if (p->parser) {
121*437bfbebSnyanmisaka         mpp_mpg4_parser_deinit(p->parser);
122*437bfbebSnyanmisaka         p->parser = NULL;
123*437bfbebSnyanmisaka     }
124*437bfbebSnyanmisaka 
125*437bfbebSnyanmisaka     if (p->task_pkt) {
126*437bfbebSnyanmisaka         mpp_packet_deinit(&p->task_pkt);
127*437bfbebSnyanmisaka     }
128*437bfbebSnyanmisaka 
129*437bfbebSnyanmisaka     if (p->stream) {
130*437bfbebSnyanmisaka         mpp_free(p->stream);
131*437bfbebSnyanmisaka         p->stream = NULL;
132*437bfbebSnyanmisaka     }
133*437bfbebSnyanmisaka     return MPP_OK;
134*437bfbebSnyanmisaka }
135*437bfbebSnyanmisaka 
mpg4d_reset(void * dec)136*437bfbebSnyanmisaka static MPP_RET mpg4d_reset(void *dec)
137*437bfbebSnyanmisaka {
138*437bfbebSnyanmisaka     if (NULL == dec) {
139*437bfbebSnyanmisaka         mpp_err_f("found NULL intput\n");
140*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
141*437bfbebSnyanmisaka     }
142*437bfbebSnyanmisaka 
143*437bfbebSnyanmisaka     Mpg4dCtx *p = (Mpg4dCtx *)dec;
144*437bfbebSnyanmisaka     p->left_length  = 0;
145*437bfbebSnyanmisaka     p->got_eos = 0;
146*437bfbebSnyanmisaka     mpp_packet_set_length(p->task_pkt, 0);
147*437bfbebSnyanmisaka     mpp_packet_set_flag(p->task_pkt, 0);
148*437bfbebSnyanmisaka 
149*437bfbebSnyanmisaka     return mpp_mpg4_parser_reset(p->parser);
150*437bfbebSnyanmisaka }
151*437bfbebSnyanmisaka 
mpg4d_flush(void * dec)152*437bfbebSnyanmisaka static MPP_RET mpg4d_flush(void *dec)
153*437bfbebSnyanmisaka {
154*437bfbebSnyanmisaka     if (NULL == dec) {
155*437bfbebSnyanmisaka         mpp_err_f("found NULL intput\n");
156*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
157*437bfbebSnyanmisaka     }
158*437bfbebSnyanmisaka 
159*437bfbebSnyanmisaka     Mpg4dCtx *p = (Mpg4dCtx *)dec;
160*437bfbebSnyanmisaka     return mpp_mpg4_parser_flush(p->parser);
161*437bfbebSnyanmisaka }
162*437bfbebSnyanmisaka 
mpg4d_control(void * dec,MpiCmd cmd_type,void * param)163*437bfbebSnyanmisaka static MPP_RET mpg4d_control(void *dec, MpiCmd cmd_type, void *param)
164*437bfbebSnyanmisaka {
165*437bfbebSnyanmisaka     if (NULL == dec) {
166*437bfbebSnyanmisaka         mpp_err_f("found NULL intput\n");
167*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
168*437bfbebSnyanmisaka     }
169*437bfbebSnyanmisaka     (void)cmd_type;
170*437bfbebSnyanmisaka     (void)param;
171*437bfbebSnyanmisaka     return MPP_OK;
172*437bfbebSnyanmisaka }
173*437bfbebSnyanmisaka 
mpg4d_prepare(void * dec,MppPacket pkt,HalDecTask * task)174*437bfbebSnyanmisaka static MPP_RET mpg4d_prepare(void *dec, MppPacket pkt, HalDecTask *task)
175*437bfbebSnyanmisaka {
176*437bfbebSnyanmisaka     Mpg4dCtx *p;
177*437bfbebSnyanmisaka     RK_U8 *pos;
178*437bfbebSnyanmisaka     size_t length;
179*437bfbebSnyanmisaka     RK_U32 eos;
180*437bfbebSnyanmisaka 
181*437bfbebSnyanmisaka     if (NULL == dec || NULL == pkt || NULL == task) {
182*437bfbebSnyanmisaka         mpp_err_f("found NULL intput dec %p pkt %p task %p\n", dec, pkt, task);
183*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
184*437bfbebSnyanmisaka     }
185*437bfbebSnyanmisaka 
186*437bfbebSnyanmisaka     task->valid = 0;
187*437bfbebSnyanmisaka     p = (Mpg4dCtx *)dec;
188*437bfbebSnyanmisaka     pos     = mpp_packet_get_pos(pkt);
189*437bfbebSnyanmisaka     length  = mpp_packet_get_length(pkt);
190*437bfbebSnyanmisaka     eos     = mpp_packet_get_eos(pkt);
191*437bfbebSnyanmisaka 
192*437bfbebSnyanmisaka     if (p->got_eos) {
193*437bfbebSnyanmisaka         mpp_log_f("has got eos packet.\n");
194*437bfbebSnyanmisaka         mpp_packet_set_length(pkt, 0);
195*437bfbebSnyanmisaka         return MPP_OK;
196*437bfbebSnyanmisaka     }
197*437bfbebSnyanmisaka 
198*437bfbebSnyanmisaka     if (NULL == p->stream) {
199*437bfbebSnyanmisaka         mpp_err("failed to malloc task buffer for hardware with size %d\n", length);
200*437bfbebSnyanmisaka         return MPP_ERR_UNKNOW;
201*437bfbebSnyanmisaka     }
202*437bfbebSnyanmisaka     mpp_packet_set_length(p->task_pkt, p->left_length);
203*437bfbebSnyanmisaka 
204*437bfbebSnyanmisaka     /*
205*437bfbebSnyanmisaka     * Check have enough buffer to store stream
206*437bfbebSnyanmisaka     * NOTE: total length is the left size plus the new incoming
207*437bfbebSnyanmisaka     *       packet length.
208*437bfbebSnyanmisaka     */
209*437bfbebSnyanmisaka     size_t total_length = MPP_ALIGN(p->left_length + length, 16) + 64; // add extra 64 bytes in tails
210*437bfbebSnyanmisaka 
211*437bfbebSnyanmisaka     if (total_length > p->stream_size) {
212*437bfbebSnyanmisaka         RK_U8 *dst = NULL;
213*437bfbebSnyanmisaka         do {
214*437bfbebSnyanmisaka             p->stream_size <<= 1;
215*437bfbebSnyanmisaka         } while (total_length > p->stream_size);
216*437bfbebSnyanmisaka 
217*437bfbebSnyanmisaka         dst = mpp_malloc_size(RK_U8, p->stream_size);
218*437bfbebSnyanmisaka         mpp_assert(dst);
219*437bfbebSnyanmisaka         // NOTE: copy remaining stream to new buffer
220*437bfbebSnyanmisaka         if (p->left_length > 0) {
221*437bfbebSnyanmisaka             memcpy(dst, p->stream, p->left_length);
222*437bfbebSnyanmisaka         }
223*437bfbebSnyanmisaka         mpp_free(p->stream);
224*437bfbebSnyanmisaka         p->stream = dst;
225*437bfbebSnyanmisaka         mpp_packet_set_data(p->task_pkt, p->stream);
226*437bfbebSnyanmisaka         mpp_packet_set_size(p->task_pkt, p->stream_size);
227*437bfbebSnyanmisaka     }
228*437bfbebSnyanmisaka 
229*437bfbebSnyanmisaka     if (mpp_packet_get_flag(pkt) & MPP_PACKET_FLAG_EXTRA_DATA) {
230*437bfbebSnyanmisaka         if (p->left_length > 0) {
231*437bfbebSnyanmisaka             p->left_length = 0;
232*437bfbebSnyanmisaka             task->valid = 1;
233*437bfbebSnyanmisaka             return MPP_OK;
234*437bfbebSnyanmisaka         }
235*437bfbebSnyanmisaka     }
236*437bfbebSnyanmisaka 
237*437bfbebSnyanmisaka     if (!p->dec_cfg->base.split_parse ||
238*437bfbebSnyanmisaka         (mpp_packet_get_flag(pkt) & MPP_PACKET_FLAG_EXTRA_DATA)) {
239*437bfbebSnyanmisaka         p->got_eos = eos;
240*437bfbebSnyanmisaka         task->flags.eos = eos;
241*437bfbebSnyanmisaka         // NOTE: empty eos packet
242*437bfbebSnyanmisaka         if (eos && !length) {
243*437bfbebSnyanmisaka             mpg4d_flush(dec);
244*437bfbebSnyanmisaka             return MPP_OK;
245*437bfbebSnyanmisaka         }
246*437bfbebSnyanmisaka         /*
247*437bfbebSnyanmisaka          * Copy packet mode:
248*437bfbebSnyanmisaka          * Decoder's user will insure each packet is one frame for process
249*437bfbebSnyanmisaka          * Parser will just copy packet to the beginning of stream buffer
250*437bfbebSnyanmisaka          */
251*437bfbebSnyanmisaka         memcpy(p->stream, pos, length);
252*437bfbebSnyanmisaka         mpp_packet_set_pos(p->task_pkt, p->stream);
253*437bfbebSnyanmisaka         mpp_packet_set_length(p->task_pkt, length);
254*437bfbebSnyanmisaka         mpp_packet_set_pts(p->task_pkt, mpp_packet_get_pts(pkt));
255*437bfbebSnyanmisaka         mpp_packet_set_dts(p->task_pkt, mpp_packet_get_dts(pkt));
256*437bfbebSnyanmisaka         // set input packet length to 0 here
257*437bfbebSnyanmisaka         // indicate that the input packet has been all consumed
258*437bfbebSnyanmisaka         mpp_packet_set_pos(pkt, pos + length);
259*437bfbebSnyanmisaka         mpp_packet_set_length(pkt, 0);
260*437bfbebSnyanmisaka         /* this step will enable the task and goto parse stage */
261*437bfbebSnyanmisaka         task->valid = 1;
262*437bfbebSnyanmisaka     } else {
263*437bfbebSnyanmisaka         /*
264*437bfbebSnyanmisaka          * Split packet mode:
265*437bfbebSnyanmisaka          * Input packet can be any length and no need to be bound of on frame
266*437bfbebSnyanmisaka          * Parser will do split frame operation to find the beginning and end of one frame
267*437bfbebSnyanmisaka          */
268*437bfbebSnyanmisaka         if (MPP_OK == mpp_mpg4_parser_split(p->parser, p->task_pkt, pkt)) {
269*437bfbebSnyanmisaka             p->left_length = 0;
270*437bfbebSnyanmisaka             task->valid = 1;
271*437bfbebSnyanmisaka         } else {
272*437bfbebSnyanmisaka             task->valid = 0;
273*437bfbebSnyanmisaka             p->left_length = mpp_packet_get_length(p->task_pkt);
274*437bfbebSnyanmisaka         }
275*437bfbebSnyanmisaka         p->got_eos = mpp_packet_get_eos(p->task_pkt);
276*437bfbebSnyanmisaka         task->flags.eos = p->got_eos;
277*437bfbebSnyanmisaka     }
278*437bfbebSnyanmisaka     task->input_packet = p->task_pkt;
279*437bfbebSnyanmisaka 
280*437bfbebSnyanmisaka     return MPP_OK;
281*437bfbebSnyanmisaka }
282*437bfbebSnyanmisaka 
mpg4d_parse(void * dec,HalDecTask * task)283*437bfbebSnyanmisaka static MPP_RET mpg4d_parse(void *dec, HalDecTask *task)
284*437bfbebSnyanmisaka {
285*437bfbebSnyanmisaka     MPP_RET ret;
286*437bfbebSnyanmisaka     Mpg4dCtx *p;
287*437bfbebSnyanmisaka 
288*437bfbebSnyanmisaka     if (NULL == dec || NULL == task) {
289*437bfbebSnyanmisaka         mpp_err_f("found NULL intput dec %p task %p\n", dec, task);
290*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
291*437bfbebSnyanmisaka     }
292*437bfbebSnyanmisaka     p = (Mpg4dCtx *)dec;
293*437bfbebSnyanmisaka     ret = mpp_mpg4_parser_decode(p->parser, task->input_packet);
294*437bfbebSnyanmisaka     if (ret) {
295*437bfbebSnyanmisaka         // found error on decoding drop this task and clear remaining length
296*437bfbebSnyanmisaka         task->valid  = 0;
297*437bfbebSnyanmisaka         task->output = -1;
298*437bfbebSnyanmisaka         mpp_packet_set_length(task->input_packet, 0);
299*437bfbebSnyanmisaka 
300*437bfbebSnyanmisaka         return MPP_NOK;
301*437bfbebSnyanmisaka     }
302*437bfbebSnyanmisaka 
303*437bfbebSnyanmisaka     mpp_mpg4_parser_setup_syntax(p->parser, &task->syntax);
304*437bfbebSnyanmisaka     mpp_mpg4_parser_setup_hal_output(p->parser, &task->output);
305*437bfbebSnyanmisaka     mpp_mpg4_parser_setup_refer(p->parser, task->refer, MAX_DEC_REF_NUM);
306*437bfbebSnyanmisaka     mpp_mpg4_parser_update_dpb(p->parser);
307*437bfbebSnyanmisaka 
308*437bfbebSnyanmisaka     if (p->got_eos) {
309*437bfbebSnyanmisaka         task->flags.eos = 1;
310*437bfbebSnyanmisaka         mpg4d_flush(dec);
311*437bfbebSnyanmisaka         return MPP_OK;
312*437bfbebSnyanmisaka     }
313*437bfbebSnyanmisaka 
314*437bfbebSnyanmisaka     p->frame_count++;
315*437bfbebSnyanmisaka 
316*437bfbebSnyanmisaka     return MPP_OK;
317*437bfbebSnyanmisaka }
318*437bfbebSnyanmisaka 
mpg4d_callback(void * dec,void * err_info)319*437bfbebSnyanmisaka static MPP_RET mpg4d_callback(void *dec, void *err_info)
320*437bfbebSnyanmisaka {
321*437bfbebSnyanmisaka     Mpg4dCtx *p_Dec = (Mpg4dCtx *)dec;
322*437bfbebSnyanmisaka     DecCbHalDone *ctx = (DecCbHalDone *)err_info;
323*437bfbebSnyanmisaka 
324*437bfbebSnyanmisaka     if (NULL == dec || NULL == err_info) {
325*437bfbebSnyanmisaka         mpp_err_f("found NULL input dec %p err_info %p\n", dec, err_info);
326*437bfbebSnyanmisaka         return MPP_ERR_NULL_PTR;
327*437bfbebSnyanmisaka     }
328*437bfbebSnyanmisaka 
329*437bfbebSnyanmisaka     MppFrame mframe = NULL;
330*437bfbebSnyanmisaka     HalDecTask *task_dec = (HalDecTask *)ctx->task;
331*437bfbebSnyanmisaka 
332*437bfbebSnyanmisaka     mpp_buf_slot_get_prop(p_Dec->frame_slots, task_dec->output, SLOT_FRAME_PTR, &mframe);
333*437bfbebSnyanmisaka     if (mframe) {
334*437bfbebSnyanmisaka         RK_U32 task_err = task_dec->flags.parse_err || task_dec->flags.ref_err;
335*437bfbebSnyanmisaka         if (ctx->hard_err || task_err) {
336*437bfbebSnyanmisaka             mpp_frame_set_errinfo(mframe, MPP_FRAME_ERR_UNKNOW);
337*437bfbebSnyanmisaka             mpp_log_f("[CALLBACK] g_no=%d, out_idx=%d, dpberr=%d, harderr=%d, ref_flag=%d, errinfo=%d, discard=%d\n",
338*437bfbebSnyanmisaka                       p_Dec->frame_count, task_dec->output, task_err, ctx->hard_err, task_dec->flags.used_for_ref,
339*437bfbebSnyanmisaka                       mpp_frame_get_errinfo(mframe), mpp_frame_get_discard(mframe));
340*437bfbebSnyanmisaka         }
341*437bfbebSnyanmisaka     }
342*437bfbebSnyanmisaka     return MPP_OK;
343*437bfbebSnyanmisaka }
344*437bfbebSnyanmisaka 
345*437bfbebSnyanmisaka const ParserApi api_mpg4d_parser = {
346*437bfbebSnyanmisaka     .name = "api_mpg4d_parser",
347*437bfbebSnyanmisaka     .coding = MPP_VIDEO_CodingMPEG4,
348*437bfbebSnyanmisaka     .ctx_size = sizeof(Mpg4dCtx),
349*437bfbebSnyanmisaka     .flag = 0,
350*437bfbebSnyanmisaka     .init = mpg4d_init,
351*437bfbebSnyanmisaka     .deinit = mpg4d_deinit,
352*437bfbebSnyanmisaka     .prepare = mpg4d_prepare,
353*437bfbebSnyanmisaka     .parse = mpg4d_parse,
354*437bfbebSnyanmisaka     .reset = mpg4d_reset,
355*437bfbebSnyanmisaka     .flush = mpg4d_flush,
356*437bfbebSnyanmisaka     .control = mpg4d_control,
357*437bfbebSnyanmisaka     .callback = mpg4d_callback,
358*437bfbebSnyanmisaka };
359*437bfbebSnyanmisaka 
360