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的不同,设置方式略有差异。

  1. 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。
  2. 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。