1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka * Copyright (c) 2015 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka */
5*437bfbebSnyanmisaka
6*437bfbebSnyanmisaka #if defined(_WIN32)
7*437bfbebSnyanmisaka #include "vld.h"
8*437bfbebSnyanmisaka #endif
9*437bfbebSnyanmisaka
10*437bfbebSnyanmisaka #define MODULE_TAG "mpi_dec_mt_test"
11*437bfbebSnyanmisaka
12*437bfbebSnyanmisaka #include <string.h>
13*437bfbebSnyanmisaka #include <pthread.h>
14*437bfbebSnyanmisaka
15*437bfbebSnyanmisaka #include "rk_mpi.h"
16*437bfbebSnyanmisaka
17*437bfbebSnyanmisaka #include "mpp_mem.h"
18*437bfbebSnyanmisaka #include "mpp_env.h"
19*437bfbebSnyanmisaka #include "mpp_time.h"
20*437bfbebSnyanmisaka #include "mpp_common.h"
21*437bfbebSnyanmisaka
22*437bfbebSnyanmisaka #include "mpi_dec_utils.h"
23*437bfbebSnyanmisaka
24*437bfbebSnyanmisaka typedef struct {
25*437bfbebSnyanmisaka MpiDecTestCmd *cmd;
26*437bfbebSnyanmisaka MppCtx ctx;
27*437bfbebSnyanmisaka MppApi *mpi;
28*437bfbebSnyanmisaka
29*437bfbebSnyanmisaka volatile RK_U32 loop_end;
30*437bfbebSnyanmisaka
31*437bfbebSnyanmisaka /* buffer for stream data reading */
32*437bfbebSnyanmisaka char *buf;
33*437bfbebSnyanmisaka
34*437bfbebSnyanmisaka /* input and output */
35*437bfbebSnyanmisaka DecBufMgr buf_mgr;
36*437bfbebSnyanmisaka MppBufferGroup frm_grp;
37*437bfbebSnyanmisaka MppPacket packet;
38*437bfbebSnyanmisaka size_t packet_size;
39*437bfbebSnyanmisaka MppFrame frame;
40*437bfbebSnyanmisaka
41*437bfbebSnyanmisaka FILE *fp_output;
42*437bfbebSnyanmisaka RK_S32 frame_count;
43*437bfbebSnyanmisaka RK_S32 frame_num;
44*437bfbebSnyanmisaka FileReader reader;
45*437bfbebSnyanmisaka
46*437bfbebSnyanmisaka /* runtime flag */
47*437bfbebSnyanmisaka RK_U32 quiet;
48*437bfbebSnyanmisaka } MpiDecMtLoopData;
49*437bfbebSnyanmisaka
thread_input(void * arg)50*437bfbebSnyanmisaka void *thread_input(void *arg)
51*437bfbebSnyanmisaka {
52*437bfbebSnyanmisaka MpiDecMtLoopData *data = (MpiDecMtLoopData *)arg;
53*437bfbebSnyanmisaka MppCtx ctx = data->ctx;
54*437bfbebSnyanmisaka MppApi *mpi = data->mpi;
55*437bfbebSnyanmisaka MppPacket packet = data->packet;
56*437bfbebSnyanmisaka FileReader reader = data->reader;
57*437bfbebSnyanmisaka RK_U32 quiet = data->quiet;
58*437bfbebSnyanmisaka
59*437bfbebSnyanmisaka mpp_log_q(quiet, "put packet thread start\n");
60*437bfbebSnyanmisaka
61*437bfbebSnyanmisaka do {
62*437bfbebSnyanmisaka RK_U32 pkt_eos = 0;
63*437bfbebSnyanmisaka FileBufSlot *slot = NULL;
64*437bfbebSnyanmisaka MPP_RET ret = reader_read(reader, &slot);
65*437bfbebSnyanmisaka if (ret)
66*437bfbebSnyanmisaka break;
67*437bfbebSnyanmisaka
68*437bfbebSnyanmisaka mpp_packet_set_data(packet, slot->data);
69*437bfbebSnyanmisaka mpp_packet_set_size(packet, slot->size);
70*437bfbebSnyanmisaka mpp_packet_set_pos(packet, slot->data);
71*437bfbebSnyanmisaka mpp_packet_set_length(packet, slot->size);
72*437bfbebSnyanmisaka
73*437bfbebSnyanmisaka pkt_eos = slot->eos;
74*437bfbebSnyanmisaka // setup eos flag
75*437bfbebSnyanmisaka if (pkt_eos) {
76*437bfbebSnyanmisaka if (data->frame_num < 0 || data->frame_count < data->frame_num) {
77*437bfbebSnyanmisaka mpp_log_q(quiet, "%p loop again\n", ctx);
78*437bfbebSnyanmisaka reader_rewind(reader);
79*437bfbebSnyanmisaka pkt_eos = 0;
80*437bfbebSnyanmisaka } else {
81*437bfbebSnyanmisaka mpp_log_q(quiet, "%p found last packet\n", ctx);
82*437bfbebSnyanmisaka mpp_packet_set_eos(packet);
83*437bfbebSnyanmisaka }
84*437bfbebSnyanmisaka }
85*437bfbebSnyanmisaka
86*437bfbebSnyanmisaka // send packet until it success
87*437bfbebSnyanmisaka do {
88*437bfbebSnyanmisaka ret = mpi->decode_put_packet(ctx, packet);
89*437bfbebSnyanmisaka if (MPP_OK == ret) {
90*437bfbebSnyanmisaka mpp_assert(0 == mpp_packet_get_length(packet));
91*437bfbebSnyanmisaka break;
92*437bfbebSnyanmisaka
93*437bfbebSnyanmisaka }
94*437bfbebSnyanmisaka // if failed wait a moment and retry
95*437bfbebSnyanmisaka msleep(1);
96*437bfbebSnyanmisaka } while (!data->loop_end);
97*437bfbebSnyanmisaka
98*437bfbebSnyanmisaka if (pkt_eos)
99*437bfbebSnyanmisaka break;
100*437bfbebSnyanmisaka } while (!data->loop_end);
101*437bfbebSnyanmisaka
102*437bfbebSnyanmisaka mpp_log_q(quiet, "put packet thread end\n");
103*437bfbebSnyanmisaka
104*437bfbebSnyanmisaka return NULL;
105*437bfbebSnyanmisaka }
106*437bfbebSnyanmisaka
thread_output(void * arg)107*437bfbebSnyanmisaka void *thread_output(void *arg)
108*437bfbebSnyanmisaka {
109*437bfbebSnyanmisaka MpiDecMtLoopData *data = (MpiDecMtLoopData *)arg;
110*437bfbebSnyanmisaka MpiDecTestCmd *cmd = data->cmd;
111*437bfbebSnyanmisaka MppCtx ctx = data->ctx;
112*437bfbebSnyanmisaka MppApi *mpi = data->mpi;
113*437bfbebSnyanmisaka RK_U32 quiet = data->quiet;
114*437bfbebSnyanmisaka
115*437bfbebSnyanmisaka mpp_log_q(quiet, "get frame thread start\n");
116*437bfbebSnyanmisaka
117*437bfbebSnyanmisaka // then get all available frame and release
118*437bfbebSnyanmisaka do {
119*437bfbebSnyanmisaka RK_U32 frm_eos = 0;
120*437bfbebSnyanmisaka MppFrame frame = NULL;
121*437bfbebSnyanmisaka MPP_RET ret = mpi->decode_get_frame(ctx, &frame);
122*437bfbebSnyanmisaka
123*437bfbebSnyanmisaka if (ret) {
124*437bfbebSnyanmisaka mpp_err("decode_get_frame failed ret %d\n", ret);
125*437bfbebSnyanmisaka continue;
126*437bfbebSnyanmisaka }
127*437bfbebSnyanmisaka
128*437bfbebSnyanmisaka if (NULL == frame) {
129*437bfbebSnyanmisaka msleep(1);
130*437bfbebSnyanmisaka continue;
131*437bfbebSnyanmisaka }
132*437bfbebSnyanmisaka
133*437bfbebSnyanmisaka if (mpp_frame_get_info_change(frame)) {
134*437bfbebSnyanmisaka // found info change and create buffer group for decoding
135*437bfbebSnyanmisaka RK_U32 width = mpp_frame_get_width(frame);
136*437bfbebSnyanmisaka RK_U32 height = mpp_frame_get_height(frame);
137*437bfbebSnyanmisaka RK_U32 hor_stride = mpp_frame_get_hor_stride(frame);
138*437bfbebSnyanmisaka RK_U32 ver_stride = mpp_frame_get_ver_stride(frame);
139*437bfbebSnyanmisaka RK_U32 buf_size = mpp_frame_get_buf_size(frame);
140*437bfbebSnyanmisaka MppBufferGroup grp = NULL;
141*437bfbebSnyanmisaka
142*437bfbebSnyanmisaka mpp_log_q(quiet, "decode_get_frame get info changed found\n");
143*437bfbebSnyanmisaka mpp_log_q(quiet, "decoder require buffer w:h [%d:%d] stride [%d:%d] size %d\n",
144*437bfbebSnyanmisaka width, height, hor_stride, ver_stride, buf_size);
145*437bfbebSnyanmisaka
146*437bfbebSnyanmisaka if (MPP_FRAME_FMT_IS_FBC(cmd->format)) {
147*437bfbebSnyanmisaka MppFrame frm = NULL;
148*437bfbebSnyanmisaka
149*437bfbebSnyanmisaka mpp_frame_init(&frm);
150*437bfbebSnyanmisaka mpp_frame_set_width(frm, width);
151*437bfbebSnyanmisaka mpp_frame_set_height(frm, height);
152*437bfbebSnyanmisaka mpp_frame_set_fmt(frm, cmd->format);
153*437bfbebSnyanmisaka
154*437bfbebSnyanmisaka ret = mpi->control(ctx, MPP_DEC_SET_FRAME_INFO, frm);
155*437bfbebSnyanmisaka mpp_frame_deinit(&frm);
156*437bfbebSnyanmisaka
157*437bfbebSnyanmisaka if (ret) {
158*437bfbebSnyanmisaka mpp_err("set fbc frame info failed\n");
159*437bfbebSnyanmisaka break;
160*437bfbebSnyanmisaka }
161*437bfbebSnyanmisaka }
162*437bfbebSnyanmisaka
163*437bfbebSnyanmisaka grp = dec_buf_mgr_setup(data->buf_mgr, buf_size, 24, cmd->buf_mode);
164*437bfbebSnyanmisaka /* Set buffer to mpp decoder */
165*437bfbebSnyanmisaka ret = mpi->control(ctx, MPP_DEC_SET_EXT_BUF_GROUP, grp);
166*437bfbebSnyanmisaka if (ret) {
167*437bfbebSnyanmisaka mpp_err("%p set buffer group failed ret %d\n", ctx, ret);
168*437bfbebSnyanmisaka break;
169*437bfbebSnyanmisaka }
170*437bfbebSnyanmisaka data->frm_grp = grp;
171*437bfbebSnyanmisaka
172*437bfbebSnyanmisaka ret = mpi->control(ctx, MPP_DEC_SET_INFO_CHANGE_READY, NULL);
173*437bfbebSnyanmisaka if (ret) {
174*437bfbebSnyanmisaka mpp_err("info change ready failed ret %d\n", ret);
175*437bfbebSnyanmisaka break;
176*437bfbebSnyanmisaka }
177*437bfbebSnyanmisaka } else {
178*437bfbebSnyanmisaka char log_buf[256];
179*437bfbebSnyanmisaka RK_S32 log_size = sizeof(log_buf) - 1;
180*437bfbebSnyanmisaka RK_S32 log_len = 0;
181*437bfbebSnyanmisaka RK_U32 err_info = mpp_frame_get_errinfo(frame);
182*437bfbebSnyanmisaka RK_U32 discard = mpp_frame_get_discard(frame);
183*437bfbebSnyanmisaka
184*437bfbebSnyanmisaka log_len += snprintf(log_buf + log_len, log_size - log_len,
185*437bfbebSnyanmisaka "decode get frame %d", data->frame_count);
186*437bfbebSnyanmisaka
187*437bfbebSnyanmisaka if (mpp_frame_has_meta(frame)) {
188*437bfbebSnyanmisaka MppMeta meta = mpp_frame_get_meta(frame);
189*437bfbebSnyanmisaka RK_S32 temporal_id = 0;
190*437bfbebSnyanmisaka
191*437bfbebSnyanmisaka mpp_meta_get_s32(meta, KEY_TEMPORAL_ID, &temporal_id);
192*437bfbebSnyanmisaka
193*437bfbebSnyanmisaka log_len += snprintf(log_buf + log_len, log_size - log_len,
194*437bfbebSnyanmisaka " tid %d", temporal_id);
195*437bfbebSnyanmisaka }
196*437bfbebSnyanmisaka
197*437bfbebSnyanmisaka if (err_info || discard) {
198*437bfbebSnyanmisaka log_len += snprintf(log_buf + log_len, log_size - log_len,
199*437bfbebSnyanmisaka " err %x discard %x", err_info, discard);
200*437bfbebSnyanmisaka }
201*437bfbebSnyanmisaka mpp_log_q(quiet, "%p %s\n", ctx, log_buf);
202*437bfbebSnyanmisaka
203*437bfbebSnyanmisaka data->frame_count++;
204*437bfbebSnyanmisaka if (data->fp_output && !err_info)
205*437bfbebSnyanmisaka dump_mpp_frame_to_file(frame, data->fp_output);
206*437bfbebSnyanmisaka
207*437bfbebSnyanmisaka fps_calc_inc(cmd->fps);
208*437bfbebSnyanmisaka }
209*437bfbebSnyanmisaka
210*437bfbebSnyanmisaka frm_eos = mpp_frame_get_eos(frame);
211*437bfbebSnyanmisaka mpp_frame_deinit(&frame);
212*437bfbebSnyanmisaka
213*437bfbebSnyanmisaka if ((data->frame_num > 0 && (data->frame_count >= data->frame_num)) ||
214*437bfbebSnyanmisaka ((data->frame_num == 0) && frm_eos))
215*437bfbebSnyanmisaka data->loop_end = 1;
216*437bfbebSnyanmisaka } while (!data->loop_end);
217*437bfbebSnyanmisaka
218*437bfbebSnyanmisaka mpp_log_q(quiet, "get frame thread end\n");
219*437bfbebSnyanmisaka
220*437bfbebSnyanmisaka return NULL;
221*437bfbebSnyanmisaka }
222*437bfbebSnyanmisaka
mt_dec_decode(MpiDecTestCmd * cmd)223*437bfbebSnyanmisaka int mt_dec_decode(MpiDecTestCmd *cmd)
224*437bfbebSnyanmisaka {
225*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
226*437bfbebSnyanmisaka FileReader reader = cmd->reader;
227*437bfbebSnyanmisaka
228*437bfbebSnyanmisaka // base flow context
229*437bfbebSnyanmisaka MppCtx ctx = NULL;
230*437bfbebSnyanmisaka MppApi *mpi = NULL;
231*437bfbebSnyanmisaka
232*437bfbebSnyanmisaka // input / output
233*437bfbebSnyanmisaka MppPacket packet = NULL;
234*437bfbebSnyanmisaka MppFrame frame = NULL;
235*437bfbebSnyanmisaka
236*437bfbebSnyanmisaka // config for runtime mode
237*437bfbebSnyanmisaka MppDecCfg cfg = NULL;
238*437bfbebSnyanmisaka RK_U32 need_split = 1;
239*437bfbebSnyanmisaka
240*437bfbebSnyanmisaka // paramter for resource malloc
241*437bfbebSnyanmisaka RK_U32 width = cmd->width;
242*437bfbebSnyanmisaka RK_U32 height = cmd->height;
243*437bfbebSnyanmisaka MppCodingType type = cmd->type;
244*437bfbebSnyanmisaka
245*437bfbebSnyanmisaka pthread_t thd_in;
246*437bfbebSnyanmisaka pthread_t thd_out = 0;
247*437bfbebSnyanmisaka pthread_attr_t attr;
248*437bfbebSnyanmisaka MpiDecMtLoopData data;
249*437bfbebSnyanmisaka
250*437bfbebSnyanmisaka mpp_log("mpi_dec_mt_test start\n");
251*437bfbebSnyanmisaka memset(&data, 0, sizeof(data));
252*437bfbebSnyanmisaka
253*437bfbebSnyanmisaka if (cmd->have_output) {
254*437bfbebSnyanmisaka data.fp_output = fopen(cmd->file_output, "w+b");
255*437bfbebSnyanmisaka if (NULL == data.fp_output) {
256*437bfbebSnyanmisaka mpp_err("failed to open output file %s\n", cmd->file_output);
257*437bfbebSnyanmisaka goto MPP_TEST_OUT;
258*437bfbebSnyanmisaka }
259*437bfbebSnyanmisaka }
260*437bfbebSnyanmisaka
261*437bfbebSnyanmisaka ret = dec_buf_mgr_init(&data.buf_mgr);
262*437bfbebSnyanmisaka if (ret) {
263*437bfbebSnyanmisaka mpp_err("dec_buf_mgr_init failed\n");
264*437bfbebSnyanmisaka goto MPP_TEST_OUT;
265*437bfbebSnyanmisaka }
266*437bfbebSnyanmisaka
267*437bfbebSnyanmisaka ret = mpp_packet_init(&packet, NULL, 0);
268*437bfbebSnyanmisaka if (ret) {
269*437bfbebSnyanmisaka mpp_err("mpp_packet_init failed\n");
270*437bfbebSnyanmisaka goto MPP_TEST_OUT;
271*437bfbebSnyanmisaka }
272*437bfbebSnyanmisaka
273*437bfbebSnyanmisaka mpp_log("mpi_dec_mt_test decoder test start w %d h %d type %d\n", width, height, type);
274*437bfbebSnyanmisaka
275*437bfbebSnyanmisaka // decoder demo
276*437bfbebSnyanmisaka ret = mpp_create(&ctx, &mpi);
277*437bfbebSnyanmisaka if (ret) {
278*437bfbebSnyanmisaka mpp_err("mpp_create failed\n");
279*437bfbebSnyanmisaka goto MPP_TEST_OUT;
280*437bfbebSnyanmisaka }
281*437bfbebSnyanmisaka
282*437bfbebSnyanmisaka ret = mpp_init(ctx, MPP_CTX_DEC, type);
283*437bfbebSnyanmisaka if (ret) {
284*437bfbebSnyanmisaka mpp_err("mpp_init failed\n");
285*437bfbebSnyanmisaka goto MPP_TEST_OUT;
286*437bfbebSnyanmisaka }
287*437bfbebSnyanmisaka
288*437bfbebSnyanmisaka // NOTE: timeout value please refer to MppPollType definition
289*437bfbebSnyanmisaka // 0 - non-block call (default)
290*437bfbebSnyanmisaka // -1 - block call
291*437bfbebSnyanmisaka // +val - timeout value in ms
292*437bfbebSnyanmisaka {
293*437bfbebSnyanmisaka MppPollType timeout = MPP_POLL_BLOCK;
294*437bfbebSnyanmisaka MppParam param = &timeout;
295*437bfbebSnyanmisaka
296*437bfbebSnyanmisaka ret = mpi->control(ctx, MPP_SET_OUTPUT_TIMEOUT, param);
297*437bfbebSnyanmisaka if (ret) {
298*437bfbebSnyanmisaka mpp_err("Failed to set output timeout %d ret %d\n", timeout, ret);
299*437bfbebSnyanmisaka goto MPP_TEST_OUT;
300*437bfbebSnyanmisaka }
301*437bfbebSnyanmisaka }
302*437bfbebSnyanmisaka
303*437bfbebSnyanmisaka mpp_dec_cfg_init(&cfg);
304*437bfbebSnyanmisaka
305*437bfbebSnyanmisaka /* get default config from decoder context */
306*437bfbebSnyanmisaka ret = mpi->control(ctx, MPP_DEC_GET_CFG, cfg);
307*437bfbebSnyanmisaka if (ret) {
308*437bfbebSnyanmisaka mpp_err("%p failed to get decoder cfg ret %d\n", ctx, ret);
309*437bfbebSnyanmisaka goto MPP_TEST_OUT;
310*437bfbebSnyanmisaka }
311*437bfbebSnyanmisaka
312*437bfbebSnyanmisaka /*
313*437bfbebSnyanmisaka * split_parse is to enable mpp internal frame spliter when the input
314*437bfbebSnyanmisaka * packet is not aplited into frames.
315*437bfbebSnyanmisaka */
316*437bfbebSnyanmisaka ret = mpp_dec_cfg_set_u32(cfg, "base:split_parse", need_split);
317*437bfbebSnyanmisaka if (ret) {
318*437bfbebSnyanmisaka mpp_err("%p failed to set split_parse ret %d\n", ctx, ret);
319*437bfbebSnyanmisaka goto MPP_TEST_OUT;
320*437bfbebSnyanmisaka }
321*437bfbebSnyanmisaka
322*437bfbebSnyanmisaka ret = mpi->control(ctx, MPP_DEC_SET_CFG, cfg);
323*437bfbebSnyanmisaka if (ret) {
324*437bfbebSnyanmisaka mpp_err("%p failed to set cfg %p ret %d\n", ctx, cfg, ret);
325*437bfbebSnyanmisaka goto MPP_TEST_OUT;
326*437bfbebSnyanmisaka }
327*437bfbebSnyanmisaka
328*437bfbebSnyanmisaka data.cmd = cmd;
329*437bfbebSnyanmisaka data.ctx = ctx;
330*437bfbebSnyanmisaka data.mpi = mpi;
331*437bfbebSnyanmisaka data.loop_end = 0;
332*437bfbebSnyanmisaka data.packet = packet;
333*437bfbebSnyanmisaka data.frame = frame;
334*437bfbebSnyanmisaka data.frame_count = 0;
335*437bfbebSnyanmisaka data.frame_num = cmd->frame_num;
336*437bfbebSnyanmisaka data.reader = reader;
337*437bfbebSnyanmisaka data.quiet = cmd->quiet;
338*437bfbebSnyanmisaka
339*437bfbebSnyanmisaka pthread_attr_init(&attr);
340*437bfbebSnyanmisaka pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
341*437bfbebSnyanmisaka
342*437bfbebSnyanmisaka ret = pthread_create(&thd_in, &attr, thread_input, &data);
343*437bfbebSnyanmisaka if (ret) {
344*437bfbebSnyanmisaka mpp_err("failed to create thread for input ret %d\n", ret);
345*437bfbebSnyanmisaka goto THREAD_END;
346*437bfbebSnyanmisaka }
347*437bfbebSnyanmisaka
348*437bfbebSnyanmisaka ret = pthread_create(&thd_out, &attr, thread_output, &data);
349*437bfbebSnyanmisaka if (ret) {
350*437bfbebSnyanmisaka mpp_err("failed to create thread for output ret %d\n", ret);
351*437bfbebSnyanmisaka goto THREAD_END;
352*437bfbebSnyanmisaka }
353*437bfbebSnyanmisaka
354*437bfbebSnyanmisaka if (cmd->frame_num < 0) {
355*437bfbebSnyanmisaka // wait for input then quit decoding
356*437bfbebSnyanmisaka mpp_log("*******************************************\n");
357*437bfbebSnyanmisaka mpp_log("**** Press Enter to stop loop decoding ****\n");
358*437bfbebSnyanmisaka mpp_log("*******************************************\n");
359*437bfbebSnyanmisaka
360*437bfbebSnyanmisaka getc(stdin);
361*437bfbebSnyanmisaka data.loop_end = 1;
362*437bfbebSnyanmisaka }
363*437bfbebSnyanmisaka
364*437bfbebSnyanmisaka THREAD_END:
365*437bfbebSnyanmisaka pthread_attr_destroy(&attr);
366*437bfbebSnyanmisaka
367*437bfbebSnyanmisaka pthread_join(thd_in, NULL);
368*437bfbebSnyanmisaka pthread_join(thd_out, NULL);
369*437bfbebSnyanmisaka
370*437bfbebSnyanmisaka ret = mpi->reset(ctx);
371*437bfbebSnyanmisaka if (ret) {
372*437bfbebSnyanmisaka mpp_err("mpi->reset failed\n");
373*437bfbebSnyanmisaka goto MPP_TEST_OUT;
374*437bfbebSnyanmisaka }
375*437bfbebSnyanmisaka
376*437bfbebSnyanmisaka MPP_TEST_OUT:
377*437bfbebSnyanmisaka if (packet) {
378*437bfbebSnyanmisaka mpp_packet_deinit(&packet);
379*437bfbebSnyanmisaka packet = NULL;
380*437bfbebSnyanmisaka }
381*437bfbebSnyanmisaka
382*437bfbebSnyanmisaka if (frame) {
383*437bfbebSnyanmisaka mpp_frame_deinit(&frame);
384*437bfbebSnyanmisaka frame = NULL;
385*437bfbebSnyanmisaka }
386*437bfbebSnyanmisaka
387*437bfbebSnyanmisaka if (ctx) {
388*437bfbebSnyanmisaka mpp_destroy(ctx);
389*437bfbebSnyanmisaka ctx = NULL;
390*437bfbebSnyanmisaka }
391*437bfbebSnyanmisaka
392*437bfbebSnyanmisaka data.frm_grp = NULL;
393*437bfbebSnyanmisaka if (data.buf_mgr) {
394*437bfbebSnyanmisaka dec_buf_mgr_deinit(data.buf_mgr);
395*437bfbebSnyanmisaka data.buf_mgr = NULL;
396*437bfbebSnyanmisaka }
397*437bfbebSnyanmisaka
398*437bfbebSnyanmisaka if (data.fp_output) {
399*437bfbebSnyanmisaka fclose(data.fp_output);
400*437bfbebSnyanmisaka data.fp_output = NULL;
401*437bfbebSnyanmisaka }
402*437bfbebSnyanmisaka
403*437bfbebSnyanmisaka if (cfg) {
404*437bfbebSnyanmisaka mpp_dec_cfg_deinit(cfg);
405*437bfbebSnyanmisaka cfg = NULL;
406*437bfbebSnyanmisaka }
407*437bfbebSnyanmisaka
408*437bfbebSnyanmisaka return ret;
409*437bfbebSnyanmisaka }
410*437bfbebSnyanmisaka
main(int argc,char ** argv)411*437bfbebSnyanmisaka int main(int argc, char **argv)
412*437bfbebSnyanmisaka {
413*437bfbebSnyanmisaka RK_S32 ret = 0;
414*437bfbebSnyanmisaka MpiDecTestCmd cmd_ctx;
415*437bfbebSnyanmisaka MpiDecTestCmd* cmd = &cmd_ctx;
416*437bfbebSnyanmisaka
417*437bfbebSnyanmisaka memset((void*)cmd, 0, sizeof(*cmd));
418*437bfbebSnyanmisaka // default use block mode
419*437bfbebSnyanmisaka cmd->timeout = -1;
420*437bfbebSnyanmisaka
421*437bfbebSnyanmisaka // parse the cmd option
422*437bfbebSnyanmisaka ret = mpi_dec_test_cmd_init(cmd, argc, argv);
423*437bfbebSnyanmisaka if (ret)
424*437bfbebSnyanmisaka goto RET;
425*437bfbebSnyanmisaka
426*437bfbebSnyanmisaka mpi_dec_test_cmd_options(cmd);
427*437bfbebSnyanmisaka
428*437bfbebSnyanmisaka if (cmd->type == MPP_VIDEO_CodingMJPEG) {
429*437bfbebSnyanmisaka mpp_log("mpi_dec_mt_test not support mjpeg yet\n");
430*437bfbebSnyanmisaka goto RET;
431*437bfbebSnyanmisaka }
432*437bfbebSnyanmisaka
433*437bfbebSnyanmisaka ret = mt_dec_decode(cmd);
434*437bfbebSnyanmisaka if (MPP_OK == ret)
435*437bfbebSnyanmisaka mpp_log("test success\n");
436*437bfbebSnyanmisaka else
437*437bfbebSnyanmisaka mpp_err("test failed ret %d\n", ret);
438*437bfbebSnyanmisaka
439*437bfbebSnyanmisaka RET:
440*437bfbebSnyanmisaka mpi_dec_test_cmd_deinit(cmd);
441*437bfbebSnyanmisaka
442*437bfbebSnyanmisaka return ret;
443*437bfbebSnyanmisaka }
444