RGN Q&A
Q1:cover 的实际大小比设置的大小要小很多
cover 的 x, y, w, h 是相对8192 的位置,不是绝对位置,按8192 映射下;例如:
u32XNew = pstRect->u16X * RGN_COVER_MAX_WIDTH / g_stVideoSize[s32VencChn].u16Width; u32YNew = pstRect->u16Y * RGN_COVER_MAX_HEIGHT/ g_stVideoSize[s32VencChn].u16Height;
pstRect->u16X:这个坐标是对应vi实际的坐标
RGN_COVER_MAX_WIDTH:8192
g_stVideoSize[s32VencChn].u16Width:对应scl实际prot口的宽
g_stVideoSize[s32VencChn].u16Height:对应scl实际prot口的高
Q2:Cover 只支持VYU444颜色格式。
RGB格式换算成VYU444格式 的公式如下:
#define RGB_TO_CRYCB(r, g, b) \ (((unsigned int)(( 0.439f * (r) - 0.368f * (g) - 0.071f * (b)) + 128.0f)) << 16) | \ (((unsigned int)(( 0.257f * (r) + 0.564f * (g) + 0.098f * (b)) + 16.0f)) << 8) | \ (((unsigned int)((-0.148f * (r) - 0.291f * (g) + 0.439f * (b)) + 128.0f)))
以黑色为例,黑色RGB的值为 (0, 0, 0),通过RGB_TO_CRYCB换算之后,得出黑色VYU444的值为 0x800080。
Q3:多线程Canvas Update 的时候,概率性出现 “Front buf state error!!!”
MI_RGN_GetCanvasInfo 和 MI_RGN_UpdateCanvas使用时要求成对出现,多线程执行需要加锁保护:
假设有 handler0 和 handler1 都贴到同一个通道上
handler0 T0_0 = getcanvas T0_1 = update handler1 T1_0 = getcanvas T1_1 = update
按照时间 T 的顺序执行:lock -> T0_0 -> T0_1 -> unlock -> lock -> T1_0 -> T1_1 -> unlock
Q4:rgn是不是只能叠加在scl上?
是的,目前rgn只能叠加在SCL 上。
Q5:rgn叠加ARGB1555图片显示花屏
首先dump osd数据,用7yuv工具查看正常。
echo dumpRgnBuf [Handle] [Path] > /proc/mi_modules/mi_rgn/mi_rgn0
查看proc信息:

发现是多个osd区域叠加到同一个通道format不同导致。这里handle 0/1都是I4格式,而handle 2是ARGB1555格式,属于硬件限制,handle 0/1也改成ARGB1555格式显示正常。
typedef enum
{
E_MI_RGN_PIXEL_FORMAT_ARGB1555 = 0,
E_MI_RGN_PIXEL_FORMAT_ARGB4444,
E_MI_RGN_PIXEL_FORMAT_I2,
E_MI_RGN_PIXEL_FORMAT_I4,
E_MI_RGN_PIXEL_FORMAT_I8,
E_MI_RGN_PIXEL_FORMAT_RGB565,
E_MI_RGN_PIXEL_FORMAT_ARGB8888,
E_MI_RGN_PIXEL_FORMAT_MAX
} MI_RGN_PixelFormat_e;
Q6:rgn叠加ARGB1555图片无法显示
首先dump osd数据,用7yuv工具查看正常。
echo dumpRgnBuf [Handle] [Path] > /proc/mi_modules/mi_rgn/mi_rgn0
查看proc信息:


打开原始数据,发现每个pixel的alpha值都是0,即对应背景Alpha,设置的alpha值为0,所以导致被透明掉了。修改u8BgAlpha为255,显示正常,问题解决。
stRgnChnPortParam.unPara.stOsdChnPort.stOsdAlphaAttr.eAlphaMode = E_MI_RGN_PIXEL_ALPHA; stRgnChnPortParam.unPara.stOsdChnPort.stOsdAlphaAttr.stAlphaPara.stArgb1555Alpha.u8BgAlpha = 0xFF; stRgnChnPortParam.unPara.stOsdChnPort.stOsdAlphaAttr.stAlphaPara.stArgb1555Alpha.u8FgAlpha = 0xFF;
ExecFunc(MI_RGN_AttachToChn(0, hHandle, &pstOsdAttr->stRgnChnPort, &stRgnChnPortParam), MI_RGN_OK);
Q7:RGN OSD 背景能否设置透明度?
可以设置,根据alpha mode的不同,设置方式略有差异。
-
E_MI_RGN_CONSTANT_ALPHA 模式
stChnPortParam1.unPara.stOsdChnPort.stOsdAlphaAttr.eAlphaMode = E_MI_RGN_CONSTANT_ALPHA; stChnPortParam1.unPara.stOsdChnPort.stOsdAlphaAttr.stAlphaPara. u8ConstantAlpha = u8A0;
参数 说明 u8ConstantAlpha Constant Alpha时Alpha值设定,取值范围0~0xFF。 -
E_MI_RGN_PIXEL_ALPHA 模式
stChnPortParam1.unPara.stOsdChnPort.stOsdAlphaAttr.eAlphaMode = E_MI_RGN_PIXEL_ALPHA; stChnPortParam1.unPara.stOsdChnPort.stOsdAlphaAttr.stAlphaPara. stArgb1555Alpha.u8BgAlpha = 0x3f; stChnPortParam1.unPara.stOsdChnPort.stOsdAlphaAttr.stAlphaPara. stArgb1555Alpha.u8FgAlpha = 0xff;
参数 说明 u8BgAlpha 背景Alpha,Alpha bit为0时对应的Alpha值,取值范围0~0xFF。 u8FgAlpha 前景Alpha, Alpha bit为1时对应的Alpha值,取值范围0~0xFF。