From 92b2097a9792c838c0655d9fdebbe3615dbeda54 Mon Sep 17 00:00:00 2001 From: SikongJueluo Date: Mon, 24 Jun 2024 21:59:35 +0800 Subject: [PATCH] finish snap but don't work --- src/isp/eb3516_video.c | 164 +++++++++++++++++++++++++++++++++++------ src/log.conf | 6 +- src/main.cpp | 6 +- 3 files changed, 148 insertions(+), 28 deletions(-) diff --git a/src/isp/eb3516_video.c b/src/isp/eb3516_video.c index 33b4f5a..92bed6a 100644 --- a/src/isp/eb3516_video.c +++ b/src/isp/eb3516_video.c @@ -1,6 +1,8 @@ #include "eb3516_video.h" +#include "hi_comm_snap.h" #include "hi_common.h" +#include "mpi_snap.h" #include "my_common.h" #include "sample_comm.h" #include "zlog.h" @@ -34,7 +36,7 @@ static SAMPLE_VPSS_CONFIG_S g_stVpss1Config = {0}; static const VPSS_CHN g_Vpss0Chn[2] = {1, 2}; static const VPSS_CHN g_Vpss1Chn = 1; static const PIC_SIZE_E g_PicSizes[3] = {PIC_1080P, PIC_720P, PIC_1080P}; -static const VENC_CHN g_VencChn[1] = {0}; +static const VENC_CHN g_VencChn[3] = {0, 1, 2}; static const PAYLOAD_TYPE_E g_CodecTypes[3] = {PT_H265, PT_H264, PT_JPEG}; static HI_S32 VPSS_GetDefChnAttr(VPSS_CHN_ATTR_S* pstVpssChnAttr, @@ -130,8 +132,8 @@ bool eb3516VideoInit(void) { g_stViConfig.astViInfo[0].stDevInfo.ViDev = 0; g_stViConfig.astViInfo[0].stDevInfo.enWDRMode = WDR_MODE_NONE; // 设置 VI PIPE 信息 - g_stViConfig.astViInfo[0].stPipeInfo.aPipe[0] = 0; // video pipe - g_stViConfig.astViInfo[0].stPipeInfo.aPipe[1] = -1; // snap pipe + g_stViConfig.astViInfo[0].stPipeInfo.aPipe[0] = 0; // video pipe + g_stViConfig.astViInfo[0].stPipeInfo.aPipe[1] = 1; // snap pipe g_stViConfig.astViInfo[0].stPipeInfo.aPipe[2] = -1; g_stViConfig.astViInfo[0].stPipeInfo.aPipe[3] = -1; g_stViConfig.astViInfo[0].stPipeInfo.enMastPipeMode = @@ -144,10 +146,10 @@ bool eb3516VideoInit(void) { g_stViConfig.astViInfo[0].stChnInfo.enVideoFormat = VIDEO_FORMAT_LINEAR; g_stViConfig.astViInfo[0].stChnInfo.enCompressMode = COMPRESS_MODE_SEG; // 设置 VI 抓拍信息 - g_stViConfig.astViInfo[0].stSnapInfo.bSnap = HI_FALSE; + g_stViConfig.astViInfo[0].stSnapInfo.bSnap = HI_TRUE; g_stViConfig.astViInfo[0].stSnapInfo.bDoublePipe = HI_TRUE; g_stViConfig.astViInfo[0].stSnapInfo.VideoPipe = 0; - g_stViConfig.astViInfo[0].stSnapInfo.SnapPipe = -1; + g_stViConfig.astViInfo[0].stSnapInfo.SnapPipe = 1; g_stViConfig.astViInfo[0].stSnapInfo.enVideoPipeMode = VI_OFFLINE_VPSS_OFFLINE; g_stViConfig.astViInfo[0].stSnapInfo.enSnapPipeMode = @@ -155,9 +157,9 @@ bool eb3516VideoInit(void) { // 配置 VPSS VPSS_GetParams(&g_stVpss0Config, &stSize, false); - // VPSS_GetParams(&g_stVpss1Config, &stSize, true); + VPSS_GetParams(&g_stVpss1Config, &stSize, true); - zlog_info(log_video, "eb3516 Video Init Finish..."); + zlog_debug(log_video, "eb3516 Video Init Finish..."); } bool eb3516VideoStart(void) { @@ -185,27 +187,48 @@ bool eb3516VideoStart(void) { zlog_error(log_video, "Start VI failed with %#x!\n", s32Ret); goto EXIT_SYS_STOP; } - zlog_info(log_video, "eb3516 VI Start Success..."); + zlog_debug(log_video, "eb3516 VI Start Success..."); // 启动 VPSS s32Ret = SAMPLE_COMM_VPSS_Start( g_stVpss0Config.s32GrpId, g_stVpss0Config.abChnEnable, &g_stVpss0Config.stGrpAttr, g_stVpss0Config.astChnAttrs); if (s32Ret != HI_SUCCESS) { - zlog_error(log_video, "Start VPSS group %d failed with %#x!\n", + zlog_error(log_video, "Start VPSS0 group %d failed with %#x!\n", g_stVpss0Config.s32GrpId, s32Ret); goto EXIT_VI_STOP; } - zlog_info(log_video, "eb3516 VPSS Start Success..."); + zlog_debug(log_video, "eb3516 VPSS0 Start Success..."); + + s32Ret = SAMPLE_COMM_VPSS_Start( + g_stVpss1Config.s32GrpId, g_stVpss1Config.abChnEnable, + &g_stVpss1Config.stGrpAttr, g_stVpss1Config.astChnAttrs); + if (s32Ret != HI_SUCCESS) { + zlog_error(log_video, "Start VPSS1 group %d failed with %#x!\n", + g_stVpss1Config.s32GrpId, s32Ret); + goto EXIT_VI_STOP; + } + zlog_debug(log_video, "eb3516 VPSS1 Start Success..."); // 绑定 VI->VPSS s32Ret = SAMPLE_COMM_VI_Bind_VPSS( g_stViConfig.astViInfo[0].stPipeInfo.aPipe[0], g_stViConfig.astViInfo[0].stChnInfo.ViChn, g_stVpss0Config.s32GrpId); if (s32Ret != HI_SUCCESS) { - zlog_error(log_video, "VI Video Pipe bind VPSS failed with %#x!\n", s32Ret); + zlog_error(log_video, "VI Video Pipe bind VPSS0 failed with %#x!\n", + s32Ret); goto EXIT_VPSS_STOP; } + zlog_debug(log_video, "eb3516 VI Bind VPSS0 Success"); + s32Ret = SAMPLE_COMM_VI_Bind_VPSS( + g_stViConfig.astViInfo[0].stPipeInfo.aPipe[1], + g_stViConfig.astViInfo[0].stChnInfo.ViChn, g_stVpss1Config.s32GrpId); + if (s32Ret != HI_SUCCESS) { + zlog_error(log_video, "VI Snap Pipe bind VPSS1 failed with %#x!\n", + s32Ret); + goto EXIT_VPSS_STOP; + } + zlog_debug(log_video, "eb3516 VI Bind VPSS1 Success"); // Get Venc Config VENC_GOP_ATTR_S stGopAttr; @@ -216,11 +239,11 @@ bool eb3516VideoStart(void) { SAMPLE_COMM_VENC_Creat(g_VencChn[0], g_CodecTypes[0], g_PicSizes[0], SAMPLE_RC_VBR, 0, HI_FALSE, &stGopAttr); if (s32Ret != HI_SUCCESS) { - zlog_error(log_video, "Create Venc Chn %d failed with %#x!\n", g_VencChn[0], - s32Ret); + zlog_error(log_video, "Create Venc Chn %d failed with %#x!\n", + g_VencChn[0], s32Ret); goto EXIT_VI_VPSS_UNBIND; } - zlog_info(log_video, "eb3516 VENC Start Success..."); + zlog_debug(log_video, "eb3516 VENC Start Success..."); /*config vo*/ SAMPLE_COMM_VO_GetDefConfig(&stVoConfig); @@ -234,7 +257,7 @@ bool eb3516VideoStart(void) { SAMPLE_PRT("start vo failed. s32Ret: 0x%x !\n", s32Ret); goto EXIT_VENC_H264_STOP; } - zlog_info(log_video, "eb3516 VO Start Success..."); + zlog_debug(log_video, "eb3516 VO Start Success..."); /*vpss bind vo*/ s32Ret = SAMPLE_COMM_VPSS_Bind_VO(g_stVpss0Config.s32GrpId, g_Vpss0Chn[0], @@ -244,6 +267,63 @@ bool eb3516VideoStart(void) { goto EXIT_VO_STOP; } + // 抓拍 jpeg 4k + SIZE_S stPicSize; + SAMPLE_COMM_SYS_GetPicSize(g_PicSizes[2], &stPicSize); + s32Ret = SAMPLE_COMM_VENC_SnapStart(g_VencChn[2], &stPicSize, HI_TRUE); + if (s32Ret != HI_SUCCESS) { + zlog_error(log_video, "Venc Snap Start failed with %#x\n", s32Ret); + goto EXIT_VENC_H264_UNBIND; + } + // 绑定 VPSS[1,0]->VENC[2] + s32Ret = SAMPLE_COMM_VPSS_Bind_VENC(g_stVpss1Config.s32GrpId, g_Vpss1Chn, + g_VencChn[2]); + if (s32Ret != HI_SUCCESS) { + zlog_error(log_video, "Venc bind Vpss failed with %#x!\n", s32Ret); + goto EXIT_VENC_SNAP_STOP; + } + + // 启动抓拍通道 + SNAP_ATTR_S stSnapAttr; + stSnapAttr.enSnapType = SNAP_TYPE_NORMAL; + stSnapAttr.bLoadCCM = HI_TRUE; + stSnapAttr.stNormalAttr.u32FrameCnt = 1; + stSnapAttr.stNormalAttr.u32RepeatSendTimes = 1; + stSnapAttr.stNormalAttr.bZSL = HI_FALSE; + s32Ret = HI_MPI_SNAP_SetPipeAttr( + g_stViConfig.astViInfo[0].stPipeInfo.aPipe[1], &stSnapAttr); + if (s32Ret != HI_SUCCESS) { + zlog_error(log_video, "HI_MPI_SNAP_SetPipeAttr failed with %#x!\n", + s32Ret); + goto EXIT_VO_STOP; + } + s32Ret = + HI_MPI_SNAP_EnablePipe(g_stViConfig.astViInfo[0].stPipeInfo.aPipe[1]); + if (s32Ret != HI_SUCCESS) { + zlog_error(log_video, "HI_MPI_SNAP_EnablePipe failed with %#x!\n", + s32Ret); + goto EXIT_VO_STOP; + } + + // 设置照片 EXIF 信息 + ISP_DCF_INFO_S stIspDCF; + HI_MPI_ISP_GetDCFInfo(g_stViConfig.astViInfo[0].stPipeInfo.aPipe[0], + &stIspDCF); + strncpy((char*)stIspDCF.stIspDCFConstInfo.au8ImageDescription, "", + DCF_DRSCRIPTION_LENGTH); + strncpy((char*)stIspDCF.stIspDCFConstInfo.au8Make, "OurEDA", + DCF_DRSCRIPTION_LENGTH); + strncpy((char*)stIspDCF.stIspDCFConstInfo.au8Model, "CatFeeder Camera", + DCF_DRSCRIPTION_LENGTH); + snprintf((char*)stIspDCF.stIspDCFConstInfo.au8Software, + DCF_DRSCRIPTION_LENGTH, "CatFeeder snap"); + s32Ret = HI_MPI_ISP_SetDCFInfo( + g_stViConfig.astViInfo[0].stPipeInfo.aPipe[0], &stIspDCF); + if (s32Ret != HI_SUCCESS) { + zlog_error(log_video, "HI_MPI_ISP_SetDCFInfo failed with %#x!\n", + s32Ret); + } + // // 绑定 VPSS[0,0]->VENC[0] // s32Ret = SAMPLE_COMM_VPSS_Bind_VENC(g_stVpss0Config.s32GrpId, // g_Vpss0Chn[0], @@ -260,44 +340,84 @@ bool eb3516VideoStart(void) { // zlog_error(log_video, "Get venc stream failed!\n"); // goto EXIT_VENC_H264_STOP; // } - // zlog_info(log_video, "eb3516 Stream Start Success..."); + // zlog_debug(log_video, "eb3516 Stream Start Success..."); - PAUSE(); + // s32Ret = SAMPLE_COMM_VENC_SaveJpeg(g_VencChn[2], 1); + // if (HI_SUCCESS != s32Ret) { + // zlog_error(log_video, "Save Jpeg Failed"); + // } + + zlog_info(log_video, "Mpp Start Successfully"); + // PAUSE(); // SAMPLE_COMM_VENC_StopGetStream(); + return true; +EXIT_VENC_SNAP_STOP: + SAMPLE_COMM_VENC_Stop(g_VencChn[2]); EXIT_VO_STOP: SAMPLE_COMM_VO_StopVO(&stVoConfig); EXIT_VENC_H264_STOP: SAMPLE_COMM_VENC_Stop(g_VencChn[1]); -EXIT_VENC_H265_STOP: - // SAMPLE_COMM_VENC_Stop(g_VencChn[0]); +EXIT_VENC_H264_UNBIND: + // SAMPLE_COMM_VPSS_UnBind_VENC(g_stVpss0Config.s32GrpId, g_Vpss0Chn[1], + // g_VencChn[1]); +VENC_H265_STOP: + SAMPLE_COMM_VENC_Stop(g_VencChn[0]); EXIT_VI_VPSS_UNBIND: SAMPLE_COMM_VI_UnBind_VPSS(g_stViConfig.astViInfo[0].stPipeInfo.aPipe[0], g_stViConfig.astViInfo[0].stChnInfo.ViChn, g_stVpss0Config.s32GrpId); + SAMPLE_COMM_VI_UnBind_VPSS(g_stViConfig.astViInfo[0].stPipeInfo.aPipe[1], + g_stViConfig.astViInfo[0].stChnInfo.ViChn, + g_stVpss1Config.s32GrpId); EXIT_VPSS_STOP: SAMPLE_COMM_VPSS_Stop(g_stVpss0Config.s32GrpId, g_stVpss0Config.abChnEnable); + SAMPLE_COMM_VPSS_Stop(g_stVpss1Config.s32GrpId, + g_stVpss1Config.abChnEnable); EXIT_VI_STOP: SAMPLE_COMM_VI_StopVi(&g_stViConfig); EXIT_SYS_STOP: SAMPLE_COMM_SYS_Exit(); EXIT_SYS_RST_CLK: EXIT: - return s32Ret; + return false; } void eb3516VideoStop(void) { + SAMPLE_COMM_VENC_Stop(g_VencChn[2]); SAMPLE_COMM_VO_StopVO(&stVoConfig); SAMPLE_COMM_VENC_Stop(g_VencChn[1]); + SAMPLE_COMM_VENC_Stop(g_VencChn[0]); SAMPLE_COMM_VI_UnBind_VPSS(g_stViConfig.astViInfo[0].stPipeInfo.aPipe[0], g_stViConfig.astViInfo[0].stChnInfo.ViChn, g_stVpss0Config.s32GrpId); + SAMPLE_COMM_VI_UnBind_VPSS(g_stViConfig.astViInfo[0].stPipeInfo.aPipe[1], + g_stViConfig.astViInfo[0].stChnInfo.ViChn, + g_stVpss1Config.s32GrpId); SAMPLE_COMM_VPSS_Stop(g_stVpss0Config.s32GrpId, g_stVpss0Config.abChnEnable); + SAMPLE_COMM_VPSS_Stop(g_stVpss1Config.s32GrpId, + g_stVpss1Config.abChnEnable); SAMPLE_COMM_VI_StopVi(&g_stViConfig); SAMPLE_COMM_SYS_Exit(); - - zlog_info(log_video, "Exit process Sucessfully!"); + + zlog_info(log_video, "Finish Stopping eb3516 Video"); +} + +bool eb3516GetPic(void) { + HI_S32 ret = HI_SUCCESS; + + VIDEO_FRAME_INFO_S stRawInfo; + HI_S32 milliSec = 10000; + + ret = HI_MPI_VI_GetPipeFrame(g_stViConfig.astViInfo[0].stPipeInfo.aPipe[1], + &stRawInfo, milliSec); + if (HI_SUCCESS != ret) { + zlog_error(log_video, "Get Pipe Frame Failed"); + return false; + } + + } \ No newline at end of file diff --git a/src/log.conf b/src/log.conf index 368338d..8e9002d 100644 --- a/src/log.conf +++ b/src/log.conf @@ -10,7 +10,7 @@ detail = "[%d.%us] [%p:%F:%L] [%V] %m%n" [rules] -*.ERROR >stdout; detail -*.WARN >stdout; -*.INFO >stdout; simple +*.=ERROR >stdout; detail +*.=WARN >stdout; detail +*.=INFO >stdout; simple *.DEBUG "log/%c.log"; detail diff --git a/src/main.cpp b/src/main.cpp index 8e6e65e..8503480 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -28,9 +28,9 @@ int main(int argc, char** argv) { } zlog_info(log, "Init zlog Sucessfully"); - // if (!std::experimental::filesystem::remove_all("log", file_error)) { - // zlog_warn(log, "Can't Remove Last Logs FOR %s", file_error.message().c_str()); - // } + if (!std::experimental::filesystem::remove_all("log", file_error)) { + zlog_warn(log, "Can't Remove Last Logs FOR %s", file_error.message().c_str()); + } if (!std::experimental::filesystem::create_directory("log", file_error)) { zlog_warn(log, "Can't Create log dir FOR %s", file_error.message().c_str());