海思Hi3559a解码视频加OSD图片的例子

目标:是在解码视频上叠加图片。

(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; i<pstBitmap->u32Height; i++)
        {
            for (j=0; j<pstBitmap->u32Width; j++)
            {
                if (u16FilColor == *pu16Temp)
                {
                    *pu16Temp &= 0x7FFF;
                }
                pu16Temp++;
            }
        }

    }

    return HI_SUCCESS;
}

(5)添加相关的头文件

#include "loadbmp.h"

(6)编译后,拷贝到板卡就可以测试了。

注意需要把mm2.bmp作为素材也考到执行目录下。

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值