linuxOS_AP06/app/rkadk/examples/rkadk_stream_test.c

585 lines
17 KiB
C
Raw Normal View History

2025-06-03 04:28:32 +00:00
/*
* Copyright (c) 2021 Rockchip, Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "rkadk_common.h"
#include "rkadk_media_comm.h"
#include "rkadk_log.h"
#include "rkadk_param.h"
#include "rkadk_stream.h"
#include "isp/sample_isp.h"
#include <getopt.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
extern int optind;
extern char *optarg;
#define IQ_FILE_PATH "/etc/iqfiles"
static FILE *g_output_file = NULL;
static FILE *g_output1_file = NULL;
static FILE *g_pcm_file = NULL;
static bool is_quit = false;
static RKADK_CHAR *g_output_path = "/data/ai.pcm";
static RKADK_CHAR optstr[] = "a:I:M:e:o:p:m:h";
//default use ini audio codec type
static RKADK_CODEC_TYPE_E g_enCodecType = RKADK_CODEC_TYPE_BUTT;
static void print_usage(const RKADK_CHAR *name) {
printf("usage example:\n");
printf("\t%s [-a /etc/iqfiles] [-I 0] [-m audio] [-e g711a] [-o "
"/tmp/aenc.g711a]\n",
name);
printf("\t-a: enable aiq with dirpath provided, eg:-a "
"/oem/etc/iqfiles/, Default /etc/iqfiles,"
"without this option aiq should run in other application\n");
printf("\t-I: Camera id, Default:0\n");
printf("\t-M: Test mode, Value: audio, video, Default:\"audio\"\n");
printf("\t-e: Encode type, Value:pcm, g711a, g711u, mp2, mp3, "
"Default:ini audio codec type\n");
printf("\t-o: Output path, Default:\"/data/ai.pcm\"\n");
printf("\t-p: param ini directory path, Default:/data/rkadk\n");
printf("\t-m: multiple sensors, Default:0, options: 1(all isp sensors), 2(isp+ahd sensors)\n");
;
}
static void sigterm_handler(int sig) {
fprintf(stderr, "signal %d\n", sig);
is_quit = true;
}
static RKADK_S32 VencDataCb(RKADK_VIDEO_STREAM_S *pVStreamData) {
if (g_output1_file) {
if (pVStreamData->u32CamId == 0 && g_output_file) {
fwrite(pVStreamData->astPack.apu8Addr, 1, pVStreamData->astPack.au32Len,
g_output_file);
RKADK_LOGP("#Write u32CamId[0] seq: %d, pts: %lld, size: %zu", pVStreamData->u32Seq,
pVStreamData->astPack.u64PTS, pVStreamData->astPack.au32Len);
} else if (pVStreamData->u32CamId == 1) {
fwrite(pVStreamData->astPack.apu8Addr, 1, pVStreamData->astPack.au32Len,
g_output1_file);
RKADK_LOGP("#Write u32CamId[1] seq: %d, pts: %lld, size: %zu", pVStreamData->u32Seq,
pVStreamData->astPack.u64PTS, pVStreamData->astPack.au32Len);
}
} else {
if (g_output_file) {
fwrite(pVStreamData->astPack.apu8Addr, 1, pVStreamData->astPack.au32Len,
g_output_file);
RKADK_LOGP("#Write seq: %d, pts: %lld, size: %zu", pVStreamData->u32Seq,
pVStreamData->astPack.u64PTS, pVStreamData->astPack.au32Len);
}
}
return 0;
}
static int PostIspCallback(RK_VOID *pParam, RK_VOID *pPrivateData) {
int ret = 0;
#ifdef RKAIQ
RKADK_U32 u32CamId = (RKADK_U32)pPrivateData;
rk_ainr_param *pAinrParam = (rk_ainr_param *)pParam;
if (pAinrParam == RK_NULL) {
RKADK_LOGE("pAinrParam is nullptr!");
return -1;
}
memset(pAinrParam, 0, sizeof(rk_ainr_param));
ret = SAMPLE_ISP_GetAINrParams(u32CamId, pAinrParam);
if (ret) {
RKADK_LOGE("u32CamId[%d] can't get ainr param!", u32CamId);
return ret;
}
RKADK_LOGD("aiisp cam %d enable %d", u32CamId, ((rk_ainr_param *)pAinrParam)->enable);
#else
RKADK_LOGW("Don't enable aiq");
#endif
return ret;
}
static int VideoTest(RKADK_U32 u32CamId, RKADK_CHAR *pIqfilesPath, RKADK_BOOL bMultiCam, RKADK_BOOL bMultiSensor) {
RKADK_S32 ret;
RKADK_MW_PTR pHandle = NULL, pHandle1 = NULL;
RKADK_STREAM_VIDEO_ATTR_S stVideoAttr;
RKADK_VIDEO_INFO_S stVideoInfo;
bool bAiispEnable = false;
RKADK_POST_ISP_ATTR_S stPostIspAttr;
RKADK_PARAM_RES_CFG_S stResCfg;
g_output_file = fopen(g_output_path, "w");
if (!g_output_file) {
RKADK_LOGE("open %s file failed, exit", g_output_path);
return -1;
}
if (bMultiSensor) {
u32CamId = 0;
g_output1_file = fopen("/data/venc_cam_1.bin", "w");
if (!g_output1_file) {
RKADK_LOGE("open /data/venc_cam_1.bin file failed, exit");
return -1;
}
}
#ifdef RKAIQ
RKADK_PARAM_FPS_S stFps;
stFps.enStreamType = RKADK_STREAM_TYPE_SENSOR;
ret = RKADK_PARAM_GetCamParam(u32CamId, RKADK_PARAM_TYPE_FPS, &stFps);
if (ret) {
RKADK_LOGE("RKADK_PARAM_GetCamParam u32CamId[%d] fps failed", u32CamId);
return -1;
}
SAMPLE_ISP_PARAM stIspParam;
memset(&stIspParam, 0, sizeof(SAMPLE_ISP_PARAM));
stIspParam.WDRMode = RK_AIQ_WORKING_MODE_NORMAL;
stIspParam.fps = stFps.u32Framerate;
stIspParam.bMultiCam = bMultiCam;
stIspParam.iqFileDir = pIqfilesPath;
stream:
SAMPLE_ISP_Start(u32CamId, stIspParam);
RKADK_BUFINFO("isp[%d] init", u32CamId);
if (bMultiCam) {
ret = RKADK_PARAM_GetCamParam(1, RKADK_PARAM_TYPE_FPS, &stFps);
if (ret) {
RKADK_LOGE("RKADK_PARAM_GetCamParam u32CamId[1] fps failed");
SAMPLE_ISP_Stop(u32CamId);
return -1;
}
SAMPLE_ISP_Start(1, stIspParam);
RKADK_BUFINFO("isp[1] init");
}
#endif
//aiisp param init
memset(&stPostIspAttr, 0, sizeof(RKADK_POST_ISP_ATTR_S));
stPostIspAttr.pModelFilePath = "/oem/usr/lib/";
stPostIspAttr.stAiIspCallback.pPrivateData = (void *)u32CamId;
stPostIspAttr.stAiIspCallback.pfUpdateCallback = PostIspCallback;
stPostIspAttr.u32FrameBufCnt = 2;
memset(&stVideoAttr, 0, sizeof(RKADK_STREAM_VIDEO_ATTR_S));
stVideoAttr.pfnDataCB = VencDataCb;
stVideoAttr.u32CamId = u32CamId;
stVideoAttr.pstPostIspAttr = &stPostIspAttr;
RKADK_STREAM_GetVideoInfo(u32CamId, &stVideoInfo);
RKADK_LOGP("stVideoInfo.enCodecType: %d", stVideoInfo.enCodecType);
RKADK_LOGP("stVideoInfo.u32BitRate: %d", stVideoInfo.u32BitRate);
RKADK_LOGP("stVideoInfo.u32FrameRate: %d", stVideoInfo.u32FrameRate);
RKADK_LOGP("stVideoInfo.u32Gop: %d", stVideoInfo.u32Gop);
RKADK_LOGP("stVideoInfo.u32Height: %d", stVideoInfo.u32Height);
RKADK_LOGP("stVideoInfo.u32Width: %d", stVideoInfo.u32Width);
ret = RKADK_STREAM_VideoInit(&stVideoAttr, &pHandle);
if (ret) {
RKADK_LOGE("RKADK_STREAM_VideoInit u32CamId[%d] failed[%d]", u32CamId, ret);
#ifdef RKAIQ
SAMPLE_ISP_Stop(u32CamId);
if (bMultiCam)
SAMPLE_ISP_Stop(1);
#endif
return -1;
}
ret = RKADK_STREAM_VencStart(pHandle, -1);
if (ret) {
RKADK_LOGE("RKADK_STREAM_VencStart u32CamId[%d] failed", u32CamId);
#ifdef RKAIQ
SAMPLE_ISP_Stop(u32CamId);
if (bMultiCam)
SAMPLE_ISP_Stop(1);
#endif
return -1;
}
if (bMultiSensor) {
stVideoAttr.u32CamId = 1;
ret = RKADK_STREAM_VideoInit(&stVideoAttr, &pHandle1);
if (ret) {
RKADK_LOGE("RKADK_STREAM_VideoInit u32CamId[1] failed = %d", ret);
#ifdef RKAIQ
SAMPLE_ISP_Stop(u32CamId);
if (bMultiCam)
SAMPLE_ISP_Stop(1);
#endif
return -1;
}
ret = RKADK_STREAM_VencStart(pHandle1, -1);
if (ret) {
RKADK_LOGE("RKADK_STREAM_VencStart u32CamId[1] failed");
#ifdef RKAIQ
SAMPLE_ISP_Stop(u32CamId);
if (bMultiCam)
SAMPLE_ISP_Stop(1);
#endif
return -1;
}
}
RKADK_LOGP("u32CamId[%d] bMultiCam[%d] bMultiSensor[%d] initial finish\n", u32CamId, bMultiCam, bMultiSensor);
signal(SIGINT, sigterm_handler);
char cmd[64];
printf("\n#Usage: input 'quit' to exit programe!\n"
"peress any other key to manual split file\n");
while (!is_quit) {
fgets(cmd, sizeof(cmd), stdin);
if (strstr(cmd, "quit") || is_quit) {
RKADK_LOGP("#Get 'quit' cmd!");
break;
} else if (strstr(cmd, "aiisp")) {
if (bAiispEnable)
bAiispEnable = false;
else
bAiispEnable = true;
ret = RKADK_MEDIA_SetPostIspAttr(u32CamId, RKADK_STREAM_TYPE_PREVIEW, bAiispEnable, &stPostIspAttr);
if (ret)
RKADK_LOGE("RKADK_MEDIA_SetPostIspAttr failed");
} else if (strstr(cmd, "720")) {
stResCfg.enResType = RKADK_RES_720P;
stResCfg.enStreamType = RKADK_STREAM_TYPE_PREVIEW;
RKADK_PARAM_SetCamParam(u32CamId, RKADK_PARAM_TYPE_STREAM_RES, &stResCfg);
ret = RKADK_STREAM_VideoReset(pHandle);
if (ret < 0) {
#if !defined(RV1106_1103) && !defined(RV1103B)
RKADK_STREAM_VencStop(pHandle);
RKADK_STREAM_VideoDeInit(pHandle);
pHandle = NULL;
#ifdef RKAIQ
SAMPLE_ISP_Stop(u32CamId);
#endif
goto stream;
#endif
}
RKADK_STREAM_VencStart(pHandle, -1);
} else if (strstr(cmd, "480")) {
stResCfg.enResType = RKADK_RES_480P;
stResCfg.enStreamType = RKADK_STREAM_TYPE_PREVIEW;
RKADK_PARAM_SetCamParam(u32CamId, RKADK_PARAM_TYPE_STREAM_RES, &stResCfg);
ret = RKADK_STREAM_VideoReset(pHandle);
if (ret < 0) {
#if !defined(RV1106_1103) && !defined(RV1103B)
RKADK_STREAM_VencStop(pHandle);
RKADK_STREAM_VideoDeInit(pHandle);
pHandle = NULL;
#ifdef RKAIQ
SAMPLE_ISP_Stop(u32CamId);
#endif
goto stream;
#endif
}
RKADK_STREAM_VencStart(pHandle, -1);
}
#if 0
if (strstr(cmd, "fps")) {
int fpsTest = 20;
RKADK_PARAM_GOP_S stGopCfg;
RKADK_S32 s32VencChn;
// set ini fps
RKADK_PARAM_SetCamParam(u32CamId, RKADK_PARAM_TYPE_FPS, &fpsTest);
// set ini gop
stGopCfg.enStreamType = RKADK_STREAM_TYPE_PREVIEW;
stGopCfg.u32Gop = fpsTest;
RKADK_PARAM_SetCamParam(u32CamId, RKADK_PARAM_TYPE_GOP, &stGopCfg);
// set aiq fps
SAMPLE_ISP_SET_FrameRate(u32CamId, fpsTest);
// set mpp fps and gop
s32VencChn =
RKADK_PARAM_GetVencChnId(u32CamId, RKADK_STREAM_TYPE_PREVIEW);
RK_MPI_VENC_SetGop(s32VencChn, stGopCfg.u32Gop);
RK_MPI_VENC_SetFps(s32VencChn, fpsTest, 1, fpsTest, 1);
// get ini fps and gop
RKADK_PARAM_GetCamParam(u32CamId, RKADK_PARAM_TYPE_FPS, &fpsTest);
RKADK_LOGP("fps: %d", fpsTest);
RKADK_PARAM_SetCamParam(u32CamId, RKADK_PARAM_TYPE_GOP, &stGopCfg);
RKADK_LOGP("gop: %d", stGopCfg.u32Gop);
}
#endif
usleep(500000);
}
RKADK_LOGP("exit!");
ret = RKADK_STREAM_VencStop(pHandle);
if (ret)
RKADK_LOGE("RKADK_STREAM_VencStop u32CamId[%d] failed", u32CamId);
ret = RKADK_STREAM_VideoDeInit(pHandle);
if (ret)
RKADK_LOGE("RKADK_STREAM_VideoDeInit u32CamId[%d] failed[%d]", u32CamId, ret);
if (bMultiSensor) {
ret = RKADK_STREAM_VencStop(pHandle1);
if (ret)
RKADK_LOGE("RKADK_STREAM_VencStop u32CamId[1] failed");
ret = RKADK_STREAM_VideoDeInit(pHandle1);
if (ret)
RKADK_LOGE("RKADK_STREAM_VideoDeInit u32CamId[1] failed[%d]", ret);
}
#ifdef RKAIQ
SAMPLE_ISP_Stop(u32CamId);
if (bMultiCam)
SAMPLE_ISP_Stop(1);
#endif
if (g_output_file) {
fclose(g_output_file);
g_output_file = NULL;
}
if (g_output1_file) {
fclose(g_output1_file);
g_output1_file = NULL;
}
return 0;
}
static RKADK_S32 AencDataCb(RKADK_AUDIO_STREAM_S *pAStreamData) {
if (!g_output_file) {
g_output_file = fopen(g_output_path, "w");
if (!g_output_file) {
RKADK_LOGE("open %s file failed, exit", g_output_path);
return -1;
}
}
fwrite(pAStreamData->pStream, 1, pAStreamData->u32Len, g_output_file);
RKADK_LOGP("#Write Aenc seq: %d, pts: %lld, size: %zu", pAStreamData->u32Seq,
pAStreamData->u64TimeStamp, pAStreamData->u32Len);
return 0;
}
static RKADK_S32 PcmDataCb(RKADK_AUDIO_STREAM_S *pAStreamData) {
if (!g_pcm_file) {
g_pcm_file = fopen("/data/ai.pcm", "w");
if (!g_pcm_file) {
RKADK_LOGE("open /data/ai.pcm file failed, exit");
return -1;
}
}
fwrite(pAStreamData->pStream, 1, pAStreamData->u32Len, g_pcm_file);
RKADK_LOGP("#Write pcm seq: %d, pts: %lld, size: %zu", pAStreamData->u32Seq,
pAStreamData->u64TimeStamp, pAStreamData->u32Len);
return 0;
}
static int AudioTest(RKADK_U32 u32CamId) {
RKADK_S32 ret;
RKADK_MW_PTR pHandle = NULL;
RKADK_STREAM_AUDIO_ATTR_S stAudioAttr;
RKADK_AUDIO_INFO_S stAudioInfo;
memset(&stAudioAttr, 0, sizeof(RKADK_STREAM_AUDIO_ATTR_S));
stAudioAttr.u32CamId = u32CamId;
stAudioAttr.enCodecType = g_enCodecType;
stAudioAttr.pfnPcmDataCB = PcmDataCb;
stAudioAttr.pfnAencDataCB = AencDataCb;
ret = RKADK_STREAM_AudioInit(&stAudioAttr, &pHandle);
if (ret) {
RKADK_LOGE("RKADK_STREAM_AudioInit failed = %d", ret);
return ret;
}
RKADK_STREAM_GetAudioInfo(pHandle, &stAudioInfo);
RKADK_LOGP("stAudioInfo.enCodecType: %d", stAudioInfo.enCodecType);
RKADK_LOGP("stAudioInfo.u16SampleBitWidth: %d", stAudioInfo.u16SampleBitWidth);
RKADK_LOGP("stAudioInfo.u32AvgBytesPerSec: %d", stAudioInfo.u32AvgBytesPerSec);
RKADK_LOGP("stAudioInfo.u32ChnCnt: %d", stAudioInfo.u32ChnCnt);
RKADK_LOGP("stAudioInfo.u32SampleRate: %d", stAudioInfo.u32SampleRate);
RKADK_LOGP("stAudioInfo.u32SamplesPerFrame: %d", stAudioInfo.u32SamplesPerFrame);
ret = RKADK_STREAM_AencStart(pHandle);
if (ret) {
RKADK_LOGE("RKADK_STREAM_AencStart failed");
return -1;
}
RKADK_LOGP("initial finish");
signal(SIGINT, sigterm_handler);
char cmd[64];
while (!is_quit) {
fgets(cmd, sizeof(cmd), stdin);
if (strstr(cmd, "quit")) {
RKADK_LOGP("#Get 'quit' cmd!");
break;
} else if (strstr(cmd, "start")) {
RKADK_STREAM_AencStart(pHandle);
} else if (strstr(cmd, "stop")) {
RKADK_STREAM_AencStop(pHandle);
}
usleep(500000);
}
ret = RKADK_STREAM_AencStop(pHandle);
if (ret) {
RKADK_LOGE("RKADK_STREAM_AencStop failed");
}
ret = RKADK_STREAM_AudioDeInit(pHandle);
if (ret)
RKADK_LOGE("RKADK_STREAM_AudioDeInit failed = %d", ret);
if (g_pcm_file) {
fclose(g_pcm_file);
g_pcm_file = NULL;
}
if (g_output_file) {
fclose(g_output_file);
g_output_file = NULL;
}
return 0;
}
int main(int argc, char *argv[]) {
RKADK_U32 u32CamId = 0;
RKADK_CHAR *pMode = "audio";
RKADK_CHAR *pIqfilesPath = IQ_FILE_PATH;
int c, inCmd = 0;
const char *iniPath = NULL;
char path[RKADK_PATH_LEN];
char sensorPath[RKADK_MAX_SENSOR_CNT][RKADK_PATH_LEN];
RKADK_BOOL bMultiCam = RKADK_FALSE;
RKADK_BOOL bMultiSensor = RK_FALSE;
while ((c = getopt(argc, argv, optstr)) != -1) {
const char *tmp_optarg = optarg;
switch (c) {
case 'a':
if (!optarg && NULL != argv[optind] && '-' != argv[optind][0]) {
tmp_optarg = argv[optind++];
}
if (tmp_optarg)
pIqfilesPath = (char *)tmp_optarg;
break;
case 'I':
u32CamId = atoi(optarg);
break;
case 'M':
pMode = optarg;
break;
case 'e':
if (!strcmp(optarg, "pcm")) {
g_enCodecType = RKADK_CODEC_TYPE_PCM;
g_output_path = "/data/ai.pcm";
} else if (!strcmp(optarg, "g711a")) {
g_enCodecType = RKADK_CODEC_TYPE_G711A;
g_output_path = "/data/aenc.g711a";
} else if (!strcmp(optarg, "g711u")) {
g_enCodecType = RKADK_CODEC_TYPE_G711U;
g_output_path = "/data/aenc.g711u";
} else if (!strcmp(optarg, "mp3")) {
g_enCodecType = RKADK_CODEC_TYPE_MP3;
g_output_path = "/data/aenc.mp3";
} else {
RKADK_LOGE("unknow encode type: %s", optarg);
return 0;
}
RKADK_LOGP("Encode type: %d", g_enCodecType);
break;
case 'o':
g_output_path = optarg;
RKADK_LOGP("g_output_path = %s", g_output_path);
break;
case 'p':
iniPath = optarg;
RKADK_LOGP("iniPath: %s", iniPath);
break;
case 'm':
inCmd = atoi(optarg);
if (inCmd == 1) {
bMultiCam = RKADK_TRUE;
bMultiSensor = RKADK_TRUE;
} else if (inCmd == 2)
bMultiSensor = RKADK_TRUE;
break;
case 'h':
default:
print_usage(argv[0]);
optind = 0;
return 0;
}
}
optind = 0;
RKADK_LOGP("#Test mode: %s", pMode);
RKADK_LOGP("#Out path: %s", g_output_path);
RKADK_MPI_SYS_Init();
if (iniPath) {
memset(path, 0, RKADK_PATH_LEN);
memset(sensorPath, 0, RKADK_MAX_SENSOR_CNT * RKADK_PATH_LEN);
sprintf(path, "%s/rkadk_setting.ini", iniPath);
for (int i = 0; i < RKADK_MAX_SENSOR_CNT; i++)
sprintf(sensorPath[i], "%s/rkadk_setting_sensor_%d.ini", iniPath, i);
/*
lg:
char *sPath[] = {"/data/rkadk/rkadk_setting_sensor_0.ini",
"/data/rkadk/rkadk_setting_sensor_1.ini", NULL};
*/
char *sPath[] = {sensorPath[0], sensorPath[1], NULL};
RKADK_PARAM_Init(path, sPath);
} else {
RKADK_PARAM_Init(NULL, NULL);
}
if (!strcmp(pMode, "audio"))
AudioTest(u32CamId);
else if (!strcmp(pMode, "video"))
VideoTest(u32CamId, pIqfilesPath, bMultiCam, bMultiSensor);
else {
RKADK_LOGE("Invalid test mode: %s", pMode);
return -1;
}
RKADK_MPI_SYS_Exit();
return 0;
}