技术专栏
海思编码通道添加显示时间
说明
这里的需求是要往生成的录像文件中添加显示时间,实际上也就是海思的VENC与OSD的绑定。
在上一篇博客海思平台freetype、SDL、SDL_TTL的编译编译出三个库之后,又提供了例程生成一个bmp图片,但是实际上我们每次往海思通道贴图,不可能说都像例程一样保存成bmp图片再贴图,这样会造成资源的浪费。
所以这里进行了进一步的修改,让我们能够直接拿到bmp图片的位图数据,而不需要生成bmp图片。
一、bmp位图数据的获取
/*
getVencOsd 获取生成的位图数据
bitmap 海思 BITMAP_S 位图数据结构体指针
*/
static SV_S32 getVencOsd(BITMAP_S *bitmap) {
if( bitmap == NULL || bitmap->pData == NULL ) {
LOG(ERROR)<<"bitmap or pData is NULL";
return SV_FAILURE;
}
//初始化字库
if ( TTF_Init() < 0 ) {
SDL_Quit();
return SV_FAILURE;
}
//打开字库
font = TTF_OpenFont("/root/res/wqy-microhei.ttc", 48);
if ( font == NULL ) {
fprintf(stderr, "Couldn't load %d pt font from %s: %s\n", 18, "ptsize", SDL_GetError());
SDL_Quit();
return SV_FAILURE;
}
//生成显示时间
std::string time("2019-10-10 10:10:10");
SDL_Color forecol = { 0xff, 0xff, 0xff, 0xff };
SDL_Surface *text = TTF_RenderUTF8_Solid(font, time.c_str(), forecol);
if ( text == NULL ) {
LOG(ERROR)<<"temp is NULL";
return SV_FAILURE;
}
SDL_PixelFormat fmt;
memset(&fmt, 0, sizeof(SDL_PixelFormat));
fmt.BitsPerPixel = 16;
fmt.BytesPerPixel = 2;
fmt.colorkey = 0xffffffff;
fmt.alpha = 0xff;
fmt.Rmask = 0xff000000;//0x00FF0000
fmt.Gmask = 0x0000ff00;//0x0000FF00
fmt.Bmask = 0x000000ff;//0x000000FF
fmt.Amask = 0;
SDL_Surface *temp = SDL_ConvertSurface(text, &fmt, 0);
if ( temp == NULL ) {
LOG(ERROR)<<"temp is NULL";
SDL_FreeSurface(text);
return SV_FAILURE;
}
memset(bitmap->pData, 0, DATA_BUFF);
memcpy(bitmap->pData, temp->pixels, (2*(temp->w)*(temp->h)));
bitmap->u32Width = temp->w;
bitmap->u32Height = temp->h;
bitmap->enPixelFormat = PIXEL_FORMAT_RGB_1555 ;
SDL_FreeSurface(text);
SDL_FreeSurface(temp);
return SV_SUCCEED;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
<
}
二、创建RGN区域
/*
* s32CreateRgnAndAttachVencChn 创建贴图区域并绑定到编码通道
* OsdRGBAs 海思 SV_OSD_RGBA_S 结构体对象
* s32VencChn 编码通道号
* s32RgnHandle 通道句柄
注意:海思的编码通道位图只支持PIXEL_FORMAT_RGB_1555或PIXEL_FORMAT_RGB_4444这里用的是1555
*/
static SV_S32 s32CreateRgnAndAttachVencChn(const SV_OSD_RGBA_S OsdRGBAs, const SV_S32 s32VencChn, const SV_S32 s32RgnHandle) {
MPP_CHN_S stChn;
//RGN 区域绑定到对应VENC
stChn.enModId = HI_ID_VENC;
stChn.s32DevId = 0;
stChn.s32ChnId = s32VencChn;
//创建RGN区域
RGN_ATTR_S stRgnAttrSet;
stRgnAttrSet.enType = OVERLAY_RGN;
stRgnAttrSet.unAttr.stOverlay.enPixelFmt = PIXEL_FORMAT_RGB_1555;
stRgnAttrSet.unAttr.stOverlay.stSize.u32Width = std::max(2, ALIGN_BACK(OsdRGBAs.stPixRect.stRectSize.s32Width, 2));
stRgnAttrSet.unAttr.stOverlay.stSize.u32Height = std::max(2, ALIGN_BACK(OsdRGBAs.stPixRect.stRectSize.s32Height, 2));
stRgnAttrSet.unAttr.stOverlay.u32BgColor = 0;
HI_MPI_RGN_DetachFromChn(s32RgnHandle, &stChn);
HI_MPI_RGN_Destroy(s32RgnHandle);
SV_S32 s32Ret = HI_MPI_RGN_Create(s32RgnHandle, &stRgnAttrSet);
if(s32Ret != SV_SUCCEED) {
LOG(ERROR)<<"HI_MPI_RGN_Create failed with 0x"<<std::hex<<s32Ret;
return SV_FAILURE;
}
RGN_CHN_ATTR_S stChnAttr;
memset(&stChnAttr, 0, sizeof(stChnAttr));
stChnAttr.bShow = HI_TRUE;
stChnAttr.enType = OVERLAY_RGN;
stChnAttr.unChnAttr.stOverlayChn.stPoint.s32X = ALIGN_BACK(OsdRGBAs.stPixRect.stStartPoint.s32X, 2);
stChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y = ALIGN_BACK(OsdRGBAs.stPixRect.stStartPoint.s32Y, 2);
stChnAttr.unChnAttr.stOverlayChn.u32BgAlpha = 0;
stChnAttr.unChnAttr.stOverlayChn.u32FgAlpha = 128;
stChnAttr.unChnAttr.stOverlayChn.u32Layer = 0;
s32Ret = HI_MPI_RGN_AttachToChn(s32RgnHandle, &stChn, &stChnAttr);
if(s32Ret != SV_SUCCEED) {
LOG(ERROR)<<"HI_MPI_RGN_AttachToChn failed with 0x"<<std::hex<<s32Ret;
HI_MPI_RGN_Destroy(s32RgnHandle);
return SV_FAILURE;
}
return SV_SUCCEED;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
<
三、加载bmp位图
/*
s32LoadBmp 加载显示bmp
pData 用来存放位图的buffer
*/
SV_S32 s32LoadBmp(SV_VOID *pData) {
BITMAP_S bitmap;
bitmap.pData = pData;
SV_S32 s32VencChn = 0;
SV_S32 s32Ret = getVencOsd(s32VencChn, &bitmap);
if( s32Ret == SV_FAILURE ) {
LOG(ERROR)<<"getVencOsd is failed!";
return SV_FAILURE;
}
SV_OSD_RGBA_S pOsd;
pOsd.stPixRect.stStartPoint.s32X = 0;
pOsd.stPixRect.stStartPoint.s32Y = 0;
pOsd.stPixRect.stRectSize.s32Width = bitmap.u32Width;
pOsd.stPixRect.stRectSize.s32Height = bitmap.u32Height;
SV_S32 s32RgnHandle = 0;
s32Ret = this->s32CreateRgnAndAttachVencChn(pOsd, s32VencChn, s32RgnHandle);
if( s32Ret == SV_FAILURE ) {
LOG(ERROR)<<"s32CreateRgnAndAttachVencChn failed with "<<s32Ret;
return SV_FAILURE;
}
//设定相应位图显示
s32Ret = HI_MPI_RGN_SetBitMap(s32RgnHandle, &bitmap);
if( s32Ret != SV_SUCCEED ) {
LOG(ERROR)<<"sv_updateRgnChannals : HI_MPI_RGN_SetBitMap failed with 0x"<<std::hex<<s32Ret;
HI_MPI_RGN_Destroy(s32RgnHandle);
return SV_FAILURE;
}
return SV_SUCCEED;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
<
四、主函数
int main (void) {
char *pData = (char *)malloc(1024 * 512);
s32LoadBmp( pData );
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
原文连接:https://blog.csdn.net/weixin_44362642/article/details/103469479
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包
点赞
收藏
评论
打赏
- 分享
- 举报
评论
1个
手气红包
-
山楂树 2024-01-12 16:46:29回复 举报好文章
相关专栏
-
浏览量:1145次2024-01-02 17:24:57
-
浏览量:3829次2020-07-27 16:07:46
-
浏览量:2486次2020-05-22 19:25:12
-
浏览量:3481次2020-08-03 11:10:18
-
浏览量:11579次2020-12-12 18:07:34
-
浏览量:1818次2023-09-07 16:08:23
-
浏览量:4294次2020-08-30 12:27:19
-
浏览量:1032次2023-03-24 11:22:33
-
浏览量:3633次2020-07-30 11:57:30
-
浏览量:2431次2020-08-04 20:26:22
-
浏览量:2215次2024-01-02 16:35:00
-
浏览量:678次2024-09-11 16:46:19
-
浏览量:5048次2018-11-13 10:03:09
-
浏览量:2901次2020-08-04 20:12:26
-
浏览量:1900次2024-01-25 16:21:59
-
浏览量:5061次2020-08-11 10:32:41
-
2020-10-23 17:11:43
-
浏览量:2697次2020-08-04 20:15:40
-
浏览量:3648次2018-02-06 10:43:46
切换马甲
上一页
下一页
打赏用户
共 0 位
我要创作
分享技术经验,可获取创作收益
分类专栏
-
104篇
热门专栏
- 路透:三星获得了向华为供应部分面板的美国许可
- 倪光南:开源芯片方向上的突破,或可规避美国的限制政策
- 海思3861L搭建Linux开发环境基于ubuntu16.04
- 海思 | 8K入户,让梦想照进家庭
- 22ap80通过pwm控制蜂鸣器
- 海思3518E开发笔记2.6——海思VPSS(Video Process Sub-System)模块详解
- Hi3516DV300三天入门之---(四)文件系统制作(1)
- OpenEuler&海思赋能:欧拉派Euler Pi——应⽤于机器⼈/机器视觉/⼯业控制
- HI3518EV300音视频接口设计参考
- 中国电信NB-IoT模组集采结果公布,海思Boudica 150获最大份额
置顶时间设置
结束时间
删除原因
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
打赏作者

在学了在学了!
您的支持将鼓励我继续创作!
打赏金额:
¥1

¥5

¥10

¥50

¥100

支付方式:

举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
审核成功
发布时间设置
发布时间:
请选择发布时间设置
是否关联周任务-专栏模块
审核失败
失败原因
请选择失败原因
备注
请输入备注