4

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

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

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

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

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

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

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

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

4

1 回答 1

5

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

是什么SoftVideoDecoderOMXComponent

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

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

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

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

创建SoftHEVC组件

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

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

SoftHEVC.cpp执行

  1. 您必须定义一个派生SoftHEVC自. 这将确保所有调用都由基类适当处理。SoftHEVC.hSoftVideoDecoderOMXComponentOMX

  2. 您必须定义一个支持组合表profile,如.levelCodecProfileLevel

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

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

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

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

  7. drainOneOutputBuffer将解码帧复制到输出端口的缓冲区,并通知调用者解码缓冲区的可用性。

  8. onQueueFilled中,成功解码后,已消耗的输入缓冲区也返回给调用者。

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

  10. 对于组件的注册,您必须执行createSoftOMXComponent创建SoftHEVC组件的方法,如下所示

由于您已经处理了注册的组件,因此我将跳过该部分。仅供参考,我假设您已kComponentsSoftOMXPlugin. 此外,由于HEVC不是已知MIME类型,因此您必须注册相同的类型。将需要更改MediaDefs.cpp您必须引入新条目的位置,MEDIA_MIMETYPE_VIDEO_HEVC类似于现有格式,例如AVC并支持 和 的OMXCodec.cpp更改ACodec.cpp

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

于 2014-03-13T00:27:57.603 回答