1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright 2020 Rockchip Electronics Co. LTD
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Licensed under the Apache License, Version 2.0 (the "License");
5*4882a593Smuzhiyun * you may not use this file except in compliance with the License.
6*4882a593Smuzhiyun * You may obtain a copy of the License at
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * http://www.apache.org/licenses/LICENSE-2.0
9*4882a593Smuzhiyun *
10*4882a593Smuzhiyun * Unless required by applicable law or agreed to in writing, software
11*4882a593Smuzhiyun * distributed under the License is distributed on an "AS IS" BASIS,
12*4882a593Smuzhiyun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4882a593Smuzhiyun * See the License for the specific language governing permissions and
14*4882a593Smuzhiyun * limitations under the License.
15*4882a593Smuzhiyun *
16*4882a593Smuzhiyun */
17*4882a593Smuzhiyun #include <cstdio>
18*4882a593Smuzhiyun #include <cerrno>
19*4882a593Smuzhiyun #include <cstring>
20*4882a593Smuzhiyun #include <cstdlib>
21*4882a593Smuzhiyun #include <unistd.h>
22*4882a593Smuzhiyun #include <pthread.h>
23*4882a593Smuzhiyun #include "rk_debug.h"
24*4882a593Smuzhiyun #include "rk_mpi_adec.h"
25*4882a593Smuzhiyun #include "rk_mpi_mb.h"
26*4882a593Smuzhiyun #include "rk_mpi_sys.h"
27*4882a593Smuzhiyun #include "test_comm_argparse.h"
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun typedef struct _rkMpiADECCtx {
30*4882a593Smuzhiyun const char *srcFilePath;
31*4882a593Smuzhiyun const char *dstFilePath;
32*4882a593Smuzhiyun RK_S32 s32LoopCount;
33*4882a593Smuzhiyun RK_S32 s32ChnNum;
34*4882a593Smuzhiyun RK_S32 s32SampleRate;
35*4882a593Smuzhiyun RK_S32 s32Channel;
36*4882a593Smuzhiyun char *chCodecId;
37*4882a593Smuzhiyun RK_S32 s32DecMode;
38*4882a593Smuzhiyun RK_BOOL bBlock;
39*4882a593Smuzhiyun RK_S32 s32ChnIndex;
40*4882a593Smuzhiyun RK_S32 s32QueryStat;
41*4882a593Smuzhiyun RK_S32 s32ClrChnBuf;
42*4882a593Smuzhiyun } TEST_ADEC_CTX_S;
43*4882a593Smuzhiyun
query_adec_flow_graph_stat(ADEC_CHN AdChn)44*4882a593Smuzhiyun void query_adec_flow_graph_stat(ADEC_CHN AdChn) {
45*4882a593Smuzhiyun RK_S32 ret = 0;
46*4882a593Smuzhiyun ADEC_CHN_STATE_S pstStat;
47*4882a593Smuzhiyun memset(&pstStat, 0, sizeof(ADEC_CHN_STATE_S));
48*4882a593Smuzhiyun ret = RK_MPI_ADEC_QueryChnStat(AdChn, &pstStat);
49*4882a593Smuzhiyun if (ret == RK_SUCCESS) {
50*4882a593Smuzhiyun RK_LOGI("query adec flow status:");
51*4882a593Smuzhiyun RK_LOGI("EOS flag : %d", pstStat.bEndOfStream);
52*4882a593Smuzhiyun RK_LOGI("total number of channel buffer : %d", pstStat.u32BufferFrmNum);
53*4882a593Smuzhiyun RK_LOGI("free number of channel buffer : %d", pstStat.u32BufferFreeNum);
54*4882a593Smuzhiyun RK_LOGI("busy number of channel buffer : %d", pstStat.u32BufferBusyNum);
55*4882a593Smuzhiyun }
56*4882a593Smuzhiyun }
57*4882a593Smuzhiyun
adec_data_free(void * opaque)58*4882a593Smuzhiyun static RK_S32 adec_data_free(void *opaque) {
59*4882a593Smuzhiyun if (opaque) {
60*4882a593Smuzhiyun free(opaque);
61*4882a593Smuzhiyun opaque = RK_NULL;
62*4882a593Smuzhiyun }
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun return 0;
65*4882a593Smuzhiyun }
66*4882a593Smuzhiyun
test_find_audio_codec_id(TEST_ADEC_CTX_S * params)67*4882a593Smuzhiyun static RK_U32 test_find_audio_codec_id(TEST_ADEC_CTX_S *params) {
68*4882a593Smuzhiyun if (params == RK_NULL)
69*4882a593Smuzhiyun return -1;
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun char *format = params->chCodecId;
72*4882a593Smuzhiyun if (strstr(format, "mp2")) {
73*4882a593Smuzhiyun return RK_AUDIO_ID_MP2;
74*4882a593Smuzhiyun } else if (strstr(format, "g726")) {
75*4882a593Smuzhiyun return RK_AUDIO_ID_ADPCM_G726;
76*4882a593Smuzhiyun } else if (strstr(format, "g711a")) {
77*4882a593Smuzhiyun return RK_AUDIO_ID_PCM_ALAW;
78*4882a593Smuzhiyun } else if (strstr(format, "g711u")) {
79*4882a593Smuzhiyun return RK_AUDIO_ID_PCM_MULAW;
80*4882a593Smuzhiyun }
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun if (params->s32DecMode == ADEC_MODE_STREAM) {
83*4882a593Smuzhiyun RK_LOGE("test not find codec id : %s", params->chCodecId);
84*4882a593Smuzhiyun return RK_AUDIO_ID_Unused;
85*4882a593Smuzhiyun } else {
86*4882a593Smuzhiyun // if set packet mode, try to get codecId, channels, samplerate
87*4882a593Smuzhiyun return RK_AUDIO_ID_AutoDetect;
88*4882a593Smuzhiyun }
89*4882a593Smuzhiyun }
90*4882a593Smuzhiyun
test_init_mpi_adec(TEST_ADEC_CTX_S * params)91*4882a593Smuzhiyun RK_S32 test_init_mpi_adec(TEST_ADEC_CTX_S *params) {
92*4882a593Smuzhiyun RK_S32 i = 0;
93*4882a593Smuzhiyun RK_S32 s32ret = 0;
94*4882a593Smuzhiyun ADEC_CHN_ATTR_S stAdecAttr;
95*4882a593Smuzhiyun ADEC_CHN AdChn = (ADEC_CHN)(params->s32ChnIndex);
96*4882a593Smuzhiyun memset(&stAdecAttr, 0, sizeof(ADEC_CHN_ATTR_S));
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun if (stAdecAttr.stCodecAttr.u32Channels == 0) {
99*4882a593Smuzhiyun stAdecAttr.stCodecAttr.u32Channels = params->s32Channel;
100*4882a593Smuzhiyun stAdecAttr.stCodecAttr.u32SampleRate = params->s32SampleRate;
101*4882a593Smuzhiyun }
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun RK_U32 codecId = test_find_audio_codec_id(params);
104*4882a593Smuzhiyun if (codecId == RK_AUDIO_ID_Unused) {
105*4882a593Smuzhiyun return RK_FAILURE;
106*4882a593Smuzhiyun }
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun stAdecAttr.enType = (RK_CODEC_ID_E)codecId;
109*4882a593Smuzhiyun stAdecAttr.enMode = (ADEC_MODE_E)params->s32DecMode;
110*4882a593Smuzhiyun stAdecAttr.u32BufCount = 4;
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun s32ret = RK_MPI_ADEC_CreateChn(AdChn, &stAdecAttr);
113*4882a593Smuzhiyun if (s32ret) {
114*4882a593Smuzhiyun RK_LOGE("create adec chn %d err:0x%x\n", AdChn, s32ret);
115*4882a593Smuzhiyun return RK_FAILURE;
116*4882a593Smuzhiyun }
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun return RK_SUCCESS;
119*4882a593Smuzhiyun }
120*4882a593Smuzhiyun
test_deinit_mpi_adec(TEST_ADEC_CTX_S * ctx)121*4882a593Smuzhiyun RK_S32 test_deinit_mpi_adec(TEST_ADEC_CTX_S *ctx) {
122*4882a593Smuzhiyun RK_MPI_ADEC_DestroyChn(ctx->s32ChnIndex);
123*4882a593Smuzhiyun return RK_SUCCESS;
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun
send_stream_thread(void * arg)126*4882a593Smuzhiyun static void *send_stream_thread(void *arg) {
127*4882a593Smuzhiyun RK_S32 s32ret = 0;
128*4882a593Smuzhiyun TEST_ADEC_CTX_S *params = reinterpret_cast<TEST_ADEC_CTX_S *>(arg);
129*4882a593Smuzhiyun RK_U8 *srcData = RK_NULL;
130*4882a593Smuzhiyun RK_S32 srcSize = 0;
131*4882a593Smuzhiyun FILE *file = RK_NULL;
132*4882a593Smuzhiyun RK_S32 err = 0;
133*4882a593Smuzhiyun RK_S32 pktEos = 0;
134*4882a593Smuzhiyun AUDIO_STREAM_S stAudioStream;
135*4882a593Smuzhiyun RK_BOOL bBlock = params->bBlock;
136*4882a593Smuzhiyun ADEC_CHN AdChn = (ADEC_CHN)(params->s32ChnIndex);
137*4882a593Smuzhiyun RK_U64 timeStamp = 0;
138*4882a593Smuzhiyun RK_S32 count = 0;
139*4882a593Smuzhiyun RK_S64 dataOffset = 0;
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun file = fopen(params->srcFilePath, "rb");
142*4882a593Smuzhiyun if (file == RK_NULL) {
143*4882a593Smuzhiyun RK_LOGE("failed to open input file(%s), error: %s", params->srcFilePath, strerror(errno));
144*4882a593Smuzhiyun goto __FAILED;
145*4882a593Smuzhiyun }
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun while (1) {
148*4882a593Smuzhiyun srcData = reinterpret_cast<RK_U8 *>(calloc(1024, sizeof(RK_U8)));
149*4882a593Smuzhiyun memset(srcData, 0, 1024);
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun srcSize = fread(srcData, 1, 1024, file);
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun if (srcSize == 0 || srcData == RK_NULL) {
154*4882a593Smuzhiyun RK_LOGI("read eos packet, now send eos packet!");
155*4882a593Smuzhiyun pktEos = 1;
156*4882a593Smuzhiyun }
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun if (pktEos) {
159*4882a593Smuzhiyun RK_MPI_ADEC_SendEndOfStream(AdChn, RK_FALSE);
160*4882a593Smuzhiyun break;
161*4882a593Smuzhiyun } else {
162*4882a593Smuzhiyun stAudioStream.u32Len = srcSize;
163*4882a593Smuzhiyun stAudioStream.u64TimeStamp = timeStamp;
164*4882a593Smuzhiyun stAudioStream.u32Seq = ++count;
165*4882a593Smuzhiyun stAudioStream.bBypassMbBlk = RK_TRUE;
166*4882a593Smuzhiyun MB_EXT_CONFIG_S extConfig = {0};
167*4882a593Smuzhiyun extConfig.pFreeCB = adec_data_free;
168*4882a593Smuzhiyun extConfig.pOpaque = srcData;
169*4882a593Smuzhiyun extConfig.pu8VirAddr = srcData;
170*4882a593Smuzhiyun extConfig.u64Size = srcSize;
171*4882a593Smuzhiyun RK_MPI_SYS_CreateMB(&(stAudioStream.pMbBlk), &extConfig);
172*4882a593Smuzhiyun __RETRY:
173*4882a593Smuzhiyun s32ret = RK_MPI_ADEC_SendStream(AdChn, &stAudioStream, bBlock);
174*4882a593Smuzhiyun if (s32ret != RK_SUCCESS) {
175*4882a593Smuzhiyun RK_LOGE("fail to send adec stream.");
176*4882a593Smuzhiyun goto __RETRY;
177*4882a593Smuzhiyun }
178*4882a593Smuzhiyun RK_MPI_MB_ReleaseMB(stAudioStream.pMbBlk);
179*4882a593Smuzhiyun }
180*4882a593Smuzhiyun timeStamp++;
181*4882a593Smuzhiyun }
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun __FAILED:
184*4882a593Smuzhiyun if (file) {
185*4882a593Smuzhiyun fclose(file);
186*4882a593Smuzhiyun file = RK_NULL;
187*4882a593Smuzhiyun }
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun return RK_NULL;
190*4882a593Smuzhiyun }
191*4882a593Smuzhiyun
receive_data_thread(void * arg)192*4882a593Smuzhiyun static void *receive_data_thread(void *arg) {
193*4882a593Smuzhiyun RK_S32 s32ret = 0;
194*4882a593Smuzhiyun FILE *file = RK_NULL;
195*4882a593Smuzhiyun TEST_ADEC_CTX_S *params = reinterpret_cast<TEST_ADEC_CTX_S *>(arg);
196*4882a593Smuzhiyun AUDIO_FRAME_INFO_S *pstFrmInfo = RK_NULL;
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun pstFrmInfo = reinterpret_cast<AUDIO_FRAME_INFO_S *>(malloc(sizeof(AUDIO_FRAME_INFO_S)));
199*4882a593Smuzhiyun memset(pstFrmInfo, 0, sizeof(AUDIO_FRAME_INFO_S));
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun RK_BOOL bBlock = params->bBlock;
202*4882a593Smuzhiyun ADEC_CHN AdChn = (ADEC_CHN)(params->s32ChnIndex);
203*4882a593Smuzhiyun RK_S32 eos = 0;
204*4882a593Smuzhiyun RK_S32 count = 0;
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun if (params->dstFilePath) {
207*4882a593Smuzhiyun file = fopen(params->dstFilePath, "wb+");
208*4882a593Smuzhiyun if (file == RK_NULL) {
209*4882a593Smuzhiyun RK_LOGE("failed to open output file %s, error: %s.", params->dstFilePath, strerror(errno));
210*4882a593Smuzhiyun goto __FAILED;
211*4882a593Smuzhiyun }
212*4882a593Smuzhiyun }
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun while (1) {
215*4882a593Smuzhiyun s32ret = RK_MPI_ADEC_GetFrame(AdChn, pstFrmInfo, bBlock);
216*4882a593Smuzhiyun if (s32ret == RK_SUCCESS) {
217*4882a593Smuzhiyun MB_BLK bBlk = pstFrmInfo->pstFrame->pMbBlk;
218*4882a593Smuzhiyun RK_VOID *pstFrame = RK_MPI_MB_Handle2VirAddr(bBlk);
219*4882a593Smuzhiyun RK_S32 frameSize = pstFrmInfo->pstFrame->u32Len;
220*4882a593Smuzhiyun eos = (frameSize <= 0) ? 1 : 0;
221*4882a593Smuzhiyun if (pstFrame) {
222*4882a593Smuzhiyun RK_LOGV("get frame data = %p, size = %d", pstFrame, frameSize);
223*4882a593Smuzhiyun if (file) {
224*4882a593Smuzhiyun fwrite(pstFrame, frameSize, 1, file);
225*4882a593Smuzhiyun fflush(file);
226*4882a593Smuzhiyun }
227*4882a593Smuzhiyun // release frame
228*4882a593Smuzhiyun RK_MPI_ADEC_ReleaseFrame(AdChn, pstFrmInfo);
229*4882a593Smuzhiyun count++;
230*4882a593Smuzhiyun }
231*4882a593Smuzhiyun } else {
232*4882a593Smuzhiyun RK_LOGE("fail to get adec frame.");
233*4882a593Smuzhiyun }
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun if (params->s32QueryStat) {
236*4882a593Smuzhiyun query_adec_flow_graph_stat(AdChn);
237*4882a593Smuzhiyun params->s32QueryStat = 0;
238*4882a593Smuzhiyun }
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun if (params->s32ClrChnBuf) {
241*4882a593Smuzhiyun RK_LOGI("test clear chn(%d) buf", AdChn);
242*4882a593Smuzhiyun RK_MPI_ADEC_ClearChnBuf(AdChn);
243*4882a593Smuzhiyun params->s32ClrChnBuf = 0;
244*4882a593Smuzhiyun }
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun if (eos) {
247*4882a593Smuzhiyun RK_LOGI("get eos packet.");
248*4882a593Smuzhiyun break;
249*4882a593Smuzhiyun }
250*4882a593Smuzhiyun }
251*4882a593Smuzhiyun
252*4882a593Smuzhiyun __FAILED:
253*4882a593Smuzhiyun if (pstFrmInfo) {
254*4882a593Smuzhiyun free(pstFrmInfo);
255*4882a593Smuzhiyun pstFrmInfo = RK_NULL;
256*4882a593Smuzhiyun }
257*4882a593Smuzhiyun
258*4882a593Smuzhiyun if (file) {
259*4882a593Smuzhiyun fclose(file);
260*4882a593Smuzhiyun file = RK_NULL;
261*4882a593Smuzhiyun }
262*4882a593Smuzhiyun return RK_NULL;
263*4882a593Smuzhiyun }
264*4882a593Smuzhiyun
unit_test_mpi_adec(TEST_ADEC_CTX_S * params)265*4882a593Smuzhiyun RK_S32 unit_test_mpi_adec(TEST_ADEC_CTX_S *params) {
266*4882a593Smuzhiyun RK_S32 i = 0;
267*4882a593Smuzhiyun TEST_ADEC_CTX_S adecCtx[ADEC_MAX_CHN_NUM];
268*4882a593Smuzhiyun pthread_t tidSend[ADEC_MAX_CHN_NUM];
269*4882a593Smuzhiyun pthread_t tidReceive[ADEC_MAX_CHN_NUM];
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun if (params->s32ChnNum > ADEC_MAX_CHN_NUM) {
272*4882a593Smuzhiyun RK_LOGE("adec chn(%d) > max_chn(%d)", params->s32ChnNum, ADEC_MAX_CHN_NUM);
273*4882a593Smuzhiyun goto __FAILED;
274*4882a593Smuzhiyun }
275*4882a593Smuzhiyun
276*4882a593Smuzhiyun params->bBlock = RK_TRUE;
277*4882a593Smuzhiyun
278*4882a593Smuzhiyun for (i = 0; i < params->s32ChnNum; i++) {
279*4882a593Smuzhiyun memcpy(&(adecCtx[i]), params, sizeof(TEST_ADEC_CTX_S));
280*4882a593Smuzhiyun adecCtx[i].s32ChnIndex = i;
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun if (test_init_mpi_adec(&adecCtx[i]) == RK_FAILURE) {
283*4882a593Smuzhiyun goto __FAILED;
284*4882a593Smuzhiyun }
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun if (params->s32DecMode == ADEC_MODE_STREAM) {
287*4882a593Smuzhiyun pthread_create(&tidSend[i], RK_NULL, send_stream_thread, reinterpret_cast<void *>(&adecCtx[i]));
288*4882a593Smuzhiyun } else {
289*4882a593Smuzhiyun
290*4882a593Smuzhiyun }
291*4882a593Smuzhiyun pthread_create(&tidReceive[i], RK_NULL, receive_data_thread, reinterpret_cast<void *>(&adecCtx[i]));
292*4882a593Smuzhiyun }
293*4882a593Smuzhiyun
294*4882a593Smuzhiyun for (i = 0; i < params->s32ChnNum; i++) {
295*4882a593Smuzhiyun pthread_join(tidSend[i], RK_NULL);
296*4882a593Smuzhiyun pthread_join(tidReceive[i], RK_NULL);
297*4882a593Smuzhiyun test_deinit_mpi_adec(&adecCtx[i]);
298*4882a593Smuzhiyun }
299*4882a593Smuzhiyun
300*4882a593Smuzhiyun return RK_SUCCESS;
301*4882a593Smuzhiyun __FAILED:
302*4882a593Smuzhiyun
303*4882a593Smuzhiyun return RK_FAILURE;
304*4882a593Smuzhiyun }
305*4882a593Smuzhiyun
306*4882a593Smuzhiyun static const char *const usages[] = {
307*4882a593Smuzhiyun "./rk_mpi_adec_test [-i src_path] [-C name] [--input_rate rate] [--input_ch ch]...",
308*4882a593Smuzhiyun NULL,
309*4882a593Smuzhiyun };
310*4882a593Smuzhiyun
mpi_adec_test_show_options(const TEST_ADEC_CTX_S * ctx)311*4882a593Smuzhiyun static void mpi_adec_test_show_options(const TEST_ADEC_CTX_S *ctx) {
312*4882a593Smuzhiyun RK_PRINT("cmd parse result:\n");
313*4882a593Smuzhiyun RK_PRINT("input file name : %s\n", ctx->srcFilePath);
314*4882a593Smuzhiyun RK_PRINT("output file name : %s\n", ctx->dstFilePath);
315*4882a593Smuzhiyun RK_PRINT("loop count : %d\n", ctx->s32LoopCount);
316*4882a593Smuzhiyun RK_PRINT("channel number : %d\n", ctx->s32ChnNum);
317*4882a593Smuzhiyun RK_PRINT("input sample rate : %d\n", ctx->s32SampleRate);
318*4882a593Smuzhiyun RK_PRINT("input channel : %d\n", ctx->s32Channel);
319*4882a593Smuzhiyun RK_PRINT("input codec name : %s\n", ctx->chCodecId);
320*4882a593Smuzhiyun RK_PRINT("input decode mode : %d\n", ctx->s32DecMode);
321*4882a593Smuzhiyun RK_PRINT("query stat : %d\n", ctx->s32QueryStat);
322*4882a593Smuzhiyun RK_PRINT("clear buf : %d\n", ctx->s32ClrChnBuf);
323*4882a593Smuzhiyun }
324*4882a593Smuzhiyun
main(int argc,const char ** argv)325*4882a593Smuzhiyun int main(int argc, const char **argv) {
326*4882a593Smuzhiyun RK_S32 i;
327*4882a593Smuzhiyun RK_S32 s32Ret;
328*4882a593Smuzhiyun TEST_ADEC_CTX_S *ctx;
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun ctx = reinterpret_cast<TEST_ADEC_CTX_S *>(malloc(sizeof(TEST_ADEC_CTX_S)));
331*4882a593Smuzhiyun memset(ctx, 0, sizeof(TEST_ADEC_CTX_S));
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun ctx->srcFilePath = RK_NULL;
334*4882a593Smuzhiyun ctx->dstFilePath = RK_NULL;
335*4882a593Smuzhiyun ctx->s32LoopCount = 1;
336*4882a593Smuzhiyun ctx->s32ChnNum = 1;
337*4882a593Smuzhiyun ctx->s32DecMode = 0;
338*4882a593Smuzhiyun ctx->chCodecId = RK_NULL;
339*4882a593Smuzhiyun ctx->s32DecMode = ADEC_MODE_STREAM;
340*4882a593Smuzhiyun
341*4882a593Smuzhiyun struct argparse_option options[] = {
342*4882a593Smuzhiyun OPT_HELP(),
343*4882a593Smuzhiyun OPT_GROUP("basic options:"),
344*4882a593Smuzhiyun OPT_STRING('i', "input", &(ctx->srcFilePath),
345*4882a593Smuzhiyun "input file name , e.g.(./*.mp3). <required>", NULL, 0, 0),
346*4882a593Smuzhiyun OPT_STRING('C', "codec", &(ctx->chCodecId),
347*4882a593Smuzhiyun "codec, e.g.(mp2/g711a/g711u/g726). <required>", NULL, 0, 0),
348*4882a593Smuzhiyun OPT_INTEGER('\0', "input_ch", &(ctx->s32Channel),
349*4882a593Smuzhiyun "the number of input stream channels. <required>", NULL, 0, 0),
350*4882a593Smuzhiyun OPT_INTEGER('\0', "input_rate", &(ctx->s32SampleRate),
351*4882a593Smuzhiyun "the sample rate of input stream. <required>", NULL, 0, 0),
352*4882a593Smuzhiyun OPT_STRING('o', "output", &(ctx->dstFilePath),
353*4882a593Smuzhiyun "output file name, e.g.(./*.pcm). default(NULL).", NULL, 0, 0),
354*4882a593Smuzhiyun OPT_INTEGER('n', "loop_count", &(ctx->s32LoopCount),
355*4882a593Smuzhiyun "loop running count. default(1)", NULL, 0, 0),
356*4882a593Smuzhiyun OPT_INTEGER('c', "channel_count", &(ctx->s32ChnNum),
357*4882a593Smuzhiyun "the count of adec channel. default(1).", NULL, 0, 0),
358*4882a593Smuzhiyun OPT_INTEGER('\0', "dec_mode", &(ctx->s32DecMode),
359*4882a593Smuzhiyun "the audio stream decode mode, range(0: pack mode, 1: stream mode), default(0)", NULL, 0, 0),
360*4882a593Smuzhiyun OPT_INTEGER('\0', "query_stat", &(ctx->s32QueryStat),
361*4882a593Smuzhiyun "query adec statistics info, range(0: query, 1: not query), default(0)", NULL, 0, 0),
362*4882a593Smuzhiyun OPT_INTEGER('\0', "clr_buf", &(ctx->s32ClrChnBuf),
363*4882a593Smuzhiyun "clear buffer of channel, range(0, 1), default(0)", NULL, 0, 0),
364*4882a593Smuzhiyun OPT_END(),
365*4882a593Smuzhiyun };
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun struct argparse argparse;
368*4882a593Smuzhiyun argparse_init(&argparse, options, usages, 0);
369*4882a593Smuzhiyun argparse_describe(&argparse, "\nselect a test case to run.",
370*4882a593Smuzhiyun "\nuse --help for details.");
371*4882a593Smuzhiyun
372*4882a593Smuzhiyun argc = argparse_parse(&argparse, argc, argv);
373*4882a593Smuzhiyun mpi_adec_test_show_options(ctx);
374*4882a593Smuzhiyun
375*4882a593Smuzhiyun // must set params
376*4882a593Smuzhiyun if (ctx->srcFilePath == RK_NULL
377*4882a593Smuzhiyun || ctx->s32Channel <= 0
378*4882a593Smuzhiyun || ctx->s32SampleRate <= 0
379*4882a593Smuzhiyun || ctx->chCodecId == RK_NULL) {
380*4882a593Smuzhiyun argparse_usage(&argparse);
381*4882a593Smuzhiyun goto __FAILED;
382*4882a593Smuzhiyun }
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun RK_MPI_SYS_Init();
385*4882a593Smuzhiyun
386*4882a593Smuzhiyun for (i = 0; i < ctx->s32LoopCount; i++) {
387*4882a593Smuzhiyun RK_LOGI("start running loop count = %d", i);
388*4882a593Smuzhiyun s32Ret = unit_test_mpi_adec(ctx);
389*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
390*4882a593Smuzhiyun goto __FAILED;
391*4882a593Smuzhiyun }
392*4882a593Smuzhiyun RK_LOGI("end running loop count = %d", i);
393*4882a593Smuzhiyun }
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun __FAILED:
396*4882a593Smuzhiyun if (ctx) {
397*4882a593Smuzhiyun free(ctx);
398*4882a593Smuzhiyun ctx = RK_NULL;
399*4882a593Smuzhiyun }
400*4882a593Smuzhiyun
401*4882a593Smuzhiyun RK_MPI_SYS_Exit();
402*4882a593Smuzhiyun return 0;
403*4882a593Smuzhiyun }
404