mirror of https://github.com/OpenIPC/firmware.git
				
				
				
			
		
			
				
	
	
		
			1088 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			1088 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			C
		
	
	
| /******************************************************************************
 | ||
|   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 */
 |