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.

TDA4VE-Q1: sdk8.5 vxSwapImageHandle

Part Number: TDA4VE-Q1


Hi ti

我们在7.3版本的sdk上面已经成功使用vxSwapImageHandle函数来零拷贝,现在切换到8.5sdk上面,使用vxSwapImageHandle函数有一些问题

1、在8.5sdk上面,nv12格式的image的y分量和uv分量的物理地址是连续的,所以一个image只能转换成一个dma fd

2、vxSwapImageHandle的参数是虚拟地址,在8,5的sdk下面一个nv12格式的image只有一个虚拟地址(因为只有一个dma fa),但是vxSwapImageHandle的参数中需要两个虚拟地址(y分量的虚拟地址和uv分量的虚拟地址)

请问如何解决这个问题,期待回复

  • 您好,我们已收到您的问题并升级到英文论坛寻求帮助,链接如下,如有答复将尽快回复您:

    e2e.ti.com/.../tda4ve-q1-sdk8-5-vxswapimagehandle

  • 还没有得到该问题的回复

  • 抱歉,该条线回复较慢一些,我们来催促下工程师看下。

  • 您好,

    工程师这边回复如下:

    1、在8.5sdk上面,nv12格式的image的y分量和uv分量的物理地址是连续的,所以一个image只能转换成一个dma fd

    工程师正在查看该改动。

    但是从 vxSwapImageHandle()来看,这将采用参数 num_planes。 这里表示的是图像中的平面数。您必须将其设置为等于输入图像的平面数。

    工程师认为应该同时考虑 Y 平面和 UV 平面。

    请问您目前遇到的错误具体是什么?

  • 非常高兴收到回复,现在面临的问题是

    1、nv12的image是有两个plane的(Y和UV),我在调用vxSwapImageHandle函数的时候,传入的参数num_planes=2,对应的是nv12格式的image,但是只有一个虚拟地址,所以函数调用会出错

    期待回复

  • 2、为什么7.3版本的sdk创建出来的nv12类型image的y plane的物理地址和uv plane的物理地址是分开的,8.4版本的sdk创建出来的nv12类型image的y plane的物理地址和uv plane的物理地址是连续的?

  • 您好,

    还需要和您确认下,从您给出的信息来看, SDK 7.3中已存在单平面实现。还请确认下您是否使用的是 SDK 7.3上且已经在 SDK 7.3上实现了zero copy?

    如果是的话,那应该具有最新的更改了。

    以上两个问题我再反馈给工程师看下。

  • 收到回复,谢谢

    之前已经在SDK 7.3上面实现了zero copy,现在使用的是sdk 8.4,想实现同样的zero copy,发现存在这个问题不能继续下去

  • 你好,还想请问一下,“SDK 7.3中已存在单平面实现”是什么意思呢?对于nv12 image来说,我们在sdk7.3中调用vxSwapImageHandle函数的时候传递的参数num_planes=2,单平面是指对于nv12 image来说num_planes可以等于1吗?

  • 您好,

    您这边是否有运行一些测试案例或一致性测试可以提供一下,方便我们的工程师尝试重现该问题? 

  • 你好,抱歉,我们的程序不是系统的测试案例,是我们自己编写的功能代码,

    你们可以根据tivxReferenceExportHandle函数和tivxMemTranslateVirtAddr函数来获取Image的物理地址查看

  • 抱歉回复晚了。

    简要为您介绍下之前的方法和当前方法之间的差异:

    之前的方法(在 SDK 7.3之前)

    -当您为多平面图像(如 NV12、平面= 2)分配缓冲区时,将会调用 MemBufferAlloc 两次(每个平面一次)。 因此在这种情况下,存储器分配可能是连续的,也可能不是连续的。

    当前的方法(从 SDK 7.3开始)

    -当您为多平面图像(如 NV12,平面= 2)分配缓冲区时,将会只调用一次 MemBufferAlloc (对于第一个平面 HOST_PTR[0]),但我们也使用基于 HOST_PTR[0]+ SIZE [0]的地址填充 HOST_PTR[1]。

    因此当该图像通过 vxSwapImageHandle 传递时,仍有2个地址可供交换。

    那这就是使用 vxCreateImage()创建图像而不是从任何handle创建图像的情形。

    如果从handle创建图像,缓冲区是由用户分配的,因此没有变化。

    1、nv12的image是有两个plane的(Y和UV),我在调用vxSwapImageHandle函数的时候,传入的参数num_planes=2,对应的是nv12格式的image,但是只有一个虚拟地址,所以函数调用会出错

    在这种情况下函数中是不会出现错误的,因为仍然有2个可用地址,如上所述:"也使用基于 host_ptR[0]+ size [0]的地址填充 host_ptR[1]"。

    此外,从 SDK 中的代码更改来看,SDK 7.3到 SDK 8.5并没有什么变化。根据 SDK 中的代码,这个更改从 SDK 7.2更改为 SDK 7.3。

    能否分享一些error log或提供usecase的更多详细信息?比如图像是如何创建的,如何交换等等?

  • 你好,很高兴收到回复,我们根据提供的信息来自己尝试解决一下