3763
- 收藏
- 点赞
- 分享
- 举报
叠加区域和扩展叠加区域的疑惑??
我在测试叠加区域和扩展叠加区域发现了2个问题,如下:
1.在叠加区域的区域句柄为40~47的区域无法显示,但是扩展区域可以显示。
2.创建时叠加区域和扩展叠加区域都为48*48,但是显示扩展叠加区域明显比叠加区域大这是为什么。
测试方法如下,首先我使用了sample_venc.c文件中的SAMPLE_VENC_720p_CLASSIC()函数,他有8个摄像头,
编码稍作修改如:
PAYLOAD_TYPE_E enPayLoad[3]= {PT_H264, PT_JPEG,PT_H264};
PIC_SIZE_E enSize[3] = {PIC_960H, PIC_960H,PIC_CIF};
VPSS的通道0做960H编码,通道1做CIF编码,通道2做高清显示,这样我们测试扩展区域时可以看到绑到指定通道其他通道的区域显示情况。
添加一个创建叠加区域和扩展叠加区域的函数如下:
//普通的叠加区域创建办法
HI_S32 Create1_RGN_OverlayProcess(RGN_HANDLE Handle,VPSS_GRP VpssGrp,VPSS_CHN VpssChn)
{
HI_S32 s32Ret = HI_FAILURE;
RGN_ATTR_S stOverlayAttr;
MPP_CHN_S stOverlayChn;
RGN_CHN_ATTR_S stOverlayChnAttr;
BITMAP_S stBitmap;
static HI_U8 layer_pri[]={0,0,0,0,0,0,0,0};
RECT_S tmp_rect[]={{8,8,48,48},{48*1+8*2,8,48,48},{48*2+8*3,8,48,48},{48*3+8*4,8,48,48},
{48*4+8*5,8,48,48},{48*5+8*6,8,48,48},{48*6+8*7,8,48,48},{48*7+8*8,8,48,48}};
HI_U8 index = 0;
index = layer_pri[VpssGrp]++;
logs("Create1_RGN_OverlayProcess:Handle=%d, VpssGrp=%d, VpssChn=%d ,index=%d \n",Handle, VpssGrp, VpssChn ,index );
logs("region:x=%d, y=%d, w=%d ,h=%d \n",tmp_rect[index].s32X, tmp_rect[index].s32Y, tmp_rect[index].u32Width ,tmp_rect[index].u32Height );
//区域属性
stOverlayAttr.enType = OVERLAY_RGN;
stOverlayAttr.unAttr.stOverlay.enPixelFmt = PIXEL_FORMAT_RGB_1555;
stOverlayAttr.unAttr.stOverlay.u32BgColor = 0x00FF;//0x7fff;
stOverlayAttr.unAttr.stOverlay.stSize.u32Height = tmp_rect[index].u32Height; //区域大小
stOverlayAttr.unAttr.stOverlay.stSize.u32Width= tmp_rect[index].u32Width;
s32Ret = HI_MPI_RGN_Create(Handle, &stOverlayAttr); //创建区域
if(HI_SUCCESS != s32Ret)
{
logs("HI_MPI_RGN_Create failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
//区域通道显示结构
stOverlayChnAttr.enType = OVERLAY_RGN; //区域类型,叠加区域
stOverlayChnAttr.bShow = HI_TRUE;
stOverlayChnAttr.unChnAttr.stOverlayChn.stPoint.s32X = tmp_rect[index].s32X;//区域所在位置
stOverlayChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y = tmp_rect[index].s32Y;
stOverlayChnAttr.unChnAttr.stOverlayChn.u32BgAlpha = 128;
stOverlayChnAttr.unChnAttr.stOverlayChn.u32FgAlpha = 128;
stOverlayChnAttr.unChnAttr.stOverlayChn.u32Layer = index;
//区域绑定通道
stOverlayChn.enModId = HI_ID_VPSS; //直接绑定到VPSS通道
stOverlayChn.s32DevId = VpssGrp;
stOverlayChn.s32ChnId = VpssChn;
s32Ret = HI_MPI_RGN_AttachToChn(Handle,&stOverlayChn,&stOverlayChnAttr); //将区域叠加到通道上去
if(HI_SUCCESS != s32Ret)
{
logs("HI_MPI_RGN_AttachToChn failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
return HI_SUCCESS;
}
//扩展叠加区域的创建办法
HI_S32 Create2_RGN_OverlayExProcess(RGN_HANDLE Handle,VPSS_GRP VpssGrp,VPSS_CHN VpssChn)
{
HI_S32 s32Ret = HI_FAILURE;
RGN_ATTR_S stOverlayExAttr;
MPP_CHN_S stOverlayExChn;
RGN_CHN_ATTR_S stOverlayExChnAttr;
BITMAP_S stBitmap;
static HI_U8 layer_pri[]={0,0,0,0,0,0,0,0};
RECT_S tmp_rect[]={{8,56+8,48,48},{48*1+8*2,56+8,48,48},{48*2+8*3,56+8,48,48},{48*3+8*4,56+8,48,48},
{48*4+8*5,56+8,48,48},{48*5+8*6,56+8,48,48},{48*6+8*7,56+8,48,48},{48*7+8*8,56+8,48,48}};
HI_U8 index = 0;
index = layer_pri[VpssGrp]++;
logs("Create2_RGN_OverlayExProcess:Handle=%d, VpssGrp=%d, VpssChn=%d ,index=%d \n",Handle, VpssGrp, VpssChn ,index );
logs("region:x=%d, y=%d, w=%d ,h=%d \n",tmp_rect[index].s32X, tmp_rect[index].s32Y, tmp_rect[index].u32Width ,tmp_rect[index].u32Height );
//区域属性
stOverlayExAttr.enType = OVERLAYEX_RGN;
stOverlayExAttr.unAttr.stOverlayEx.enPixelFmt = PIXEL_FORMAT_RGB_1555;
stOverlayExAttr.unAttr.stOverlayEx.u32BgColor = 0x00FF;//0x7fff;
stOverlayExAttr.unAttr.stOverlayEx.stSize.u32Height = tmp_rect[index].u32Height; //区域大小
stOverlayExAttr.unAttr.stOverlayEx.stSize.u32Width= tmp_rect[index].u32Width;
s32Ret = HI_MPI_RGN_Create(Handle, &stOverlayExAttr); //创建区域
if(HI_SUCCESS != s32Ret)
{
logs("HI_MPI_RGN_Create failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
//区域通道显示结构
stOverlayExChnAttr.enType = OVERLAYEX_RGN; //区域类型,扩展叠加区域
stOverlayExChnAttr.bShow = HI_TRUE;
stOverlayExChnAttr.unChnAttr.stOverlayExChn.stPoint.s32X = tmp_rect[index].s32X;//区域所在位置
stOverlayExChnAttr.unChnAttr.stOverlayExChn.stPoint.s32Y = tmp_rect[index].s32Y;
stOverlayExChnAttr.unChnAttr.stOverlayExChn.u32BgAlpha = 128;
stOverlayExChnAttr.unChnAttr.stOverlayExChn.u32FgAlpha = 128;
stOverlayExChnAttr.unChnAttr.stOverlayExChn.u32Layer = index;
//区域绑定通道
stOverlayExChn.enModId = HI_ID_VPSS; //直接绑定到VPSS通道
stOverlayExChn.s32DevId = VpssGrp;
stOverlayExChn.s32ChnId = VpssChn;
s32Ret = HI_MPI_RGN_AttachToChn(Handle,&stOverlayExChn,&stOverlayExChnAttr); //将区域叠加到通道上去
if(HI_SUCCESS != s32Ret)
{
logs("HI_MPI_RGN_AttachToChn failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
return HI_SUCCESS;
}
然后在SAMPLE_VENC_720p_CLASSIC()中添加测试代码如下:
#if 0
for(i = 0 ; i < 8;i++)
{
Create1_RGN_OverlayProcess(16+i,i,VPSS_CHN0);
}
for(i = 0 ; i < 8;i++)
{
Create1_RGN_OverlayProcess(24+i,i,VPSS_CHN0);
}
for(i = 0 ; i < 8;i++)
{
Create1_RGN_OverlayProcess(32+i,i,VPSS_CHN0);
}
for(i = 0 ; i < 8;i++)
{
Create1_RGN_OverlayProcess(40+i,i,VPSS_CHN0);
}
#else
for(i = 0 ; i < 8;i++)
{
Create2_RGN_OverlayExProcess(16+i,i,VPSS_CHN2);
}
for(i = 0 ; i < 8;i++)
{
Create2_RGN_OverlayExProcess(24+i,i,VPSS_CHN2);
}
for(i = 0 ; i < 8;i++)
{
Create2_RGN_OverlayExProcess(32+i,i,VPSS_CHN2);
}
for(i = 0 ; i < 8;i++)
{
Create2_RGN_OverlayExProcess(40+i,i,VPSS_CHN2);
}
#endif
编译后结果是:
1.在为每个VPSS通道创建4个叠加区域的情况下实际只会显示3个,
在为每个VPSS通道创建4个扩展叠加区域的情况下实际会显示4个,
2.叠加区域和扩展叠加区域同为48*48大小但是实际显示情况扩展叠加区域明显更大。
这两个问题我特意去翻看了区域管理那章,但是没找到答案,不知道还有那些文档描述了区域,感觉文档上描述的也太不清楚了。
1.在叠加区域的区域句柄为40~47的区域无法显示,但是扩展区域可以显示。
2.创建时叠加区域和扩展叠加区域都为48*48,但是显示扩展叠加区域明显比叠加区域大这是为什么。
测试方法如下,首先我使用了sample_venc.c文件中的SAMPLE_VENC_720p_CLASSIC()函数,他有8个摄像头,
编码稍作修改如:
PAYLOAD_TYPE_E enPayLoad[3]= {PT_H264, PT_JPEG,PT_H264};
PIC_SIZE_E enSize[3] = {PIC_960H, PIC_960H,PIC_CIF};
VPSS的通道0做960H编码,通道1做CIF编码,通道2做高清显示,这样我们测试扩展区域时可以看到绑到指定通道其他通道的区域显示情况。
添加一个创建叠加区域和扩展叠加区域的函数如下:
//普通的叠加区域创建办法
HI_S32 Create1_RGN_OverlayProcess(RGN_HANDLE Handle,VPSS_GRP VpssGrp,VPSS_CHN VpssChn)
{
HI_S32 s32Ret = HI_FAILURE;
RGN_ATTR_S stOverlayAttr;
MPP_CHN_S stOverlayChn;
RGN_CHN_ATTR_S stOverlayChnAttr;
BITMAP_S stBitmap;
static HI_U8 layer_pri[]={0,0,0,0,0,0,0,0};
RECT_S tmp_rect[]={{8,8,48,48},{48*1+8*2,8,48,48},{48*2+8*3,8,48,48},{48*3+8*4,8,48,48},
{48*4+8*5,8,48,48},{48*5+8*6,8,48,48},{48*6+8*7,8,48,48},{48*7+8*8,8,48,48}};
HI_U8 index = 0;
index = layer_pri[VpssGrp]++;
logs("Create1_RGN_OverlayProcess:Handle=%d, VpssGrp=%d, VpssChn=%d ,index=%d \n",Handle, VpssGrp, VpssChn ,index );
logs("region:x=%d, y=%d, w=%d ,h=%d \n",tmp_rect[index].s32X, tmp_rect[index].s32Y, tmp_rect[index].u32Width ,tmp_rect[index].u32Height );
//区域属性
stOverlayAttr.enType = OVERLAY_RGN;
stOverlayAttr.unAttr.stOverlay.enPixelFmt = PIXEL_FORMAT_RGB_1555;
stOverlayAttr.unAttr.stOverlay.u32BgColor = 0x00FF;//0x7fff;
stOverlayAttr.unAttr.stOverlay.stSize.u32Height = tmp_rect[index].u32Height; //区域大小
stOverlayAttr.unAttr.stOverlay.stSize.u32Width= tmp_rect[index].u32Width;
s32Ret = HI_MPI_RGN_Create(Handle, &stOverlayAttr); //创建区域
if(HI_SUCCESS != s32Ret)
{
logs("HI_MPI_RGN_Create failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
//区域通道显示结构
stOverlayChnAttr.enType = OVERLAY_RGN; //区域类型,叠加区域
stOverlayChnAttr.bShow = HI_TRUE;
stOverlayChnAttr.unChnAttr.stOverlayChn.stPoint.s32X = tmp_rect[index].s32X;//区域所在位置
stOverlayChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y = tmp_rect[index].s32Y;
stOverlayChnAttr.unChnAttr.stOverlayChn.u32BgAlpha = 128;
stOverlayChnAttr.unChnAttr.stOverlayChn.u32FgAlpha = 128;
stOverlayChnAttr.unChnAttr.stOverlayChn.u32Layer = index;
//区域绑定通道
stOverlayChn.enModId = HI_ID_VPSS; //直接绑定到VPSS通道
stOverlayChn.s32DevId = VpssGrp;
stOverlayChn.s32ChnId = VpssChn;
s32Ret = HI_MPI_RGN_AttachToChn(Handle,&stOverlayChn,&stOverlayChnAttr); //将区域叠加到通道上去
if(HI_SUCCESS != s32Ret)
{
logs("HI_MPI_RGN_AttachToChn failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
return HI_SUCCESS;
}
//扩展叠加区域的创建办法
HI_S32 Create2_RGN_OverlayExProcess(RGN_HANDLE Handle,VPSS_GRP VpssGrp,VPSS_CHN VpssChn)
{
HI_S32 s32Ret = HI_FAILURE;
RGN_ATTR_S stOverlayExAttr;
MPP_CHN_S stOverlayExChn;
RGN_CHN_ATTR_S stOverlayExChnAttr;
BITMAP_S stBitmap;
static HI_U8 layer_pri[]={0,0,0,0,0,0,0,0};
RECT_S tmp_rect[]={{8,56+8,48,48},{48*1+8*2,56+8,48,48},{48*2+8*3,56+8,48,48},{48*3+8*4,56+8,48,48},
{48*4+8*5,56+8,48,48},{48*5+8*6,56+8,48,48},{48*6+8*7,56+8,48,48},{48*7+8*8,56+8,48,48}};
HI_U8 index = 0;
index = layer_pri[VpssGrp]++;
logs("Create2_RGN_OverlayExProcess:Handle=%d, VpssGrp=%d, VpssChn=%d ,index=%d \n",Handle, VpssGrp, VpssChn ,index );
logs("region:x=%d, y=%d, w=%d ,h=%d \n",tmp_rect[index].s32X, tmp_rect[index].s32Y, tmp_rect[index].u32Width ,tmp_rect[index].u32Height );
//区域属性
stOverlayExAttr.enType = OVERLAYEX_RGN;
stOverlayExAttr.unAttr.stOverlayEx.enPixelFmt = PIXEL_FORMAT_RGB_1555;
stOverlayExAttr.unAttr.stOverlayEx.u32BgColor = 0x00FF;//0x7fff;
stOverlayExAttr.unAttr.stOverlayEx.stSize.u32Height = tmp_rect[index].u32Height; //区域大小
stOverlayExAttr.unAttr.stOverlayEx.stSize.u32Width= tmp_rect[index].u32Width;
s32Ret = HI_MPI_RGN_Create(Handle, &stOverlayExAttr); //创建区域
if(HI_SUCCESS != s32Ret)
{
logs("HI_MPI_RGN_Create failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
//区域通道显示结构
stOverlayExChnAttr.enType = OVERLAYEX_RGN; //区域类型,扩展叠加区域
stOverlayExChnAttr.bShow = HI_TRUE;
stOverlayExChnAttr.unChnAttr.stOverlayExChn.stPoint.s32X = tmp_rect[index].s32X;//区域所在位置
stOverlayExChnAttr.unChnAttr.stOverlayExChn.stPoint.s32Y = tmp_rect[index].s32Y;
stOverlayExChnAttr.unChnAttr.stOverlayExChn.u32BgAlpha = 128;
stOverlayExChnAttr.unChnAttr.stOverlayExChn.u32FgAlpha = 128;
stOverlayExChnAttr.unChnAttr.stOverlayExChn.u32Layer = index;
//区域绑定通道
stOverlayExChn.enModId = HI_ID_VPSS; //直接绑定到VPSS通道
stOverlayExChn.s32DevId = VpssGrp;
stOverlayExChn.s32ChnId = VpssChn;
s32Ret = HI_MPI_RGN_AttachToChn(Handle,&stOverlayExChn,&stOverlayExChnAttr); //将区域叠加到通道上去
if(HI_SUCCESS != s32Ret)
{
logs("HI_MPI_RGN_AttachToChn failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
return HI_SUCCESS;
}
然后在SAMPLE_VENC_720p_CLASSIC()中添加测试代码如下:
#if 0
for(i = 0 ; i < 8;i++)
{
Create1_RGN_OverlayProcess(16+i,i,VPSS_CHN0);
}
for(i = 0 ; i < 8;i++)
{
Create1_RGN_OverlayProcess(24+i,i,VPSS_CHN0);
}
for(i = 0 ; i < 8;i++)
{
Create1_RGN_OverlayProcess(32+i,i,VPSS_CHN0);
}
for(i = 0 ; i < 8;i++)
{
Create1_RGN_OverlayProcess(40+i,i,VPSS_CHN0);
}
#else
for(i = 0 ; i < 8;i++)
{
Create2_RGN_OverlayExProcess(16+i,i,VPSS_CHN2);
}
for(i = 0 ; i < 8;i++)
{
Create2_RGN_OverlayExProcess(24+i,i,VPSS_CHN2);
}
for(i = 0 ; i < 8;i++)
{
Create2_RGN_OverlayExProcess(32+i,i,VPSS_CHN2);
}
for(i = 0 ; i < 8;i++)
{
Create2_RGN_OverlayExProcess(40+i,i,VPSS_CHN2);
}
#endif
编译后结果是:
1.在为每个VPSS通道创建4个叠加区域的情况下实际只会显示3个,
在为每个VPSS通道创建4个扩展叠加区域的情况下实际会显示4个,
2.叠加区域和扩展叠加区域同为48*48大小但是实际显示情况扩展叠加区域明显更大。
这两个问题我特意去翻看了
我来回答
回答16个
时间排序
认可量排序
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
认可0
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
32014-07-14 13:33:48
-
2017-03-22 11:36:38
-
2015-11-13 15:36:11
-
82014-10-30 10:05:47
-
2017-05-05 14:56:23
-
2019-01-07 14:16:53
-
2019-01-19 09:54:05
-
2017-05-26 18:28:29
-
2017-08-21 12:10:12
-
2019-06-11 20:53:21
-
2022-06-11 09:53:28
-
42020-07-15 18:01:32
-
2017-09-09 02:53:26
-
2016-03-02 11:25:48
-
2018-09-07 18:34:38
-
2020-06-10 10:32:47
-
92014-10-18 17:02:11
-
22020-04-11 20:34:59
-
62018-06-19 11:15:32
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认