如下图这是200s手册上写的将YUV转换为RGB的算法。 这个东西改怎么配置才能正常的将YUV转为RGB呢?这里每个系数的值都是可以配置的,就是不知道该设置成什么值导致LCD上显示的图有色差。
下图中左上角是layer1层YUV转RGB的图 右下角是我通过网上查找的算法转的RGB显示在layer0的图。
下面是网上找的将YUYV转RGB的算法转换后得到上图右下角的图。请大佬出手算下参数。
离线
你标题上写个DE我还要以为你要用硬件转呢 一点进来发现是软件转
软件转很慢的 f1c的话还是操作libdrm使的fb直接显示yuv吧
离线
你标题上写个DE我还要以为你要用硬件转呢 一点进来发现是软件转
软件转很慢的 f1c的话还是操作libdrm使的fb直接显示yuv吧
你可能没注意看,我就是要用硬件的display engine转,左上角就是硬件yuv转的rgb但是明显变色了,转换系数不对,右下角是软件转的,只是看下有没有大佬会算,给出来参考下。
然后linux上f1c的有实现硬件yuv转rgb吗?能否给个链接,非常感谢。之前看别人说用过libdrm没效果可能sdk不对。
最近编辑记录 vip888888 (2020-10-27 22:31:50)
离线
逸俊晨晖 说:你标题上写个DE我还要以为你要用硬件转呢 一点进来发现是软件转
软件转很慢的 f1c的话还是操作libdrm使的fb直接显示yuv吧你可能没注意看,我就是要用硬件的display engine转,左上角就是硬件yuv转的rgb但是明显变色了,转换系数不对,右下角是软件转的,只是看下有没有大佬会算,给出来参考下。
然后linux上f1c的有实现硬件yuv转rgb吗?能否给个链接,非常感谢。之前看别人说用过libdrm没效果可能sdk不对。
确实没认真看
注意fb颜色空间格式是rgb还是其它顺序
我也没见过人家用 之前我用两层rgb叠层 发现透明度是有问题的 可能驱动有问题
离线
通过上面公式拆解,可以得到rgb和yuv的直接公式如下:
r = (y + (359 * v)) >> 8; = y/256 + (359*(V-128))/256 = y + (359*V - 45952)/256 = y+ 1.40234375*v - 179.5
g = (y - (88 * u) - (183 * v)) >> 8; =y/256 -(88*(u-128))/256 - (183*(v-128))/256 = y -(88*u-11264)/256 - (183*v-23424)/256=y -0.34375u+44 -0.71484375*v + 91.5 = y-0.34375u-0.71484375*v + 135.5
b = (y + (454 * u)) >> 8; = y/256 + (454*(u-128))/256 = y + (454u-58112)/256 = y + 1.7734375u - 227
统一下就是:
r =y+ 1.40234375*v - 179.5
g =y-0.34375u-0.71484375*v + 135.5
b =y + 1.7734375u - 227
但是和这个公式一配比的话,他这个系数无法变为负数,最后那个常量也无法变为负数了。所以此公式也对应不上呀。
要么就用已知的YUV 和RGB的值套上全志手册的公式解12次一元一次方矩阵?以此得到系数?或者有没有大佬已经有系统跑通了的可以读取下0x01E60950 - 0x01E60980的值给来参考下。
离线
你用的硬件转rgb速度怎么样?代码能分享下看看么
离线
你用的硬件转rgb速度怎么样?代码能分享下看看么
这不是还没成功嘛。转的不对呀,还没搞定呢。
最近编辑记录 vip888888 (2020-10-29 22:45:15)
离线
关注,期待楼主好消息
离线
f1c100_ 说:你用的硬件转rgb速度怎么样?代码能分享下看看么
这不是还没成功嘛。转的不对呀,还没搞定呢。
我的意思是我也研究下:),看瞎搞能不能跑通
离线
这个可以转的,我看过别人的视频。
离线
大神,这个功能现在是否完善了,想向您学习一下,能否留一下联系方式。
离线
大神,这个功能现在是否完善了,想向您学习一下,能否留一下联系方式。
使用图层yuv转RGB功能参数如下:
static const uint32_t csc_tab[4][12] =
{
//Y/G Y/G Y/G Y/G U/R U/R U/R U/R V/B V/B V/B V/B
//bt601
0x04a8, 0x1e70, 0x1cbf, 0x0878, 0x04a8, 0x0000, 0x0662, 0x3211, 0x04a8, 0x0812, 0x0000, 0x2eb1, //yuv2rgb
//bt709
0x04a8, 0x1f26, 0x1ddd, 0x04d0, 0x04a8, 0x0000, 0x072c, 0x307e, 0x04a8, 0x0876, 0x0000, 0x2dea, //yuv2rgb
//DISP_YCC
0x0400, 0x1e9e, 0x1d24, 0x087b, 0x0400, 0x0000, 0x059c, 0x34c8, 0x0400, 0x0716, 0x0000, 0x31d5, //yuv2rgb
//xvYCC
0x04a8, 0x1f26, 0x1ddd, 0x04d0, 0x04a8, 0x0000, 0x072c, 0x307e, 0x04a8, 0x0876, 0x0000, 0x2dea, //yuv2rgb
};
uint32_t Tn = 1;
write32((virtual_addr_t)F1C100S_DEBE_BASE + 0x950, (csc_tab[Tn][0])); //G
write32((virtual_addr_t)F1C100S_DEBE_BASE + 0x954, (csc_tab[Tn][1]));
write32((virtual_addr_t)F1C100S_DEBE_BASE + 0x958, (csc_tab[Tn][2]));
write32((virtual_addr_t)F1C100S_DEBE_BASE + 0x95C, (csc_tab[Tn][3]));
write32((virtual_addr_t)F1C100S_DEBE_BASE + 0x960, (csc_tab[Tn][4])); //R
write32((virtual_addr_t)F1C100S_DEBE_BASE + 0x964, (csc_tab[Tn][5]));
write32((virtual_addr_t)F1C100S_DEBE_BASE + 0x968, (csc_tab[Tn][6]));
write32((virtual_addr_t)F1C100S_DEBE_BASE + 0x96C, (csc_tab[Tn][7]));
write32((virtual_addr_t)F1C100S_DEBE_BASE + 0x970, (csc_tab[Tn][8])); //B
write32((virtual_addr_t)F1C100S_DEBE_BASE + 0x974, (csc_tab[Tn][9]));
write32((virtual_addr_t)F1C100S_DEBE_BASE + 0x978, (csc_tab[Tn][10]));
write32((virtual_addr_t)F1C100S_DEBE_BASE + 0x97C, (csc_tab[Tn][11]));
离线