Android MultiMedia框架——OMX服务启动

本文详细介绍了Android多媒体框架中的OMX服务启动过程,从硬件plugin到软件plugin的加载,以及MediaCodec编码上下文。在Android 9.0源码基础上,分析了OMXService如何加载libmedia_codecserviceregistrant.so,创建OmxStore和Omx,注册服务,并解析media_codecs.xml等配置文件。重点讨论了OMXMaster如何管理硬件和软件编码plugin,以及组件和插件之间的映射关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android MultiMedia框架——OMX服务启动
Android MultiMedia框架——OMXPlugin
Android MultiMedia框架——MediaCodec编码(上)
Android MultiMedia框架——MediaCodec编码(下)

基于Android9.0 源码分析

hw/android.hardware.media.omx@1.0-service和audioserver进程类似,也是通过init进程加载rc文件的方式,启动service

rc配置文件:frameworks/av/services/mediacodec/android.hardware.media.omx@1.0-service.rc

service vendor.media.omx /vendor/bin/hw/android.hardware.media.omx@1.0-service
    class main
    user mediacodec
    group camera drmrpc mediadrm
    ioprio rt 4
    writepid /dev/cpuset/foreground/tasks

OMX服务流程图如下:
在这里插入图片描述

看一下其内部实现

main_codecservice.cpp

int main(int argc __unused, char** argv)
{
   
   
    strcpy(argv[0], "media.codec");

    signal(SIGPIPE, SIG_IGN);
    SetUpMinijail(kSystemSeccompPolicyPath, kVendorSeccompPolicyPath);

    android::ProcessState::initWithDriver("/dev/vndbinder");
    android::ProcessState::self()->startThreadPool();

    ::android::hardware::configureRpcThreadpool(64, false);

    // 定制编解码器服务
    void *registrantLib = dlopen(
            "libmedia_codecserviceregistrant.so",
            RTLD_NOW | RTLD_LOCAL);
    if (registrantLib) {
   
   
        RegisterCodecServicesFunc registerCodecServices =
                reinterpret_cast<RegisterCodecServicesFunc>(
                dlsym(registrantLib, "RegisterCodecServices"));
        if (registerCodecServices) {
   
   
            registerCodecServices();
        } else {
   
   
            LOG(WARNING) << "Cannot register additional services "
                    "-- corrupted library.";
        }
    } else {
   
   
        // Default codec services
        using namespace ::android::hardware::media::omx::V1_0;
        sp<IOmxStore> omxStore = new implementation::OmxStore();
        if (omxStore == nullptr) {
   
   
            LOG(ERROR) << "Cannot create IOmxStore HAL service.";
        } else if (omxStore->registerAsService() != OK) {
   
   
            LOG(ERROR) << "Cannot register IOmxStore HAL service.";
        }
        sp<IOmx> omx = new implementation::Omx();
        if (omx == nullptr) {
   
   
            LOG(ERROR) << "Cannot create IOmx HAL service.";
        } else if (omx->registerAsService() != OK) {
   
   
            LOG(ERROR) << "Cannot register IOmx HAL service.";
        } else {
   
   
            LOG(INFO) << "IOmx HAL service created.";
        }
    }

    ::android::hardware::joinRpcThreadpool();
}
  1. strcpy 修改进程名为media.codec;
    修改后的进程信息为:
    mediacodec 910 1 1 19:08:07 ? 00:00:00 media.codec hw/android.hardware.media.omx@1.0-service
  2. 加载libmedia_codecserviceregistrant.so,判断是否有定制编解码器服务;
  3. 默认codec services,创建OmxStore,Omx, 分别注册服务;

OmxStore 初始化

查看OMXStore初始化方法

OmxStore::OmxStore(
        const char* owner,
        const char* const* searchDirs,
        const char* mainXmlName,
        const char* performanceXmlName,
        const char* profilingResultsXmlPath) {
   
   
    MediaCodecsXmlParser <
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值