如何在Android Framework中添加自定义硬件编解码器?

Android 专栏收录该内容
239 篇文章 1 订阅

原文:How to add custom hardware codec to Android Framework?
http://gopinaths.gitlab.io/post/custom_hardware_codec_in_android/

本文介绍了Android平台中的媒体架构,从而解释了将自己的供应商特定硬件编码器/解码器作为OpenMAX组件添加到Android框架的步骤。

什么是编解码器?

编解码器是硬件设备或将输入数据处理成输出数据的计算机程序。编码数据流或用于传输和存储的信号(可能是加密形式)的编解码器称为编码器,解码器功能反转编码以进行重放或编辑。编解码器广泛用于视频会议,流媒体和视频编辑应用等应用。以下是几种不同类型的视频编解码器:H.264编码器和解码器,MPEG编码器和解码器,MJPEG编码器和解码器。

Android中的Mediacodec

Android包括Stagefright,一种原生级别的媒体播放引擎,内置基于软件的流行媒体格式编解码器。 Stagefright音频和视频播放功能包括与OpenMAX编解码器的集成,会话管理,时间同步渲染,传输控制和DRM(称为数字限制管理或数字版权管理)。 Stagefright还支持设备供应商提供的自定义硬件编解码器的集成。

架构

下面的框图显示了Android中的媒体架构。
在这里插入图片描述
从上图中可以看出,媒体架构主要由以下类和组件组成。

  • MediaCodec Class
  • Media player Service
  • Stagefright Engine
  • OMX Components.

Stagefright Engine and MediaPlayer Service

在本机级别,Android提供了一个多媒体框架,利用Stagefright引擎进行音频和视频录制和回放。 Stagefright附带默认的受支持软件编解码器列表,您可以使用OpenMax集成层标准实现自己的硬件编解码器。 有关更多实现细节,请参阅位于AOSP路径下方的MediaPlayer和Stagefright组件。

frameworks/av/media/libmedia 
frameworks/av/media/libmediaplayerservice
frameworks/av/media/libstagefright

MediaCodec类

MediaCodec类可用于访问低级媒体编解码器,即编码器/解码器组件.MediaCodec类首先在Android 4.1(API 16)中可用。 mediacodec类的主要目的是访问设备中的底层硬件和软件编解码器。 因此,如果想在Android应用程序中使用自定义硬件/软件编解码器,则需要将编解码器注册到Android Framework。 这可以通过以下步骤完成。

在Android中注册您的编解码器的步骤

在Android框架中,编解码器通过media_codecs.xml注册。 以下是来自media_codec.xml文件的示例编码器和解码器块。

<MediaCodecs>
    <Encoders>
        <!-- video Decoder  -->
        <MediaCodec name="OMX.qcom.video.encoder.h263" type="video/3gpp" >
            <Quirk name="requires-allocate-on-input-ports" />
            <Quirk name="requires-allocate-on-output-ports"/>
            <Quirk name="requires-loaded-to-idle-after-allocation"/>
        </MediaCodec>
    </Encoders>
    <Decoders>
        <!-- video Decoder  -->
        <MediaCodec name="OMX.qcom.video.decoder.mpeg4" type="video/mp4v-es" >
            <Quirk name="requires-allocate-on-input-ports" />
            <Quirk name="requires-allocate-on-output-ports"/>
            <Quirk name="defers-output-buffer-allocation"/>
        </MediaCodec>
    </Decoders>
</MediaCodecs>

在标准的Android发行版中,可以在此处找到示例media_codecs.xml。 Stagefright服务解析系统/ etc / media_codecs.xml和system / etc / media_profiles.xml,以通过android.media.MediaCodecList和android.media.CamcorderProfile类将设备上支持的编解码器和配置文件公开给应用程序。 因此,您需要创建/编辑自己的media_codec.xml文件,并在AOSP构建期间将其复制到系统映像的system / etc目录中。

例子

要注册视频编解码器,您必须在解码器列表下添加新条目。 如果编码器在编码器列表下添加新条目。 为确保始终选择您的编解码器,请确保您的编解码器被列为特定MIME类型的第一个条目。 以下是media_codecs.xml文件中H.264编码器和解码器的示例。

H.264编码器示例,

</encoders>
    <MediaCodec name="OMX.vendor-name.h264.encode" type="video/avc" >
         <Limit name="size" min="48x48" max="3840x2176" />
       <Limit name="bitrate" range="1-50000000" />
    </MediaCodec>
</encoders>
</Decoders>
     <MediaCodec name="OMX.vendor-name.h264.decoder" type="video/avc" >
            <Limit name="size" min="32x32" max="3840x2176" />
            <Limit name="bitrate" range="1- 62500000" />
        </MediaCodec"bitrate" range="1-50000000" />
    </MediaCodec>
</Decoders>

其中,OMX.vendor-name.H264.encoder和OMX.vendor-name.H264.Decoder是组件的名称。 video / avc是组件的MIME类型。在该示例中,它表示AVC / H.264视频。接下来的两个语句表示编解码器的怪癖或特殊要求。现在您刚刚将自定义编解码器注册到了android框架。 ifile的。下一步是将您的编解码器集成到OMX层中。

OMX组件

什么是OpenMAX(OMX)?
OpenMAX(开放媒体加速)是一种免版税的跨平台(C语言编程接口)开放标准,用于加速嵌入式和移动设备上多媒体应用中的音频,视频和图像的捕获和呈现。 OpenMAX由非营利性技术联盟Khronos Group管理。 OpenMAX提供三层接口:

应用层(AL)
整合层(IL)
开发层(DL)
应用层(AL)
OpenMAX AL是多媒体应用程序(如媒体播放器)和平台媒体框架之间的接口。在Anroid中,该层暴露为mediacodec类。

整合层(IL)

OpenMAX IL是媒体框架和一组多媒体组件(如音频或视频编解码器)之间的接口。例如,在我们的例子中,它是Android上的StageFright或MediaCodec API。对于Windows,它是DirectShow。同样,Linux上的FFmpeg或Libav,或跨平台的GStreamer)。因此,如果要向Android OMAX层添加任何硬件编解码器支持,则必须在此层中完成。为此,您必须创建OMX组件和一个OMX插件,将您的自定义编解码器与Stagefright框架连接在一起。例如组件,可以参考Galaxy Nexus的示例插件,这里:hardware / ti / omap4xx / libstagefrighthw。

在OMAX IL层中添加自己的编解码器

根据OpenMAX IL组件标准创建组件。组件接口位于frameworks / native / include / media / OpenMAX / OMX_Component.h文件中。
创建一个OpenMAX插件,将您的组件与Stagefright服务相链接。有关创建插件的接口,请参阅frameworks / native / include / media / hardware / OMXPluginBase.h和HardwareAPI.h头文件。
将您的插件构建为产品Makefile中名为libstagefrighthw.so的共享库。该库将放在您的终端系统的/ system / lib中。该库将公开一个将由dlsym查找的createOMXPlugin符号。
OMXMaster调用addVendorPlugin,它在内部调用addPlugin(“libstagefrighthw.so”)。在addPlugin中,将查找createOMXPlugin,使用该函数初始化makeComponentInstance,destroyComponentInstance等的其他函数指针。
注意:

在某些情况下,这个“libstagefrighthw.so”库将由您的编解码器供应商作为预构建的二进制文件提供,因为它可能包含专有信息。在这种情况下,您的设备供应商将实施前两个步骤。在这种情况下,您只需要确保将模块声明为产品包。

开发层(DL)

OpenMAX DL是物理硬件之间的接口,例如数字信号处理器(DSP)芯片,CPU,GPU和软件,如视频编解码器和3D引擎。它允许编解码器/芯片供应商轻松集成支持OpenMAX DL的新硬件,而无需优化其低级软件。

Android中的OpenMAX核心实现:
可以从以下细节中参考Android中的OpenMAX实现。

源代码:/ AOSP / frameworks / av / media / libstagefright / omx
包含文件:/ AOSP / frameworks / native / include / media / openmax
共享库名:libstagefright_omx.so
对libstagefright的更改
在某些情况下,您可能需要将硬件编解码器组件支持的MIME类型添加到stagefright引擎。这告诉topfright引擎有关新支持的MIME类型的顶级应用程序框架。
必须在frameworks / av / media / libstagefright中的Acodec.cpp文件中添加支持。例如,如果您的MIME未在“MimeToRole”和“VideoCodingMapEntry”结构中列出,则需要将其包含在那里。例如,您可以参考“MEDIA_MIMETYPE_VIDEO_H263”来查看它是如何在libstagefright中注册的。

struct MimeToRole {
        const char *mime;
        const char *decoderRole;
        const char *encoderRole;
    }; 

References
https://source.android.com/devices/media/
https://www.khronos.org/files/openmax-al-1-1-quick-reference.pdf
https://www.khronos.org/openmax/

Portions of this page are reproduced from work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.

  • 0
    点赞
  • 0
    评论
  • 4
    收藏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值