firmware/general/package/xiongmai-osdrv-xm530/files/sample/venc/venc.c

1088 lines
37 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/******************************************************************************
Some simple xm510 video encode functions.
*****************************************************************************
******************************************************************************/
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* End of #ifdef __cplusplus */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <pthread.h>
#include <math.h>
#include <unistd.h>
#include "venc.h"
#include "Camera.h"
const int capsize2width[CAPTURE_SIZE_EXT_V2_NR] =
{704, 704, 352, 352, 176, 640, 320, 1024, 160,240,926,1280,1280,1600,1920,1920,1872,2048,2592,960,2560,3072,3264,4000,4096};
const int capsize2height[2][CAPTURE_SIZE_EXT_V2_NR] =
{
{576, 288, 576, 288, 144, 480, 240, 768, 120,192,576,720,960,1200,1080,1200,1408,1536,1944,1080,1440,2048,2448,3000,2160},
{480, 240, 480, 240, 120, 480, 240, 768, 120,192,576,720,960,1200,1080,1200,1408,1536,1944,1080,1440,2048,2448,3000,2160}
};
XM_S32 SampleSysInit(unsigned int RsltType)
{
static int sys_inited = 0;
if(sys_inited == 0)
{
XM_MPI_SYS_Init();
//system("isp &");
CAMERACFG_TO_ISP stCfg;
memset(&stCfg,0,sizeof(CAMERACFG_TO_ISP));
stCfg.u32StdType = 0;
stCfg.u32RsltType = RsltType;
stCfg.u32Infrared = (1<<31) | 0;
camera_isp_task(&stCfg);
sys_inited = 1;
}
return XM_SUCCESS;
}
/******************************************************************************
* funciton : create Vi Chn
******************************************************************************/
XM_S32 ViChnConfig(VI_CHN vichn, VIDEO_NORM_E enNorm, XM_U32 enSize)
{
SAMPLE_PRT("ViChn = %d,enNorm = %d,enSize = %d\n",vichn,enNorm,enSize);
XM_S32 s32Ret;
VI_CHN_ATTR_S ViChnAttr;
memset(&ViChnAttr, 0, sizeof(VI_CHN_ATTR_S));
ViChnAttr.stCapRect.s32X = 0;
ViChnAttr.stCapRect.s32Y = 0;
ViChnAttr.stCapRect.u32Width = (enSize == CAPTURE_SIZE_4M)?2296:capsize2width[enSize];
ViChnAttr.stCapRect.u32Height = capsize2height[enNorm][enSize];
ViChnAttr.stDestSize.u32Width = capsize2width[enSize];
ViChnAttr.stDestSize.u32Height = capsize2height[enNorm][enSize];
s32Ret = XM_MPI_VI_SetChnAttr(vichn, &ViChnAttr);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("set VI Chn attribute failed 0x%x!\n",s32Ret);
return XM_FAILURE;
}
s32Ret = XM_MPI_VI_EnableChn(vichn);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("set VI Chn enable failed 0x%x!\n",s32Ret);
return XM_FAILURE;
}
return XM_SUCCESS;
}
XM_S32 ViChnConfigEx(VI_CHN vichn, VIDEO_NORM_E enNorm, XM_U32 enSize)
{
SAMPLE_PRT("ViChn = %d,enNorm = %d,enSize = %d\n",vichn,enNorm,enSize);
XM_S32 s32Ret;
VI_EXT_CHN_ATTR_S stExtAttr;
memset(&stExtAttr, 0, sizeof(VI_EXT_CHN_ATTR_S));
stExtAttr.stDestSize.u32Width = capsize2width[enSize];
stExtAttr.stDestSize.u32Height = capsize2height[enNorm][enSize];
s32Ret = XM_MPI_VI_SetExtChnAttr(vichn, &stExtAttr);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("set VI Chn attribute failed 0x%x!\n",s32Ret);
return XM_FAILURE;
}
s32Ret = XM_MPI_VI_EnableChn(vichn);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("set VI Chn enable failed 0x%x!\n",s32Ret);
return XM_FAILURE;
}
return XM_SUCCESS;
}
/******************************************************************************
* funciton : save stream
******************************************************************************/
XM_S32 VencSaveStream(FILE *fp, VENC_STREAM_S *pstStream)
{
XM_S32 i;
for (i = 0; i < pstStream->u32PackCount; i++)
{
fwrite(pstStream->pstPack[i].pu8Addr,pstStream->pstPack[i].u32Len, 1, fp);
fflush(fp);
}
return XM_SUCCESS;
}
XM_S32 COMM_SYS_GetPicSize(VIDEO_NORM_E enNorm, XM_U32 enPicSize, SIZE_S *pstSize)
{
SAMPLE_PRT("enNorm = %d,enPicSize = %d\n",enNorm,enPicSize);
if(enPicSize>CAPTURE_SIZE_EXT_V2_NR || enPicSize<CAPTURE_SIZE_D1)
{
return XM_FAILURE;
}
pstSize->u32Height = capsize2height[enNorm][enPicSize];
pstSize->u32Width = capsize2width[enPicSize];
return XM_SUCCESS;
}
/******************************************************************************
* funciton : Start venc stream mode (h264, jpeg)
******************************************************************************/
XM_S32 COMM_VENC_Start(XM_U32 dwType, PAYLOAD_TYPE_E enType, VIDEO_NORM_E enNorm, XM_U32 enSize, int enRcMode)
{
SAMPLE_PRT("VencChn = %d,enType = %d,enNorm = %d,enSize = %d,enRcMode = %d\n",dwType,enType,enNorm,enSize,enRcMode);
XM_S32 s32Ret;
VENC_CHN_ATTR_S stVencChnAttr;
VENC_ATTR_H264_S stH264Attr;
VENC_ATTR_H264_CBR_S stH264Cbr;
VENC_ATTR_H264_VBR_S stH264Vbr;
VENC_ATTR_H264_FIXQP_S stH264FixQp;
VENC_ATTR_H265_S stH265Attr;
VENC_ATTR_H265_CBR_S stH265Cbr;
VENC_ATTR_H265_VBR_S stH265Vbr;
VENC_ATTR_H265_FIXQP_S stH265FixQp;
VENC_ATTR_JPEG_S stJpegAttr;
SIZE_S stPicSize;
s32Ret = COMM_SYS_GetPicSize(enNorm, enSize, &stPicSize);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("Get picture size failed!\n");
return XM_FAILURE;
}
stVencChnAttr.stVeAttr.enType = enType;
switch(enType)
{
case PT_H264:
{
stH264Attr.u32MaxPicWidth = stPicSize.u32Width;
stH264Attr.u32MaxPicHeight = stPicSize.u32Height;
stH264Attr.u32PicWidth = stPicSize.u32Width;/*the picture width*/
stH264Attr.u32PicHeight = stPicSize.u32Height;/*the picture height*/
stH264Attr.u32BufSize = stPicSize.u32Width * stPicSize.u32Height * 3/8;/*stream buffer size*/
stH264Attr.u32Profile = 1;/*0: baseline; 1:MP; 2:HP ? */
stH264Attr.bByFrame = XM_TRUE;/*get stream mode is slice mode or frame mode?*/
memcpy(&stVencChnAttr.stVeAttr.stAttrH264e, &stH264Attr,sizeof(VENC_ATTR_H264_S));
if(SAMPLE_RC_CBR == enRcMode)
{
stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR;
stH264Cbr.u32Gop = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30;
stH264Cbr.u32StatTime = 1; /* stream rate statics time(s) */
stH264Cbr.u32SrcFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30;/* input (vi) frame rate */
stH264Cbr.fr32DstFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30;/* target frame rate */
switch (enSize)
{
case CAPTURE_SIZE_QCIF:
stH264Cbr.u32BitRate = 256; /* average bit rate */
break;
case CAPTURE_SIZE_QVGA: /* 320 * 240 */
case CAPTURE_SIZE_CIF:
stH264Cbr.u32BitRate = 512;
break;
case CAPTURE_SIZE_D1:
case CAPTURE_SIZE_VGA: /* 640 * 480 */
stH264Cbr.u32BitRate = 768;
break;
case CAPTURE_SIZE_720P: /* 1280 * 720 */
stH264Cbr.u32BitRate = 2188;
break;
case CAPTURE_SIZE_1_3M: /* 1280 * 960 */
stH264Cbr.u32BitRate = 2188;
break;
case CAPTURE_SIZE_1080P: /* 1920 * 1080 */
stH264Cbr.u32BitRate = 1024*2;
break;
case CAPTURE_SIZE_4M: /* 2560 * 1440 */
stH264Cbr.u32BitRate = 4096;
break;
default :
stH264Cbr.u32BitRate = 1024;
break;
}
stH264Cbr.u32FluctuateLevel = 0; /* average bit rate */
memcpy(&stVencChnAttr.stRcAttr.stAttrH264Cbr, &stH264Cbr, sizeof(VENC_ATTR_H264_CBR_S));
}
else if (SAMPLE_RC_FIXQP == enRcMode)
{
stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264FIXQP;
stH264FixQp.u32Gop = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30;
stH264FixQp.u32SrcFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30;
stH264FixQp.fr32DstFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30;
stH264FixQp.u32IQp = 20;
stH264FixQp.u32PQp = 23;
memcpy(&stVencChnAttr.stRcAttr.stAttrH264FixQp, &stH264FixQp,sizeof(VENC_ATTR_H264_FIXQP_S));
}
else if (SAMPLE_RC_VBR == enRcMode)
{
stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264VBR;
stH264Vbr.u32Gop = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30;
stH264Vbr.u32StatTime = 1;
stH264Vbr.u32SrcFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30;
stH264Vbr.fr32DstFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30;
stH264Vbr.u32MinQp = 24;
stH264Vbr.u32MaxQp = 32;
switch (enSize)
{
case CAPTURE_SIZE_QCIF:
stH264Vbr.u32MaxBitRate= 256*3; /* average bit rate */
break;
case CAPTURE_SIZE_QVGA: /* 320 * 240 */
case PIC_CIF:
stH264Vbr.u32MaxBitRate = 512*3;
break;
case CAPTURE_SIZE_D1:
case PIC_VGA: /* 640 * 480 */
stH264Vbr.u32MaxBitRate = 1024*2*3;
break;
case CAPTURE_SIZE_720P: /* 1280 * 720 */
stH264Vbr.u32MaxBitRate = 1024*3*3;
break;
case CAPTURE_SIZE_1_3M: /* 1280 * 960 */ //cly 0524
stH264Vbr.u32MaxBitRate = 1024*4*3;
break;
case CAPTURE_SIZE_1080P: /* 1920 * 1080 */
stH264Vbr.u32MaxBitRate = 1024*6*3;
break;
case CAPTURE_SIZE_4M: /* 2560 * 1440 */
stH264Cbr.u32BitRate = 4096;
break;
default :
stH264Vbr.u32MaxBitRate = 1024*4*3;
break;
}
memcpy(&stVencChnAttr.stRcAttr.stAttrH264Vbr, &stH264Vbr, sizeof(VENC_ATTR_H264_VBR_S));
}
else
{
return XM_FAILURE;
}
}
break;
case PT_H265:
{
stH265Attr.u32MaxPicWidth = stPicSize.u32Width;
stH265Attr.u32MaxPicHeight = stPicSize.u32Height;
stH265Attr.u32PicWidth = stPicSize.u32Width;/*the picture width*/
stH265Attr.u32PicHeight = stPicSize.u32Height;/*the picture height*/
stH265Attr.u32BufSize = stPicSize.u32Width * stPicSize.u32Height * 3/8;/*stream buffer size*/
stH265Attr.u32Profile = 1;/*0: baseline; 1:MP; 2:HP ? */
stH265Attr.bByFrame = XM_TRUE;/*get stream mode is slice mode or frame mode?*/
memcpy(&stVencChnAttr.stVeAttr.stAttrH265e, &stH265Attr,sizeof(VENC_ATTR_H265_S));
if(SAMPLE_RC_CBR == enRcMode)
{
stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H265CBR;
stH265Cbr.u32Gop = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30;
stH265Cbr.u32StatTime = 1; /* stream rate statics time(s) */
stH265Cbr.u32SrcFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30;/* input (vi) frame rate */
stH265Cbr.fr32DstFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30;/* target frame rate */
switch (enSize)
{
case CAPTURE_SIZE_QCIF:
stH265Cbr.u32BitRate = 256; /* average bit rate */
break;
case CAPTURE_SIZE_QVGA: /* 320 * 240 */
case CAPTURE_SIZE_CIF:
stH265Cbr.u32BitRate = 512;
break;
case CAPTURE_SIZE_D1:
case CAPTURE_SIZE_VGA: /* 640 * 480 */
stH265Cbr.u32BitRate = 768;
break;
case CAPTURE_SIZE_720P: /* 1280 * 720 */
stH265Cbr.u32BitRate = 2188;
break;
case CAPTURE_SIZE_1_3M: /* 1280 * 960 */
stH265Cbr.u32BitRate = 2188;
break;
case CAPTURE_SIZE_1080P: /* 1920 * 1080 */
stH265Cbr.u32BitRate = 1024*2;
break;
case CAPTURE_SIZE_4M: /* 2560 * 1440 */
stH264Cbr.u32BitRate = 4096;
break;
default :
break;
}
stH265Cbr.u32FluctuateLevel = 0; /* average bit rate */
memcpy(&stVencChnAttr.stRcAttr.stAttrH265Cbr, &stH265Cbr, sizeof(VENC_ATTR_H265_CBR_S));
}
else if (SAMPLE_RC_FIXQP == enRcMode)
{
stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H265FIXQP;
stH265FixQp.u32Gop = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30;
stH265FixQp.u32SrcFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30;
stH265FixQp.fr32DstFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30;
stH265FixQp.u32IQp = 20;
stH265FixQp.u32PQp = 23;
memcpy(&stVencChnAttr.stRcAttr.stAttrH265FixQp, &stH265FixQp,sizeof(VENC_ATTR_H265_FIXQP_S));
}
else if (SAMPLE_RC_VBR == enRcMode)
{
stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H265VBR;
stH265Vbr.u32Gop = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30;
stH265Vbr.u32StatTime = 1;
stH265Vbr.u32SrcFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30;
stH265Vbr.fr32DstFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30;
stH265Vbr.u32MinQp = 24;
stH265Vbr.u32MaxQp = 32;
switch (enSize)
{
case CAPTURE_SIZE_QCIF:
stH265Vbr.u32MaxBitRate= 256*3; /* average bit rate */
break;
case CAPTURE_SIZE_QVGA: /* 320 * 240 */
case PIC_CIF:
stH265Vbr.u32MaxBitRate = 512*3;
break;
case CAPTURE_SIZE_D1:
case PIC_VGA: /* 640 * 480 */
stH265Vbr.u32MaxBitRate = 1024*2*3;
break;
case CAPTURE_SIZE_720P: /* 1280 * 720 */
stH265Vbr.u32MaxBitRate = 1024*3*3;
break;
case CAPTURE_SIZE_1_3M: /* 1280 * 960 */ //cly 0524
stH265Vbr.u32MaxBitRate = 1024*4*3;
break;
case CAPTURE_SIZE_1080P: /* 1920 * 1080 */
stH265Vbr.u32MaxBitRate = 1024*6*3;
break;
case CAPTURE_SIZE_4M: /* 2560 * 1440 */
stH264Cbr.u32BitRate = 4096;
break;
default :
stH265Vbr.u32MaxBitRate = 1024*4*3;
break;
}
memcpy(&stVencChnAttr.stRcAttr.stAttrH265Vbr, &stH265Vbr, sizeof(VENC_ATTR_H265_VBR_S));
}
else
{
return XM_FAILURE;
}
}
break;
case PT_JPEG:
SAMPLE_PRT("set JpegAttr.\n");
stJpegAttr.u32PicWidth = stPicSize.u32Width;
stJpegAttr.u32PicHeight = stPicSize.u32Height;
stJpegAttr.u32MaxPicWidth= stPicSize.u32Width;
stJpegAttr.u32MaxPicHeight= stPicSize.u32Height;
stJpegAttr.u32BufSize = stPicSize.u32Width * stPicSize.u32Height * 3 / 4;
stJpegAttr.bByFrame = XM_TRUE;/*get stream mode is field mode or frame mode*/
memcpy(&stVencChnAttr.stVeAttr.stAttrJpeg, &stJpegAttr, sizeof(VENC_ATTR_JPEG_S));
break;
default:
return XM_ERR_VENC_NOT_SUPPORT;
}
s32Ret = XM_MPI_VENC_CreateChn(dwType, &stVencChnAttr);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("XM_MPI_VENC_CreateChn [%d] faild with %#x!",dwType, s32Ret);
return s32Ret;
}
return XM_SUCCESS;
}
/******************************************************************
* funciton : get venc stream
*******************************************************************/
XM_VOID* VencGetStreamProc(XM_VOID *p)
{
XM_S32 s32Ret;
int i;
VENC_STREAM_S vencStream;
VENC_STREAM_S *pVencStream = &vencStream;
XM_S32 s32ChnTotal;
FILE *pFile[VENC_MAX_CHN_NUM];
SAMPLE_VENC_GETSTREAM_PARA_S *pstPara;
XM_CHAR aszFileName[VENC_MAX_CHN_NUM][64];
pstPara = (SAMPLE_VENC_GETSTREAM_PARA_S*)p;
s32ChnTotal = pstPara->s32Cnt;
if (s32ChnTotal >= VENC_MAX_CHN_NUM)
{
SAMPLE_PRT("input count invaild\n");
return NULL;
}
pVencStream->pstPack = (VENC_PACK_S*)malloc(sizeof(VENC_PACK_S));
for (i = 0; i < s32ChnTotal; i++)
{
sprintf(aszFileName[i], "stream_chn%d",i);
pFile[i] = fopen(aszFileName[i], "wb");
if (!pFile[i])
{
SAMPLE_PRT("open file[%s] failed!\n", aszFileName[i]);
return NULL;
}
}
while(pstPara->bThreadStart)
{
XM_MPI_VENC_SelectData();
for( i = 0 ; i< s32ChnTotal; i++ )
{
s32Ret = XM_MPI_VENC_GetStream(i, pVencStream, XM_FALSE);
if (XM_SUCCESS != s32Ret)
{
break;
}
s32Ret = VencSaveStream(pFile[i], pVencStream);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("save stream failed!\n");
}
s32Ret = XM_MPI_VENC_ReleaseStream(i, pVencStream);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("XM_MPI_VENC_ReleaseStream [%d] failed!\n", i);
break;
}
}
usleep(10);
}
for (i = 0; i < s32ChnTotal; i++)
{
fclose(pFile[i]);
}
return 0;
}
int VencSetTitleV2(int streamType, CAPTURE_TITLE_PARAM_V2 *pParam)
{
XM_S32 s32Ret = XM_FAILURE;
RGN_HANDLE RgnHandle = 0;
RGN_ATTR_S stRgnAttr;
BITMAP_S stBitmap;
int magn = 2; //放大倍数
static unsigned int rgnFlag[2] = {0};
RgnHandle = pParam->index;
if (pParam->enable == 0 || pParam->pixel == NULL)
{
if (rgnFlag[streamType] & (1 << RgnHandle))
{
s32Ret = XM_MPI_RGN_Disable(streamType, RgnHandle, OVERLAY_RGN);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("XM_MPI_RGN_Disable [%d] failed with %#x\n", RgnHandle, s32Ret);
}
}
return XM_SUCCESS;
}
if (rgnFlag[streamType] & 1 << RgnHandle)
{
stRgnAttr.enType = OVERLAY_RGN;
stRgnAttr.u32Handle = RgnHandle;
s32Ret = XM_MPI_RGN_GetAttr(streamType, &stRgnAttr);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("XM_MPI_RGN_GetAttr (%d) failed with %#x!\n", RgnHandle, s32Ret);
return XM_FAILURE;
}
if (stRgnAttr.unAttr.stOverlay.stRect.u32Height != pParam->height || stRgnAttr.unAttr.stOverlay.stRect.u32Width != pParam->width)
{
s32Ret = XM_MPI_RGN_Destroy(streamType, &stRgnAttr);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("XM_MPI_RGN_Destroy [%d] failed with %#x\n", RgnHandle, s32Ret);
}
rgnFlag[streamType] &= ~(1 << RgnHandle);
}
}
stRgnAttr.enType = OVERLAY_RGN;
stRgnAttr.u32Handle = RgnHandle;
stRgnAttr.unAttr.stOverlay.u32ColorMap = 0x8F0;
stRgnAttr.unAttr.stOverlay.u32Format = 1;
stRgnAttr.unAttr.stOverlay.u32Effect = (pParam->bg_color >> 30) | ((magn-1) << 16) | ((magn-1) << 12);
stRgnAttr.unAttr.stOverlay.stRect.s32X = pParam->x;
stRgnAttr.unAttr.stOverlay.stRect.s32Y = pParam->y;
stRgnAttr.unAttr.stOverlay.stRect.u32Width = pParam->width / 2 * 2;
stRgnAttr.unAttr.stOverlay.stRect.u32Height = pParam->height / 2 * 2;
if (rgnFlag[streamType] & (1 << RgnHandle))
{
s32Ret = XM_MPI_RGN_SetAttr(streamType, &stRgnAttr);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("XM_MPI_RGN_SetAttr (%d) failed with %#x!\n", RgnHandle, s32Ret);
return XM_FAILURE;
}
}
else
{
SAMPLE_PRT("chn = %d\n", streamType);
s32Ret = XM_MPI_RGN_Create(streamType, &stRgnAttr);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("XM_MPI_RGN_Create (%d) failed with %#x!\n", RgnHandle, s32Ret);
return XM_FAILURE;
}
rgnFlag[streamType] |= 1 << RgnHandle;
}
stBitmap.u32Handle = RgnHandle;
stBitmap.u32Width = pParam->width;
stBitmap.u32Height = pParam->height;
stBitmap.u32Format = 1;
stBitmap.pData = (XM_VOID *)pParam->pixel;
s32Ret = XM_MPI_RGN_SetBitMap(streamType, &stBitmap);
if (s32Ret != XM_SUCCESS)
{
SAMPLE_PRT("XM_MPI_RGN_SetBitMaperror:%x\n", s32Ret);
return XM_FAILURE;
}
XM_MPI_RGN_Enable(streamType, RgnHandle, OVERLAY_RGN);
return XM_SUCCESS;
}
/******************************************************************************
* funciton : 720P Set Title
******************************************************************************/
XM_S32 VencSetTitle(CAPTURE_TITLE_PARAM *pParam)
{
XM_S32 s32Ret;
RGN_ATTR_S stRgnAttr;
BITMAP_S stBitmap;
VI_CHN ViChn = 0;
RGN_HANDLE RgnHandle = 0;
stRgnAttr.enType = OVERLAY_RGN;
stRgnAttr.u32Handle = RgnHandle;
stRgnAttr.unAttr.stOverlay.u32ColorMap = 0xF0;
stRgnAttr.unAttr.stOverlay.u32Format = 0;
stRgnAttr.unAttr.stOverlay.u32Effect = (pParam->bg_color >> 30);
stRgnAttr.unAttr.stOverlay.stRect.s32X = pParam->x;
stRgnAttr.unAttr.stOverlay.stRect.s32Y = pParam->y;
stRgnAttr.unAttr.stOverlay.stRect.u32Width = pParam->width/2*2;
stRgnAttr.unAttr.stOverlay.stRect.u32Height = pParam->height/2*2;
s32Ret = XM_MPI_RGN_Create(ViChn, &stRgnAttr);
if(XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("XM_MPI_RGN_Create failed!\n");
return XM_FAILURE;
}
stBitmap.u32Handle = RgnHandle;
stBitmap.u32Width = pParam->width;
stBitmap.u32Height = pParam->height;
stBitmap.u32Format = 0; //单色前景
stBitmap.pData = (XM_VOID *)pParam->pixel;
s32Ret = XM_MPI_RGN_SetBitMap(ViChn,&stBitmap);
if(s32Ret != XM_SUCCESS)
{
SAMPLE_PRT("XM_MPI_RGN_SetBitMaperror:%#x\n", s32Ret);
return XM_FAILURE;
}
s32Ret = XM_MPI_RGN_Enable(ViChn,RgnHandle,OVERLAY_RGN);
if(s32Ret != XM_SUCCESS)
{
SAMPLE_PRT("XM_MPI_RGN_Enable failed!\n");
return XM_FAILURE;
}
return XM_SUCCESS;
}
/******************************************************************************
* function : H.264@720p@25fps+H.264@D1@25fps
******************************************************************************/
XM_S32 SAMPLE_VENC_720P_CLASSIC(int seconds)
{
XM_S32 s32Cnt = 0;
XM_S32 s32Ret;
VENC_CHN VencChn = 0;
VI_CHN ViChn = 0;
SAMPLE_VENC_GETSTREAM_PARA_S gs_stPara;
pthread_t gs_VencPid;
s32Ret = SampleSysInit(0);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("SampleSysInit failed!\n");
return XM_FAILURE;
}
ViChn = 0;
s32Ret = ViChnConfig(ViChn, VIDEO_ENCODING_MODE_PAL,CAPTURE_SIZE_720P);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start ViChn %d failed!\n", ViChn);
return XM_FAILURE;
}
ViChn = 1;
s32Ret = ViChnConfigEx(ViChn, VIDEO_ENCODING_MODE_PAL,CAPTURE_SIZE_D1);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start ViChn %d failed!\n", ViChn);
return XM_FAILURE;
}
VencChn = 0;
s32Ret = COMM_VENC_Start(VencChn, PT_H264,VIDEO_ENCODING_MODE_PAL,CAPTURE_SIZE_720P,SAMPLE_RC_CBR);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start VencChn %d failed!\n", VencChn);
goto END_VI_STOP;
}
s32Cnt += 1;
VencChn = 1;
s32Ret = COMM_VENC_Start(VencChn, PT_H264,VIDEO_ENCODING_MODE_PAL,CAPTURE_SIZE_D1,SAMPLE_RC_CBR);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start VencChn %d failed!\n", VencChn);
goto END_VI_STOP;
}
s32Cnt += 1;
for(VencChn = 0; VencChn < s32Cnt; VencChn++)
{
s32Ret = XM_MPI_VENC_StartRecvPic(VencChn);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("XM_MPI_VENC_StartRecvPic [%d] failed!\n", VencChn);
goto END_VENC_DESTORY;
}
}
gs_stPara.bThreadStart = XM_TRUE;
gs_stPara.s32Cnt = s32Cnt;
s32Ret = pthread_create(&gs_VencPid, 0, VencGetStreamProc, (XM_VOID*)&gs_stPara);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VENC_StartGetStream failed!\n");
goto END_VENC_STOP_RECV_PIC;
}
sleep(seconds);
gs_stPara.bThreadStart = XM_FALSE;
pthread_join(gs_VencPid, 0);
END_VENC_STOP_RECV_PIC:
for(VencChn = 0; VencChn < s32Cnt; VencChn++)
{
s32Ret = XM_MPI_VENC_StopRecvPic(VencChn);
if (s32Ret != XM_SUCCESS)
{
SAMPLE_PRT("XM_MPI_VENC_StopRecvPic [%d] err 0x%x",VencChn, s32Ret);
}
}
END_VENC_DESTORY:
for(VencChn = 0; VencChn < s32Cnt; VencChn++)
{
s32Ret = XM_MPI_VENC_DestroyChn(VencChn);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("XM_MPI_VENC_DestroyChn [%d] faild with %#x!",VencChn, s32Ret);
}
}
END_VI_STOP:
for(ViChn = 0; ViChn < s32Cnt; ViChn++)
{
s32Ret = XM_MPI_VI_DisableChn(ViChn);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("XM_MPI_VI_DisableChn [%d] faild with %#x!",ViChn, s32Ret);
}
}
return s32Ret;
}
/******************************************************************************
* function : H.265@400W@25fps+H.264@D1@25fps
******************************************************************************/
XM_S32 SAMPLE_VENC_400W_CLASSIC(int seconds)
{
XM_S32 s32Cnt = 0;
XM_S32 s32Ret;
VENC_CHN VencChn = 0;
VI_CHN ViChn = 0;
SAMPLE_VENC_GETSTREAM_PARA_S gs_stPara;
pthread_t gs_VencPid;
s32Ret = SampleSysInit(4);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("SampleSysInit failed!\n");
return XM_FAILURE;
}
ViChn = 0;
s32Ret = ViChnConfig(ViChn, VIDEO_ENCODING_MODE_PAL,CAPTURE_SIZE_4M);//<2F>˴<EFBFBD><CBB4><EFBFBD><EFBFBD>޸<EFBFBD>2560*1440
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start ViChn %d failed!\n", ViChn);
return XM_FAILURE;
}
ViChn = 1;
s32Ret = ViChnConfigEx(ViChn, VIDEO_ENCODING_MODE_PAL,CAPTURE_SIZE_D1);//<2F>˴<EFBFBD><CBB4><EFBFBD><EFBFBD>޸<EFBFBD>2560*1440
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start ViChn %d failed!\n", ViChn);
return XM_FAILURE;
}
VencChn = 0;
s32Ret = COMM_VENC_Start(VencChn, PT_H264,VIDEO_ENCODING_MODE_PAL,CAPTURE_SIZE_4M,SAMPLE_RC_CBR);//<2F>˴<EFBFBD><CBB4><EFBFBD><EFBFBD>޸<EFBFBD>2560*1440
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start VencChn %d failed!\n", VencChn);
goto END_VI_STOP;
}
s32Cnt += 1;
VencChn = 1;
s32Ret = COMM_VENC_Start(VencChn, PT_H264,VIDEO_ENCODING_MODE_PAL,CAPTURE_SIZE_D1,SAMPLE_RC_CBR);//<2F>˴<EFBFBD><CBB4><EFBFBD><EFBFBD>޸<EFBFBD>2560*1440
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start VencChn %d failed!\n", VencChn);
goto END_VI_STOP;
}
s32Cnt += 1;
for(VencChn = 0; VencChn < s32Cnt; VencChn++)
{
s32Ret = XM_MPI_VENC_StartRecvPic(VencChn);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("XM_MPI_VENC_StartRecvPic [%d] failed!\n", VencChn);
goto END_VENC_DESTORY;
}
}
gs_stPara.bThreadStart = XM_TRUE;
gs_stPara.s32Cnt = s32Cnt;
s32Ret = pthread_create(&gs_VencPid, 0, VencGetStreamProc, (XM_VOID*)&gs_stPara);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VENC_StartGetStream failed!\n");
goto END_VENC_STOP_RECV_PIC;
}
sleep(seconds);
gs_stPara.bThreadStart = XM_FALSE;
pthread_join(gs_VencPid, 0);
END_VENC_STOP_RECV_PIC:
for(VencChn = 0; VencChn < s32Cnt; VencChn++)
{
s32Ret = XM_MPI_VENC_StopRecvPic(VencChn);
if (s32Ret != XM_SUCCESS)
{
SAMPLE_PRT("XM_MPI_VENC_StopRecvPic [%d] err 0x%x",VencChn, s32Ret);
}
}
END_VENC_DESTORY:
for(VencChn = 0; VencChn < s32Cnt; VencChn++)
{
s32Ret = XM_MPI_VENC_DestroyChn(VencChn);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("XM_MPI_VENC_DestroyChn [%d] faild with %#x!",VencChn, s32Ret);
}
}
END_VI_STOP:
for(ViChn = 0; ViChn < s32Cnt; ViChn++)
{
s32Ret = XM_MPI_VI_DisableChn(ViChn);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("XM_MPI_VI_DisableChn [%d] faild with %#x!",ViChn, s32Ret);
}
}
return s32Ret;
}
/******************************************************************************
* H.264@720p@25fps with Title
******************************************************************************/
XM_S32 SAMPLE_VENC_720P_SetTitle(int seconds)
{
XM_S32 s32Ret;
XM_S32 s32Cnt = 0;
VENC_CHN VencChn = 0;
VI_CHN ViChn = 0;
SAMPLE_VENC_GETSTREAM_PARA_S gs_stPara;
pthread_t gs_VencPid;
XM_U8 thePixel[] = {
0x10,0x40,0x00,0x04,0x10,0xA0,0x47,0xFE,
0x10,0x88,0x31,0x00,0xFD,0xFC,0x11,0x08,
0x11,0x20,0x01,0xFC,0x13,0x28,0x01,0x08,
0x25,0xFC,0xF1,0x08,0x21,0x20,0x11,0x08,
0x51,0x28,0x11,0x08,0x51,0xFC,0x11,0x08,
0x91,0x20,0x12,0x08,0x25,0x20,0x14,0x50,
0x45,0x24,0x10,0x20,0x7D,0xFE,0x28,0x06,
0x01,0x00,0x47,0xFC,0x01,0x00,0x00,0x00
};
XM_U8 secondPixel[] = { //2bit模式每个像素点占用2bit空间
0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,
0x0a,0x00,0x00,0x00,0x00,0x80,0x0a,0x5a,
0x02,0xa8,0x00,0x00,0xaa,0x80,0xa5,0xa0,
0x02,0x80,0x02,0x60,0x25,0x55,0x89,0x56,
0x00,0x02,0x55,0x62,0x55,0x58,0x09,0x60,
0x09,0x58,0x95,0xa9,0x69,0x56,0x00,0x09,
0x56,0x89,0x5a,0x96,0x25,0x58,0x09,0x58,
0x96,0x02,0x5a,0x58,0x00,0x25,0x68,0x09,
0x60,0x25,0xa5,0x58,0x25,0x98,0x96,0x02,
0x5a,0x58,0x00,0x95,0x80,0x09,0x60,0x25,
0xa5,0x58,0x25,0x98,0x96,0xaa,0x5a,0x58,
0x00,0x96,0x00,0x09,0x6a,0xa5,0xa5,0x96,
0x25,0x96,0x95,0x55,0x5a,0x58,0x00,0x96,
0x00,0x09,0x55,0x55,0xa5,0x96,0x26,0x96,
0x95,0x55,0x5a,0x58,0x00,0x96,0x00,0x09,
0x55,0x55,0xa6,0x96,0x96,0x96,0x96,0xaa,
0x5a,0x58,0x00,0x96,0x00,0x09,0x6a,0xa5,
0xa6,0x25,0x96,0x96,0x96,0x02,0x5a,0x58,
0x00,0x96,0x00,0x09,0x60,0x25,0x96,0x25,
0x96,0x96,0x96,0x02,0x5a,0x58,0x00,0x95,
0x80,0x09,0x60,0x25,0x96,0x25,0x58,0x96,
0x96,0x02,0x5a,0x58,0x00,0x25,0x6a,0x89,
0x60,0x25,0x96,0x09,0x58,0x96,0x96,0x02,
0x59,0x56,0x00,0x09,0x55,0x69,0x60,0x25,
0x96,0x09,0x58,0x26,0x96,0x02,0x59,0x56,
0x00,0x02,0x55,0x69,0x60,0x25,0x96,0x09,
0x60,0x25,0xa8,0x00,0xa2,0xa8,0x00,0x00,
0xaa,0x82,0x80,0x0a,0x28,0x02,0x80,0x0a
};
CAPTURE_TITLE_PARAM Param =
{
.x = 10,
.y = 10,
.width = 32,
.height = 16,
.fg_color = 0x030303,
.bg_color = 0xFFFFFF,
.pixel = thePixel,
};
CAPTURE_TITLE_PARAM_V2 ParamV2 =
{
.index = 1,
.enable = 1,
.x = 1000,
.y = 100,
.width = 56,
.height = 16,
.fg_color = 0x030303,
.bg_color = 0xFFFFFF,
.pixel = secondPixel,
};
s32Ret = SampleSysInit(0);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("SampleSysInit failed!\n");
return XM_FAILURE;
}
RGN_PALLET_S pallet = {{0x008080, 0x216EB9, 0x415BF1, 0x8235C1, 0xA21193, 0x813623, 0x19F16E, 0x5CB3B4,
0x408080, 0x71488A, 0x4D9348, 0x9AA611, 0x179398, 0x4E93E7, 0x9BA5AF, 0xDB8080}};
XM_MPI_RGN_SetPallet(0, &pallet);
XM_MPI_RGN_SetPallet(1, &pallet);
s32Ret = ViChnConfig(ViChn, VIDEO_ENCODING_MODE_PAL,CAPTURE_SIZE_720P);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start ViChn %d failed!\n", ViChn);
return XM_FAILURE;
}
s32Ret = VencSetTitle(&Param);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("Set Title failed!\n");
goto END_VI_STOP;
}
s32Ret = VencSetTitleV2(ViChn, &ParamV2);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("Set TitleV2 failed!\n");
goto END_VI_STOP;
}
s32Ret = COMM_VENC_Start(VencChn, PT_H264,VIDEO_ENCODING_MODE_PAL,CAPTURE_SIZE_720P,SAMPLE_RC_CBR);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Venc failed!\n");
goto END_VI_STOP;
}
s32Cnt += 1;
s32Ret = XM_MPI_VENC_StartRecvPic(VencChn);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("XM_MPI_VENC_StartRecvPic [%d] failed!\n", VencChn);
goto END_VENC_DESTORY;
}
gs_stPara.bThreadStart = XM_TRUE;
gs_stPara.s32Cnt = s32Cnt;
s32Ret = pthread_create(&gs_VencPid, 0, VencGetStreamProc, (XM_VOID*)&gs_stPara);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VENC_StartGetStream failed!\n");
goto END_VENC_STOP_RECV_PIC;
}
sleep(seconds);
gs_stPara.bThreadStart = XM_FALSE;
pthread_join(gs_VencPid, 0);
END_VENC_STOP_RECV_PIC:
s32Ret = XM_MPI_VENC_StopRecvPic(VencChn);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("XM_MPI_VENC_StopRecvPic [%d] failed!\n", VencChn);
}
END_VENC_DESTORY:
s32Ret = XM_MPI_VENC_DestroyChn(VencChn);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("XM_MPI_VENC_DestroyChn [%d] faild with %#x!",VencChn, s32Ret);
}
END_VI_STOP:
s32Ret = XM_MPI_VI_DisableChn(ViChn);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("XM_MPI_VI_DisableChn [%d] faild with %#x!",ViChn, s32Ret);
}
return s32Ret;
}
/******************************************************************************
* function : Capture JPEG
******************************************************************************/
XM_S32 SAMPLE_VENC_CaptureJPEG(int num)
{
XM_S32 s32Ret, count;
VENC_CHN VencChn = 0;
VENC_CHN jpegChn = 2;
VI_CHN ViChn = 0;
FILE *fp;
XM_CHAR jpegFileName[64];
VENC_STREAM_S stStream;
s32Ret = SampleSysInit(0);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("SampleSysInit failed!\n");
return XM_FAILURE;
}
s32Ret = ViChnConfig(ViChn, VIDEO_ENCODING_MODE_PAL,CAPTURE_SIZE_720P);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start ViChn %d failed!\n", ViChn);
return XM_FAILURE;
}
s32Ret = COMM_VENC_Start(VencChn, PT_H264,VIDEO_ENCODING_MODE_PAL,CAPTURE_SIZE_720P,SAMPLE_RC_CBR);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Venc failed!\n");
return XM_FAILURE;
}
s32Ret = COMM_VENC_Start(jpegChn, PT_JPEG,VIDEO_ENCODING_MODE_PAL,CAPTURE_SIZE_720P,0);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("Start Venc JPEG failed!\n");
return XM_FAILURE;
}
stStream.pstPack = (VENC_PACK_S*)malloc(sizeof(VENC_PACK_S));
for(count = 1; count <= num; count++)
{
sleep(1);
s32Ret = XM_MPI_VENC_StartRecvPic(jpegChn);
if (s32Ret != XM_SUCCESS)
{
SAMPLE_PRT("XM_MPI_VENC_StartRecvPic err !\n");
break;
}
s32Ret = XM_MPI_VENC_GetStream(jpegChn, &stStream, XM_TRUE);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("XM_MPI_VENC_GetStream:%#x\n",s32Ret);
continue;
}
sprintf(jpegFileName, "%d.jpeg", count);
fp = fopen(jpegFileName, "w+");
s32Ret = VencSaveStream(fp, &stStream);
fclose(fp);
s32Ret = XM_MPI_VENC_StopRecvPic(jpegChn);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("XM_VENC_StopCH jpegChn %d failed %#X\n", jpegChn, s32Ret);
break;
}
s32Ret = XM_MPI_VENC_ReleaseStream(jpegChn, &stStream);
if ( s32Ret != XM_SUCCESS )
{
SAMPLE_PRT("XM_MPI_VENC_ReleaseStream failed %#x\n", s32Ret);
}
}
s32Ret = XM_MPI_VENC_DestroyChn(jpegChn);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("XM_MPI_VENC_DestroyChn jpeg faild!\n");
}
s32Ret = XM_MPI_VENC_DestroyChn(VencChn);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("XM_MPI_VENC_DestroyChn [%d] faild!\n", VencChn);
}
s32Ret = XM_MPI_VI_DisableChn(ViChn);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("XM_MPI_VI_DisableChn [%d] faild with %#x!",ViChn, s32Ret);
}
return XM_SUCCESS;
}
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* End of #ifdef __cplusplus */