您尚未登录。

楼主 #1 2020-10-27 17:03:57

vip888888
会员
注册时间: 2020-07-16
已发帖子: 141
积分: 138

F1c200s display engine 通过layer将YUV转RGB系数配置问题

如下图这是200s手册上写的将YUV转换为RGB的算法。 这个东西改怎么配置才能正常的将YUV转为RGB呢?这里每个系数的值都是可以配置的,就是不知道该设置成什么值导致LCD上显示的图有色差。
yuv1.png
下图中左上角是layer1层YUV转RGB的图 右下角是我通过网上查找的算法转的RGB显示在layer0的图。
yuv2.jpg

下面是网上找的将YUYV转RGB的算法转换后得到上图右下角的图。请大佬出手算下参数。
yuv3.png

离线

#2 2020-10-27 21:14:34

逸俊晨晖
会员
注册时间: 2018-08-29
已发帖子: 151
积分: 137.5

Re: F1c200s display engine 通过layer将YUV转RGB系数配置问题

你标题上写个DE我还要以为你要用硬件转呢 一点进来发现是软件转
软件转很慢的 f1c的话还是操作libdrm使的fb直接显示yuv吧

离线

楼主 #3 2020-10-27 22:30:33

vip888888
会员
注册时间: 2020-07-16
已发帖子: 141
积分: 138

Re: F1c200s display engine 通过layer将YUV转RGB系数配置问题

逸俊晨晖 说:

你标题上写个DE我还要以为你要用硬件转呢 一点进来发现是软件转
软件转很慢的 f1c的话还是操作libdrm使的fb直接显示yuv吧

你可能没注意看,我就是要用硬件的display engine转,左上角就是硬件yuv转的rgb但是明显变色了,转换系数不对,右下角是软件转的,只是看下有没有大佬会算,给出来参考下。

然后linux上f1c的有实现硬件yuv转rgb吗?能否给个链接,非常感谢。之前看别人说用过libdrm没效果可能sdk不对。

最近编辑记录 vip888888 (2020-10-27 22:31:50)

离线

#4 2020-10-29 00:27:54

逸俊晨晖
会员
注册时间: 2018-08-29
已发帖子: 151
积分: 137.5

Re: F1c200s display engine 通过layer将YUV转RGB系数配置问题

vip888888 说:
逸俊晨晖 说:

你标题上写个DE我还要以为你要用硬件转呢 一点进来发现是软件转
软件转很慢的 f1c的话还是操作libdrm使的fb直接显示yuv吧

你可能没注意看,我就是要用硬件的display engine转,左上角就是硬件yuv转的rgb但是明显变色了,转换系数不对,右下角是软件转的,只是看下有没有大佬会算,给出来参考下。

然后linux上f1c的有实现硬件yuv转rgb吗?能否给个链接,非常感谢。之前看别人说用过libdrm没效果可能sdk不对。

确实没认真看
注意fb颜色空间格式是rgb还是其它顺序
我也没见过人家用 之前我用两层rgb叠层 发现透明度是有问题的 可能驱动有问题

离线

楼主 #5 2020-10-29 14:18:21

vip888888
会员
注册时间: 2020-07-16
已发帖子: 141
积分: 138

Re: F1c200s display engine 通过layer将YUV转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
yuv1.png
但是和这个公式一配比的话,他这个系数无法变为负数,最后那个常量也无法变为负数了。所以此公式也对应不上呀。

要么就用已知的YUV 和RGB的值套上全志手册的公式解12次一元一次方矩阵?以此得到系数?或者有没有大佬已经有系统跑通了的可以读取下0x01E60950 - 0x01E60980的值给来参考下。

离线

#6 2020-10-29 18:55:59

f1c100_
会员
注册时间: 2020-09-22
已发帖子: 32
积分: 20.5

Re: F1c200s display engine 通过layer将YUV转RGB系数配置问题

你用的硬件转rgb速度怎么样?代码能分享下看看么

离线

楼主 #7 2020-10-29 22:44:59

vip888888
会员
注册时间: 2020-07-16
已发帖子: 141
积分: 138

Re: F1c200s display engine 通过layer将YUV转RGB系数配置问题

f1c100_ 说:

你用的硬件转rgb速度怎么样?代码能分享下看看么

这不是还没成功嘛。转的不对呀,还没搞定呢。

最近编辑记录 vip888888 (2020-10-29 22:45:15)

离线

#8 2020-10-30 00:13:02

微凉VeiLiang
会员
所在地: 深圳
注册时间: 2018-10-28
已发帖子: 627
积分: 522
个人网站

Re: F1c200s display engine 通过layer将YUV转RGB系数配置问题

关注,期待楼主好消息

离线

#9 2020-10-30 00:42:09

f1c100_
会员
注册时间: 2020-09-22
已发帖子: 32
积分: 20.5

Re: F1c200s display engine 通过layer将YUV转RGB系数配置问题

vip888888 说:
f1c100_ 说:

你用的硬件转rgb速度怎么样?代码能分享下看看么

这不是还没成功嘛。转的不对呀,还没搞定呢。

我的意思是我也研究下:),看瞎搞能不能跑通

离线

#10 2020-10-30 20:57:11

sprintf
会员
注册时间: 2020-09-11
已发帖子: 50
积分: 45

Re: F1c200s display engine 通过layer将YUV转RGB系数配置问题

这个可以转的,我看过别人的视频。

离线

#11 2021-09-19 21:41:09

45074810
会员
注册时间: 2020-09-27
已发帖子: 3
积分: 1.5

Re: F1c200s display engine 通过layer将YUV转RGB系数配置问题

大神,这个功能现在是否完善了,想向您学习一下,能否留一下联系方式。

离线

#12 2023-09-23 15:09:35

sjshe3326
会员
注册时间: 2020-10-19
已发帖子: 125
积分: 69.5

Re: F1c200s display engine 通过layer将YUV转RGB系数配置问题

45074810 说:

大神,这个功能现在是否完善了,想向您学习一下,能否留一下联系方式。

使用图层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]));

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn