视屏编码过程分析

图像视频子系统:

第一步:初始化系统参数并且调用回调函数,分配缓存池大小

 u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\
               enSize, SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH);
   stVbConf.astCommPool[0].u32BlkSize = u32BlkSize;
   stVbConf.astCommPool[0].u32BlkCnt = g_u32BlkCnt;

第二步:初始化系统

 s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("system init failed with %d!\n", s32Ret);
           goto END_VENC_1080P_CLASSIC_0;
    }

上述函数的原型:

HI_S32 SAMPLE_COMM_SYS_Init(VB_CONF_S *pstVbConf)
{
    MPP_SYS_CONF_S stSysConf = {0};
    HI_S32 s32Ret = HI_FAILURE;


    HI_MPI_SYS_Exit();
    HI_MPI_VB_Exit();


    if (NULL == pstVbConf)
    {
        SAMPLE_PRT("input parameter is null, it is invaild!\n");
        return HI_FAILURE;
    }


    s32Ret = HI_MPI_VB_SetConf(pstVbConf);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("HI_MPI_VB_SetConf failed!\n");
        return HI_FAILURE;
    }


    s32Ret = HI_MPI_VB_Init();
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("HI_MPI_VB_Init failed!\n");
        return HI_FAILURE;
    }


    stSysConf.u32AlignWidth = SAMPLE_SYS_ALIGN_WIDTH;
    s32Ret = HI_MPI_SYS_SetConf(&stSysConf);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("HI_MPI_SYS_SetConf failed\n");
        return HI_FAILURE;
    }


    s32Ret = HI_MPI_SYS_Init();
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("HI_MPI_SYS_Init failed!\n");
        return HI_FAILURE;
    }


    return HI_SUCCESS;
}

主要是设置VB的参数和一些系统的初始化

第三步:

设置VI。

 stViConfig.enViMode   = SENSOR_TYPE;
    stViConfig.enRotate   = ROTATE_NONE;
    stViConfig.enNorm     = VIDEO_ENCODING_MODE_AUTO;
    stViConfig.enViChnSet = VI_CHN_SET_NORMAL;
    stViConfig.enWDRMode  = WDR_MODE_NONE;
    s32Ret = SAMPLE_COMM_VI_StartVi(&stViConfig);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("start vi failed!\n");
        goto END_VENC_1080P_CLASSIC_1;
    }

第四步:

创建GROUP,设置GRP参数,启动GROUP,设置VPSS通道属性,工作模式;绑定VI和VPSS,使能 VPSS通道

s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize, &stSize);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n");
        goto END_VENC_1080P_CLASSIC_1;
    }
VpssGrp = 0;
   stVpssGrpAttr.u32MaxW = stSize.u32Width;
   stVpssGrpAttr.u32MaxH = stSize.u32Height;
   stVpssGrpAttr.bIeEn = HI_FALSE;
   stVpssGrpAttr.bNrEn = HI_TRUE;
   stVpssGrpAttr.bHistEn = HI_FALSE;
   stVpssGrpAttr.bDciEn = HI_FALSE;
   stVpssGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE;
   stVpssGrpAttr.enPixFmt = PIXEL_FORMAT_YUV_SEMIPLANAR_420;

   s32Ret = SAMPLE_COMM_VPSS_StartGroup(VpssGrp, &stVpssGrpAttr);
   if (HI_SUCCESS != s32Ret)
   {
       SAMPLE_PRT("Start Vpss failed!\n");
       goto END_VENC_1080P_CLASSIC_2;
   }


   s32Ret = SAMPLE_COMM_VI_BindVpss(stViConfig.enViMode);
   if (HI_SUCCESS != s32Ret)
   {
       SAMPLE_PRT("Vi bind Vpss failed!\n");
       goto END_VENC_1080P_CLASSIC_3;
   }
 
VpssChn = 0;
   stVpssChnMode.enChnMode      = VPSS_CHN_MODE_USER;
   stVpssChnMode.bDouble        = HI_FALSE;
   stVpssChnMode.enPixelFormat  = PIXEL_FORMAT_YUV_SEMIPLANAR_420;
   stVpssChnMode.u32Width       = stSize.u32Width;
   stVpssChnMode.u32Height      = stSize.u32Height;
   stVpssChnMode.enCompressMode = COMPRESS_MODE_SEG;
   memset(&stVpssChnAttr, 0, sizeof(stVpssChnAttr));
   stVpssChnAttr.s32SrcFrameRate = -1;
   stVpssChnAttr.s32DstFrameRate = -1;

   s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL);
   if (HI_SUCCESS != s32Ret)
   {
       SAMPLE_PRT("Enable vpss chn failed!\n");
       goto END_VENC_1080P_CLASSIC_4;
   }


第五步:开始编码

VpssGrp = 0;
   VpssChn = 0;
   VencChn = 0;
   s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad,\
                                  gs_enNorm, enSize, enRcMode,u32Profile);
   if (HI_SUCCESS != s32Ret)
   {
       SAMPLE_PRT("Start Venc failed!\n");
       goto END_VENC_1080P_CLASSIC_5;
   }


   s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn);
   if (HI_SUCCESS != s32Ret)
   {
       SAMPLE_PRT("Start Venc failed!\n");
       goto END_VENC_1080P_CLASSIC_5;
   }

第六步:编码处理

s32Ret = SAMPLE_COMM_VENC_StartGetStream(s32ChnNum);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("Start Venc failed!\n");
        goto END_VENC_1080P_CLASSIC_5;
    }


    printf("please press twice ENTER to exit this sample\n");
    getchar();
    getchar();



你可能感兴趣的:(海思liteos_3518E)