Android MediaCodec message机制分析

本文详细分析了Android MediaCodec中的消息机制,从mCodecLooper的使用开始,探讨了ALooper、AMessage和ACodec之间的关系。通过跟踪代码,揭示了消息如何在CodecLooper线程上进行异步处理,以及ACodec如何利用消息处理状态机来控制其行为。整个流程涉及到线程创建、消息传递和状态机管理,展示了MediaCodec内部复杂而精巧的设计。
摘要由CSDN通过智能技术生成

我在MediaCodec中看到一段代码,感觉很蒙蔽

 if (mIsVideo) {
   
        // video codec needs dedicated looper
        if (mCodecLooper == NULL) {
   
            mCodecLooper = new ALooper;
            mCodecLooper->setName("CodecLooper");
            mCodecLooper->start(false, false, ANDROID_PRIORITY_AUDIO);
        }
        //这里mCodec是一个ACodec对象
        mCodecLooper->registerHandler(mCodec);
    }

在MediaCodec.h中定义了

sp<ALooper> mCodecLooper;

这是一个ALooper对象,然后在MediaCodec这个类里就再也搜索不到mCodecLooper的使用了。所以就很奇怪,总不能这段代码写出来没什么用吧?
对了,mCodecLooper是一个ALooper,start调用完之后,完全不像不作为的样子啊

status_t ALooper::start(
        bool runOnCallingThread, bool canCallJava, int32_t priority) {
   
    ...
    Mutex::Autolock autoLock(mLock);
    ...
    // LooperThread继承自Thread类
    // 通过threadLoop触发ALooper的loop
    mThread = new LooperThread(this, canCallJava);
    // 然后这个新创建的CodecLooper就开始运行了
    status_t err = mThread->run(
            mName.empty() ? "ALooper" : mName.c_str(), priority);
    if (err != OK) {
   
        mThread.clear();
    }

    return err;
}

很明显,这个线程被启动了,并且有事儿干。
此时,我的目光被这个调用吸引了

mCodecLooper->registerHandler(mCodec);

ALooper调用了registerHandler方法,传递了一个ACodec对象。而ACodec使用了很多AMessage来发消息,进行异步调用。那我们先列举一下这几个类的关系
暂时无法在文档外展示此内容
接着看看registerHandler方法

ALooper::handler_id ALooper::registerHandler(const sp<AHandler> &handler) {
   
    return gLooperRoster.registerHandler(this, handler);
}

函数就执行了,ALooper中的gLooperRoster调用registerHandler方法。在ALooper中没有发现gLooperRoster的使用,它是一个全局变量。
在frameworks/av/media/libstagefright目录搜索发现,除了ALooper,AMessage中也有这个全局变量的身影

foundation/AMessage.cpp:39:extern ALooperRoster gLooperRoster;

除此之外就没有线索了。所以再次在frameworks/av底下就行搜索

media/libmediaplayer2/mediaplayer2.cpp:49:extern ALooperRoster gLooperRoster;
media/libmediaplayer2/mediaplayer2.cpp:352:        gLooperRoster.dump(fd, args);
media/libstagefright/foundation/AMessage.cpp:39:extern ALooperRoster gLooperRoster;
media/libstagefright/foundation/ALooper.cpp:34:ALooperRoster gLooperRoster;
media/libstagefright/foundation/ALooper.cpp:76:    gLooperRoster.unregisterStaleHandlers();
media/libstagefright/foundation/ALooper.cpp:89:    return gLooperRoster.registerHandler(this, handler);
media/libstagefright/foundation/ALooper.cpp:93:    gLooperRoster.unregisterHandler(handlerID);
media/libmediaplayerservice/MediaPlayerService.cpp:260:extern ALooperRoster gLooperRoster
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值