Android多媒体开发【11】-- android中OpenMax的实现【2】AwesomePlayer中openmax的入口
2014-06-23 10:39
555 查看
http://blog.csdn.net/tx3344/article/details/8126732
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);
[cpp] view
plaincopy
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);
[cpp] view
plaincopy
相关文章推荐
- Android多媒体开发【11】-- android中OpenMax的实现【2】AwesomePlayer中openmax的入口
- Android多媒体开发【11】-- android中OpenMax的实现【2】AwesomePlayer中openmax的入口
- android中OpenMax的实现【2】AwesomePlayer中openmax的入口
- Android多媒体开发【12】-- android中OpenMax的实现【3】OMX中主要成员
- Android多媒体开发【10】-- android中OpenMax的实现【1】整体框架
- android中OpenMax + AwesomePlayer中openmax的入口
- Android多媒体开发-- android中OpenMax的实现整体框架
- Android多媒体开发【12】-- android中OpenMax的实现【3】OMX中主要成员
- Android多媒体开发【10】-- android中OpenMax的实现【1】整体框架
- Android多媒体开发【10】-- android中OpenMax的实现【1】整体框架
- Android多媒体开发【10】-- android中OpenMax的实现【1】整体框架
- Android多媒体开发【12】-- android中OpenMax的实现【3】OMX中主要成员
- Android多媒体开发-- android中OpenMax的实现整体框架
- Android多媒体开发【12】-- android中OpenMax的实现【3】OMX中主要成员
- 【Android应用开发】-(11)使用JPCT-AE 3D框架实现旋转的立方体(附效果图及源码)
- android 多媒体框架服务之StagefrightPlayer和OMXCodec实现原理学习
- Android初级开发(八)——手机多媒体—弹窗选择照片或直接拍照的实现
- android中多媒体解码openmax的实现
- Android初级开发(八)——手机多媒体—底部弹窗+选择照片或拍照的实现
- Android MediaPlayer Playback---多媒体开发应用程序接口