您的位置:首页 > 移动开发 > Android开发

android中OpenMax的实现【2】AwesomePlayer中openmax的入口

2014-06-25 14:51 351 查看
AwesomePlayer 中有个变量

[cpp] view plaincopy

OMXClient mClient;

让我们看看 OMXClient

[cpp] view plaincopy

class OMXClient {

public:

OMXClient();

status_t connect();

void disconnect();

sp<IOMX> interface() {

return mOMX;

}

private:

sp<IOMX> mOMX;

OMXClient(const OMXClient &);

OMXClient &operator=(const OMXClient &);

};

OMXClient 有个IOMX 的变量 mOMX ,这个就是和OMX服务进行binder通讯的。
在 AwesomePlayer 的构造函数中会调用

[cpp] view plaincopy

CHECK_EQ(mClient.connect(), (status_t)OK);

[cpp] view plaincopy

status_t OMXClient::connect() {

sp<IServiceManager> sm = defaultServiceManager();

sp<IBinder> binder = sm->getService(String16("media.player"));

sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder);

CHECK(service.get() != NULL);

mOMX = service->getOMX();

CHECK(mOMX.get() != NULL);

if (!mOMX->livesLocally(NULL /* node */, getpid())) {

ALOGI("Using client-side OMX mux.");

mOMX = new MuxOMX(mOMX);

}

return OK;

}

[cpp] view plaincopy

sp<IOMX> 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<IOMX> mOMX的实例 传给mVideoSource、mAudioSource来共享使用这个OMX的入口。
也就是说一个AwesomePlayer对应着 一个IOMX 变量,AwesomePlayer中的音视频解码器共用这个IOMX变量来获得OMX服务。

[cpp] view plaincopy

sp<IOMX> interface() {

return mOMX;

}

[cpp] view plaincopy

mAudioSource = OMXCodec::Create(

mClient.interface(), mAudioTrack->getFormat(),

false, // createEncoder

mAudioTrack);

[cpp] view plaincopy

mVideoSource = OMXCodec::Create(

mClient.interface(), mVideoTrack->getFormat(),

false, // createEncoder

mVideoTrack,

NULL, flags, USE_SURFACE_ALLOC ? mNativeWindow : NULL);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: