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.

[参考译文] J784S4XEVM:GStreamer:edgeai-gst-plugins、openvx 和 dma-buf 互操作性

Guru**** 2568585 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1540572/j784s4xevm-gstreamer-edgeai-gst-plugins-openvx-and-dma-buf-interoperability

器件型号:J784S4XEVM


工具/软件:

您好、

我们正在 Gstreamer 流水线中使用 edgeai-gst-plugins 与 OpenVX 和 v4l2h265enc。 当 v4l2h265enc 使用 dma-buf 导入时、我们注意到图像损坏。 我们的“简化“流程:

gst-launch-1.0 videotestsrc pattern=SMPTE num-buffers=30 ! video/x-raw、格式=NV12、宽度=1920、高度=1080、帧速率=30/1! tiovxmultiscaler !  video/x-raw、格式=NV12、宽度=1280、高度=720、帧速率=30/1  ! 我们的自定义元素! tiovxmemalloc! video/x-raw、strip-y-align=32! v4l2h265enc output-io-mode=5! h265parse! mp4mux! filesink location=/tmp/out.mp4 sync=false -v  

通过这一流水线、我们可以看到图像损坏、如下所示:

损坏模式不一致、并且会因帧而异。 这看起来像是缓存一致性问题。 但是、不使用 dma-buf 导入 (output-IO-mode=0) 的流水线可以正常工作。 但这会导致视频帧复制、出于性能原因、我们需要避免该复制。

gst-launch-1.0 videotestsrc pattern=SMPTE num-buffers=30 ! video/x-raw、格式=NV12、宽度=1920、高度=1080、帧速率=30/1! tiovxmultiscaler !  video/x-raw、格式=NV12、宽度=1280、高度=720、帧速率=30/1  ! 我们的自定义元素! tiovxmemalloc! video/x-raw、strip-y-align=32! v4l2h265enc output-io-mode=0! h265parse! mp4mux! filesink location=/tmp/out.mp4 sync=false -v  



our_custom_Element:在这种情况下、我们的自定义 GStreamer 元素非常简单。 它只是从缓冲区中获取 vx_image、映射它、设置内容、然后取消映射它。 下面是展示该损坏情况的示例代码。 在工作和非工作的情况下,我们的自定义元素是相同的。 仅当 v4l2h265enc output-io-mode=5 时才会发生损坏。


static GstFlowReturn gst_tiovx_custom_transform_ip(GstBaseTransform *trans, GstBuffer *buf)
{	
	auto self{trans};
	vx_uint32 constexpr OVX_ARRAY_PRIMARY_IMAGE_INDEX{0};
	auto meta{reinterpret_cast<GstTIOVXImageMeta *>(gst_buffer_get_meta(buf, GST_TYPE_TIOVX_IMAGE_META_API))};
	if (not meta)
	{
		GST_ERROR("gst_buffer_get_meta failed: GstTIOVXImageMeta missing!");
		return GST_FLOW_ERROR;
	}
	vx_reference fullImageReference{vxGetObjectArrayItem(meta->array, OVX_ARRAY_PRIMARY_IMAGE_INDEX)};
	if (not fullImageReference) {
		GST_ELEMENT_ERROR(self, STREAM, FAILED, ("vxGetObjectArrayItem failed"), (NULL));
		return GST_FLOW_ERROR;
	}

	const int patchX = 320;
	const int patchY = 180;

	vx_image fullImage{reinterpret_cast<vx_image>(fullImageReference)};
	vx_rectangle_t const rect = {patchX, patchY, patchX*3, patchY*3};
	vx_map_id map_id{};
	void *ptr{nullptr};
	vx_imagepatch_addressing_t addr{};

	for (vx_uint32 plane{0}; plane < NV12_PLANE_COUNT; ++plane)
	{
		if (vxMapImagePatch(fullImage, &rect, plane, &map_id, &addr, &ptr, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST, VX_NOGAP_X) != VX_SUCCESS)
		{
			GST_ELEMENT_ERROR(self, STREAM, FAILED, ("vxMapImagePatch failed"), (NULL));
			return GST_FLOW_ERROR;
		}

		auto const yRows{addr.dim_y * addr.scale_y / VX_SCALE_UNITY};
		for (vx_uint32 y = 0; y < yRows; y++)
		{
			vx_uint8 *rowPtr = (vx_uint8 *)ptr + y * addr.stride_y;
			auto const xBytes{addr.dim_x  * addr.stride_x * addr.scale_x / VX_SCALE_UNITY};
			memset(rowPtr, 0,xBytes);
		}

		if (vxUnmapImagePatch(fullImage, map_id) != VX_SUCCESS)
		{
			GST_ELEMENT_ERROR(self, STREAM, FAILED, ("vxUnmapImagePatch failed"), (NULL));
			return GST_FLOW_ERROR;
		}
	}
	vxReleaseReference (&fullImageReference);
	
	return GST_FLOW_OK;
}


您能看看这个并帮助解决问题吗? 是否存在任何互操作性问题? 这里是否有我们为了保持 tiovx 和 DMA buf 一致而错过的任何内容

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

    您好:  

    感谢您的问题。 我将研究这一点并提供更新。

    此致、
    Sarabesh S.

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

    您好、 Sarabesh Srinivasan 

    对此有任何更新?

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

    您好:  

    您使用的是哪个 SDK 版本?

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

    我们现在正在使用 SDK 10.01、但我们将切换到 SDK 11。

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

    您好:  

    谢谢、我会尝试一些管道来复制、并告诉您我的结果。

    此致、
    Sarabesh S.

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

     您好、 Sarabesh Srinivasan 

     对此有什么新内容?

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

    您好:  

    是的、我想跟进、以便仅在使用 edgeai tiovx 插件时您是否存在该问题。 如果将其移除、输出是否不再损坏?

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

    如果没有 edgeai tiovx 、缓冲区不是 vx_image、因此我们仅与 edgeai tiovx 插件一起使用自定义插件。

    只有当我们使用 vxMapImagePatch/vxUnmapImagePatch 并修改映像时、输出才会损坏。

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

    好的、感谢您提供的信息。 我将咨询 edge-ai 团队以获取他们的意见。 由于正在进行升级、请预计会出现延迟。 感谢您的耐心。

    此致、
    Sarabesh S.

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

    对此有任何更新?

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

    尊敬的 Bartosz:  

    由于编码器可以参考 v4l2 摄像头 src 或显示接收端缓冲区、因此不可避免地会发生一些存储器副本。 如果在 DMA-BUF 流水线中取出自定义元素、您是否仍会在输出中看到错误? 此外、请确保在流水线中使用“tiovxmemalloc pool-size=8“指定 poolsize。

    此致、
    Sarabesh S.

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

    您好、 Sarabesh Srinivasan 

    没错、某些存储器副本是不可避免的。 但是、我们需要专注于消除我们可以避免的问题。 这对于实现良好的性能至关重要、因为随着我们运行更多的并行流水线、该性能会迅速下降。

    需要明确的是、不存在元素时不会发生存储器损坏。 仅在vxMapImagePatchvxUnmapImagePatch将/与配合使用时才会出现问题dmabuff

    为了您的参考,腐败不会发生,如果我们明确调用appMemCacheWb. 缓存刷新通常是vxMapImagePatchvxUnmapImagePatch其他平台上/函数的一部分。 但是、J784S4 平台已禁用此功能、因为此功能应与缓存一致、不需要手动刷新。 我的测试表明此功能无法正常工作。

    -> https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1034892/tda4vm-why-appmemcachewb-is-blocked-for-a72-in-tivxmembufferunmap?tisearch=e2e-sitesearch&keymatch=

    不幸的是、手动呼叫appMemCacheWb对我们来说不是可行的解决方案。 我们可能使用无法修改的代码、vxImage使用标准vxMapImagePatch/vxUnmapImagePatch函数处理这些代码。

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

    您好:

    我理解并感谢这些细节。 由于对 Vision Apps 的依赖性很强、我将在更大的团队中回首他们的想法。  

    谢谢、

    Sarabesh S.

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

    嘿 Sarabesh Srinivasan ,在这一个的任何运动?

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

    您好:  

    对延迟深表歉意。 我们已经看到类似的错误正在被调查。 高速缓存一致性实际上只是来自 OpenVX 端的交换机、由 Linux 在后端进行处理 我与团队沟通过、团队采取的行动取决于我们的 Linux 团队。 我正在对错误进行归档、并将在更新时提供更新。 我们非常感谢您对此的耐心等待。

    谢谢、
    Sarabesh S.

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

    您好、 Sarabesh Srinivasan 

    感谢您的更新。 您是否有修复的预计时间线?

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

    尊敬的 Bartosz:

    实际上、我仍在咨询团队、了解 j784s4 的缓存一致性协议以及 wave5 是否完全缓存一致性。 当前没有时间线。 我将在得到解决方案时提供选项。  

    谢谢您、
    Sarabesh S.

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

    您好:  

    我们做了一些调查,并找到了几个路径,你可以采取来得到一个解决。  

    1.第一种解决方法是删除用于停止 A72 内核的 appMemCacheWb () 的#ifndef。 您可以在 tivxMemBufferUnmap 函数定义下的/ti-processor-sdk-rtos-j721s2-evm-10_01_00_04/tiovx/source/platform/psdk_j7/common/tivx_mem.c 中找到此信息。 然后重新编译和编译(此处)。  

    2.第二,更多的是一个诊断步骤,以帮助我们确定问题发生在哪里。 这是为了禁用器件树 (k3-j784s4-j742s2-common.dtsi) 中的 MSMC L3 高速缓存节点、然后检查是否仍然存在损坏。 如果不是、那么我们知道问题出在 MSMC L3 高速缓存上。

    请告诉我您的结果。

    谢谢您、
    Sarabesh S.

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

    您好、 Sarabesh Srinivasan 

    如何更改文件? 从 L2_0 和 L2_1 删除“下一级缓存“行? 我是否还需要删除整个“MSMC_L3"部分“部分?
       

      L2_0: l2-cache0 {
                    compatible = "cache";
                    cache-level = <2>;
                    cache-unified;
                    cache-size = <0x200000>;
                    cache-line-size = <64>;
                    cache-sets = <1024>;
                    next-level-cache = <&msmc_l3>;
            };
    
            L2_1: l2-cache1 {
                    compatible = "cache";
                    cache-level = <2>;
                    cache-unified;
                    cache-size = <0x200000>;
                    cache-line-size = <64>;
                    cache-sets = <1024>;
                    next-level-cache = <&msmc_l3>;
            };
    
            msmc_l3: l3-cache0 {
                    compatible = "cache";
                    cache-level = <3>;
                    cache-unified;
            };


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

    您好、  

    让我检查一下这些确切步骤是什么、我将返回给您。

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

    Sarabesh Srinivasan 

    有什么关于这方面的消息吗?

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

    您好、

    是的、我找到了几 种不同的方法来修改 MSMC 大小。 如果您使用 u-boot、最好的方法是在 Linux 中修改 u-boot 配置、并在 SDK 中重新编译 u-boot 二进制文件并将它们复制到 SD 卡中。

    在 10.01 Linux SDK 中、您可以在此处找到 MSMC-cache-size 参数:
    ti-processor-sdk-linux-adas-j721s2-evm-10_01_00_04/board-support/ti-u-boot-2024.04+git/board/ti/j784s4/ board-cfg.yaml

    将参数修改为 0x0  从顶层开始运行  生成 u-boot

    然后将目标映像 (tiboot3.bin、tispl.bin、u-boot.img) 复制到 SD 卡的引导分区上

    您可以在此处找到运行 make u-boot 的所有依赖项: 链接

    另一种方法是   在 vision-apps 中使用生成器链接器脚本、并将 MSMC SRAM 大小参数全部修改为 0。 按照 SDK 文档中此处的说明进行操作:
    https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-j721s2/10_01_00_04/exports/docs/psdk_rtos/docs/user_guide/developer_notes_memory_map.html

    谢谢、
    Sarabesh S.