This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux/AM5728:捕获 VPE 显示问题

Guru**** 2943400 points

Other Parts Discussed in Thread: TVP5158

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/660340/linux-am5728-capture-vpe-display-issues

器件型号:AM5728
主题中讨论的其他器件:TVP5158

工具/软件:Linux

您好!

我向 Capturedisplay 添加了 cmem 支持(双摄像机的 leran)

我尝试让我们的电路板像这样工作:

摄像头--YUV--> VPE --RGB24-->显示屏

然后:

四通道显示704 288 yuv 704 576 rgb24 1 3 s 31:1920x1080

输出为:

VIP:G_FMT (START):宽度= 704、高度= 288、4cc = YUYV
VPE i/p:G_FMT:宽度= 704、高度= 288、4cc = YUV
VPE o/p:G_FMT:宽度= 704、高度= 576、4cc = RGB3

分配大小为0xc6000的 cmem 缓冲器
错误:alloc_buffer:175:drmModeAddFB2失败:无效参数(-22)
错误:get_cmem_buffers:198:分配失败
分配 addr b1467000的 cmem 缓冲区

分配显示缓冲区失败

我的问题是:

我认为 VPE 工作正常、所以问题出在 drmModeAddFB2的第三个参数上  

int drmModeAddFB2 (int FD、uint32_t width、uint32_t height、
uint32_t pixel_format、uint32_t bo_handles[4]、
uint32_t pines[4]、uint32_t offset[4]、
uint32_t * buf_id、uint32_t 标志);

它不 是0x33424752 (RGB3)、那么它应该是什么?

2. My CMEM 为默认值:

40500000-405ffff:CMEM
a0000000-abffff:CMEM

但是,为什么分配的 cmem 地址 是 bb1467000。对吗?

此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否先尝试将 VPE 的输出设置为 nv12? 还共享传递给 drmModeAddFB2() API 的所有参数的值。

    /capturrevpedisplay 704 288 yuyv 704 576 nv12 1 0 -s 31:1920x1080
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    nv12也会失败。但是 yuyv 可以。

    VPE:/dev/video0打开成功!!![ 136.283158] TVP5158 2-0058:检测到 PAL 视频

    输入= 704 x 288、1448695129
    输出= 704 x 576、842094158
    VIP 开放成功!!!
    使用1个连接器、1920x1080显示屏、多平面:1.
    在连接器31、CRTC 34上设置模式1920x1080
    [136.577464] TVP5158 2-0058:检测到 PAL 视频
    VIP:G_FMT (START):宽度= 704、高度= 288、4cc = YUYV
    VPE i/p:G_FMT:宽度= 704、高度= 288、4cc = YUV
    VPE o/p:G_FMT:宽度= 704、高度= 576、4cc = NV12

    分配大小为0xc6000的 cmem 缓冲器
    错误:alloc_buffer:163:drmModeAddFB2失败:无效参数(-22)
    错误:get_cmem_buffers:186:分配失败

    吹气是我的代码:

    int bytes_pp = 3;

    偏移[4]={0};
    buf->fourcc = fourcc;
    buf->width = w;//704
    buf->height = h;//576
    buf->nbo = 1;
    buf->螺 距[0]= w*bytes_pp;//w*3

    buf->fd[0]= alloc_cmem_buffer (w*h*bytes_pp,1,&buf->cmem_buf);

    if (buf->fd [0]< 0){
    FREE_cmem_buffer (buf->cmem_buf);
    printf ("无法导出 CMEM 缓冲区\n")");
    返回空;

    buf->bo[0]= omap_bo_from_dabuf (display->dev、buf->fd[0]);
    if (buf->bo[0]){
    BO_Handles [0]= OMAP-BO_Handle (buf->bo[0]);

    RET = drmModeAddFB2 (display->fd、buf->width、buf->height、fourcc、
    BO_Handles、buf->puts, offsets,&buf->fb_id,0);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    原始 captuprepedisplay 演示可与 nv12输出配合使用。 nv12格式的 bytes_pp 要求为1.5。 您能否首先使用 OMAP-DRM 为 nv12输出分配的原始缓冲区来运行演示? 确保这正常工作、从 原始演示中将输入参数打印到 drmModeAddFB2、然后将缓冲区分配切换到 CMEM、将输入与 工作解决方案和非工作解决方案中的 drmModeAddFB2进行比较。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Manisha

    我们尝试通过自己来转换颜色。

    e2e.ti.com/.../0181.capturevpedisplay.c

    e2e.ti.com/.../vpe_2D00_common.c

    我分配的 cmem:

    块1:池0:6 bufs 大小0xc6000 (请求0xc6000)

    池0忙缓冲区:

    池0免费 bufs:
    ID 0:phys addr bcf3a000
    ID 1:phys addr bce74000
    ID 2:phys addr bcdae000
    ID 3:phys addr bcce8000
    ID 4:phys addr bcc22000
    ID 5:phys addr bb5c000

    块1:池1:1 bufs 大小0x129000 (请求0x129000)

    池1忙缓冲区:

    池1免费 bufs:
    ID 0:phys addr bc96d000

    HDMI 上的输出将抖动,我找不到这是什么问题。请帮助我们。

    下面是我 之前存储的图像。您可以看到图像向上移动一行。

    e2e.ti.com/.../yuv.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我了解了使用 VPE 进行 yuv 至 rgb24转换的 capturrevpedisplay 应用程序。 我发现问题在于 V4L2和 DRM 框架之间的 fourcc 格式不兼容。 它们对于 yuyv 和 nv12是相同的、因此适用于这两种格式。 但对于 RGB 格式、这两个框架中的规格不同。

    FourCC ('R'、'G'、'B'、'3')或 V4L2中的 FourCC ('B'、'G'、'R'、'3')在 DRM 框架中转换为 FourCC ('R'、'G'、'2'、'4')。

    我在 display-kms.c 文件中的 alloc_buffer()函数内的 switch()部分中添加了以下部分
    案例 FourCC ('B'、'G'、'R'、'3'):
    案例 FourCC ('R'、'G'、'2'、'4'):
    FourCC =FourCC ('R'、'G'、'2'、'4');
    buf->nbo = 1;
    buf->bo[0]= alloc_bo (disp、24、buf->width、buf->height、
    &bo_handles [0]、&buf->螺 距[0]);
    中断;
    案例 FourCC ('a'、'R'、'2'、'4'):
    案例 FourCC ('R'、'G'、'B'、'4'):
    FourCC = FourCC ('A'、'R'、'2'、'4');
    buf->nbo = 1;
    buf->bo[0]= alloc_bo (disp、32、buf->width、buf->height、
    &bo_handles [0]、&buf->螺 距[0]);
    中断;

    通过这些更改、captuprepedisplay 应用程序可用于以下参数-
    #./Capturrevpedisplay 640 480 yuv 1920 1080 bgr24 0 1 -s 36:1920x1080

    您需要使用 CMEM 缓冲器对您的应用进行类似的更改。

    希望通过这些更改/修复、您无需使用基于软件的颜色转换、因此无需调试与此相关的显示问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Manisha

    在我尝试过您的建议后、它成功了。

    但在本演示中仍会出现问题。

    当我们尝试使用 buf->cmem_buf 进行一些处理(OpenCV)时。

    视频流将抖动。 没有提示时、视频流将正常显示。

    在我看来、CMEM 是 V4L2和 DRM 之间的份额缓冲器?

    是否有任何其他线程可以使用分配的这些 cmem buf。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Manisha
    我发现问题可能发生在 VPE 中吗?
    我尝试使用:
    /capturrevpedisplay 1920 1080 yuyv 1280 720 bgr24 0 3 -s 31:1920x1080 (__LW_AT__,无)
    要进行处理(OpenCV)、另一个摄像头(SDI 1080p)将会成功。
    如果我尝试:
    四通道显示704 288 yuv 704 576 bgr24 1 3 s 31:1920x1080
    HDMI 的显示将是抖动(如没有去花边)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    隔行显示功能已损坏、没有修复计划。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Manisha
    我知道 DSS 不支持隔行视频显示。
    这是否意味着、如果我们插入算法处理视频、VPE 将中断以进行去花边处理?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不明白您的意思-

    bulabula_yan 说:
    如果我们插入算法处理视频,将打破 VPE 以进行去花边操作?

    您的用例的数据流是什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Manisha

    我们的数据流是 PAL (576i)

    因此、我使用 Captuprepedisplay 演示来进行去花边操作、然后在 HDMI 上进行显示(576p)(将大小调整为1080p 或其他)

    我在 process()中添加了算法,在其中添加了:

    索引= VPE_OUTPUT (VPE);  // buf[index]-> cmem 指向 VPE 和 DRM 之间分配的指令  

    PROCESS (buf[index]-> cmem);  //our 算法

    display_buffer (VPE、index);  //display buf[index]-> cmem

    如果在本演示中插入我们的算法,VPE 将停止去隔行。

    HDMI 将显示576i 、而不使用隔行。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    VPE 不应取决于谁是输出缓冲器的使用者。

    您的算法是否需要大量时间、从而剥夺了 VPE 实时所需的缓冲器?
    如何禁用缓存的读/写操作、以确保缓存清理不会导致问题
    您还可以尝试从管道中删除显示并执行文件写入、并检查是否也看到 FileWrite 输出问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Manisha

    我尝试添加:

    usleep(5000);

    display_buffer (VPE、index);

    显示前。

    如果 usleep 大于2ms、则缓冲区将在某个时间隔行。

    我们的算法一次需要30ms、输入必须为 PAL (576i)。

    是否有任何解决方案?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果 VPE 每秒馈入50个隔行字段、则它将在一秒内生成50个隔行帧、并且显示屏也应预期以50 fps 的速率运行。 如果您的算法需要30ms、那么它会减慢整个流水线的速度。 该算法需要以生产者(VPE)和使用者(显示)的速度运行
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Manisha
    感谢您的回复。
    我想我知道你说什么。
    VPE 将在 PAL (50个字段)中输出50帧并进行隔行扫描。
    但我们可以使用大约20ms。对吧?
    为什么我只添加5ms (usleep(5000);)会导致滑索混乱?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不知道您的应用正在进行什么以及该算法在执行什么操作、因此无法评论插入2ms 睡眠会产生什么影响。 我可以说的是、VPE 执行反交错操作并不取决于谁正在使用反交错帧。 VPE 应使用正确的参数设置正确地馈入输入和输出缓冲器、并且将按照指示执行。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Manisha

    下面是我在 Captualvepedisplay 中所做的操作:

    第327行:

    索引= VPE_OUTPUT (VPE);

    //usleep(5000);

    display_buffer (VPE、index);

    如上所述、我希望 使 usleep(5000)在我们的算法中执行。

    我发现如果 usleep 超过2ms、VPE 将 在该测试后断开带状线。

    在我看来,50帧 将保持在大约20毫秒左右,但为什么只有大约2毫秒?

    实际上、我们只需要 VPE 每秒输出25帧、这仍然是完成算法所需的更多时间。我尝试将交叉点字段设置为2、但失败了  

    e2e.ti.com/.../666961

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否可以尝试提高 VIP 和 VPE 的缓冲深度?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Manisha

    非常感谢  

    很不错!

    我将"NUMBUF"更改为12、VPE 的工作更加稳定。

    但有时它仍会抖动

    我尝试测量捕获-显示循环的时间。

    我发现显示有时不稳定。下面是我在 src 代码的 captupediaplay.c 行327中调试的内容

    Clock_gettime (clock_monotonic、&tp0);//tp0
    display_buffer (VPE、index);
    clock_gettime (clock_monotonic、&tp1);//tp1
    pre_time=tdiff_calc (&tp0、&tp1);
    printf ("total is tdiff =%lf_time"、\ms); 

    [输出]:

    总时间为 tdiff = 7.727317 ms
    总计为 tdiff = 19.982787ms
    总计为 tdiff = 7.717232ms
    总计为 tdiff = 7.735614ms
    总计为 tdiff = 7.746837ms
    总计为 tdiff = 7.749277ms
    总计为 tdiff = 7.723738ms
    总计为 tdiff = 7.727480ms
    总计为 tdiff = 7.675589ms
    总计为 tdiff = 7.718696ms
    总计为 tdiff = 7.718370ms
    总计为 tdiff = 2.509784ms
    总计为 tdiff = 2.298317ms
    总计为 tdiff = 3.245363 ms
    总计为 tdiff = 5.429814 ms
    总计为 tdiff = 7.704218ms
    总计为 tdiff = 7.629555ms
    总计为 tdiff = 7.623373ms
    总计为 tdiff = 7.714792ms
    总计为 tdiff = 7.694133ms
    总计为 tdiff = 6.831024ms
    总计为 tdiff = 7.660624 ms
    总计为 tdiff = 7.732197ms
    总计为 tdiff = 7.705032ms
    总计为 tdiff = 7.689090ms
    总计为 tdiff = 7.737403ms
    总计为 tdiff = 7.707635ms
    总计为 tdiff = 7.691856ms
    总计为 tdiff = 7.724389ms
    总计为 tdiff = 7.646798ms
    总时间为 tdiff = 7.708286ms
    总计为 tdiff = 7.756109 ms
    总计为 tdiff = 7.703243ms
    总计为 tdiff = 7.715280ms
    总计为 tdiff = 14.580302ms
    总计为 tdiff = 7.594094ms
    总计为 tdiff = 7.703243ms
    总时间为 tdiff = 7.733987ms
    总计为 tdiff = 7.737240ms
    总计为 tdiff = 7.687790ms
    总计为 tdiff = 7.742608ms
    总计为 tdiff = 7.658509ms
    总计为 tdiff = 7.729595ms
    总计为 tdiff = 7.73493ms
    总时间为 tdiff = 1.427237ms
    总计为 tdiff = 2.248216ms
    总计为 tdiff = 2.358829ms
    总计为 tdiff = 5.100251ms
    总计为 tdiff = 7.607107ms
    总计为 tdiff = 7.710725ms
    总计为 tdiff = 7.670710ms
    总计为 tdiff = 19.948464ms
    总计为 tdiff = 7.708448ms
    总计为 tdiff = 7.642242 ms
    总计为 tdiff = 7.684210ms

    它大约每50帧发生一次。( 很少显示需要15~16ms)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Manisha
    VPE 将以隔行扫描模式输出50帧。
    我发现我们的算法有时需要超过20ms。 我认为这就是为什么 VPE 滑线障碍.
    我能否在去隔行模式下配置 VPE 输出25fps?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="bulabula_yan"]我能否在去花边模式下配置 VPE 输出25fps?

    这不受支持。 如今、VPE 驱动器仅支持运动补偿去隔行、这将为接收到的每个磁场产生去隔行框架。 您可以尝试将备用字段提交给 VPE 以在应用程序中取消隔行。 我不知道这是否会起作用,或会影响图片的质素,因为它是在运动补偿方面。 VPE IP 支持空间去电弧、这在替代场下降方面可能效果更好、但 VPE 驱动程序不支持该功能。