localhost

localhost

0个粉丝

16

问答

0

专栏

4

资料

localhost  发布于  2016-04-08 15:29:33
采纳率 0%
16个问答
15119

Hi3516A实现OSD叠加/遮盖功能设计疑问

 
本帖最后由 localhost 于 2016-4-8 16:01 编辑

近期由于项目需要 涉及到HI3516A的OSD功能,初期疑问如下(以时间戳为添加对象为例,个人理解可能有错误希望各前辈、大神多帮忙指正,万分感谢):
1、对于osd的作用区域,要添加的图层信息是在vpss区设定后,会自动添加到相应的venc管道中么?还是vpss与venc均需要配置?
我来回答
回答25个
时间排序
认可量排序

localhost

0个粉丝

16

问答

0

专栏

4

资料

localhost 2016-04-08 15:32:33
认可0
2、对于vpss的设置中OSD相关图像属性设置 与 vi输入配置是否有影响,是相互独立配置的么?

localhost

0个粉丝

16

问答

0

专栏

4

资料

localhost 2016-04-08 15:34:57
认可0
本帖最后由 localhost 于 2016-4-8 15:36 编辑

3、关于VPSS的相关使用说明中,下图所指出的group的概念 应该如何理解?
             在用户模式下:一个vpss中最多包含128个group,每个group中又可分为物理管道及拓展管道。这样理解正确么?

枫叶尚卿

0个粉丝

6

问答

0

专栏

0

资料

枫叶尚卿 2016-04-08 15:50:59
认可0
本帖最后由 枫叶尚卿 于 2016-4-8 15:52 编辑

问题一:attach到编码通道
[code]HI_MPI_RGN_AttachToChn()[/code]

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-04-08 16:04:11
认可0
上图VPSS表示的VPSS模块

vpss有group和channel两个概念

简单来说 group是针对发送者来说的, 比如vi/vdec等, 数据发送者把数据发到 vpss的某个group中, 整个VPSS模块有N多个group, 其中分为物理和扩展

每个vpss group又有N多个channel, 这些channel是对于后续数据接受者来说的

也就是说一个数据源,比如vi, 可以把数据送到 vpss 的某个group中, 然后经过VPSS处理, 该group的不同channel, 把数据送到不同的多个数据接收者, 比如channel0 送到VO channel1 送到VENC, 可以认为是个一分多

而这些数据通道的建立可以通过"绑定"来实现

VPSS功能很多,值得研究

localhost

0个粉丝

16

问答

0

专栏

4

资料

localhost 2016-04-08 16:05:56
认可0
本帖最后由 localhost 于 2016-4-8 16:13 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=28138&ptid=10910]枫叶尚卿 发表于 2016-4-8 15:50[/url]
问题一:attach到编码通道[/quote]

我的意思是 添加到编码管道之前 的区域创建这部分 是不是只需要在配置vpss的时候 创建好,然后当venc管道处理vpss输出的视频流文件同时就会自动去将创建好的的叠加区域 添加到venc管道中呢?

比如说sample中:
如下两次分别附加到venc和vpss中
    /*************************************************
      step 1: create region and attach to venc
     *************************************************/
    VencOsdHandle    = 0;
    u32VencRgnNum = 4;
    s32Ret = SAMPLE_RGN_CreateOverlayForVenc(VencOsdHandle, u32VencRgnNum);
    if(HI_SUCCESS != s32Ret)
    {
        printf("SAMPLE_RGN_CreateOverlayForVenc failed! s32Ret: 0x%x.\n", s32Ret);
        return s32Ret;
    }

    /*************************************************
      step 2: create region and attach to vpss group
     *************************************************/
    VpssOsdHandle    = u32VencRgnNum;
    u32VpssRgnNum = 4;
    s32Ret = SAMPLE_RGN_CreateOverlayExForVpss(VpssOsdHandle, u32VpssRgnNum);
    if(HI_SUCCESS != s32Ret)
    {
        printf("SAMPLE_RGN_CreateOverlayExForVpss failed! s32Ret: 0x%x.\n", s32Ret);
        return s32Ret;
    }

这种配置是使用osd功能的必要步骤么

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-04-08 16:10:27
认可0
关于OSD叠加, 其实就是叠加在处理的图像上, 在VPSS上叠加, 那么VPSS后面绑定的数据接收者就会有了

枫叶尚卿

0个粉丝

6

问答

0

专栏

0

资料

枫叶尚卿 2016-04-08 16:13:29
认可0
[code]1.创建RGN(overlay)
   HI_MPI_RGN_Create()
2. attach到编码通道(设置OSD的位置大小透明特性)
   HI_MPI_RGN_AttachToChn()
3. 制作OSD内容
   把需要显示的内容做成第一,二步要求的格式放在一块内存里
4.HI_MPI_RGN_SetBitMap()[/code]

枫叶尚卿

0个粉丝

6

问答

0

专栏

0

资料

枫叶尚卿 2016-04-08 16:16:09
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=28141&ptid=10910]localhost 发表于 2016-4-8 16:05[/url]
我的意思是 添加到编码管道之前 的区域创建这部分 是不是只需要在配置vpss的时候 创建好,然后当venc管 ...[/quote]

不是必要步骤,分应用情况叠加到 vpss 还是 venc

localhost

0个粉丝

16

问答

0

专栏

4

资料

localhost 2016-04-08 16:17:45
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=28143&ptid=10910]zhuangweiye 发表于 2016-4-8 16:10[/url]
关于OSD叠加, 其实就是叠加在处理的图像上, 在VPSS上叠加, 那么VPSS后面绑定的数据接收者就会有了[/quote]

那这样的话 可不可以理解成 hi3516a的OSD功能可以有两种模式:一、在vpss中创建叠加层,然后同一group分出的多个视频都会具有叠加后的图像;二、在venc中创建叠加层(vpss不作处理、不创建),则仅仅在对应的venc输出的视频流是有叠加层的呢?

localhost

0个粉丝

16

问答

0

专栏

4

资料

localhost 2016-04-08 16:20:17
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=28140&ptid=10910]zhuangweiye 发表于 2016-4-8 16:04[/url]
上图VPSS表示的VPSS模块

vpss有group和channel两个概念
[/quote]

前辈 关于那个vpss模块分出的group中,应该是只有每一组对应的通道不是才会设计物理和拓展的么

localhost

0个粉丝

16

问答

0

专栏

4

资料

localhost 2016-04-08 16:26:25
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=28145&ptid=10910]枫叶尚卿 发表于 2016-4-8 16:16[/url]
不是必要步骤,分应用情况叠加到 vpss 还是 venc[/quote]

哦 前辈 那关于osd的创建设置分为以下几类:
1、在vpss中创建配置,则对于group中输出的视频流均带有osd;
2、仅在venc中创建配置,则对于同一vpss的group中输出的视频流文件只有经过venc编码的才会具有osd;
3、在vpss及venc同时创建配置,则视频均有osd,同时venc中的视频会具有多层叠加。
这样理解 可以么?

枫叶尚卿

0个粉丝

6

问答

0

专栏

0

资料

枫叶尚卿 2016-04-08 16:44:16
认可0
注意支持的模块,我这个是 3531 的,并没有 VPSS



zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-04-08 17:12:31
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=28146&ptid=10910]localhost 发表于 2016-4-8 16:17[/url]
那这样的话 可不可以理解成 hi3516a的OSD功能可以有两种模式:一、在vpss中创建叠加层,然后同一group分 ...[/quote]

3516A要看用什么

如果是OVERLAY, 那么只能在VENC
如果是OVERLAYEX, 可以在VPSS, 但是从流程来看, 这个是加在channel上的


另外上面说的物理和扩展是channel

localhost

0个粉丝

16

问答

0

专栏

4

资料

localhost 2016-04-08 18:05:43
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=28153&ptid=10910]枫叶尚卿 发表于 2016-4-8 16:44[/url]
注意支持的模块,我这个是 3531 的,并没有 VPSS[/quote]

哦 原来这样 好的 谢谢您啦 我再仔细研究一下

localhost

0个粉丝

16

问答

0

专栏

4

资料

localhost 2016-04-09 10:50:59
认可0
本帖最后由 localhost 于 2016-4-9 16:34 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=28144&ptid=10910]枫叶尚卿 发表于 2016-4-8 16:13[/url]
[/quote]

按照前辈的 配置顺序 结合sample制作OSD内容 利用这样一个函数 CreateSurfaceByCanvas 制作了图层 但是 运行后 视频并未出现叠加图层 程序也没有报错 有什么检测方法么  或者前辈有什么方便的制作过程 麻烦介绍一下好么 谢谢了

localhost

0个粉丝

16

问答

0

专栏

4

资料

localhost 2016-04-11 14:21:22
认可0
本帖最后由 localhost 于 2016-4-11 14:29 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=28155&ptid=10910]zhuangweiye 发表于 2016-4-8 17:12[/url]
3516A要看用什么

如果是OVERLAY, 那么只能在VENC
[/quote]

前辈 一下是我按照 讲解的步骤 配置的OSD设置 同时 vpss/vi 已设置为离线模式 编译通过 比运行无报错 但是 视频中并无叠加的图层 还请前辈帮忙看下 是否有配置出错或缺失配置 谢谢啦
[code]
int StartOsd(vi_par& vi, venc_par& ve, vi_par& vi_another, venc_par& ve_another)
{
        RGN_HANDLE Handle;
        HI_S32 u32RgnNum;
        RGN_ATTR_S stRgnAttrSet;
        RGN_CANVAS_INFO_S stCanvasInfo;
        BITMAP_S stBitmap;
        HI_S32 s32Ret = HI_SUCCESS;
        SIZE_S stSize;
        s32Ret = JEEYIN_RGN_CreateOverlayExForVpss(Handle, u32RgnNum);//创建区域
        if(HI_SUCCESS != s32Ret)
        {
                printf("error\n");
                return s32Ret;
        }

        StartVi(vi);
        StartVenc(vi, ve);
        StartVenc_another(vi_another, ve_another);

    s32Ret = HI_MPI_RGN_GetAttr(Handle, &stRgnAttrSet);//加载位图到区域
    if(HI_SUCCESS != s32Ret)
    {
        printf("HI_MPI_RGN_GetAttr failed! s32Ret: 0x%x.\n", s32Ret);
        return s32Ret;
    }
    s32Ret = HI_MPI_RGN_GetCanvasInfo(Handle, &stCanvasInfo);//获取画布显示信息
    if(HI_SUCCESS != s32Ret)
    {
        printf("HI_MPI_RGN_GetCanvasInfo failed! s32Ret: 0x%x.\n", s32Ret);
        return s32Ret;
    }   

    stBitmap.pData   = (HI_VOID *)stCanvasInfo.u32VirtAddr;
    stSize.u32Width  = stCanvasInfo.stSize.u32Width;
    stSize.u32Height = stCanvasInfo.stSize.u32Height;

    s32Ret = JEEYIN_RGN_UpdateCanvas("mm.bmp", &stBitmap, HI_FALSE, 0, &stSize, stCanvasInfo.u32Stride, stRgnAttrSet.unAttr.stOverlayEx.enPixelFmt);
    if(HI_SUCCESS != s32Ret)
    {
        printf("SAMPLE_RGN_UpdateCanvas failed! s32Ret: 0x%x.\n", s32Ret);
        return s32Ret;
    }

    s32Ret = HI_MPI_RGN_UpdateCanvas(Handle);
    if(HI_SUCCESS != s32Ret)
    {
        printf("HI_MPI_RGN_UpdateCanvas failed! s32Ret: 0x%x.\n", s32Ret);
        return s32Ret;
    }
}

HI_S32 JEEYIN_RGN_UpdateCanvas(const char *filename, BITMAP_S *pstBitmap, HI_BOOL bFil, HI_U32 u16FilColor, SIZE_S *pstSize, HI_U32 u32Stride,PIXEL_FORMAT_E enPixelFmt)
{
    OSD_SURFACE_S Surface;
    OSD_BITMAPFILEHEADER bmpFileHeader;
    OSD_BITMAPINFO bmpInfo;

    if(GetBmpInfo(filename, &bmpFileHeader, &bmpInfo) < 0)
    {
                printf("GetBmpInfo err!\n");
        return HI_FAILURE;
    }

    if (PIXEL_FORMAT_RGB_1555 == enPixelFmt)
    {
        Surface.enColorFmt = OSD_COLOR_FMT_GB1555;
    }
    else if (PIXEL_FORMAT_RGB_4444 == enPixelFmt)
    {
        Surface.enColorFmt = OSD_COLOR_FMT_RGB4444;
    }
    else if (PIXEL_FORMAT_RGB_8888 == enPixelFmt)
    {
        Surface.enColorFmt = OSD_COLOR_FMT_RGB8888;
    }
    else
    {
        printf("Pixel format is not support!\n");        
        return HI_FAILURE;
    }

    if(NULL == pstBitmap->pData)
    {
        printf("malloc osd memroy err!\n");        
        return HI_FAILURE;
    }
    CreateSurfaceByCanvas(filename, &Surface, (HI_U8*)(pstBitmap->pData), pstSize->u32Width, pstSize->u32Height, u32Stride);
            pstBitmap->u32Width  = Surface.u16Width;
    pstBitmap->u32Height = Surface.u16Height;
   
    if (PIXEL_FORMAT_RGB_1555 == enPixelFmt)
    {
        pstBitmap->enPixelFormat = PIXEL_FORMAT_RGB_1555;
    }
    else if (PIXEL_FORMAT_RGB_4444 == enPixelFmt)
    {
        pstBitmap->enPixelFormat = PIXEL_FORMAT_RGB_4444;
    }
    else if (PIXEL_FORMAT_RGB_8888 == enPixelFmt)
    {
        pstBitmap->enPixelFormat = PIXEL_FORMAT_RGB_8888;
    }

    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;

}

HI_S32 JEEYIN_RGN_CreateOverlayExForVpss(RGN_HANDLE Handle, HI_S32 u32Num)
{
        HI_S32 i;
        HI_S32 s32Ret;
        MPP_CHN_S stChn;
        HI_U32 u32layer = 0;
        RGN_ATTR_S stRgnAttrSet;
        RGN_CHN_ATTR_S stChnAttr;
           /*attach the OSD to the vpss*/
    stChn.enModId  = HI_ID_VPSS;
    stChn.s32DevId = 0;
    stChn.s32ChnId = 0;//VPSS_CHN2;//0 jeeyin-osd

    for (i=Handle; i<(Handle + u32Num); i++)   
    {
        stRgnAttrSet.enType = OVERLAYEX_RGN;
        stRgnAttrSet.unAttr.stOverlayEx.enPixelFmt       = PIXEL_FORMAT_RGB_1555;
        stRgnAttrSet.unAttr.stOverlayEx.stSize.u32Width  = 300;
        stRgnAttrSet.unAttr.stOverlayEx.stSize.u32Height = 300;
        stRgnAttrSet.unAttr.stOverlayEx.u32BgColor       = 0x000003e0;
        
        if (1 == i%u32Num)
        {
            stRgnAttrSet.unAttr.stOverlayEx.stSize.u32Width  = 180;
            stRgnAttrSet.unAttr.stOverlayEx.stSize.u32Height = 120;
            stRgnAttrSet.unAttr.stOverlayEx.u32BgColor       = 0x0000001f;
        }
        else if (2 == i%u32Num)
        {
            stRgnAttrSet.unAttr.stOverlayEx.stSize.u32Width  = 160;
            stRgnAttrSet.unAttr.stOverlayEx.stSize.u32Height = 120;

            stRgnAttrSet.unAttr.stOverlayEx.u32BgColor       = 0x00007c00;     
        }
        else if (3 == i%u32Num)
        {
            stRgnAttrSet.unAttr.stOverlayEx.stSize.u32Width  = 100;
            stRgnAttrSet.unAttr.stOverlayEx.stSize.u32Height = 150;
            stRgnAttrSet.unAttr.stOverlayEx.u32BgColor       = 0x000007ff;   
        }
       
        s32Ret = HI_MPI_RGN_Create(i, &stRgnAttrSet);
        if(s32Ret != HI_SUCCESS)
        {
                printf("error\n");
                return s32Ret;       
        }
       
        stChnAttr.bShow  = HI_TRUE;
        stChnAttr.enType = OVERLAYEX_RGN;
        stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32X = 48;
        stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32Y = 48;
        stChnAttr.unChnAttr.stOverlayExChn.u32BgAlpha   = 128;//alpha为0的像素点透明度,也称背景透明度
        stChnAttr.unChnAttr.stOverlayExChn.u32FgAlpha   = 128;//alpha为1的像素点透明度,也称前景透明度
        stChnAttr.unChnAttr.stOverlayExChn.u32Layer     = u32layer;
        u32layer++;

        if (1 == i%4)
        {
            stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32X = 130;
            stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32Y = 330;
        }
        else if (2 == i%4)
        {
            stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32X = 270;
            stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32Y = 300;
        }
        else if (3 == i%4)
        {
            stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32X = 180;
            stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32Y = 400;
        }               
         s32Ret = HI_MPI_RGN_AttachToChn(i, &stChn, &stChnAttr);
        if(s32Ret != HI_SUCCESS)
        {
            printf("HI_MPI_RGN_AttachToChn failed! s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }       
        }
        return HI_SUCCESS;

}
[/code]

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-04-11 15:06:57
认可0
05.        HI_S32 u32RgnNum;

11.        s32Ret = JEEYIN_RGN_CreateOverlayExForVpss(Handle, u32RgnNum);//创建区域

u32RgnNum 都没有初始化, 没报错也是运气不错, 是不是stack里面的缺省值是0了

给个 /proc/umap/rgn 的信息

localhost

0个粉丝

16

问答

0

专栏

4

资料

localhost 2016-04-20 11:30:17
认可0
本帖最后由 localhost 于 2016-4-20 11:31 编辑

OSD功能已基本实现 有需要的的朋友 请移步一下新的总结帖
[url]http://www.ebaina.com/bbs/forum.php?mod=viewthread&tid=11061&page=1&extra=#pid28797[/url]{:2_40:}

localhost

0个粉丝

16

问答

0

专栏

4

资料

localhost 2016-04-20 11:33:45
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=28249&ptid=10910]zhuangweiye 发表于 2016-4-11 15:06[/url]
05.        HI_S32 u32RgnNum;

11.        s32Ret = JEEYIN_RGN_CreateOverlayExForVpss(Handle, u32Rgn ...[/quote]

实在是抱歉 前辈 没收到提示 才看到实在不好意思:P
以下是调试信息:
[RGN] Version: [Hi3516A_MPP_V1.0.3.0 B040 Debug], Build Time[Mar 13 2015, 19:09:49]

-----REGION STATUS OF OVERLAY--------------------------------------------------
Hdl Type Used PiFmt    W    H  BgColor      Phy     Virt   Stride
   0    0    1     8   16   16     ffff a4861400 d0b5e400       64

-----REGION CALL TDE STATUS OF OVERLAY--------------------------------------------------
Hdl     CallCnt      JobSuc     JobFail     TaskSuc    TaskFail      EndSuc     EndFail
   0           1           1           0           1           0           1           0

-----REGION CHN STATUS OF OVERLAY----------------------------------------------
HdlType Mod Dev Chn bSh   X   Y AphF AphBLayer bAQp QP bInv InvW InvH Luma ChnM
   0   0   8   0   0   1  32  32  128    0   0    0  0    0    0    0    0    0

-----REGION STATUS OF COVER----------------------------------------------------
Hdl Type Used

-----REGION CHN STATUS OF COVER------------------------------------------------
-----REGION CHN STATUS OF RECT COVER------------------------------------------------
Hdl Type  Mod  Dev  Chn bShow     X     Y     W     H Field     Color Layer

-----REGION CHN STATUS OF QUAD_RANGLE COVER------------------------------------------------
Hdl Type  Mod  Dev  Chn bShow    X0    Y0    X1    Y1    X2    Y2    X3    Y3 Solid Thick Shape Field     Color Layer

-----REGION STATUS OF COVEREX--------------------------------------------------
Hdl Type Used

-----REGION CHN STATUS OF COVEREX----------------------------------------------
-----REGION CHN STATUS OF RECT COVEREX------------------------------------------------
Hdl Type  Mod  Dev  Chn bShow     X     Y     W     H Field     Color Layer

-----REGION CHN STATUS OF QUAD_RANGLE COVEREX------------------------------------------------
Hdl Type  Mod  Dev  Chn bShow    X0    Y0    X1    Y1    X2    Y2    X3    Y3 Solid Thick Shape Field     Color Layer

-----REGION STATUS OF OVERLAYEX------------------------------------------------
Hdl Type Used PiFmt   W   H BgColor      Phy     Virt   Stride

-----REGION CALL TDE STATUS OF OVERLAYEX------------------------------------------------
Hdl     CallCnt      JobSuc     JobFail     TaskSuc    TaskFail      EndSuc     EndFail

-----REGION CHN STATUS OF OVERLAYEX--------------------------------------------
HdlType Mod Dev Chn Field bSh     X     Y AphF AphBLayer

angelzyb

0个粉丝

0

问答

0

专栏

0

资料

angelzyb 2016-07-18 15:56:43
认可0
写得很不错,感谢分享。
加载中···
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区