目标:是在解码视频上叠加图片。
(1)在sample_vdec.c中,找到解码的函数SAMPLE_H265_VDEC_VPSS_VO
(2)在SAMPLE_H265_VDEC_VPSS_VO中,在 step8: send stream to VDEC后面,添加在VO上显示图片的代码
/************************************************
step8: send stream to VDEC
*************************************************/
//....///
SAMPLE_COMM_VDEC_StartSendStream(u32VdecChnNum, &stVdecSend[0], &VdecThread[0]);
/************************************************
step9: add OSD to VO chan
*************************************************/
HI_S32 Chn=0;
s32Ret = SampleVoChnCreateRegion(Chn);
if (s32Ret != HI_SUCCESS)
{
printf("chn %d SampleVoChnCreateRegion err, value = 0x%x. \n", Chn, s32Ret);
return s32Ret;
}
(3)SampleVoChnCreateRegion是我自定义的函数,用于在VO上添加bmp图片显示,代码如下:
HI_S32 SampleVoChnCreateRegion(HI_S32 Chn)
{
HI_S32 s32Ret;
MPP_CHN_S stChn;
RGN_ATTR_S stRgnAttr;
RGN_CHN_ATTR_S stChnAttr;
BITMAP_S stBitmap;
/* creat region*/
stRgnAttr.enType = OVERLAYEX_RGN;
stRgnAttr.unAttr.stOverlayEx.enPixelFmt = PIXEL_FORMAT_ARGB_1555;
stRgnAttr.unAttr.stOverlayEx.stSize.u32Width = 64;//128;
stRgnAttr.unAttr.stOverlayEx.stSize.u32Height = 64;//128;
stRgnAttr.unAttr.stOverlayEx.u32BgColor = 0xfc;
stRgnAttr.unAttr.stOverlayEx.u32CanvasNum = 2;
s32Ret = HI_MPI_RGN_Create(Chn, &stRgnAttr);
if (s32Ret != HI_SUCCESS)
{
printf("region of chn %d create fail. value=0x%x.", Chn, s32Ret);
return s32Ret;
}
/*attach region to chn*/
stChn.enModId = HI_ID_VO;
stChn.s32ChnId = Chn;
stChnAttr.bShow = HI_TRUE;
stChnAttr.enType = OVERLAYEX_RGN;
stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32X = 0;//128;
stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32Y = 0;//128;
stChnAttr.unChnAttr.stOverlayExChn.u32BgAlpha = 128;
stChnAttr.unChnAttr.stOverlayExChn.u32FgAlpha = 128;
stChnAttr.unChnAttr.stOverlayExChn.u32Layer = 0;
/* load bitmap*/
s32Ret = SampleVoLoadRgnBmp("mm2.bmp", &stBitmap, HI_FALSE, 0);
if (s32Ret != HI_SUCCESS)
{
return s32Ret;
}
s32Ret = HI_MPI_RGN_SetBitMap(Chn, &stBitmap);
if (s32Ret != HI_SUCCESS)
{
printf("region set bitmap to chn %d fail. value=0x%x.", Chn, s32Ret);
free(stBitmap.pData);
return s32Ret;
}
free(stBitmap.pData);
s32Ret = HI_MPI_RGN_AttachToChn(Chn, &stChn, &stChnAttr);
if (s32Ret != HI_SUCCESS)
{
printf("region attach to chn %d fail. value=0x%x.", Chn, s32Ret);
return s32Ret;
}
return HI_SUCCESS;
}
其中u32Width表示图片的宽度,u32Height表示图片的高度,s32X和s32Y表示图片的位置
enModId表示显示的位置,指定为HI_ID_VO,s32ChnId表示显示的通道,为0.
(4)读入Bmp图片的代码如下:
HI_S32 SampleVoLoadRgnBmp(const char *filename, BITMAP_S *pstBitmap, HI_BOOL bFil, HI_U32 u16FilColor)
{
OSD_SURFACE_S Surface;
OSD_BITMAPFILEHEADER bmpFileHeader;
OSD_BITMAPINFO bmpInfo;
if(GetBmpInfo(filename,&bmpFileHeader,&bmpInfo) < 0)
{
printf("GetBmpInfo err!\n");
return HI_FAILURE;
}
Surface.enColorFmt = OSD_COLOR_FMT_RGB1555;
pstBitmap->pData = malloc(2*(bmpInfo.bmiHeader.biWidth)*(bmpInfo.bmiHeader.biHeight));
if(NULL == pstBitmap->pData)
{
printf("malloc osd memroy err!\n");
return HI_FAILURE;
}
CreateSurfaceByBitMap(filename,&Surface,(HI_U8*)(pstBitmap->pData));
pstBitmap->u32Width = Surface.u16Width;
pstBitmap->u32Height = Surface.u16Height;
pstBitmap->enPixelFormat = PIXEL_FORMAT_ARGB_1555;
int i,j;
HI_U16 *pu16Temp;
pu16Temp = (HI_U16*)pstBitmap->pData;
if (bFil)
{
for (i=0; iu32Height; i++)
{
for (j=0; ju32Width; j++)
{
if (u16FilColor == *pu16Temp)
{
*pu16Temp &= 0x7FFF;
}
pu16Temp++;
}
}
}
return HI_SUCCESS;
}
(5)添加相关的头文件
#include "loadbmp.h"
(6)编译后,拷贝到板卡就可以测试了。
注意需要把mm2.bmp作为素材也考到执行目录下。