/* * Copyright 2022 Rockchip Electronics Co. LTD * * 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. * */ #ifdef __cplusplus #if __cplusplus extern "C" { #endif #endif /* End of #ifdef __cplusplus */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "sample_comm.h" #define CAM_NUM_MAX 2 #define BUFFER_SIZE 255 #define LDCH_MAX_LEVEL 255 typedef struct _rkModeTest { RK_BOOL bIfMainThreadQuit; RK_BOOL bIfViThreadQuit[CAM_NUM_MAX]; RK_BOOL bModuleTestThreadQuit; RK_BOOL bModuleTestIfopen; RK_BOOL bMultictx; RK_BOOL bIfIspGroupInit; RK_S32 s32ModuleTestType; RK_S32 s32ModuleTestLoop; RK_S32 s32CamId[CAM_NUM_MAX]; RK_S32 s32CamGroupId; RK_U32 u32TestFrameCount; RK_U32 u32ViGetFrameCount[CAM_NUM_MAX]; RK_U32 u32CamNum; rk_aiq_working_mode_t eHdrMode; RK_CHAR *pIqFileDir; } g_mode_test; typedef struct _rkMpiCtx { SAMPLE_VI_CTX_S vi[CAM_NUM_MAX]; } SAMPLE_MPI_CTX_S; static SAMPLE_MPI_CTX_S *ctx = RK_NULL; static g_mode_test *gModeTest = RK_NULL; static RK_S32 g_exit_result = RK_SUCCESS; static sem_t g_sem_module_test[CAM_NUM_MAX]; static pthread_mutex_t g_frame_count_mutex[CAM_NUM_MAX]; static void program_handle_error(const char *func, RK_U32 line) { RK_LOGE("func: <%s> line: <%d> error exit!", func, line); g_exit_result = RK_FAILURE; gModeTest->bIfMainThreadQuit = RK_TRUE; } static void program_normal_exit(const char *func, RK_U32 line) { RK_LOGE("func: <%s> line: <%d> normal exit!", func, line); gModeTest->bIfMainThreadQuit = RK_TRUE; } static void sigterm_handler(int sig) { fprintf(stderr, "signal %d\n", sig); program_normal_exit(__func__, __LINE__); } static RK_CHAR optstr[] = "?::a:w:h:c:o:m:t:l:i:"; static const struct option long_options[] = { {"aiq", optional_argument, NULL, 'a'}, {"width", required_argument, NULL, 'w'}, {"height", required_argument, NULL, 'h'}, {"camNum", required_argument, NULL, 'c'}, {"viOutputPath", required_argument, NULL, 'o'}, {"loopCount", required_argument, NULL, 'l'}, {"modeTestType", required_argument, NULL, 'm'}, {"modeTestLoop", required_argument, NULL, 't' + 'l'}, {"testFrameCount", required_argument, NULL, 't'}, {"ispLaunchMode", required_argument, NULL, 'i'}, {"help", optional_argument, NULL, '?'}, {NULL, 0, NULL, 0}, }; static void print_usage(const RK_CHAR *name) { printf("usage example:\n"); printf("\t%s -a /oem/usr/share/iqfiles -c 2 -w 1920 -h 1080\n", name); printf("\t-a | --aiq : enable aiq with dirpath provided, default: " "/oem/usr/share/iqfiles\n"); printf("\t-w | --width: Vi width. Default: 1920\n"); printf("\t-h | --height: Vi height. Default: 1080\n"); printf("\t-c | --camNum: camera Num. default: 2\n"); printf("\t-o | --viOutputPath: save vi output yuv file. default: NULL\n"); printf("\t-l | --loopcount: vi get stream loopcount. default: -1\n"); printf("\t-m | --modeTestType : test type, 0:none, 1:P/N switch test, 2:HDR switch " "test, 3:frame rate switch test, 4: LDCH mode test. Default: 0\n"); printf("\t--modeTestLoop : module test loop, default: -1\n"); printf("\t--testFrameCount : set the venc reveive frame count for every test " "loop, default: 500\n"); printf("\t--ispLaunchMode : 0: single cam init, 1: camera group init. default: 0\n"); } static RK_S32 isp_init(void) { RK_S32 s32Ret = RK_FAILURE; #if (defined RKAIQ) && (defined UAPI2) if (gModeTest->bIfIspGroupInit == RK_FALSE) { for (RK_S32 i = 0; i < gModeTest->u32CamNum; i++) { s32Ret = SAMPLE_COMM_ISP_Init(gModeTest->s32CamId[i], gModeTest->eHdrMode, gModeTest->bMultictx, gModeTest->pIqFileDir); s32Ret |= SAMPLE_COMM_ISP_Run(gModeTest->s32CamId[i]); if (s32Ret != RK_SUCCESS) { RK_LOGE("ISP init failure camid:%d", i); return RK_FAILURE; } } } else if (gModeTest->bIfIspGroupInit == RK_TRUE) { rk_aiq_camgroup_instance_cfg_t camgroup_cfg; memset(&camgroup_cfg, 0, sizeof(rk_aiq_camgroup_instance_cfg_t)); camgroup_cfg.sns_num = gModeTest->u32CamNum; camgroup_cfg.config_file_dir = gModeTest->pIqFileDir; s32Ret = SAMPLE_COMM_ISP_CamGroup_Init(gModeTest->s32CamGroupId, gModeTest->eHdrMode, gModeTest->bMultictx, &camgroup_cfg); if (s32Ret != RK_SUCCESS) { printf("%s : isp cam group init\n", __func__); return RK_FAILURE; } } else { RK_LOGE("ISP dosen't support this launch mode %d", gModeTest->bIfIspGroupInit); return RK_FAILURE; } #endif return RK_SUCCESS; } static RK_S32 isp_deinit(void) { RK_S32 s32Ret = RK_SUCCESS; #if (defined RKAIQ) && (defined UAPI2) if (gModeTest->bIfIspGroupInit == RK_FALSE) { for (RK_S32 i = 0; i < gModeTest->u32CamNum; i++) { SAMPLE_COMM_ISP_Stop(i); } } else if (gModeTest->bIfIspGroupInit == RK_TRUE) { s32Ret = SAMPLE_COMM_ISP_CamGroup_Stop(gModeTest->s32CamGroupId); if (s32Ret != RK_SUCCESS) { RK_LOGE("SAMPLE_COMM_ISP_CamGroup_Stop failure:%#X", s32Ret); return s32Ret; } } else { RK_LOGE("ISP deinit dosen't support this mode %d", gModeTest->bIfIspGroupInit); return RK_FAILURE; } #endif return RK_SUCCESS; } static void *vi_get_stream(void *pArgs) { SAMPLE_VI_CTX_S *ctx = (SAMPLE_VI_CTX_S *)pArgs; RK_S32 s32Ret = RK_FAILURE; FILE *fp = RK_NULL; RK_S32 s32Fd = 0; RK_S32 s32FrameSize = ctx->u32Height * ctx->u32Width * 3 / 2; RK_S32 loopCount = 0; RK_VOID *pData = RK_NULL; RK_CHAR name[BUFFER_SIZE] = {0}; if (ctx->dstFilePath) { snprintf(name, sizeof(name), "/%s/vi_%d.bin", ctx->dstFilePath, ctx->s32DevId); fp = fopen(name, "wb"); if (fp == RK_NULL) { RK_LOGE("chn %d can't open %s file !\n", ctx->s32DevId, ctx->dstFilePath); program_handle_error(__func__, __LINE__); return RK_NULL; } s32Fd = fileno(fp); } while (!gModeTest->bIfViThreadQuit[ctx->s32DevId]) { s32Ret = SAMPLE_COMM_VI_GetChnFrame(ctx, &pData); if (s32Ret == RK_SUCCESS) { if (fp) { fwrite(pData, 1, s32FrameSize, fp); fflush(fp); } SAMPLE_COMM_VI_ReleaseChnFrame(ctx); loopCount++; if (gModeTest->bModuleTestIfopen) { pthread_mutex_lock(&g_frame_count_mutex[ctx->s32DevId]); gModeTest->u32ViGetFrameCount[ctx->s32DevId]++; pthread_mutex_unlock(&g_frame_count_mutex[ctx->s32DevId]); if (gModeTest->u32ViGetFrameCount[ctx->s32DevId] == gModeTest->u32TestFrameCount) { sem_post(&g_sem_module_test[ctx->s32DevId]); } } RK_LOGD("vi chn:%d get_stream count: %d", ctx->s32DevId, loopCount); if (ctx->s32loopCount > 0 && loopCount >= ctx->s32loopCount) { program_normal_exit(__func__, __LINE__); break; } } } if (fp) { fsync(s32Fd); fclose(fp); fp = RK_NULL; } RK_LOGE("vi_get_stream chn:%d exit", ctx->s32DevId); return RK_NULL; } static void wait_module_test_switch_success(void) { for (RK_U32 i = 0; i < gModeTest->u32CamNum; i++) { pthread_mutex_lock(&g_frame_count_mutex[i]); gModeTest->u32ViGetFrameCount[i] = 0; pthread_mutex_unlock(&g_frame_count_mutex[i]); sem_wait(&g_sem_module_test[i]); } } static void pn_mode_switch(RK_S32 test_loop) { RK_S32 i = 0; RK_S32 s32TestCount = 0; RK_S32 s32Ret = RK_FAILURE; while (!gModeTest->bModuleTestThreadQuit) { if (gModeTest->bIfIspGroupInit == RK_FALSE) { for (i = 0; i < gModeTest->u32CamNum; i++) { s32Ret = RK_MPI_VI_PauseChn(ctx->vi[i].u32PipeId, ctx->vi[i].s32ChnId); if (s32Ret != RK_SUCCESS) { RK_LOGE("RK_MPI_VI_PauseChn failure:%#X pipe:%d chnid:%d", s32Ret, ctx->vi[i].u32PipeId, ctx->vi[i].s32ChnId); program_handle_error(__func__, __LINE__); break; } } } else { for (i = 0; i < gModeTest->u32CamNum; i++) { s32Ret = RK_MPI_VI_StopPipe(ctx->vi[i].u32PipeId); if (s32Ret != RK_SUCCESS) { RK_LOGE("RK_MPI_VI_StopPipe failure:%#X pipe:%d", s32Ret, ctx->vi[i].u32PipeId); program_handle_error(__func__, __LINE__); break; } } } s32Ret = isp_deinit(); if (s32Ret != RK_SUCCESS) { RK_LOGE("isp_deinit failure"); program_handle_error(__func__, __LINE__); break; } s32Ret = isp_init(); if (s32Ret != RK_SUCCESS) { RK_LOGE("isp_init failure"); program_handle_error(__func__, __LINE__); break; } if (gModeTest->bIfIspGroupInit == RK_FALSE) { for (i = 0; i < gModeTest->u32CamNum; i++) { s32Ret = RK_MPI_VI_ResumeChn(ctx->vi[i].u32PipeId, ctx->vi[i].s32ChnId); if (s32Ret != RK_SUCCESS) { RK_LOGE("RK_MPI_VI_ResumeChn failure:%#X pipe:%d chnid:%d", s32Ret, ctx->vi[i].u32PipeId, ctx->vi[i].s32ChnId); } } } else { for (i = 0; i < gModeTest->u32CamNum; i++) { s32Ret = RK_MPI_VI_StartPipe(ctx->vi[i].u32PipeId); if (s32Ret != RK_SUCCESS) { RK_LOGE("RK_MPI_VI_StartPipe failure:%#X pipe:%d", s32Ret, ctx->vi[i].u32PipeId); program_handle_error(__func__, __LINE__); break; } } } wait_module_test_switch_success(); s32TestCount++; RK_LOGE("--VI_PAUSE--ISP_STOP--ISP_INIT_RUN--VI_RESUME-----------PN Switch Test " "success Total: %d Now Count: " "%d-------------------", test_loop, s32TestCount); if (test_loop > 0 && s32TestCount >= test_loop) { RK_LOGE( "------------------PN test end(pass/success) count: %d-----------------", s32TestCount); gModeTest->bModuleTestIfopen = RK_FALSE; program_normal_exit(__func__, __LINE__); break; } } RK_LOGE("pn_mode_switch exit"); return; } static void hdr_mode_switch_test(RK_S32 test_loop) { RK_S32 i = 0; RK_S32 s32TestCount = 0; RK_S32 s32Ret = RK_FAILURE; while (!gModeTest->bModuleTestThreadQuit) { if (gModeTest->bIfIspGroupInit == RK_FALSE) { for (i = 0; i < gModeTest->u32CamNum; i++) { s32Ret = RK_MPI_VI_PauseChn(ctx->vi[i].u32PipeId, ctx->vi[i].s32ChnId); if (s32Ret != RK_SUCCESS) { RK_LOGE("RK_MPI_VI_PauseChn failure:%#X pipe:%d chnid:%d", s32Ret, ctx->vi[i].u32PipeId, ctx->vi[i].s32ChnId); program_handle_error(__func__, __LINE__); break; } } } else { for (i = 0; i < gModeTest->u32CamNum; i++) { s32Ret = RK_MPI_VI_StopPipe(ctx->vi[i].u32PipeId); if (s32Ret != RK_SUCCESS) { RK_LOGE("RK_MPI_VI_StopPipe failure:%#X pipe:%d", s32Ret, ctx->vi[i].u32PipeId); program_handle_error(__func__, __LINE__); break; } } } s32Ret = isp_deinit(); if (s32Ret != RK_SUCCESS) { RK_LOGE("isp_deinit failure"); program_handle_error(__func__, __LINE__); break; } if (gModeTest->eHdrMode == RK_AIQ_WORKING_MODE_NORMAL) { gModeTest->eHdrMode = RK_AIQ_WORKING_MODE_ISP_HDR2; } else if (gModeTest->eHdrMode == RK_AIQ_WORKING_MODE_ISP_HDR2) { gModeTest->eHdrMode = RK_AIQ_WORKING_MODE_NORMAL; } else { gModeTest->eHdrMode = RK_AIQ_WORKING_MODE_NORMAL; } s32Ret = isp_init(); if (s32Ret != RK_SUCCESS) { RK_LOGE("isp_init failure"); program_handle_error(__func__, __LINE__); break; } if (gModeTest->bIfIspGroupInit == RK_FALSE) { for (i = 0; i < gModeTest->u32CamNum; i++) { s32Ret = RK_MPI_VI_ResumeChn(ctx->vi[i].u32PipeId, ctx->vi[i].s32ChnId); if (s32Ret != RK_SUCCESS) { RK_LOGE("RK_MPI_VI_ResumeChn failure:%#X pipe:%d chnid:%d", s32Ret, ctx->vi[i].u32PipeId, ctx->vi[i].s32ChnId); } } } else { for (i = 0; i < gModeTest->u32CamNum; i++) { s32Ret = RK_MPI_VI_StartPipe(ctx->vi[i].u32PipeId); if (s32Ret != RK_SUCCESS) { RK_LOGE("RK_MPI_VI_StartPipe failure:%#X pipe:%d", s32Ret, ctx->vi[i].u32PipeId); program_handle_error(__func__, __LINE__); break; } } } wait_module_test_switch_success(); s32TestCount++; RK_LOGE("--VI_PAUSE--ISP_STOP--SET_HDR_MODE--ISP_INIT_RUN--VI_RESUME-------------" "HDR Mode Switch Test success Total: %d Now Count: " "%d-------------------", test_loop, s32TestCount); if (test_loop > 0 && s32TestCount >= test_loop) { RK_LOGE("------------------HDR Mode test end(pass/success) count: " "%d-----------------", s32TestCount); gModeTest->bModuleTestIfopen = RK_FALSE; program_normal_exit(__func__, __LINE__); break; } } RK_LOGE("hdr_mode_switch_test exit"); return; } static void frameRate_switch_test(RK_S32 test_loop) { RK_S32 i = 0; RK_S32 s32TestCount = 0; RK_S32 s32Ret = RK_FAILURE; VI_CHN_ATTR_S pstChnAttr; while (!gModeTest->bModuleTestThreadQuit) { for (i = 0; i < gModeTest->u32CamNum; i++) { memset(&pstChnAttr, 0, sizeof(VI_CHN_ATTR_S)); s32Ret = RK_MPI_VI_GetChnAttr(ctx->vi[i].u32PipeId, ctx->vi[i].s32ChnId, &pstChnAttr); if (s32Ret != RK_SUCCESS) { RK_LOGE("RK_MPI_VI_GetChnAttr failure:%X DevId:%d", s32Ret, ctx->vi[i].s32DevId); program_handle_error(__func__, __LINE__); break; } if (pstChnAttr.stFrameRate.s32SrcFrameRate == -1) { pstChnAttr.stFrameRate.s32SrcFrameRate = 1; } pstChnAttr.stFrameRate.s32SrcFrameRate += 1; if (pstChnAttr.stFrameRate.s32SrcFrameRate > 25) { pstChnAttr.stFrameRate.s32SrcFrameRate = 1; } pstChnAttr.stFrameRate.s32DstFrameRate = pstChnAttr.stFrameRate.s32SrcFrameRate; s32Ret = RK_MPI_VI_SetChnAttr(ctx->vi[i].u32PipeId, ctx->vi[i].s32ChnId, &pstChnAttr); if (s32Ret != RK_SUCCESS) { RK_LOGE("RK_MPI_VI_GetChnAttr failure:%X DevId:%d", s32Ret, ctx->vi[i].s32DevId); program_handle_error(__func__, __LINE__); break; } RK_LOGE("Framerate switch to: %d", pstChnAttr.stFrameRate.s32DstFrameRate); } wait_module_test_switch_success(); s32TestCount++; RK_LOGE("--GET_VI_CHNATTR--SET_FR--SET_VI_CHNATTR----------Framerate switch " "success Total: %d Now Count: " "%d-------------------", test_loop, s32TestCount); if (test_loop > 0 && s32TestCount >= test_loop) { RK_LOGE("------------------Framerate switch end(pass/success) count: " "%d-----------------", s32TestCount); gModeTest->bModuleTestIfopen = RK_FALSE; program_normal_exit(__func__, __LINE__); break; } } RK_LOGE("frameRate_switch_test exit"); return; } static void ldch_mode_test(RK_S32 test_loop) { RK_BOOL bIfLDCHEnable = RK_FALSE; RK_S32 s32Ret = RK_FAILURE; RK_U32 u32LdchLevel = 0; RK_S32 test_count = 0; RK_S32 i = 0; while (!gModeTest->bModuleTestThreadQuit) { for (i = 0; i < gModeTest->u32CamNum; i++) { s32Ret = SAMPLE_COMM_ISP_SetLDCH(gModeTest->s32CamId[i], u32LdchLevel, bIfLDCHEnable); if (s32Ret != RK_SUCCESS) { RK_LOGE("SAMPLE_COMM_ISP_SetLDCH failure camId:%d", gModeTest->s32CamId[i]); program_handle_error(__func__, __LINE__); break; } if (bIfLDCHEnable) { u32LdchLevel++; if (u32LdchLevel > LDCH_MAX_LEVEL) { u32LdchLevel = 0; } } bIfLDCHEnable = !bIfLDCHEnable; } wait_module_test_switch_success(); test_count++; RK_LOGE("--SET_LDCH---------------LDCH state: %d(0:close 1:open) level:%d", bIfLDCHEnable, u32LdchLevel); RK_LOGE("-----------------------------LDCH switch success total:%d now count:%d", test_loop, test_count); if (test_loop > 0 && test_count >= test_loop) { RK_LOGE("--------------LDCH switch success test end total:%d", test_loop); gModeTest->bModuleTestIfopen = RK_FALSE; program_normal_exit(__func__, __LINE__); break; } } RK_LOGE("ldch_mode_test exit"); return; } static void *sample_isp_stress_test(void *pArgs) { prctl(PR_SET_NAME, "isp_stress_test"); wait_module_test_switch_success(); SAMPLE_COMM_DumpMeminfo("Enter sample_multi_isp_stress_test", gModeTest->s32ModuleTestType); switch (gModeTest->s32ModuleTestType) { case 1: pn_mode_switch(gModeTest->s32ModuleTestLoop); break; case 2: hdr_mode_switch_test(gModeTest->s32ModuleTestLoop); break; case 3: frameRate_switch_test(gModeTest->s32ModuleTestLoop); break; case 4: ldch_mode_test(gModeTest->s32ModuleTestLoop); break; default: RK_LOGE("mode test type:%d is unsupported", gModeTest->s32ModuleTestType); } SAMPLE_COMM_DumpMeminfo("Exit sample_multi_isp_stress_test", gModeTest->s32ModuleTestType); RK_LOGE("sample_isp_stress_test exit"); return RK_NULL; } RK_S32 global_param_init(void) { ctx = (SAMPLE_MPI_CTX_S *)malloc(sizeof(SAMPLE_MPI_CTX_S)); if (ctx == RK_NULL) { RK_LOGE("malloc for ctx failure"); return RK_FAILURE; } memset(ctx, 0, sizeof(SAMPLE_MPI_CTX_S)); gModeTest = (g_mode_test *)malloc(sizeof(g_mode_test)); if (gModeTest == RK_NULL) { RK_LOGE("malloc for gModeTest failure"); return RK_FAILURE; } memset(gModeTest, 0, sizeof(g_mode_test)); gModeTest->s32ModuleTestLoop = -1; gModeTest->u32TestFrameCount = 500; for (RK_S32 i = 0; i < CAM_NUM_MAX; i++) { sem_init(&g_sem_module_test[i], 0, 0); if (pthread_mutex_init(&g_frame_count_mutex[i], NULL) != 0) { RK_LOGE("mutex init failure \n"); return RK_FAILURE; } } return RK_SUCCESS; } RK_S32 global_param_deinit(void) { if (ctx) { free(ctx); ctx = RK_NULL; } if (gModeTest) { free(gModeTest); gModeTest = RK_NULL; } for (RK_S32 i; i < CAM_NUM_MAX; i++) { sem_destroy(&g_sem_module_test[i]); pthread_mutex_destroy(&g_frame_count_mutex[i]); } return RK_SUCCESS; } /****************************************************************************** * function : main() * Description : main ******************************************************************************/ int main(int argc, char *argv[]) { RK_S32 s32Ret = RK_FAILURE; RK_U32 u32ViWidth = 1920; RK_U32 u32ViHeight = 1080; RK_CHAR *pViOutPath = RK_NULL; RK_U32 u32CamNum = 2; RK_S32 s32loopCnt = -1; RK_S32 i; char *iq_file_dir = "/oem/usr/share/iqfiles"; pthread_t vi_get_stream_thread_id[CAM_NUM_MAX], modeTest_thread_id; if (argc < 2) { print_usage(argv[0]); return 0; } s32Ret = global_param_init(); if (s32Ret != RK_SUCCESS) { RK_LOGE("global_param_init failure"); return RK_FAILURE; } signal(SIGINT, sigterm_handler); signal(SIGTERM, sigterm_handler); #if (defined RKAIQ) && (defined UAPI2) RK_BOOL bMultictx = RK_TRUE; #endif int c; while ((c = getopt_long(argc, argv, optstr, long_options, NULL)) != -1) { switch (c) { case 'a': iq_file_dir = optarg; break; case 'w': u32ViWidth = atoi(optarg); break; case 'h': u32ViHeight = atoi(optarg); break; case 'c': u32CamNum = atoi(optarg); gModeTest->u32CamNum = u32CamNum; break; case 'o': pViOutPath = optarg; break; case 'l': s32loopCnt = atoi(optarg); break; case 'm': gModeTest->s32ModuleTestType = atoi(optarg); break; case 't' + 'l': gModeTest->s32ModuleTestLoop = atoi(optarg); break; case 't': gModeTest->u32TestFrameCount = atoi(optarg); break; case 'i': gModeTest->bIfIspGroupInit = atoi(optarg); break; case '?': default: print_usage(argv[0]); return 0; } } printf("#IQ Path: %s\n", iq_file_dir); if (iq_file_dir) { #if (defined RKAIQ) && (defined UAPI2) printf("#Rkaiq XML DirPath: %s\n", iq_file_dir); printf("#bMultictx: %d\n\n", bMultictx); rk_aiq_working_mode_t hdr_mode = RK_AIQ_WORKING_MODE_NORMAL; if (u32CamNum > 1) { gModeTest->bMultictx = RK_TRUE; } else { gModeTest->bMultictx = RK_FALSE; } gModeTest->eHdrMode = hdr_mode; gModeTest->pIqFileDir = iq_file_dir; if (gModeTest->bIfIspGroupInit == RK_FALSE) { for (RK_S32 i = 0; i < u32CamNum; i++) { gModeTest->s32CamId[i] = i; } } else if (gModeTest->bIfIspGroupInit == RK_TRUE) { gModeTest->s32CamGroupId = 0; } s32Ret = isp_init(); if (s32Ret != RK_SUCCESS) { RK_LOGE("isp init failure"); goto __FAILED2; } #endif } if (RK_MPI_SYS_Init() != RK_SUCCESS) { g_exit_result = RK_FAILURE; goto __FAILED; } // Init VI[0] ~ VI[1] for (i = 0; i < u32CamNum; i++) { ctx->vi[i].u32Width = u32ViWidth; ctx->vi[i].u32Height = u32ViHeight; ctx->vi[i].s32DevId = i; ctx->vi[i].u32PipeId = i; ctx->vi[i].s32ChnId = 0; ctx->vi[i].bIfIspGroupInit = gModeTest->bIfIspGroupInit; ctx->vi[i].stChnAttr.stIspOpt.u32BufCount = 3; ctx->vi[i].stChnAttr.stIspOpt.enMemoryType = VI_V4L2_MEMORY_TYPE_DMABUF; ctx->vi[i].stChnAttr.u32Depth = 2; ctx->vi[i].dstFilePath = pViOutPath; ctx->vi[i].s32loopCount = s32loopCnt; ctx->vi[i].stChnAttr.enPixelFormat = RK_FMT_YUV420SP; ctx->vi[i].stChnAttr.enCompressMode = COMPRESS_MODE_NONE; ctx->vi[i].stChnAttr.stFrameRate.s32SrcFrameRate = -1; ctx->vi[i].stChnAttr.stFrameRate.s32DstFrameRate = -1; SAMPLE_COMM_VI_CreateChn(&ctx->vi[i]); } /* Start pipe */ if (gModeTest->bIfIspGroupInit == RK_TRUE) { /* isp group init */ for (i = 0; i < u32CamNum; i++) { s32Ret = RK_MPI_VI_StartPipe(ctx->vi[i].u32PipeId); if (s32Ret != RK_SUCCESS) { RK_LOGE("RK_MPI_VI_StartPipe failure:$#X pipe:%d", s32Ret, ctx->vi[i].u32PipeId); g_exit_result = RK_FALSE; goto __VI_INITFAIL; } } } for (i = 0; i < u32CamNum; i++) { pthread_create(&vi_get_stream_thread_id[i], RK_NULL, vi_get_stream, &ctx->vi[i]); } if (gModeTest->s32ModuleTestType) { gModeTest->bModuleTestIfopen = RK_TRUE; pthread_create(&modeTest_thread_id, RK_NULL, sample_isp_stress_test, (void *)(gModeTest)); } RK_LOGE("%s initial finish", __func__); while (!gModeTest->bIfMainThreadQuit) { sleep(1); } RK_LOGE("%s exit!", __func__); if (gModeTest->s32ModuleTestType) { gModeTest->bModuleTestThreadQuit = RK_TRUE; pthread_join(modeTest_thread_id, RK_NULL); } // Vi thread exit for (i = 0; i < u32CamNum; i++) { gModeTest->bIfViThreadQuit[i] = RK_TRUE; pthread_join(vi_get_stream_thread_id[i], RK_NULL); } __VI_INITFAIL: /* vi deinit */ if (gModeTest->bIfIspGroupInit == RK_TRUE) { /* isp group init */ for (i = 0; i < u32CamNum; i++) { s32Ret = RK_MPI_VI_StopPipe(ctx->vi[i].u32PipeId); if (s32Ret != RK_SUCCESS) { RK_LOGE("RK_MPI_VI_StopPipe failure:$#X pipe:%d", s32Ret, ctx->vi[i].u32PipeId); g_exit_result = RK_FALSE; } } } for (i = 0; i < u32CamNum; i++) { s32Ret = SAMPLE_COMM_VI_DestroyChn(&ctx->vi[i]); if (s32Ret != RK_SUCCESS) { RK_LOGE("RK_MPI_VI_Close failed with %#x!\n", s32Ret); g_exit_result = RK_FALSE; } } __FAILED: RK_MPI_SYS_Exit(); if (iq_file_dir) { #if (defined RKAIQ) && (defined UAPI2) isp_deinit(); #endif } __FAILED2: global_param_deinit(); return g_exit_result; } #ifdef __cplusplus #if __cplusplus } #endif #endif /* End of #ifdef __cplusplus */