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:IVA-HD Engine_open()内存访问

Guru**** 2589280 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/588643/linux-am5728-iva-hd-engine_open-memory-access

器件型号:AM5728

工具/软件:Linux

大家好,我正在创建一个将在 AM57x EVM 上使用 IVA-HD 解码器的应用程序,并且我遇到了引擎_open() API 调用(来自 libdce 库)的问题。  使用参数调用时:

引擎=引擎_打开("ivahd_vidsvr"、NULL、&EC)我接收到分段故障。

我跟踪了这个问题、直到在 Engine_open 内的 memplugin_alloc()内调用 OMAP-bo_new()时、但是保存 OMAP-bo_new()的源文件是一个预编译的二进制文件、在发生 segfault 之前、我无法让调试器显示任何其他内容。

我猜是我试图在我不允许的空间中分配内存、而不是通常不可用的内存。  也许我没有正确分配内存、因为我的程序无法在 IVA-HD 的 IPU 控制器的内存中查看?  我正在使用 EVM 本身上的 ARM-Linux-gnueabihf-gcc 工具链进行编译。  这是不正确的吗?

实质上,我的问题归结为“是否有一种正确的方法来编译使用 IVA-HD 的程序,使 Engine_open()可以看到 IVA-HD 子系统?”
 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、软件团队是否有任何问题?  这是一个漫长的周末之后的星期一、所以我知道是否有人在休息一天。  只需确保此查询不会丢失。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    看起来您的内存不足。 您为编解码器分配了多少个缓冲器? 缓冲区来自较平铺内存、大小限制为128 MB。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    目前、我仅在 Engine_open 阶段发生故障、通过测试

    "engine_open ("ivahd_vidsvr"、NULL、&ec);"

    但是、我应该只为我的解码器结构分配60个字节(或者至少这是我用来表示编解码器的结构的大小)和大约28KB 的 jpeg 数据进行解码。  除非我错过了几个零点,否则我怀疑我正在尝试通过 Engine_open()调用拉128MB。  

    我进一步探讨了一些调试选项、发现了这些错误消息、这些消息似乎证实了我对程序看不到更平铺内存的理论。  它们如下:

    [466.208051] OMAP-IMU 55082000.MMU:55082000.MMU:2.1版
    [1301.138421] virtio_rpmsg_bus virtio1:接收到无收件人的 MSG

    作为一个 addenum、下面是我提到的编解码器结构:

    typedef 结构解码器{

    发动机手柄发动机;
    VIDDEC3_Handle 编解码器;
    VIDDEC3_PARAMS *参数;
    VIDDEC3_DynamicParams * dynParams;
    VIDDEC3_Status *状态;
    XDM2_BufDesc * inBufs;
    XDM2_BufDesc * outBufs;
    VIDDEC3_InArgs * InArgs;
    VIDDEC3_OutArgs * outArgs;
    char *输入;
    int id;
    int padded_width;
    Int padded_height;
    int orig_width;
    Int orig_height;

    }解码器;

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

    我还创建了一个虚拟应用程序,它所做的就是使用相同的参数调用 Engine_open(),应用程序中不存在其他内存缓冲区。  我从/usr/liblibdrm_omap.so.1收到相同的 SEGFAULT 错误  

    我还可以确认使用 IVA-HD 的 gstreamer 应用程序是否正常工作。

    这是我提到的虚拟 C 程序。

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    #include 
    #include 
    #include 
    #include 
    #include 
    
    /*-------------- 局部定义-------------------------------------------------------- */
    #define SLICEFIFOLEN 3200
    #define SLICESIZE 8192
    #define PRINTER_DEBUG
    /*通过 XDM_getversion*/
    #define getversion
    #define 4096 STRIDE
    //#define JPEGSLICE
    
    
    /*---获取编解码器版本 本地宏------- */
    #define 错误(FMT,...) printf ("%s":%d:\t%s\aaround:" fMT "\n"、__file__、__line__、__function__、##__VA_args__)
    /*启用以下命令以打印调试信息*/
    #ifdef print_debug
    #define debug (FMT、...) printf ("%s:%d:\t%s\tdebug:" fMT "\n"、__file__、__line__、__function__、##_va_args__)
    #else
    #define debug (FMT、...)
    #endif
    
    
    /*将 x 与下一个最高值的倍数对齐2^n */
    #define ALIGN2 (x、n)(((x)+((1 <<(n)- 1)))&~(1 <<(n)- 1))
    #define PADX ALIsv2 (NULL、4)
    #define PADY_INTER
    
    
    
    
    引擎(NULL)=引擎引擎处理引擎、INF =引擎处理引擎4 (NULL)
    
    if (!engine){
    error ("无法打开引擎!:%p\n"、EC);
    return 1;
    }
    debug ("引擎已打开");
    
    return 0;
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是使用定制板和定制软件来开发和测试此应用、还是使用 TI 的 PLSDK 和 AM57x IDK/GP EVM? 如果使用 TI PLSDK、是否对 DTS 文件/bootargs 或任何其他软件进行了任何更改?

    您是否能够使用 GST 发布来运行涉及 ductai 插件的 gstreamer 流水线?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    将 TI AM57x EVM 与 PSDK 3.02.05配合使用时、不会修改 DTS/bootargs。 仅用于以太网配置的 systemd 引导脚本。

    2.我可以运行 gstreamer 管道,但经常会收到错误,例如:
    libdce_linux.c:145: DCE_BUF_UNLOCK 错误:失败 eError == DCE_Eok 错误 val -5MRpc_use:错误:无法声明缓冲区使用
    libdce_linux.c:115: DCE_buf_lock 错误:失败 eError == DCE_eok 错误 val -5MRpc_release:错误:无法释放缓冲区

    这些错误发生在 h264编码中、但不适用于 jpeg 解码
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您在编码器 GST 插件中看到的错误是该插件的已知问题、我们正在调查此问题。

    关于您在使用 Engine_open()调用时看到的错误,您是否能够为 H.264和 MPEG-4流运行开箱即用的 viddec3test 二进制文件? 您是否查看过此代码-
    git.ti.com/.../viddec3test.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我运行了代码(viddec3test -w 800x600 airshow_p352x288.h264)

    它不运行、表示 MmRpc_use 无法声明缓冲区使用。 它也不能处理那里的缓冲区。

    但是、它会成功地打开发动机。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我刚刚在我的末尾尝试了 viddec3test 应用程序、它对我来说很好。 我使用的是 PSDK 版本3.3。 使用-w 作为 cmd line args 时、请确保运行 Weston。 您可以通过运行脚本启动 Weston 服务器-
    /etc/init.d/weston 开始
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    实际上、我一直在使用 Weston。 我将尝试使用 PSDK v3.3并报告。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已安装 PSDK 3.3、并且 viddec3test 应用程序工作正常。 但是、由于我想使用 IVA-HD (C 语言)创建我自己的应用、我发现我缺少所需的头文件。 安装 libdce (从此处: git.omapzoom.org/.../ 并运行上述的 Engine_open 测试代码)后、会导致相同的错误。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我没有准确地了解缺少哪些头文件以及从何处获取。 此处开发和维护了所需的软件-
    http://git.ti.com/glsdk/
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    就我从读取 viddec3test 源代码中可以看出、我需要 libdce.h、这也需要 构建 https://git.ti.com/glsdk 中的 DCE 项目。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    噢。 您也可以从 Arago Build 项目中构建应用程序、并可以从错误的 repo 中删除下载组件的所有这些依赖项。 这就是构建 omapdrmtest 的地方(viddec3test 是其中的一部分)。

    检查此链接。 首先、您可以将应用程序添加到 omaprmtest 文件夹、并使用添加的文件更新 bitbake 配置文件。
    processors.wiki.ti.com/.../Processor_SDK_Building_The_SDK

    您可以使用以下命令编译 omapdrmtest:
    MACHINE=am57xx-EVM bitbake omapdrmtest
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    每次需要重新编译应用程序时、我是否都必须重新编译 omapdrmtest 项目? 我们在我感觉之前已经进行过这场对话、除了关于 Yocto 的对话。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    哦、我现在还记得那场对话。 是的、这是相同的建议(通过 Yocto 建造)。 您有三种选择-

    1. 通过 Yocto 构建 omapdrmtest、然后将所有相关文件和库从 Yocto Build 复制到您的应用程序(在构建设置中)、然后在 Yocto 之外构建您的应用程序。  
    2. 使用您的定制应用增强 omapdrmtest、并通过 Yocto 构建您的定制应用。 您可以在 Yocto 项目的本地副本中进行源代码更改。 如果每次更改代码时应用程序都是该编译设置的一部分、则需要编译 omapdrmtest。 您可以使用以下说明来根据您的更改构建 ompadrmtest 以及任何增量构建-

           MACHINE=am57xx-EVM bitbake omapdrmtest -c cleanal

           MACHINE=am57xx-EVM bitbake omapdrmtest --f -c compile.

    3.在 Yocto 内部创建您自己的项目(config、bitbake 方法遵循 omapdrmtest /或去除您不需要的所有文件的 omapdrmtest 并将文件添加到其中),并按照上述构建说明通过 Yocto 构建您的项目。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将开始介绍这一点、并将结果通知您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Manisha、您好、快速问题:如果我在您的最后一篇文章中继续选择选项1、我将如何通过 Yocto 构建 omapdrm 测试? 即获取相关文件和库?