1、首先海思官方给予的代码中找到编码通道组是不变的,变化的是DevId可以参考的代码是:
{
/******************************************************************************
* function : venc bind vpss
******************************************************************************/
HI_S32 SAMPLE_COMM_VENC_BindVpss(VENC_GRP GrpChn,VPSS_GRP VpssGrp,VPSS_CHN VpssChn)
{
HI_S32 s32Ret = HI_SUCCESS;
MPP_CHN_S stSrcChn;
MPP_CHN_S stDestChn;
stSrcChn.enModId = HI_ID_VPSS;
stSrcChn.s32DevId = VpssGrp;
stSrcChn.s32ChnId = VpssChn;
stDestChn.enModId = HI_ID_GROUP;
stDestChn.s32DevId = GrpChn;
stDestChn.s32ChnId = 0;
s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDestChn);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
return s32Ret;
}
}
这样我们在看一下region中的编码通道以及编码通道组,同样我们只需要将OSD区域绑定到对应的编码通道即可,但是我们不是很清楚变化的编码通道组还是编码通道,这样由上面的代码可以看出变化的是编码通道而不是编码通道组,也就是编码通道组恒定,我们一般用不到扩展编码通道组,这样我们修改对应的编码通道就可以完成多编码通道同时绑定OSD区域了(见红色代码),怎么完成反色的呢?以及反色需要主要的是什么呢?主要是区域的对齐方式(见蓝色代码),参考代码如下:
{
for(Joseph_bind_DevId = 0; Joseph_bind_DevId < grpcnt; Joseph_bind_DevId++)
{
VencGrp = 0;
stChn.enModId = HI_ID_GROUP;
stChn.s32DevId = Joseph_bind_DevId;
stChn.s32ChnId = VencGrp;
RgnHandle = 0;
printf("%s:[%d] stChn.s32ChnId is %d ,\n",__FUNCTION__,__LINE__,stChn.s32ChnId);
memset(&stChnAttr,0,sizeof(stChnAttr));
stChnAttr.bShow = HI_TRUE;
stChnAttr.enType = OVERLAY_RGN;
stChnAttr.unChnAttr.stOverlayChn.stPoint.s32X = 16;
stChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y = 16;
stChnAttr.unChnAttr.stOverlayChn.u32BgAlpha = 128;
stChnAttr.unChnAttr.stOverlayChn.u32FgAlpha = 0;
stChnAttr.unChnAttr.stOverlayChn.u32Layer = Joseph_u32Layer--;
stChnAttr.unChnAttr.stOverlayChn.stQpInfo.bAbsQp = HI_FALSE;
stChnAttr.unChnAttr.stOverlayChn.stQpInfo.s32Qp = 0;
stChnAttr.unChnAttr.stOverlayChn.stInvertColor.stInvColArea.u32Height = 32;
stChnAttr.unChnAttr.stOverlayChn.stInvertColor.stInvColArea.u32Width = 16;
stChnAttr.unChnAttr.stOverlayChn.stInvertColor.u32LumThresh = 64;
stChnAttr.unChnAttr.stOverlayChn.stInvertColor.bInvColEn = HI_TRUE;
stChnAttr.unChnAttr.stOverlayChn.stInvertColor.enChgMod = LESSTHAN_LUM_THRESH;
s32Ret = HI_MPI_RGN_AttachToChn(RgnHandle, &stChn, &stChnAttr);
if(HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("HI_MPI_RGN_AttachToChn (%d) failed with %#x!\n",\
RgnHandle, s32Ret);
return HI_FAILURE;
}
printf("display region to s32DevId %d chn success!\n",stChn.s32DevId);
}
}
注意:
1、使用完的区域,需要先撤出通道,然后再销毁区域!
2、同一区域可以多次依附在不同的编码通道!