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.

[参考译文] AM62A7:如何将叠加写入 DSS 中的 VIDL 流水线

Guru**** 2477295 points
Other Parts Discussed in Thread: AM62P

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1458462/am62a7-how-to-write-overlay-to-vidl-pipeline-in-dss

器件型号:AM62A7
主题中讨论的其他器件:AM62P

工具与软件:

您好!

我想在 VID 流水线上流式传输视频、并将类似内容(分辨率、录制等)叠加到视频中。  

我不希望我的数据流因为该叠加计算而出现任何延迟。
我在 TRM 中遇到了 DSS、它具有叠加管理器和两个不同的流水线(VID 和 VIDL)
https://software-dl.ti.com/processor-sdk-linux/esd/AM62AX/10_00_00/exports/docs/linux/Foundational_Components /内核/DSSDisplay050/DSS7.html Kernel_Drivers

如何将我的主视频流式传输到 VID 流水线、以及如何将叠加流式传输到 VIDL 流水线?
假设我的视频流水线在下方、我的叠加流水线是另一个测试源。  

gst-launch-1.0 videotestsrc pattern=snow ! video/x-raw,format=UYVY,width=1920,height=1080 ! kmssink driver-name=tidss

如何在重叠流水线中流式传输?

注意:
我使用的是 Processor-SDK-Linux 9.2.0

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

    您好!

    我的一位同事尝试了以下方法:

    在 AM62A 上、我尝试了以下流水线:

    皮皮埃因:

    st-launch-1.0 -v videotestsrc ! video/x-raw、width=1920、height=1080、帧速率=30/1、format=NV12! 队列! gdkpixbufoverlay location=planets.png offset-x=400 offset-y=400! 队列! clockoverlay time-format="%D %H:%M:%S"! 队列! kmssink driver-name=tidss force-modesetting=true sync=false

    附加是我在流水线中引用的 planets.png

    运行流水线后的显示屏屏幕截图:

    此致、
    Krunal

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

    尊敬的 Krunal:

    我理解 gdkpixbufoverlay 提供了图像覆盖。 我想确保它能够真正访问显示子系统的 VIDL 流水线、否则 gstreamer 会通过视频进行基于 CPU 的渲染、并推送到缓冲区。

    因为我的终端应用会有所不同。 它在 CV 和播放中创建包含大量文本信息的帧。 我正在使用 appsrc 为它,现在我正在使用 kmssink 本身,但我不能在另一个平面播放任何其他视频。 要复制此情况、您可以尝试两个不同模式的 videotestsrc、并考虑将其中一个用于叠加。

    此外、我想问的是、像素的透明度信息是如何存储的?

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

    您好!

    根据我内部讨论、它使用的是 CPU。 我不知道有任何用于叠加层的 gstreamer 插件。 通常、我们有以下示例: https://software-dl.ti.com/processor-sdk-linux/esd/AM62PX/10_01_10_04/exports/docs/system/Demo_User_Guides / Display_Cluster_User_Guide .html。在本示例中、我们让 R5内核写入信号灯和 A53执行3D 渲染。 两个内容都被发送到显示屏、叠加管理器将组合帧缓冲区。 没有使用 GStreamer 的此类示例。

    此致、
    Krunal

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

    尊敬的 Krunal:

    我没有 AM62P 板来测试显示仪表组演示。 它也适用于 AM62A 吗?

    另外、我想知道如何处理 AM62A 下的像素透明度信息吗?

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

    是的、同样的概念也适用、因为 DSS 控制器是相同的。 请详细说明透明度请求吗?

    此致、
    Krunal  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="353402" url="~/support/processors-group/processors/f/processors-forum/1458462/am62a7-how-to-write-overlay-to-vidl-pipeline-in-dss/5600013 #5600013"]

    请详细说明透明度请求吗?

    [报价]

    基本上、像素将在 DPI 线路中以 UYVY 或 RGB 格式发送、是吗?
    在这两种格式中没有透明度的信息。

    但在发送像素之前、覆盖管理器还呈现组合颜色值以及透明度。
    您可以通过在后台运行 edgeai-gui-app、在终端中运行 gstreamer 测试命令来尝试该操作

    gst-launch-1.0 videotestsrc pattern=solid-color foreground-color=0x80FF0000 ! video/x-raw,height=1080,width=1920,format=BGRA,pixel-aspect-ratio=16/9 ! kmssink driver-name=tidss sync=false
    
    Where,
     #80FF0000 -> ARGB format

    这样将为您提供 α 为50%的红色透明镀层。 您可以尝试将宽度减半并使用 α 值来查看差异。

    现在、我的问题是、如何将该透明度信息提供给以字节为单位的重叠? 1个像素是否直接包含32字节(R-8、B-8、G-8、A-8)的信息? 或者、RGB 为24字节、透明度信息的输入方式是不同的?

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

    尊敬的 Krunal:

    仅供参考、每当我使用以下管道时、我都可以在特定平面上流式传输、但绝不能同时流式传输

    # FOR PLANE 31
    gst-launch-1.0 videotestsrc pattern=snow ! video/x-raw,format=UYVY,width=1920,height=1080 ! kmssink driver-name=tidss sync=false plane-id=31
    
    # FOR PLANE 41
    gst-launch-1.0 videotestsrc pattern=snow ! video/x-raw,format=UYVY,width=1920,height=1080 ! kmssink driver-name=tidss sync=false plane-id=41

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    现在、我的问题是、如何以字节为单位向叠加提供这种透明信息? 1个像素是否直接包含32字节(R-8、B-8、G-8、A-8)的信息? 或者、RGB 为24字节、透明度信息的输入方式不同?[/QUOT]

    关于此问题、请查看以下流程图的输入和输出格式:

    每个流水线输出都连接到单个重叠管理器。

    引用 TRM 中的以下内容:
    "

    对于组件数据大小小于/等于10位的 ARGB 源数据、复制逻辑(ARGB 扩展)通过将 MSB 复制到 LSB 将数据转换为 ARGB48:

    •当禁用调节(或不支持分频器)时、生成的 ARGB48数据直接提供给流水线输出;

    •当启用垂直缩放时、生成的 ARGB48数据首先截断为 ARGB8888、然后转换为 ARGB10101010 (通过 MSB 复制到 LSB)、然后再馈送到垂直缩放器输入;

    •当垂直缩放被禁用但启用了水平缩放时、生成的 ARGB48数据会直接提供给水平缩放器输入;

    "

    根据输入格式复制上述内容:  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    仅供参考、每当我使用以下流水线时、我都可以在特定平面上流式传输、但不能同时流式传输

    我们没有使用 GStreamer 显示此情况的示例、但我们有使用 modetest 的 C 代码示例。 您可以尝试  以下操作:

    root@am62pxx-evm:~# systemctl stop weston
    .
    .
    .
    root@am62pxx-evm:~# kmsprint
    Connector 0 (40) LVDS-1 (connected)
      Encoder 0 (39) NONE
        Crtc 0 (38) 1920x1200@60.00 150.275 1920/32/52/24/? 1200/24/8/3/? 60 (60.00) 0x0 0x48
          Plane 0 (31) fb-id: 55 (crtcs: 0 1) 0,0 1920x1200 -> 0,0 1920x1200 (AR12 AB12 RA12 RG16 BG16 AR15 AB15 AR24 AB24 RA24 BA24 RG24 BG24 AR30 AB30 XR12 XB12 RX12 XR15 XB15 XR24 XB24 RX24 BX24 XR30 XB30 YUYV UY
    VY NV12)
            FB 55 1920x1200
    Connector 1 (50) HDMI-A-1 (connected)
      Encoder 1 (49) NONE
        Crtc 1 (48) 1920x1080@59.93 138.500 1920/48/32/80/+ 1080/3/5/23/- 60 (59.93) 0x9 0x48
          Plane 1 (41) fb-id: 56 (crtcs: 0 1) 0,0 1920x1080 -> 0,0 1920x1080 (AR12 AB12 RA12 RG16 BG16 AR15 AB15 AR24 AB24 RA24 BA24 RG24 BG24 AR30 AB30 XR12 XB12 RX12 XR15 XB15 XR24 XB24 RX24 BX24 XR30 XB30 YUYV UY
    VY NV12)
            FB 56 1920x1080
    root@am62pxx-evm:~# 
    root@am62pxx-evm:~# 
    root@am62pxx-evm:~# 
    root@am62pxx-evm:~# modetest -M tidss -s 50@48:1920x1080 -s 40@38:1920x1200

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

    尊敬的 Divyansh:

    您所示的输出使用两个不同的显示屏。 但在我的情况下、我必须在连接单个显示器(HDMI-A-1)的同时访问两个平面。

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

    您好!

    我已实现到不同叠加组件(VID 流水线和 VIDL 流水线)的流式传输。 以下是详细信息。

    VID 流水线

    每当通过 kmssink 正常进行流式传输时、它都会使用 VID 流水线(在本例中为平面41) [请参阅此处]。 要在该流水线上流式传输、可以使用以下 gstreamer 命令。

    ## GST COMMAND
    gst-launch-1.0 videotestsrc pattern=snow ! video/x-raw,format=UYVY,width=1920,height=1080 ! kmssink driver-name=tidss sync=false
    
    ## GST COMMAND WITH SPECIFIC PLANE
    #  though both does the same, it will be better to specify plane when using two pipelines
    gst-launch-1.0 videotestsrc pattern=snow ! video/x-raw,format=UYVY,width=1920,height=1080 ! kmssink driver-name=tidss sync=false plane-id=41

    VIDL 流水线

    tidss 驱动程序正在创建虚拟帧缓冲区、通常用于运行 GUI 内容。 这个虚拟帧缓冲区连接到 VIDL 管道(在我的例子:平面31)。 要在该流水线上流式传输、可以使用以下 gstreamer 命令。

    gst-launch-1.0 videotestsrc pattern=ball ! video/x-raw,format=BGRx,width=1920,height=1080 ! fbdevsink sync=false

    重要提示

    1.平面位置

    您可以配置哪个平面应与其他平面重叠。 由于 framebuffer 的同步功能不是很好、因此最好为 GUI 使用 framebuffer。
    您可以使用配置平面重叠 Zpos 属性中捕获。 [请参阅]

    modetest -M tidss -w 31:zpos:1 -w 41:zpos:0
    
    # In tisdk-edgeai-image, there is a init script (/opt/edgeai-gst-apps/init_script.sh) running to change the z position. Either remove the modetest line or apply your changes there

    2.透明度

    帧缓冲区当前无法配置为像素透明。 为了使 GUI 透明、可以使用 α  属性中捕获。 则它会应用于整个平面

    modetest -M tidss -w 31:alpha:6553  
    # The above command sets 10% alpha
    # values range from 0 to 65535

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

    尊敬的 Divyansh 和 Krunal:

    虽然我实现了我在问题中提出的要求,我 需要进一步支持像素透明的帧缓冲。

    我是否应该继续以同一主题进行讨论? 或者我应该打开新主题吗?

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

    由于您的查询与此主题不同、因此最好启动一个新的查询。