我在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