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/DRA744:使用 Android 应用程序回放 DRA74xx 媒体解码器。

Guru**** 2553450 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/618409/linux-dra744-dra74xx-media-decoder-playback-with-android-app

器件型号:DRA744

工具/软件:Linux

您好!

我在设备上使用 Android 应用程序执行回放时看到错误。 错误日志如下所示:

E/OMX_VIDDEC_COMMON (4725):  
E/OMX_VIDDEC_COMMON (4725):Process 函数返回错误...  
E/OMX_VIDDEC_COMMON (4725):编解码器扩展- 0x408001
E/OMX_VIDDEC_COMMON (4725):提供给编解码器的输入缓冲区大小为:25649
E/OMX_VIDDEC_COMMON (4725):帧计数为:1.
E/OMX_VIDDEC_COMMON (4725):消耗的字节- 734
E/IMG_Gralloc (4725):spsMaxRefFrames = 2、nRefFrames 最初设置为1
E/IMG_Gralloc (4725):将流的级别重置为4.1级
E/IMG_Gralloc (4725):nBufferCountMin_old =-1837558940、nBufferCountMin_new = 1
E/OMX_VIDDEC_COMMON (4725):需要端口禁用/重新配置
D/UL-HLSPlayer( 5166):获取8db4b0b454334b508c2f36a0888732c7的 assetinfo

为错误0x408001设置的位如下:
位1:IH264VDEC_ERR_NOSLICE:在该进程调用中甚至没有找到单个无错层头,也没有启动 MB 循环
位15:XDM_FATALERROR:致命错误
位22:IH264VDEC_ERR_NUMREF_FRA框:活动 SPS 中的 num_ref_frames 大于支持的 max_num ref_frames。

您能否解释一下此错误的真正含义以及是否有修复方法? 我看到它经常出现、虽然它不会妨碍视频解码和显示、但在播放一段时间后、我看到黑屏。

如果对这一问题有任何想法,将不胜感激。

谢谢!

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

    您使用哪种 Android 版本?

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

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

    我已将您的问题转发给 Android 专家。

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

    尊敬的 Kevin:

    您可以通过查看 H.264编解码器用户指南来找到更多信息。 请参阅"附录 C -错误处理"

    当编解码器返回位15 "XDM_FATAL_ERROR"的错误时、这意味着编解码器将无法继续解码、因为在解码时检测到严重问题。 这可能是您看到黑屏的原因、因为解码器已停止并且无法继续。

    根据设置的其他错误位、解析器未正确解析视频文件或视频本身已损坏(不基于 H.264标准规范)。

    如用户指南中所述、

    位0 - IH264VDEC_ERR _NOSLICE。  <-表示要解码的输入数据损坏。

    位22 - IH264VDEC_ERR _NUMREF_FRA框<-这是导致编解码器抛出致命错误的错误位。

    如上所述、H.264 SPS 标头中指定的 num_ref_frames 大于在 SPS max_num_ref_frames 中指定的值(应在 VUI 参数- max_dec_FRAME_buffering 中)。

    请使用 H.264视频解析器工具检查视频片段、例如 Tektronix、Elecard 或 Vega、查看剪辑的 SPS 和 PPS。

    从 Android 的角度来看、可能会发生错误、因为在剪辑开始时、TI OMX 会将 num_ref_frames 设置 为1、因为 TI OMX 没有 SPS 和 PPS 的解析器数据。 它将第1个输入数据传递给编解码器、当编解码器解码削波所需的 max_nnum_ref_frames 大于配置的数字基准帧(其中输出缓冲器被更早地配置)时、编解码器将抛出该错误。 这将触发 TI OMX 上的端口重新配置(请参阅 OMXH264VD_HandleError()),而 stagefright 将处理端口重新配置,这将清除、重置和重新配置 解码视频所需的输出缓冲器数量。

    谢谢。
    //好友

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

    我已找到 SPS max_nnum_ref_frames 的设置位置。 它在 OMX_h264dec .c 中围绕第87行进行设置:
    (((IH264VDEC_Status *) pVidDecComp -> pDecStatus)->spsMaxRefFrames = 1;
    我将其更改为2、现在看不到报告的错误。

    但是、在播放一段时间后、我会收到一个新错误:
    E/OMX_VIDDEC_COMMON (6533):Process 函数返回错误...
    E/OMX_VIDDEC_COMMON (6533):编解码器扩展- 0x100101
    E/OMX_VIDDEC_COMMON (6533):提供给编解码器的输入缓冲区大小为:15422
    E/OMX_VIDDEC_COMMON (6533):帧数为:51664
    E/OMX_VIDDEC_COMMON (6533):已用字节- 727
    D/UL-MediaCodecDecoder (7218):dequeueInputBuffer 返回重试
    D/UL-AndroidHLSSSource(7218):将分辨率从 W/H 768 x 432更改为992 x 558
    D/UL-MediaCodecDecoder (7218):dequeueInputBuffer 返回重试
    E/OMX_BASE_PROCESS (6533):检查失败:OMX_ErrorNone = eError
    E/OMX_BASE_PROCESD( 6533):返回错误:eError


    位0:IH264VDEC_ERR_NOSLICE:如您所述,它指示要解码的输入数据损坏。
    位8:XDM_PARAMSCHANGE:序列参数更改
    位20:IH264VDEC_ERR_PICSIZECHANGE:检测到分辨率变化。

    当我看到此错误是由于分辨率的改变、解码器在最后一个解码的帧上停止并且未恢复。 我从驱动程序中看到此错误:
    [73311.068291] OMAP-hwmod:MMU_ipu2:_wait_target_disable 失败

    我一直在 logcat 中得到这些错误:
    D/UL-MediaCodecDecoder (7218):dequeueOutputBuffer 返回的 AMEDIACODEC_INFO_Try 再次_later
    D/UL-MediaCodecDecoder (7218):MediaCodeReadAndPost 返回了 MEDIACODEC_TTRY
    D/UL-MediaCodecDecoder (7218):dequeueInputBuffer 返回重试
    D/UL-MediaCodecDecoder (7218):dequeueOutputBuffer 返回的 AMEDIACODEC_INFO_Try 再次_later
    D/UL-MediaCodecDecoder (7218):dequeueInputBuffer 返回重试
    D/UL-MediaCodecDecoder (7218):dequeueOutputBuffer 返回的 AMEDIACODEC_INFO_Try 再次_later
    D/UL-MediaCodecDecoder (7218):dequeueInputBuffer 返回重试
    D/UL-MediaCodecDecoder (7218):dequeueOutputBuffer 返回的 AMEDIACODEC_INFO_Try 再次_later
    E/UL-MediaCodecDecoder( 7218):错误:输入缓冲器索引错误:-1
    具有 UL-MediaCodecDecoder (7218):[MediaCodec]读取计数:1返回:-2147483648
    D/UL-MediaCodecDecoder (7218):dequeueInputBuffer 返回重试


    有什么想法会导致这个问题? 它看起来像是一个内核问题。

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

    您好、开尔文、

    将 spsMaxRefFrame 从1更改为2可能适用于特定的削波、但从系统级角度来看、这可能不是一个好主意、因为现在默认情况下会创建一个额外的输出缓冲区。 对于参考帧大于2的另一个剪辑、您将再次收到错误、该错误将触发端口重新配置。 由于 OMX 没有 SPS 信息、因此设计中预计会进行端口重新配置。 通过将第一个输入传递到编解码器、OMX 从编解码器获取所需参考帧上的信息、这些参考帧决定了解码削波所需的输出缓冲器数量。 话虽如此、我只是说端口重新配置是处理具有>=2个参考帧的剪辑时的正常流程。

    对于错误"Codec Extended - 0x100101"、由于日志和错误、指定检测到分辨率从768x432更改为992x558。 同样、在这种情况下、端口重新配置应该发生在它应该通过刷新和撕下编解码器实例从编解码器返回的所有缓冲器并重新创建编解码器实例的位置。 输出缓冲器将需要 使用新的分辨率重新配置。 OMX 返回时出现错误,我在日志上看不到更多内容,但您应该看到类似的日志,如“E/OMX_VIDDEC_COMMON (4725):port disable/reconfiguration needed”。 当您说 Android 应用时、它是默认的 Android Media Player 应用程序吗? 或其他媒体应用? 如果不同、您可以尝试在默认 Android Media Player 应用程序上播放剪辑吗? 它应按应有的方式处理端口重新配置。

    谢谢。

    //好友

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

    感谢您的回答。 我将把我的更改恢复为 spsMaxRefFrames。 根据您的响应、我认为系统将通过执行端口重新配置安全地从我报告的错误中恢复、对吧?
    我没有看到日志:"e/OMX_VIDDEC_COMMON (4725):port disable/reconfiguration needed"(当这些错误出现时,我看到日志数次,但在回放过程中没有出现错误时,我看到日志数次。 这是问题吗? 系统未重新配置端口?

    此处测试的 Android 应用程序是迪斯尼频道。 我不确定如何从此应用程序播放剪辑、因为它正在从服务器实时流式传输内容。

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

    您还想提一下您使用的是哪款 TI Android 版本吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不是特别使用 TI Android 版本、而是使用来自 omapzoom 的 Android lollipop-mr1版本、用于 dra7xx 项目。 我已将其移植到 TI 平台。 它运行 lollipop。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、开尔文、

    您采用了最新的硬件/ti/dra7xx 项目 d-lollipop-Mr1-release 分支。
    我对您的陈述的解释是否正确?

    我们已在 TI J6的最新 lollipop-MR1代码库上启用自适应回放。

    您必须从获取/选择所有相关补丁

    [1] git.omapzoom.org
    [2] git.omapzoom.org


    请注意、我们仅在 Android CTS 测试中测试了此功能。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、您对我的陈述的解释是正确的。

    您的意思是、我应该只选择与自适应回放相关的更改、而忽略其他更改吗?

    我在 OMX_h264dec .c 中注意到、当将流重置为4.1级时、输出端口重新配置和编解码器恢复的标志不会设置、而是针对其他级别设置、如下面的代码段所示。 没有设置它们的原因吗? 我想知道设置它们是否可以解决我从那时起遇到的问题、然后我假设端口将被重新配置并重新创建编解码器。
    (笑声)
    }否则(pDecStatus->spsMaxRefFrames > nRefFrames41){
    pH264VidDecComp -> tH264VideoParam.eLevel = OMX_VIDEO_AVCLevel5;
    staticparams->presetLevelIdc = IH264VDEC_Level5;
    OSAL_ErrorTrace ("将流的级别重置为5级");
    pVidDecComp->nCodecRecationRequired = 1;
    pVidDecComp->nOutPortReconfigRequired = 1;
    }否则(pDecStatus->spsMaxRefFrames > nRefFramesOld){
    pH264VidDecComp -> tH264VideoParam.eLevel = OMX_VIDEO_AVCLevel41;
    OSAL_ErrorTrace ("将流的级别重置为4.1级");
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Kelvin Tom、

    默认情况下、创建的编解码器具有4.1级、当前端口重新配置主要用于处理回放开始时的缓冲区填充要求、我们始终在第一个帧解码后触发一个端口重新配置周期。  因此、如果 设置的参数与默认值相同、我们不会触发端口重新配置。

    但是、如上所述、在播放过程中发生参数不匹配的情况下、此逻辑似乎缺少。

    我们将通过添加显式端口重新配置来解决这一问题、即使对于默认设置也是如此(因为一旦为具有不同属性的流启动解码、编解码器就不再处于默认设置中)。

    现在、请继续为最后一个 if () case 添加这两行、我们将检查整个路径并提供正确的修复。

    谢谢、此致、

    Sunita。

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

    我认为您的评论和应用程序的更新解决了该问题。

    -开尔文