AwesomePlayer 中有个变量
-
class OMXClient {
-
public:
-
OMXClient();
-
-
status_t connect();
-
void disconnect();
-
-
sp interface() {
-
return mOMX;
-
}
-
-
private:
-
sp mOMX;
-
-
OMXClient(const OMXClient &);
-
OMXClient &operator=(const OMXClient &);
-
};
OMXClient 有个IOMX 的变量 mOMX ,这个就是和OMX服务进行binder通讯的。
在 AwesomePlayer 的构造函数中会调用
-
CHECK_EQ(mClient.connect(), (status_t)OK);
-
status_t OMXClient::connect() {
-
sp sm = defaultServiceManager();
-
sp binder = sm->getService(String16("media.player"));
-
sp service = interface_cast(binder);
-
-
CHECK(service.get() != NULL);
-
-
mOMX = service->getOMX();
-
CHECK(mOMX.get() != NULL);
-
-
if (!mOMX->livesLocally(NULL , getpid())) {
-
ALOGI("Using client-side OMX mux.");
-
mOMX = new MuxOMX(mOMX);
-
}
-
-
return OK;
-
}
-
sp MediaPlayerService::getOMX() {
-
Mutex::Autolock autoLock(mLock);
-
-
if (mOMX.get() == NULL) {
-
mOMX = new OMX;
-
}
-
-
return mOMX;
-
}
OMXClient::connect函数是通过binder机制 获得到MediaPlayerService,然后通过MediaPlayerService来创建OMX的实例。这样OMXClient就获得到了OMX的入口,接下来就可以通过binder机制来获得OMX提供的服务。
也就是说OMXClient 是android中 openmax 的入口。
在创建音视频解码mVideoSource、mAudioSource的时候会把OMXClient中的sp mOMX的实例 传给mVideoSource、mAudioSource来共享使用这个OMX的入口。
也就是说一个AwesomePlayer对应着 一个IOMX 变量,AwesomePlayer中的音视频解码器共用这个IOMX变量来获得OMX服务。
-
sp interface() {
-
return mOMX;
-
}
-
mAudioSource = OMXCodec::Create(
-
mClient.interface(), mAudioTrack->getFormat(),
-
false,
-
mAudioTrack);
-
mVideoSource = OMXCodec::Create(
-
mClient.interface(), mVideoTrack->getFormat(),
-
false,
-
mVideoTrack,
-
NULL, flags, USE_SURFACE_ALLOC ? mNativeWindow : NULL);
阅读(1180) | 评论(0) | 转发(0) |