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.

[参考译文] AM5728:H.264编码器输出数据同步问题

Guru**** 2561790 points
Other Parts Discussed in Thread: AM5728, SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/595525/am5728-h-264-encoder-output-data-sync-issue

器件型号:AM5728
Thread 中讨论的其他器件: SYSBIOSDM385

您好!

我们在 AM5728上的 H264编码器(IVAHD)中观察到 putData 同步回调与 Processor SDK 的行为差异、其中 H264编码器(IVAHD) putData 同步回调会随机提供每次回调的输出块/片数、而作为我们在 OMAP4和 J6上的独立实施、 putData 回调始终提供所有帧的预期输出块/片数。

对于 e.g、在 OMPA4/J6上、当我们使用8个片进行 H264编码时、我们观察到每帧8个 putData 回调、其中每次回调产生一个块/片。 但是、当 AM5728上的同一编码器库与处理器 SDK 集成时、我们观察到不同数量的 putData 回调、 也不一致、即有时我们会在一个帧中看到2个回叫、有时是3或5、或者任何小于或等于8的数字、尽管 H264生成的总输出流具有8个切片、但每个回叫会为某些帧生成多个块/切片。

请提供输入以解决此问题。

如果您需要更多/具体的详细信息、请告知我们。

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

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

    这是处理器 SDK 3.3 (内置   )。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢。 软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Darshan、
    AFAIK、即使 TI H.264编码器库提供了子帧级同步(层模式)功能、PSDK 也不支持层模式编码。 我怀疑您有自己的切片模式编码实施方案、该方案利用 TI H.264编码器库。 如果在 AM5728和 OMAP4/J6上进行测试时 H.264编解码器编码器库版本相同、则必须在您的实现软件上进行配置。 您是否在 AM5728和 OMAP4/J6之间的实现中使用了相同的配置?

    查看 TI H.264编码器用户指南: git.ti.com/.../H264_Encoder_HDVICP2_UserGuide.pdf、附录 G"低延迟/子帧级别同步"、 G.3 H.264编码器输出与子帧级别同步、表24指定了创建参数。 为 VIDENC2_Params::numOutputDataUnits 设置了什么值?

    如果 outputDataMode = IVIDEO_SLICEMODE、则它指示编码器应生成位流的片的基本单位。
    例如:此处5表示编码一组5个 NAMU 后、编码器应通知应用。

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

    您好、Buddy、

    感谢您的支持。

    是的。 我们已在 PSDK 中添加子帧级同步。 我们修改了 IPUMM FW、libdce、omapdrmtest。

    H264库版本和所有编码器静态和动态配置参数完全相同。

    VIDENC2_Params::numOutputDataUnits = 1;

    在独立的 testapp 中、SPS 和 PPS 有两个回调。 但在 PSDK 中、它通过一次回调提供 SPS 和 PPS。 在 Put 数据回调 中、XDM_DataSyncDesc:::numBlocks 值从1到4不等。 我们希望每次它都恰好为1。 这将为每个块/切片提供一次回调。

    我已附加所有编解码器参数配置。

    e2e.ti.com/.../H264_5F00_Encoder_5F00_paramerts_5F00_logs.txt

    谢谢、

    达尔尚

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

    由于我们在 PSDK 中没有与 SLI_MODE 进行子帧级同步、因此调试该问题有点困难。
    我假设独立测试应用程序是 H264编码器编解码器库提供的测试应用程序。 您能否在运行切片模式时为我们提供测试配置、因为我在 h264enc/app/test/testvecs/config 下看不到切片代码的默认测试 cfg。 这是为了查看独立 testapp 配置与 PSDK 中的编解码器参数配置之间是否存在差异。

    如果您查看我之前提到的 H.264编码器用户指南并参阅 G.3.2节"outputDataMode 为 IVIDEO_SLICEMODE 的 H.264编码器行为";在第3段中、当编解码器进行 putData Fxn 回调时、numOfSlice 可能大于 numOutDataUnit。 在第5至第9段中、它显示即使 numOutputDataUnit 设置为64、numBlocks 也可能为127。
    同样在表28中、XDM_DataSyncDesc:::numBlocks 的有效值表示"任何值、它是在 putData 调用点之前生成的层数。 如果 outputDataUnit 为7、则在作为通信点的页面交叉中生成8个切片、那么 numBlocks 为8、所有8个切片将通知到 App 编解码器可以生成以下可能的 numBlocks 1值<= numBlocks <= 127"
    重点是 numBlocks 可以大于在 create 参数设置的 numOutputDataUnit。 当编码器由于完全输入数据可用而快速编码时(inputDataMode = IVIDEO_ENTIREFRAME (3));它会导致更多数字块在通信点上被编解码器可用。

    我认为独立的 testapp 可以根据 numOutputDataUnit 用片数据填充输入缓冲区、从而生成一致的 numBlocks。 在 PSDK 中、它用一个完整的帧填充输入缓冲器。

    查看 H264_Encoder_parameter_logs.txt、您能否使用与独立 testapp 相同的配置尝试在 sliceCodingParams 上进行设置:
    params->sliceCodingParams.sliceCodingPreset = IH264_SLICECODING_DEFAULT;// 0
    params->sliceCodingParams.sliceMode = IH264_SLICEMODE_DEFAULT;// 0
    params->sliceCodingParams.sliceUnitSize = 0;
    params->sliceCodingParams.sliceStartOffset[0] = 0;
    params->sliceCodingParams.sliceStartOffset[1] = 0;
    params->sliceCodingParams.sliceStartOffset[2] = 0;
    params->sliceCodingParams.streamFormat = IH264_STREAME_FORMAT_DEFAULT;// 0

    您目前的情况如下:
    sliceCodingParams.sliceCodingPreset 1 <- IH264_SLICECODING_USERdefined
    sliceCodingParams.sliceMode 1 <-- IH264_SLICEMODE_MBUNIT
    sliceCodingParams.sliceUnitSize 1080 <-此参数用于通知单个层面中的宏区块数。
    sliceCodingParams.sliceStartOffset[0] 0
    sliceCodingParams.sliceStartOffset[1] 0
    sliceCodingParams.sliceStartOffset[2] 0
    切片文件 Params.streamFormat 0

    我不确定为什么会出现1080的宏块数量。 根据标准、H.264级别4.1每帧应具有8192个宏块。 参考资料: en.wikipedia.org/.../MPEG-4_AVC

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

    您好、Buddy、

    请查找附加的配置。

    我知道 numBlocks 可以多于 NumOutputUnits。 但是、我们希望每个块都有一致的回调、以实现低延迟。 下面是9帧编码的输出数据回调数(分辨率1920x1080)应用程序的日志。

    帧1:回调数9.
    帧2:回调数8.
    帧3:回调数2
    帧4:回调数2
    帧5:回调数1
    帧6:回调数3.
    帧7:回调数2
    帧8:回调数3.
    帧9:回调数3.

    还有另一个奇怪的行为差异。

    独立测试应用程序:SPS 和 PPS 由两个输出数据回调提供(每个回调编号 Blocks = 1)

    PSDK 应用:SPS 和 PPS 在单输出数据回调中提供(numBlocks = 2)

    我还做了以下实验。 行为在任何情况下都不会改变。

    -将 IVA 频率降低至266 MHz。 我甚至尝试将 IVA 频率设置为46MHz (尽管不在 OPP 中)

    -设置处理呼叫线程的最高优先级。  

    -设置 Task.defaultAffinity = 0、以便所有线程在 Core 0上运行(禁用 SMP)。

    我想这可以抵消"编码器运行速度更快"和"页面交叉"的情况。 在 SMP 模式下运行的 SYS BIOS 是否会影响任何内容? 因为 SysBIOS 在 DM385和 DM8127上以非 SMP 模式运行、数据同步在其中运行良好。

    请提供您的意见、说明哪些因素会导致此行为。

    e2e.ti.com/.../Alexander_5F00_1080p_5F00_420sp_5F00_30fr_5F00_datasync.cfg

    谢谢、

    达尔尚

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

    假设您在独立测试应用和 PSDK 应用上使用相同的输入文件进行测试:ALEXANDER 1080p_420sp_30fr.YUV
    您能否检查以确保前3个帧的输入缓冲器数据和大小与发送到编解码器的数据相同?

    使用 PSDK 应用时、当 IPUMM 从编解码器接收到 putData Fxn 回调时、您能否检查数字块? 您提供的是 MPU 端的应用程序日志中的输入数据回调数? 我想知道 MPU 和 M4之间是否存在同步问题。 当您运行 Standalone TestApp 时、所有上下文都在 M4侧运行。 在 PSDK 应用中、它从 MPU 端运行。
    我想知道、IPUMM 接收的数字块是否可能与 PSDK 应用接收的数字块不同
    BTW、此 PSDK 应用在 PSDK 3.3中的位置是什么?
    谢谢。
    //好友
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Buddy/Darshan、

    独立和 PSDK 应用中的编解码器行为相同 请参阅用户指南 G3.2  

    "通过编解码器与应用程序之间关于数据可用性的通信点是 下面的其中一个、以较晚者为准"

    -对片数(numOutputDataUnit)进行编码,即如果在当前 页面中,numOfSlice >= numOutputDataUnit,则进行 putData 调用。

    -最小1K 的数据被编码、即 numOfSlices 超过 第一页交叉中的 numOutputDataUnit。"

    因此、仅当满足上述条件时、H.264编码器才会通过 putData 调用进行通信。 至少将对1K 的数据进行编码、如果该数据中有多个切片、则编码器将合并块(切片)的数量、并更新与1k 数据中可用块(切片)数量相关的 putData 调用。

    例如、假设整个帧是黑色图像(相同数据)、用户需要启用输出 DataSync 的8个层面。 编码器将对该帧进行编码、输出生成的字节将小于1k 数据。 因此、putdata 函数将仅在包含8个块(切片)的帧结束时调用。

    这种情况发生在低比特率情况下、并且配置了更多的层数。 为了避免此数量的所需切片、应减少。

    此致

    Gajanan