HI_S32 SAMPLE_COMM_VENC_Creat(VENC_CHN VencChn, PAYLOAD_TYPE_E enType, PIC_SIZE_E enSize, SAMPLE_RC_E enRcMode, HI_U32 u32Profile, HI_BOOL bRcnRefShareBuf,VENC_GOP_ATTR_S *pstGopAttr)
{
HI_S32 s32Ret;
SIZE_S stPicSize;
VENC_CHN_ATTR_S stVencChnAttr;
VENC_ATTR_JPEG_S stJpegAttr;
SAMPLE_VI_CONFIG_S stViConfig;
HI_U32 u32FrameRate;
HI_U32 u32StatTime;
#if defined(LSGK_VERSION)
HI_U32 u32Gop = 2;//25;//30;
#else
HI_U32 u32Gop = 25;//30;
#endif
s32Ret = SAMPLE_COMM_SYS_GetPicSize( enSize, &stPicSize);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("Get picture size failed!\n");
return HI_FAILURE;
}
SAMPLE_COMM_VI_GetSensorInfo(&stViConfig);
if(SAMPLE_SNS_TYPE_BUTT == stViConfig.astViInfo[0].stSnsInfo.enSnsType)
{
SAMPLE_PRT("Not set SENSOR%d_TYPE !\n",0);
return HI_FALSE;
}
s32Ret = SAMPLE_COMM_VI_GetFrameRateBySensor(stViConfig.astViInfo[0].stSnsInfo.enSnsType, &u32FrameRate);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VI_GetFrameRateBySensor failed!\n");
return s32Ret;
}
/******************************************
step 1: Create Venc Channel
******************************************/
stVencChnAttr.stVencAttr.enType = enType;
stVencChnAttr.stVencAttr.u32MaxPicWidth = stPicSize.u32Width;
stVencChnAttr.stVencAttr.u32MaxPicHeight = stPicSize.u32Height;
stVencChnAttr.stVencAttr.u32PicWidth = stPicSize.u32Width;/*the picture width*/
stVencChnAttr.stVencAttr.u32PicHeight = stPicSize.u32Height;/*the picture height*/
u32FrameRate = getDevFramerate(0, 1);
printf("enRcMode=%d\n",enRcMode);
if (enType == PT_MJPEG || enType == PT_JPEG)
{
stVencChnAttr.stVencAttr.u32BufSize = ALIGN_UP(stPicSize.u32Width, 16) * ALIGN_UP(stPicSize.u32Height, 16);
}
else
{
stVencChnAttr.stVencAttr.u32BufSize = ALIGN_UP(stPicSize.u32Width * stPicSize.u32Height * 3 / 4, 64);/*stream buffer size*/
}
stVencChnAttr.stVencAttr.u32Profile = u32Profile;
stVencChnAttr.stVencAttr.bByFrame = HI_TRUE;/*get stream mode is slice mode or frame mode?*/
if(VENC_GOPMODE_SMARTP == pstGopAttr->enGopMode)
{
u32StatTime = pstGopAttr->stSmartP.u32BgInterval/u32Gop;
}
else
{
u32StatTime = 1;
}
switch (enType)
{
case PT_H265:
{
if (SAMPLE_RC_CBR == enRcMode)
{
VENC_H265_CBR_S stH265Cbr;
stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H265CBR;
stH265Cbr.u32Gop = u32Gop;
stH265Cbr.u32StatTime = u32StatTime; /* stream rate statics time(s) */
stH265Cbr.u32SrcFrameRate = u32FrameRate; /* input (vi) frame rate */
stH265Cbr.fr32DstFrameRate = u32FrameRate; /* target frame rate */
switch (enSize)
{
case PIC_VGA:
stH265Cbr.u32BitRate = 1024 + 512*u32FrameRate/30;
break;
case PIC_720P:
stH265Cbr.u32BitRate = 1024 * 2 + 1024*u32FrameRate/30;
break;
case PIC_1080P:
stH265Cbr.u32BitRate = 1024 * 2 + 2048*u32FrameRate/30;
break;
case PIC_2592x1944:
stH265Cbr.u32BitRate = 1024 * 3 + 3072*u32FrameRate/30;
break;
case PIC_3840x2160:
stH265Cbr.u32BitRate = 1024 * 5 + 5120*u32FrameRate/30;
break;
default : //other small resolution
stH265Cbr.u32BitRate = 256;
break;
}
memcpy(&stVencChnAttr.stRcAttr.stH265Cbr, &stH265Cbr, sizeof(VENC_H265_CBR_S));
}
else if (SAMPLE_RC_FIXQP == enRcMode)
{
VENC_H265_FIXQP_S stH265FixQp;
stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H265FIXQP;
stH265FixQp.u32Gop = 30;
stH265FixQp.u32SrcFrameRate = u32FrameRate;
stH265FixQp.fr32DstFrameRate = u32FrameRate;
stH265FixQp.u32IQp = 25;
stH265FixQp.u32PQp = 30;
stH265FixQp.u32BQp = 32;
memcpy(&stVencChnAttr.stRcAttr.stH265FixQp, &stH265FixQp, sizeof(VENC_H265_FIXQP_S));
}
else if (SAMPLE_RC_VBR == enRcMode)
{
VENC_H265_VBR_S stH265Vbr;
stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H265VBR;
stH265Vbr.u32Gop = u32Gop;
stH265Vbr.u32StatTime = u32StatTime;
stH265Vbr.u32SrcFrameRate = u32FrameRate;
stH265Vbr.fr32DstFrameRate = u32FrameRate;
switch (enSize)
{
case PIC_VGA:
stH265Vbr.u32MaxBitRate = 1024 + 512*u32FrameRate/30;
break;
case PIC_720P:
stH265Vbr.u32MaxBitRate = 1024 * 2 + 1024*u32FrameRate/30;
break;
case PIC_1080P:
stH265Vbr.u32MaxBitRate = 1024 * 2 + 2048*u32FrameRate/30;
break;
case PIC_2592x1944:
stH265Vbr.u32MaxBitRate = 1024 * 3 + 3072*u32FrameRate/30;
break;
default :
stH265Vbr.u32MaxBitRate = 1024 * 15 + 2048*u32FrameRate/30;
break;
}
memcpy(&stVencChnAttr.stRcAttr.stH265Vbr, &stH265Vbr, sizeof(VENC_H265_VBR_S));
}
else if(SAMPLE_RC_AVBR == enRcMode)
{
VENC_H265_AVBR_S stH265AVbr;
stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H265AVBR;
stH265AVbr.u32Gop = u32Gop;
stH265AVbr.u32StatTime = u32StatTime;
stH265AVbr.u32SrcFrameRate = u32FrameRate;
stH265AVbr.fr32DstFrameRate = u32FrameRate;
switch (enSize)
{
case PIC_VGA:
stH265AVbr.u32MaxBitRate = 1024 + 512*u32FrameRate/30;
break;
case PIC_720P:
stH265AVbr.u32MaxBitRate = 1024 * 2 + 1024*u32FrameRate/30;
break;
case PIC_1080P:
stH265AVbr.u32MaxBitRate = 1024 * 2 + 2048*u32FrameRate/30;
break;
case PIC_2592x1944:
stH265AVbr.u32MaxBitRate = 1024 * 3 + 3072*u32FrameRate/30;
break;
case PIC_3840x2160:
stH265AVbr.u32MaxBitRate = 1024 * 5 + 5120*u32FrameRate/30;
break;
default :
stH265AVbr.u32MaxBitRate = 1024 * 15 + 2048*u32FrameRate/30;
break;
}
memcpy(&stVencChnAttr.stRcAttr.stH265AVbr, &stH265AVbr, sizeof(VENC_H265_AVBR_S));
}
else if(SAMPLE_RC_QVBR == enRcMode)
{
VENC_H265_QVBR_S stH265QVbr;
stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H265QVBR;
stH265QVbr.u32Gop = u32Gop;
stH265QVbr.u32StatTime = u32StatTime;
stH265QVbr.u32SrcFrameRate = u32FrameRate;
stH265QVbr.fr32DstFrameRate = u32FrameRate;
switch (enSize)
{
case PIC_VGA:
stH265QVbr.u32TargetBitRate = 1024 + 512*u32FrameRate/30;
break;
case PIC_720P:
stH265QVbr.u32TargetBitRate= 1024 * 2 + 1024*u32FrameRate/30;
break;
case PIC_1080P:
stH265QVbr.u32TargetBitRate = 1024 * 2 + 2048*u32FrameRate/30;
break;
case PIC_2592x1944:
stH265QVbr.u32TargetBitRate = 1024 * 3 + 3072*u32FrameRate/30;
break;
case PIC_3840x2160:
stH265QVbr.u32TargetBitRate = 1024 * 5 + 5120*u32FrameRate/30;
break;
case PIC_4000x3000:
stH265QVbr.u32TargetBitRate = 1024 * 10 + 5120*u32FrameRate/30;
break;
case PIC_7680x4320:
stH265QVbr.u32TargetBitRate = 1024 * 20 + 5120*u32FrameRate/30;
break;
default :
stH265QVbr.u32TargetBitRate = 1024 * 15 + 2048*u32FrameRate/30;
break;
}
memcpy(&stVencChnAttr.stRcAttr.stH265QVbr, &stH265QVbr, sizeof(VENC_H265_QVBR_S));
}
else if(SAMPLE_RC_CVBR == enRcMode)
{
VENC_H265_CVBR_S stH265CVbr;
stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H265CVBR;
stH265CVbr.u32Gop = u32Gop;
stH265CVbr.u32StatTime = u32StatTime;
stH265CVbr.u32SrcFrameRate = u32FrameRate;
stH265CVbr.fr32DstFrameRate = u32FrameRate;
stH265CVbr.u32LongTermStatTime = 1;
stH265CVbr.u32ShortTermStatTime = u32StatTime;
switch (enSize)
{
case PIC_VGA:
stH265CVbr.u32MaxBitRate = 1024 + 512*u32FrameRate/30;
stH265CVbr.u32LongTermMaxBitrate = 1024 + 512*u32FrameRate/30;
stH265CVbr.u32LongTermMinBitrate = 256;
break;
case PIC_720P:
stH265CVbr.u32MaxBitRate = 1024 * 3 + 1024*u32FrameRate/30;
stH265CVbr.u32LongTermMaxBitrate = 1024 * 2 + 1024*u32FrameRate/30;
stH265CVbr.u32LongTermMinBitrate = 512;
break;
case PIC_1080P:
stH265CVbr.u32MaxBitRate = 1024 * 2 + 2048*u32FrameRate/30;
stH265CVbr.u32LongTermMaxBitrate = 1024 * 2 + 2048*u32FrameRate/30;
stH265CVbr.u32LongTermMinBitrate = 1024;
break;
case PIC_2592x1944:
stH265CVbr.u32MaxBitRate = 1024 * 4 + 3072*u32FrameRate/30;
stH265CVbr.u32LongTermMaxBitrate = 1024 * 3 + 3072*u32FrameRate/30;
stH265CVbr.u32LongTermMinBitrate = 1024*2;
break;
case PIC_3840x2160:
stH265CVbr.u32MaxBitRate = 1024 * 8 + 5120*u32FrameRate/30;
stH265CVbr.u32LongTermMaxBitrate = 1024 * 5 + 5120*u32FrameRate/30;
stH265CVbr.u32LongTermMinBitrate = 1024*3;
break;
case PIC_4000x3000:
stH265CVbr.u32MaxBitRate = 1024 * 12 + 5120*u32FrameRate/30;
stH265CVbr.u32LongTermMaxBitrate = 1024 * 10 + 5120*u32FrameRate/30;
stH265CVbr.u32LongTermMinBitrate = 1024*4;
break;
case PIC_7680x4320:
stH265CVbr.u32MaxBitRate = 1024 * 24 + 5120*u32FrameRate/30;
stH265CVbr.u32LongTermMaxBitrate = 1024 * 20 + 5120*u32FrameRate/30;
stH265CVbr.u32LongTermMinBitrate = 1024*6;
break;
default :
stH265CVbr.u32MaxBitRate = 1024 * 24 + 5120*u32FrameRate/30;
stH265CVbr.u32LongTermMaxBitrate = 1024 * 15 + 2048*u32FrameRate/30;
stH265CVbr.u32LongTermMinBitrate = 1024*5;
break;
}
memcpy(&stVencChnAttr.stRcAttr.stH265CVbr, &stH265CVbr, sizeof(VENC_H265_CVBR_S));
}
else if(SAMPLE_RC_QPMAP == enRcMode)
{
VENC_H265_QPMAP_S stH265QpMap;
stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H265QPMAP;
stH265QpMap.u32Gop = u32Gop;
stH265QpMap.u32StatTime = u32StatTime;
stH265QpMap.u32SrcFrameRate = u32FrameRate;
stH265QpMap.fr32DstFrameRate = u32FrameRate;
stH265QpMap.enQpMapMode = VENC_RC_QPMAP_MODE_MEANQP;
memcpy(&stVencChnAttr.stRcAttr.stH265QpMap, &stH265QpMap, sizeof(VENC_H265_QPMAP_S));
}
else
{
SAMPLE_PRT("%s,%d,enRcMode(%d) not support\n",__FUNCTION__,__LINE__,enRcMode);
return HI_FAILURE;
}
stVencChnAttr.stVencAttr.stAttrH265e.bRcnRefShareBuf = bRcnRefShareBuf;
}
break;
case PT_H264:
{
if (SAMPLE_RC_CBR == enRcMode)
{
VENC_H264_CBR_S stH264Cbr;
printf("1111111111111111111111111111\n");
printf("2222222222 u32FrameRate = %u\n", u32FrameRate);
stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR;
stH264Cbr.u32Gop = u32Gop; /*the interval of IFrame*/
stH264Cbr.u32StatTime = u32StatTime; /* stream rate statics time(s) */
stH264Cbr.u32SrcFrameRate = u32FrameRate; /* input (vi) frame rate */
stH264Cbr.fr32DstFrameRate = u32FrameRate; /* target frame rate */
switch (enSize)
{
case PIC_VGA:
stH264Cbr.u32BitRate = 1024 + 512*u32FrameRate/30;
break;
case PIC_720P:
stH264Cbr.u32BitRate = 1024 * 2 + 1024*u32FrameRate/30;
break;
case PIC_1080P:
stH264Cbr.u32BitRate = 1024 * 2 + 2048*u32FrameRate/30;
break;
case PIC_2592x1944:
stH264Cbr.u32BitRate = 1024 * 3 + 3072*u32FrameRate/30;
break;
case PIC_3840x2160:
stH264Cbr.u32BitRate = 1024 * 5 + 5120*u32FrameRate/30;
break;
default : //other small resolution
stH264Cbr.u32BitRate = 512;
break;
}
memcpy(&stVencChnAttr.stRcAttr.stH264Cbr, &stH264Cbr, sizeof(VENC_H264_CBR_S));
}
else if (SAMPLE_RC_FIXQP == enRcMode)
{
VENC_H264_FIXQP_S stH264FixQp;
stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264FIXQP;
stH264FixQp.u32Gop = 30;
stH264FixQp.u32SrcFrameRate = u32FrameRate;
stH264FixQp.fr32DstFrameRate = u32FrameRate;
stH264FixQp.u32IQp = 25;
stH264FixQp.u32PQp = 30;
stH264FixQp.u32BQp = 32;
memcpy(&stVencChnAttr.stRcAttr.stH264FixQp, &stH264FixQp, sizeof(VENC_H264_FIXQP_S));
}
else if (SAMPLE_RC_VBR == enRcMode)
{
VENC_H264_VBR_S stH264Vbr;
printf("2222222222222222222222222222222222\n");
printf("2222222222 u32FrameRate = %u\n", u32FrameRate);
stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264VBR;
stH264Vbr.u32Gop = u32Gop;
stH264Vbr.u32StatTime = u32StatTime;
stH264Vbr.u32SrcFrameRate = u32FrameRate;
#ifdef LSGK_1
#ifdef LSGK_VERSION
stH264Vbr.fr32DstFrameRate = 20;
#else
stH264Vbr.fr32DstFrameRate = u32FrameRate;
#endif
#else
stH264Vbr.fr32DstFrameRate = u32FrameRate;
#endif
switch (enSize)
{
case PIC_VGA:
stH264Vbr.u32MaxBitRate = 1024 + 512*u32FrameRate/30;
break;
case PIC_720P:
stH264Vbr.u32MaxBitRate = 1024 * 2 + 1024*u32FrameRate/30;
break;
case PIC_1080P:
stH264Vbr.u32MaxBitRate = 1024 * 2 + 2048*u32FrameRate/30;
break;
case PIC_2592x1944:
stH264Vbr.u32MaxBitRate = 1024 * 3 + 3072*u32FrameRate/30;
break;
case PIC_3840x2160:
stH264Vbr.u32MaxBitRate = 1024 * 5 + 5120*u32FrameRate/30;
break;
default :
#ifdef YLOK_1
stH264Vbr.u32MaxBitRate = 512;
#else
stH264Vbr.u32MaxBitRate = 1024 * 15 + 2048*u32FrameRate/30;
#endif
break;
}
memcpy(&stVencChnAttr.stRcAttr.stH264Vbr, &stH264Vbr, sizeof(VENC_H264_VBR_S));
}
else if (SAMPLE_RC_AVBR == enRcMode)
{
VENC_H264_VBR_S stH264AVbr;
stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264AVBR;
stH264AVbr.u32Gop = u32Gop;
stH264AVbr.u32StatTime = u32StatTime;
stH264AVbr.u32SrcFrameRate = u32FrameRate;
stH264AVbr.fr32DstFrameRate = u32FrameRate;
switch (enSize)
{
case PIC_VGA:
stH264AVbr.u32MaxBitRate = 1024 + 512*u32FrameRate/30;
break;
case PIC_720P:
stH264AVbr.u32MaxBitRate = 1024 * 2 + 1024*u32FrameRate/30;
break;
case PIC_1080P:
stH264AVbr.u32MaxBitRate = 1024 * 2 + 2048*u32FrameRate/30;
break;
case PIC_2592x1944:
stH264AVbr.u32MaxBitRate = 1024 * 3 + 3072*u32FrameRate/30;
break;
case PIC_3840x2160:
stH264AVbr.u32MaxBitRate = 1024 * 5 + 5120*u32FrameRate/30;
break;
case PIC_4000x3000:
stH264AVbr.u32MaxBitRate = 1024 * 10 + 5120*u32FrameRate/30;
break;
case PIC_7680x4320:
stH264AVbr.u32MaxBitRate = 1024 * 20 + 5120*u32FrameRate/30;
break;
default :
stH264AVbr.u32MaxBitRate = 1024 * 15 + 2048*u32FrameRate/30;
break;
}
memcpy(&stVencChnAttr.stRcAttr.stH264AVbr, &stH264AVbr, sizeof(VENC_H264_AVBR_S));
}
else if (SAMPLE_RC_QVBR == enRcMode)
{
VENC_H264_QVBR_S stH264QVbr;
stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264QVBR;
stH264QVbr.u32Gop = u32Gop;
stH264QVbr.u32StatTime = u32StatTime;
stH264QVbr.u32SrcFrameRate = u32FrameRate;
stH264QVbr.fr32DstFrameRate = u32FrameRate;
switch (enSize)
{
case PIC_VGA:
stH264QVbr.u32TargetBitRate = 1024 + 512*u32FrameRate/30;
break;
case PIC_360P:
stH264QVbr.u32TargetBitRate = 1024 * 2 + 1024*u32FrameRate/30;
break;
case PIC_720P:
stH264QVbr.u32TargetBitRate = 1024 * 2 + 1024*u32FrameRate/30;
break;
case PIC_1080P:
stH264QVbr.u32TargetBitRate = 1024 * 2 + 2048*u32FrameRate/30;
break;
case PIC_2592x1944:
stH264QVbr.u32TargetBitRate = 1024 * 3 + 3072*u32FrameRate/30;
break;
case PIC_3840x2160:
stH264QVbr.u32TargetBitRate = 1024 * 5 + 5120*u32FrameRate/30;
break;
case PIC_4000x3000:
stH264QVbr.u32TargetBitRate = 1024 * 10 + 5120*u32FrameRate/30;
break;
case PIC_7680x4320:
stH264QVbr.u32TargetBitRate = 1024 * 20 + 5120*u32FrameRate/30;
break;
default :
stH264QVbr.u32TargetBitRate = 1024 * 15 + 2048*u32FrameRate/30;
break;
}
memcpy(&stVencChnAttr.stRcAttr.stH264QVbr, &stH264QVbr, sizeof(VENC_H264_QVBR_S));
}
else if(SAMPLE_RC_CVBR == enRcMode)
{
VENC_H264_CVBR_S stH264CVbr;
stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264CVBR;
stH264CVbr.u32Gop = u32Gop;
stH264CVbr.u32StatTime = u32StatTime;
stH264CVbr.u32SrcFrameRate = u32FrameRate;
stH264CVbr.fr32DstFrameRate = u32FrameRate;
stH264CVbr.u32LongTermStatTime = 1;
stH264CVbr.u32ShortTermStatTime = u32StatTime;
switch (enSize)
{
case PIC_VGA:
stH264CVbr.u32MaxBitRate = 1024 + 512*u32FrameRate/30;
stH264CVbr.u32LongTermMaxBitrate = 1024 + 512*u32FrameRate/30;
stH264CVbr.u32LongTermMinBitrate = 256;
break;
case PIC_720P:
stH264CVbr.u32MaxBitRate = 1024 * 3 + 1024*u32FrameRate/30;
stH264CVbr.u32LongTermMaxBitrate = 1024 * 2 + 1024*u32FrameRate/30;
stH264CVbr.u32LongTermMinBitrate = 512;
break;
case PIC_1080P:
stH264CVbr.u32MaxBitRate = 1024 * 2 + 2048*u32FrameRate/30;
stH264CVbr.u32LongTermMaxBitrate = 1024 * 2 + 2048*u32FrameRate/30;
stH264CVbr.u32LongTermMinBitrate = 1024;
break;
case PIC_2592x1944:
stH264CVbr.u32MaxBitRate = 1024 * 4 + 3072*u32FrameRate/30;
stH264CVbr.u32LongTermMaxBitrate = 1024 * 3 + 3072*u32FrameRate/30;
stH264CVbr.u32LongTermMinBitrate = 1024*2;
break;
case PIC_3840x2160:
stH264CVbr.u32MaxBitRate = 1024 * 8 + 5120*u32FrameRate/30;
stH264CVbr.u32LongTermMaxBitrate = 1024 * 5 + 5120*u32FrameRate/30;
stH264CVbr.u32LongTermMinBitrate = 1024*3;
break;
case PIC_4000x3000:
stH264CVbr.u32MaxBitRate = 1024 * 12 + 5120*u32FrameRate/30;
stH264CVbr.u32LongTermMaxBitrate = 1024 * 10 + 5120*u32FrameRate/30;
stH264CVbr.u32LongTermMinBitrate = 1024*4;
break;
case PIC_7680x4320:
stH264CVbr.u32MaxBitRate = 1024 * 24 + 5120*u32FrameRate/30;
stH264CVbr.u32LongTermMaxBitrate = 1024 * 20 + 5120*u32FrameRate/30;
stH264CVbr.u32LongTermMinBitrate = 1024*6;
break;
default :
stH264CVbr.u32MaxBitRate = 1024 * 24 + 5120*u32FrameRate/30;
stH264CVbr.u32LongTermMaxBitrate = 1024 * 15 + 2048*u32FrameRate/30;
stH264CVbr.u32LongTermMinBitrate = 1024*5;
break;
}
memcpy(&stVencChnAttr.stRcAttr.stH264CVbr, &stH264CVbr, sizeof(VENC_H264_CVBR_S));
}
else if(SAMPLE_RC_QPMAP == enRcMode)
{
VENC_H264_QPMAP_S stH264QpMap;
stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264QPMAP;
stH264QpMap.u32Gop = u32Gop;
stH264QpMap.u32StatTime = u32StatTime;
stH264QpMap.u32SrcFrameRate = u32FrameRate;
stH264QpMap.fr32DstFrameRate = u32FrameRate;
memcpy(&stVencChnAttr.stRcAttr.stH264QpMap, &stH264QpMap, sizeof(VENC_H264_QPMAP_S));
}
else
{
SAMPLE_PRT("%s,%d,enRcMode(%d) not support\n",__FUNCTION__,__LINE__,enRcMode);
return HI_FAILURE;
}
stVencChnAttr.stVencAttr.stAttrH264e.bRcnRefShareBuf = bRcnRefShareBuf;
}
break;
case PT_MJPEG:
{
if (SAMPLE_RC_FIXQP == enRcMode)
{
VENC_MJPEG_FIXQP_S stMjpegeFixQp;
stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_MJPEGFIXQP;
stMjpegeFixQp.u32Qfactor = 95;
stMjpegeFixQp.u32SrcFrameRate = u32FrameRate;
stMjpegeFixQp.fr32DstFrameRate = u32FrameRate;
memcpy(&stVencChnAttr.stRcAttr.stMjpegFixQp, &stMjpegeFixQp,sizeof(VENC_MJPEG_FIXQP_S));
}
else if (SAMPLE_RC_CBR == enRcMode)
{
VENC_MJPEG_CBR_S stMjpegeCbr;
stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_MJPEGCBR;
stMjpegeCbr.u32StatTime = u32StatTime;
stMjpegeCbr.u32SrcFrameRate = u32FrameRate;
stMjpegeCbr.fr32DstFrameRate = u32FrameRate;
switch (enSize)
{
case PIC_VGA:
stMjpegeCbr.u32BitRate = 1024 * 3 + 1024*u32FrameRate/30;
break;
case PIC_720P:
stMjpegeCbr.u32BitRate = 1024 * 5 + 1024*u32FrameRate/30;
break;
case PIC_1080P:
stMjpegeCbr.u32BitRate = 1024 * 8 + 2048*u32FrameRate/30;
break;
case PIC_2592x1944:
stMjpegeCbr.u32BitRate = 1024 * 20 + 3072*u32FrameRate/30;
break;
case PIC_3840x2160:
stMjpegeCbr.u32BitRate = 1024 * 25 + 5120*u32FrameRate/30;
break;
case PIC_4000x3000:
stMjpegeCbr.u32BitRate = 1024 * 30 + 5120*u32FrameRate/30;
break;
case PIC_7680x4320:
stMjpegeCbr.u32BitRate = 1024 * 40 + 5120*u32FrameRate/30;
break;
default :
stMjpegeCbr.u32BitRate = 1024 * 20 + 2048*u32FrameRate/30;
break;
}
memcpy(&stVencChnAttr.stRcAttr.stMjpegCbr, &stMjpegeCbr,sizeof(VENC_MJPEG_CBR_S));
}
else if (SAMPLE_RC_VBR == enRcMode)
{
VENC_MJPEG_VBR_S stMjpegVbr;
stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_MJPEGVBR;
stMjpegVbr.u32StatTime = u32StatTime;
stMjpegVbr.u32SrcFrameRate = u32FrameRate;
stMjpegVbr.fr32DstFrameRate = 5;
switch (enSize)
{
case PIC_VGA:
stMjpegVbr.u32MaxBitRate = 1024 * 3 + 1024*u32FrameRate/30;
break;
case PIC_720P:
stMjpegVbr.u32MaxBitRate = 1024 * 5 + 1024*u32FrameRate/30;
break;
case PIC_1080P:
stMjpegVbr.u32MaxBitRate = 1024 * 8 + 2048*u32FrameRate/30;
break;
case PIC_2592x1944:
stMjpegVbr.u32MaxBitRate = 1024 * 20 + 3072*u32FrameRate/30;
break;
case PIC_3840x2160:
stMjpegVbr.u32MaxBitRate = 1024 * 25 + 5120*u32FrameRate/30;
break;
case PIC_4000x3000:
stMjpegVbr.u32MaxBitRate = 1024 * 30 + 5120*u32FrameRate/30;
break;
case PIC_7680x4320:
stMjpegVbr.u32MaxBitRate = 1024 * 40 + 5120*u32FrameRate/30;
break;
default :
stMjpegVbr.u32MaxBitRate = 1024 * 20 + 2048*u32FrameRate/30;
break;
}
memcpy(&stVencChnAttr.stRcAttr.stMjpegVbr, &stMjpegVbr,sizeof(VENC_MJPEG_VBR_S));
}
else
{
SAMPLE_PRT("cann't support other mode(%d) in this version!\n",enRcMode);
return HI_FAILURE;
}
}
break;
case PT_JPEG:
stJpegAttr.bSupportDCF = HI_FALSE;
stJpegAttr.stMPFCfg.u8LargeThumbNailNum = 0;
stJpegAttr.enReceiveMode = VENC_PIC_RECEIVE_SINGLE;
memcpy(&stVencChnAttr.stVencAttr.stAttrJpege, &stJpegAttr, sizeof(VENC_ATTR_JPEG_S));
break;
default:
SAMPLE_PRT("cann't support this enType (%d) in this version!\n",enType);
return HI_ERR_VENC_NOT_SUPPORT;
}
if(PT_MJPEG == enType || PT_JPEG == enType )
{
stVencChnAttr.stGopAttr.enGopMode = VENC_GOPMODE_NORMALP;
stVencChnAttr.stGopAttr.stNormalP.s32IPQpDelta = 0;
}
else
{
memcpy(&stVencChnAttr.stGopAttr,pstGopAttr,sizeof(VENC_GOP_ATTR_S));
if((VENC_GOPMODE_BIPREDB == pstGopAttr->enGopMode)&&(PT_H264 == enType))
{
if(0 == stVencChnAttr.stVencAttr.u32Profile)
{
stVencChnAttr.stVencAttr.u32Profile = 1;
SAMPLE_PRT("H.264 base profile not support BIPREDB, so change profile to main profile!\n");
}
}
if((VENC_RC_MODE_H264QPMAP == stVencChnAttr.stRcAttr.enRcMode)||(VENC_RC_MODE_H265QPMAP == stVencChnAttr.stRcAttr.enRcMode))
{
if(VENC_GOPMODE_ADVSMARTP == pstGopAttr->enGopMode)
{
stVencChnAttr.stGopAttr.enGopMode = VENC_GOPMODE_SMARTP;
SAMPLE_PRT("advsmartp not support QPMAP, so change gopmode to smartp!\n");
}
}
}
printf("-------------------------- stVencChnAttr.stRcAttr.stH264Cbr.u32BitRate=%d\n", stVencChnAttr.stRcAttr.stH264Cbr.u32BitRate);
printf("chn_attr is stVencChnAttr.stVencAttr.u32PicWidth=%u\n\
stVencChnAttr.stVencAttr.u32PicHeight=%u\n\
stVencChnAttr.stVencAttr.enType=%u\n\
stVencChnAttr.stVencAttr.u32Profile=%u\n\
stVencChnAttr.stRcAttr.enRcMode=%u\n\
stVencChnAttr.stRcAttr.stH264Vbr.u32Gop=%u\n\
stVencChnAttr.stRcAttr.stH264Vbr.u32MaxBitRate=%u\n\
stVencChnAttr.stRcAttr.stH264Vbr.u32SrcFrameRate=%u\n\
stVencChnAttr.stRcAttr.stH264Vbr.fr32DstFrameRateFZ=%u\n\
stVencChnAttr.stRcAttr.stH264Vbr.fr32DstFrameRateFM=%u\n\
stVencChnAttr.stRcAttr.stH264Vbr.u32StatTime=%u\n\
stVencChnAttr.stGopAttr.enGopMode=%u\n",\
stVencChnAttr.stVencAttr.u32PicWidth,stVencChnAttr.stVencAttr.u32PicHeight,stVencChnAttr.stVencAttr.enType,\
stVencChnAttr.stVencAttr.u32Profile,stVencChnAttr.stRcAttr.enRcMode,stVencChnAttr.stRcAttr.stH264Vbr.u32Gop,\
stVencChnAttr.stRcAttr.stH264Vbr.u32MaxBitRate,stVencChnAttr.stRcAttr.stH264Vbr.u32SrcFrameRate,(stVencChnAttr.stRcAttr.stH264Vbr.fr32DstFrameRate & (HI_U32)65535),\
((stVencChnAttr.stRcAttr.stH264Vbr.fr32DstFrameRate >> 16) & (HI_U32)65535),stVencChnAttr.stRcAttr.stH264Vbr.u32StatTime,stVencChnAttr.stGopAttr.enGopMode);
printf("chn_attr is stVencChnAttr.stVencAttr.u32PicWidth=%u\n\
stVencChnAttr.stVencAttr.u32PicHeight=%u\n\
stVencChnAttr.stVencAttr.enType=%u\n\
stVencChnAttr.stVencAttr.u32Profile=%u\n\
stVencChnAttr.stRcAttr.enRcMode=%u\n\
stVencChnAttr.stRcAttr.stH264Cbr.u32Gop=%u\n\
stVencChnAttr.stRcAttr.stH264Cbr.u32MaxBitRate=%u\n\
stVencChnAttr.stRcAttr.stH264Cbr.u32SrcFrameRate=%u\n\
stVencChnAttr.stRcAttr.stH264Cbr.fr32DstFrameRateFZ=%u\n\
stVencChnAttr.stRcAttr.stH264Cbr.fr32DstFrameRateFM=%u\n\
stVencChnAttr.stRcAttr.stH264Cbr.u32StatTime=%u\n\
stVencChnAttr.stGopAttr.enGopMode=%u\n",\
stVencChnAttr.stVencAttr.u32PicWidth,stVencChnAttr.stVencAttr.u32PicHeight,stVencChnAttr.stVencAttr.enType,\
stVencChnAttr.stVencAttr.u32Profile,stVencChnAttr.stRcAttr.enRcMode,stVencChnAttr.stRcAttr.stH264Cbr.u32Gop,\
stVencChnAttr.stRcAttr.stH264Cbr.u32BitRate,stVencChnAttr.stRcAttr.stH264Cbr.u32SrcFrameRate,(stVencChnAttr.stRcAttr.stH264Cbr.fr32DstFrameRate & (HI_U32)65535),\
((stVencChnAttr.stRcAttr.stH264Cbr.fr32DstFrameRate >> 16) & (HI_U32)65535),stVencChnAttr.stRcAttr.stH264Cbr.u32StatTime,stVencChnAttr.stGopAttr.enGopMode);
s32Ret = HI_MPI_VENC_CreateChn(VencChn, &stVencChnAttr);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("HI_MPI_VENC_CreateChn [%d] faild with %#x! ===\n", \
VencChn, s32Ret);
return s32Ret;
}
s32Ret = SAMPLE_COMM_VENC_CloseReEncode(VencChn);
if (HI_SUCCESS != s32Ret)
{
HI_MPI_VENC_DestroyChn(VencChn);
return s32Ret;
}
return HI_SUCCESS;
}
最新发布