[Android Video Framework]ACodec加载OMX

本文详细解析了Android系统中ACodec如何加载OpenMAX层的OMX组件,包括通过OMXClient连接MediaCodecService,获取OMX句柄,加载vendor和google的组件,以及分配组件节点的过程。重点介绍了connectLegacy方法,涉及到Project Treble的组件解耦以及libstagefrighthw.so中的接口实现。
摘要由CSDN通过智能技术生成

OpenMAX确立了一套标准的接口,上层App直接调用这些接口,底层硬件厂商直接实现这些接口,
从而实现了上层软件开发与底层芯片开发地彻底分离,加速了跨平台的多媒体组件的开发、整合和编程。
Android上的MediaCodec是通过ACodec来加载openmax层,了解OMX加载过程,有助于我们更好的分析问题和解决问题

加载过程还需从ACodec::UninitializedState::onAllocateComponent接口说起。

1、onAllocateComponent

bool ACodec::UninitializedState::onAllocateComponent(const sp<AMessage> &msg) {
……
    for (size_t matchIndex = 0; matchIndex < matchingCodecs.size();
            ++matchIndex) {
        componentName = matchingCodecs[matchIndex];

    OMXClient client;
    bool trebleFlag;
    if (client.connect(owners[matchIndex].c_str(), &trebleFlag) != OK) {
        mCodec->signalError(OMX_ErrorUndefined, NO_INIT);
        return false;
    }
    omx = client.interface();

        pid_t tid = gettid();
        int prevPriority = androidGetThreadPriority(tid);
        androidSetThreadPriority(tid, ANDROID_PRIORITY_FOREGROUND);
        err = omx->allocateNode(componentName.c_str(), observer, &omxNode);
        androidSetThreadPriority(tid, prevPriority);

        if (err == OK) {
            mCodec->setTrebleFlag(trebleFlag);
            ALOGE("codec %s selected", componentName.c_str());
            break;
        } else {
            ALOGE("Allocating component '%s' failed, try next one.", componentName.c_str());
        }

        omxNode = NULL;
    }

可以简单理解为两步
1、获取OMX句柄
2、分配component

1.1 获取OMX句柄

我们可以将此过程理解为 C/S模型,客户端/服务器模型
运行在mediaserver或者app进程内的 MediaCodec是 client
运行在media.codec进程内的component是 server
MediaCodec通过 OMXClient,经过binder进程间通讯, 向MediaCodecService获取 OMX句柄
如下:

        OMXClient client;
        bool trebleFlag;
        if (client.connect(owners[matchIndex].c_str(), &trebleFlag) != OK) {
            mCodec->signalError(OMX_ErrorUndefined, NO_INIT);
            return false;
        }
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值