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

如何在android源代码中调用我的自定义解码器,android,android-ndk,android-mediaplayer,android-framework,stagefright,Android,Android Ndk,Android Mediaplayer,Android Framework,Stagefright,我正在尝试将我的软件HEVC解码器添加到android源代码中。我希望生成libstagefright.so文件 我提到了其他类似的问题,对我帮助不大。我无法通过以下问题或参考指南清楚地了解情况 1) 将编解码器集成到Android多媒体框架 2) 集成一个自定义解码器,在android上播放,同时显示fps 3) 如何注册OMX内核以添加新解码器 有人能帮我把一个新的自定义解码器和安卓系统集成起来吗 现在,我刚刚在SoftOMXPlugin.cpp文件中添加了media_codecs.xml和

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

我提到了其他类似的问题,对我帮助不大。我无法通过以下问题或参考指南清楚地了解情况

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

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

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

有人能帮我把一个新的自定义解码器和安卓系统集成起来吗

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

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

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

什么是
软视频解码组件

在最新版本的
Android
Stagefright
框架中,
SW
加速编解码器使用类似于
OMX
的接口集成到框架中。早些时候,情况并非如此,它本身也存在一些挑战。因此,谷歌简化了集成策略,并规定所有
SW
编解码器将采用
SoftOMXComponent
类接口

大多数的
OMX-IL
调用都是由基类处理的,因此,新编解码器组件的实现相对简单,如下所述

我将以
AVC
codec集成为例提供一个概述。强烈建议读者熟悉描述
OMX IL
视频解码器组件的结构、功能和状态机的

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

创建
SoftHEVC
组件

请参阅的头文件和相应的源文件

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

SoftHEVC.cpp
实现

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

  • 您必须定义一个支持组合表,如中所示

  • 构造函数中
    ,您可以以类似的方式初始化大多数变量。由于这是一个视频解码器组件,您必须初始化两个端口,即,
    输入
    输出
    ctor
    调用
    initDecoder
    初始化组件。您还必须为编解码器实现类似的功能

  • dtor
    是不言自明的,因此,我将跳过对其的解释

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

  • 您将观察两个函数
    handleportsetingschanged
    handleCropRectEvent
    。从输出缓冲区的角度来看,这两个事件很重要
    handlePortSettingsChanged
    表示输出缓冲区维度相对于原始初始化大小的变化,因此,向用户提供事件回调以释放当前分配并重新分配。
    handleCropRectEvent
    表示与用户通信的“裁剪窗口”。通常,这不需要重新分配缓冲区

  • 将解码帧复制到输出端口的缓冲区和解码的缓冲区

  • onQueueFilled
    中,解码成功后,将发送给调用方

  • 其余的函数非常简单,我觉得您可以简单地重用大部分实现

  • 要注册组件,您必须实现
    createSoftOMXComponent
    ,它创建
    SoftHEVC
    组件,如图所示

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

    通过这些步骤,我想你应该能够