localhost

localhost

0个粉丝

16

问答

0

专栏

4

资料

localhost  发布于  2016-04-20 11:15:17
采纳率 0%
16个问答
14629

关于Hi3516A的OSD功能实现总结与答疑

 

[i=s] 本帖最后由 localhost 于 2016-4-20 13:08 编辑 [/i]

[font=新宋体][size=7][color=DeepSkyBlue]首先,非常感谢论坛各位前辈的细心解答和帮助。特别感谢:@zhuangweiye @ 枫叶尚卿 @love_lin @domenor 还有很多真的很感谢 [/color][/backcolor][/size][/font] [font=宋体][size=6][color=Red]基于前辈们的帮助,OSD的功能基本实现,接下来我将把改写的代码分享出来 (配有注解哦!{:3_53:} )同时附上相关帖子的连接可以一起参考参考哦~{:3_53:} [/color][/size][/font] {:3_46:} http://www.ebaina.com/bbs/forum.php?mod=viewthread&tid=10910&page=1#pid28155 {:2_32:} http://www.ebaina.com/bbs/forum.php?mod=viewthread&tid=10879&page=1#pid27965 {:3_57:} http://www.ebaina.com/bbs/forum.php?mod=viewthread&tid=10385&fromuid=12370

我来回答
回答44个
时间排序
认可量排序

localhost

0个粉丝

16

问答

0

专栏

4

资料

localhost 2016-04-20 11:21:05
认可0
本帖最后由 localhost 于 2016-4-20 11:28 编辑

[code] OSD功能实现代码 可以独立使用的哦~
int StartOsd(vi_par& vi, venc_par& ve, vi_par& vi_another, venc_par& ve_another)
{
        RGN_HANDLE Handle;//区域句柄号(必须未使用过【0,RGN_HANDLE_MAX】)
        RGN_ATTR_S JYRgnAttr;//区域属性结构体
        HI_S32 s32Ret;
//用户填充区域属性并创建区域
        /*用户填充区域属性*/
        Handle = 0;
        JYRgnAttr.enType = OVERLAY_RGN;//OVERLAY_RGN编码通道叠加 COVER_RGN输入通道遮挡 COVEREX_RGN扩展通道遮挡 OVERLAYEX_RGN扩展通道叠加
        JYRgnAttr.unAttr.stOverlay.enPixelFmt = PIXEL_FORMAT_RGB_1555;
        JYRgnAttr.unAttr.stOverlay.stSize.u32Width = 800;
        JYRgnAttr.unAttr.stOverlay.stSize.u32Height = 200;
        JYRgnAttr.unAttr.stOverlay.u32BgColor = 0x0000ffff;

        /*创建区域*/
        s32Ret = HI_MPI_RGN_Create(Handle, &JYRgnAttr);
        if(HI_SUCCESS != s32Ret)
        {
                printf("HI_MPI_RGN_Create error! /jeeyinOsd.cpp +10\n");
                return -1;
        }

//将区域指定到具体通道中
        MPP_CHN_S JYOsdVEChn;//定义通道类型结构体
        RGN_CHN_ATTR_S JYOsdVEChnAttr;//定义区域通道显示属性
        /*配置通道属性*/
        JYOsdVEChn.enModId  = HI_ID_VENC;
        JYOsdVEChn.s32DevId = 0;
        JYOsdVEChn.s32ChnId = 0;

        JYOsdVEChnAttr.bShow = HI_TRUE;
        JYOsdVEChnAttr.enType = OVERLAY_RGN;
        JYOsdVEChnAttr.unChnAttr.stOverlayChn.stPoint.s32X = 32;//区域位置,水平x【0,8190】以2对齐
        JYOsdVEChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y = 32;//区域位置,垂直y【0,8190】以2对齐
        JYOsdVEChnAttr.unChnAttr.stOverlayChn.u32BgAlpha   = 0;//后景alpha位为0的透明度,【0,128】值越小越透明
        JYOsdVEChnAttr.unChnAttr.stOverlayChn.u32FgAlpha   = 128;//前景alpha位为1的透明度,【0,128】值越小越透明
        JYOsdVEChnAttr.unChnAttr.stOverlayChn.u32Layer     = 0;//区域层次 【0,7】
        //此区域编码时使用的QP值,在不确认的情况下推荐均设置为0
        JYOsdVEChnAttr.unChnAttr.stOverlayChn.stQpInfo.bAbsQp = HI_FALSE;
        JYOsdVEChnAttr.unChnAttr.stOverlayChn.stQpInfo.s32Qp  = 0;
        //区域反色配置
        JYOsdVEChnAttr.unChnAttr.stOverlayChn.stInvertColor.stInvColArea.u32Height = 16;
        JYOsdVEChnAttr.unChnAttr.stOverlayChn.stInvertColor.stInvColArea.u32Width = 16;
        JYOsdVEChnAttr.unChnAttr.stOverlayChn.stInvertColor.u32LumThresh = 128;//亮度阀值【0,255】
        JYOsdVEChnAttr.unChnAttr.stOverlayChn.stInvertColor.enChgMod     = LESSTHAN_LUM_THRESH;//osd反色触发模式
        JYOsdVEChnAttr.unChnAttr.stOverlayChn.stInvertColor.bInvColEn    = HI_FALSE;//OSD反色开关

        s32Ret = HI_MPI_RGN_AttachToChn(Handle, &JYOsdVEChn, &JYOsdVEChnAttr);
        if(HI_SUCCESS != s32Ret)
        {
                printf("HI_MPI_RGN_AttachToChn error! /jeeyinOsd.cpp +54\n");
                return s32Ret;
        }

        StartVi(vi);
        StartVenc(vi, ve);
        StartVenc_another(vi_another, ve_another);
        //获取区域属性
        s32Ret = HI_MPI_RGN_GetAttr(Handle,&JYRgnAttr);
        if(s32Ret != HI_SUCCESS)
        {
                        printf("HI_MPI_RGN_GetAttr error! /jeeyinOsd.cpp +64\n");
                        return s32Ret;
        }
        JYRgnAttr.unAttr.stOverlay.u32BgColor = 0x0000cccc;
        //获取画布信息
        RGN_CANVAS_INFO_S JYOsdCanvasInfo;
        s32Ret = HI_MPI_RGN_GetCanvasInfo(Handle, &JYOsdCanvasInfo);
        if(HI_SUCCESS != s32Ret)
        {
                printf("HI_MPI_RGN_GetCanvasInfo error! jeeyinOsd.cpp +73\n");
                return s32Ret;
        }

        BITMAP_S JYstBitmap;//位图图像信息结构体
        SIZE_S JYSize;

        JYstBitmap.pData = (HI_VOID*)JYOsdCanvasInfo.u32VirtAddr;
        JYSize.u32Width  = JYOsdCanvasInfo.stSize.u32Width;
        JYSize.u32Height = JYOsdCanvasInfo.stSize.u32Height;
        /*更新画布数据*/
        s32Ret = SAMPLE_RGN_UpdateCanvas("mm.bmp", &JYstBitmap, HI_FALSE, 0, &JYSize, JYOsdCanvasInfo.u32Stride, JYRgnAttr.unAttr.stOverlay.enPixelFmt);
        if(HI_SUCESS != s32Ret)
        {
                printf("SAMPLE_RGN_UpdataCanvas error! jeeyinOsd.cpp +88\n");
                return s32Ret;
        }

        s32Ret = HI_MPI_RGN_UpdateCanvas(Handle);
        if(HI_SUCCESS != s32Ret)
        {
                printf("HI_MPI_RGN_UpdateCanvas error! jeeyinOsd.cpp \n");
                return s32Ret;
        }

}

HI_S32 SAMPLE_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_RGB1555;
        }
        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;
}
[/code]

{:2_33:} 代码写的可能不是很利索 希望各位看到后 有改进的方式 请及时留言 我会及时调整 谢谢啦

localhost

0个粉丝

16

问答

0

专栏

4

资料

localhost 2016-04-20 11:24:56
认可0
本帖最后由 localhost 于 2016-5-14 12:22 编辑

这是以上配置后 可实现的效果

localhost

0个粉丝

16

问答

0

专栏

4

资料

localhost 2016-04-20 11:26:50
认可0
本帖最后由 localhost 于 2016-4-20 11:29 编辑

接下来任务 是使用SDL的相关库 将静态图片
调整为时间戳的形式 各位前辈有什么经验 希望及时留言 交流下呀
{:2_42:}

kg123456

0个粉丝

14

问答

0

专栏

3

资料

kg123456 2016-04-21 14:27:03
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=28797&ptid=11061]localhost 发表于 2016-4-20 11:26[/url]
接下来任务 是使用SDL的相关库 将静态图片
调整为时间戳的形式 各位前辈有什么经验 希望及时留言 交流下 ...[/quote]

你好  请问SDL相关库编译,有参考的吗?

localhost

0个粉丝

16

问答

0

专栏

4

资料

localhost 2016-04-21 15:57:05
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=28861&ptid=11061]kg123456 发表于 2016-4-21 14:27[/url]
你好  请问SDL相关库编译,有参考的吗?[/quote]

网上有开放的源码包 可以去下载 但是 没有详解

lemon

0个粉丝

5

问答

0

专栏

0

资料

lemon 2016-04-22 09:57:44
认可0
SDK里面关于OSD的smaple,但是没有关于显示字幕OSD的资料,不知道从哪下手啊:Q

localhost

0个粉丝

16

问答

0

专栏

4

资料

localhost 2016-04-22 10:04:00
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=28906&ptid=11061]lemon 发表于 2016-4-22 09:57[/url]
SDK里面关于OSD的smaple,但是没有关于显示字幕OSD的资料,不知道从哪下手啊[/quote]

是的 所以你要考虑其他方法 比如 将字符数据转换成位图叠加,这应该是最快的方法,网上有两种手段:
1、利用SDL的三个库实现 转换;
2、单独利用freetype2实现字符位图转换。
这两种方法 很抱歉 我也在研究 手头资料 只有源码库 没有手册和demo 如果您有的话 希望您可以分享一下 谢谢啦~

hgh

0个粉丝

2

问答

0

专栏

0

资料

hgh 2016-04-22 10:24:29
认可0
一个OSD还搞的这么复杂啊。

lemon

0个粉丝

5

问答

0

专栏

0

资料

lemon 2016-04-22 10:24:58
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=28908&ptid=11061]localhost 发表于 2016-4-22 10:04[/url]
是的 所以你要考虑其他方法 比如 将字符数据转换成位图叠加,这应该是最快的方法,网上有两种手段:
1、 ...[/quote]

喊,我研究研究:lol

localhost

0个粉丝

16

问答

0

专栏

4

资料

localhost 2016-04-22 10:40:29
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=28915&ptid=11061]hgh 发表于 2016-4-22 10:24[/url]
一个OSD还搞的这么复杂啊。[/quote]

第一次 用手头资料都不全 不知道前辈可否指导一下呢

hgh

0个粉丝

2

问答

0

专栏

0

资料

hgh 2016-04-22 10:53:53
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=28917&ptid=11061]localhost 发表于 2016-4-22 10:40[/url]
第一次 用手头资料都不全 不知道前辈可否指导一下呢[/quote]

就按10楼那样做就可以了

localhost

0个粉丝

16

问答

0

专栏

4

资料

localhost 2016-04-22 11:15:47
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=28918&ptid=11061]hgh 发表于 2016-4-22 10:53[/url]
就按10楼那样做就可以了[/quote]

10楼么?没有呀
您可以 指点一下 将字符转换成位图的方法建议吗

黄征one

0个粉丝

0

问答

0

专栏

0

资料

黄征one 2016-06-09 15:06:14
认可0
感谢楼主的无私

localhost

0个粉丝

16

问答

0

专栏

4

资料

localhost 2016-06-14 13:39:52
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=31394&ptid=11061]黄征one 发表于 2016-6-9 15:06[/url]
感谢楼主的无私[/quote]

交流分享而已 哈哈!对于实现方法有什么优化 都可以来盖楼~交流下,楼主现在就进行了一些优化 但是遇到一些运行崩溃,正在查找原因。

localhost

0个粉丝

16

问答

0

专栏

4

资料

localhost 2016-06-14 13:43:18
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=28906&ptid=11061]lemon 发表于 2016-4-22 09:57[/url]
SDK里面关于OSD的smaple,但是没有关于显示字幕OSD的资料,不知道从哪下手啊[/quote]

最近 测试找到一种添加字幕的 方式 不知是否和你需求一样,看下楼下效果

localhost

0个粉丝

16

问答

0

专栏

4

资料

localhost 2016-06-14 13:47:14
认可0
本帖最后由 localhost 于 2016-6-14 13:48 编辑

这是我在上面的代码基础上 结合SDL的库 实现的实时字符覆盖叠加效果

chuxian

0个粉丝

7

问答

0

专栏

0

资料

chuxian 2016-06-22 14:50:41
认可0
你好,楼主,我的是3518e+ov9712模组,这几天刚看关于osd方面的资料,所以很多东西不是太懂,目前,我想实现的功能是,海思的/MPP2/sample/sample_venc.c代码中n能够实现对视频流进行加水印或者bmp图片,不知道你贴的代码能不能实现,麻烦楼主提出一些建议,osd没有说明文档,看的一头雾水。

ws19921108

0个粉丝

4

问答

0

专栏

0

资料

ws19921108 2016-06-22 15:25:11
认可0
学习一下,谢谢

localhost

0个粉丝

16

问答

0

专栏

4

资料

localhost 2016-06-23 10:24:43
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32123&ptid=11061]chuxian 发表于 2016-6-22 14:50[/url]
你好,楼主,我的是3518e+ov9712模组,这几天刚看关于osd方面的资料,所以很多东西不是太懂,目前,我想实 ...[/quote]

3518 的区别 我不太清楚 ,不过根据之前咨询来说应该差别不大,我给出的实例代码是osd叠加独立的形式,在开始获取视频流之前配置并生效 就可以 但要注意vpss组或venc通道的对应 剩下的只有你试试才知道

chuxian

0个粉丝

7

问答

0

专栏

0

资料

chuxian 2016-06-23 10:37:54
认可0
恩,谢谢楼主指点,这两天正在尝试,有问题再请教你:D
加载中···
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区