【问题标题】:How to invoke my custom decoder in android source code如何在 android 源代码中调用我的自定义解码器
【发布时间】:2014-04-16 17:07:08
【问题描述】:

我正在尝试将我的软件 HEVC 解码器添加到 android 源代码中。我希望生成 libstagefright.so 文件。

我提到了其他类似的问题,但对我没有多大帮助。我无法通过以下问题或参考指南获得清晰的画面。

1) 将编解码器集成到 Android 多媒体框架中。

2)集成自定义解码器,在安卓上播放,同时显示fps。

3)如何注册 OMX 内核以添加新解码器。

有人可以帮助我将新的自定义解码器与 Android 集成的步骤。

现在,我刚刚在 SoftOMXPlugin.cpp 文件中添加了 media_codecs.xml 和 { "OMX.google.h265.decoder" , "hevcdec" , "video_decoder.hevc" }

需要编辑哪些其他文件才能将新格式添加到 android 源代码中? 哪些函数调用我的解码器源代码(softomxcplugin 源文件是否调用我的解码器?)。

【问题讨论】:

    标签: android android-ndk android-mediaplayer android-framework stagefright


    【解决方案1】:

    从您的查询和之前的讨论中,请找到将HEVC 组件集成到Android 框架中的步骤。由于您的组件是 SW 组件,因此您必须集成与 SoftVideoDecoderOMXComponent 相同的组件。

    什么是SoftVideoDecoderOMXComponent

    AndroidStagefright 框架的最新版本中,SW 加速编解码器使用类似OMX 的接口集成到框架中。早些时候,情况并非如此,并且有一些挑战。因此,Google 简化了集成策略,并要求所有SW 编解码器都使用SoftOMXComponent 类接口。

    大部分OMX IL 调用由基类处理,因此,新编解码器组件的实现相对容易,如下所述。

    我将以AVC 编解码器集成为例进行概述。 强烈建议读者熟悉OMX IL 1.1.2 specification,它描述了OMX IL 视频解码器组件的结构、功能和状态机。

    注意:HEVC 还不是OMX IL 规范的一部分,因此建议主要是了解组件的结构和功能。

    SoftHEVC组件的创建

    请参考SoftAVC.h的头文件和对应的源SoftAVC.cpp

    您将不得不实现一组类似的文件。由于某些固有的相似性,强烈建议重用 AVC 的整体实现。

    SoftHEVC.cpp 实施

    1. 您必须在派生自SoftVideoDecoderOMXComponentSoftHEVC.h 中定义一个SoftHEVC 组件。这将确保所有OMX 调用都由基类适当处理。

    2. 您必须定义支持表 profile-level 组合,如 CodecProfileLevel 中所示。

    3. constructor 中,您可以以类似的方式初始化大部分变量。由于这是一个视频解码器组件,您必须初始化 2 个端口,即inputoutputctor 调用 initDecoder 来初始化组件。您还必须为您的编解码器实现类似的功能。

    4. dtor 是不言自明的,因此,我将跳过相同的解释。

    5. onQueueFilled 会在为input 端口上的处理提供一个充满一帧比特流数据的缓冲区或为output 提供一个空闲缓冲区时调用。这会调用主解码函数H264SwDecDecode。现在,对于第一帧,与最初初始化的分辨率相比,您可能会遇到分辨率的变化。这由下一点所述的 2 个场景来处理。

    6. 您会观察到两个函数 handlePortSettingsChangedhandleCropRectEvent。从输出缓冲区的角度来看,这两个事件很重要。 handlePortSettingsChanged 表示 输出缓冲区尺寸的变化 与最初初始化的大小相比,因此,向用户提供事件回调以释放当前分配并重新分配相同。 handleCropRectEvent 表示向用户传达的__cropping window__。通常,这不需要重新分配缓冲区。

    7. drainOneOutputBuffer 会将解码帧复制到输出端口的缓冲区和解码缓冲区的notify the caller about the availability

    8. onQueueFilled中,成功解码后,input buffer which has been consumed is also returned back给调用者。

    9. 其余功能非常简单,我觉得您可以简单地重用大部分实现。

    10. 要注册组件,您必须实现createSoftOMXComponent,它会创建SoftHEVC 组件,如here 所示。

    由于您已经处理了注册的组件,我将跳过该部分。仅供参考,我假设您已在SoftOMXPlugin 中的kComponents 数组中注册了该组件。此外,由于HEVC 不是已知的MIME 类型,因此您必须注册相同的类型。 MediaDefs.cpp 需要进行更改,您必须引入一个新条目 MEDIA_MIMETYPE_VIDEO_HEVC,类似于 AVC 等现有格式,并支持 OMXCodec.cppACodec.cpp 的更改。

    通过这些步骤,我想你应该能够集成你的SW解码器并能够实现你的播放。

    【讨论】:

    • 感谢您的回复。我按照您提供的步骤,能够生成 libstagefright_hevc_decoder.so。现在,我不确定我的软件解码器是否已经完美集成。我正在尝试在平板电脑上测试之前寻找测试 libstagefright 文件的选项。如果您能帮助我完成将 libstagefright 与我的硬件集成的步骤,我将不胜感激,就像硬件是否需要刷新/格式化一样。
    • @sayedjuned.. 你的直播看起来怎么样?它是基本流还是容器格式?如果是容器格式,可以使用内置的stagefright 可执行文件来测试吗?如果它是一个基本流,我们将不得不重建一个新的stagefright 可执行文件,能够处理它。这些步骤不能保证屏幕上的显示,如果您对此感兴趣,则必须使用MediaPlayer 对其进行测试。请分享您要验证的路径
    • 我的流是基本流,我想在设备上显示视频。请让我知道测试基本流的 libstagefright 可执行文件所需的更改。
    • @sayedjuned.. 我的诚实反馈是将其嵌入到 MP4 文件中,因为所需的更改量非常有限,其中一些是离线的。要将基本流播放器集成到现有的Stagefright 框架中,需要付出很多努力。我觉得最好尝试容器格式。
    • 感谢您的回复根据您的反馈,容器格式似乎更容易。但我不熟悉任何容器格式。如果您能指导我将我的解码器集成到任何容器格式的步骤,我会很高兴。您能否建议任何可以轻松访问和更改的容器格式,因为我时间不够。
    猜你喜欢
    • 2013-08-31
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多