如何在android源代码中调用我的自定义解码器

时间:2014-03-12 13:50:42

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

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

我提到了其他类似的问题,对我没什么帮助。我无法通过以下问题或参考指南得到清晰的图片。

1)将Codec集成到Android多媒体框架中。

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

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

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

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

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

1 个答案:

答案 0 :(得分:5)

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

什么是SoftVideoDecoderOMXComponent

Android Stagefright框架的最新版本中,使用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. 您必须在SoftHEVC中定义SoftHEVC.h组件,该组件派生自SoftVideoDecoderOMXComponent。这将确保基类适当地处理所有OMX调用。

  2. 您必须在CodecProfileLevel中找到支持profile - level组合的表格。

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

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

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

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

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

  9. onQueueFilled中,成功解码后,input buffer which has been consumed is also returned back发送给来电者。

  10. 其余功能非常简单,我觉得你可以简单地重复使用大部分功能。

  11. 要注册该组件,您必须实施createSoftOMXComponent,以创建here所示的SoftHEVC组件。

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

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