Android多媒体开发【11】-- android中OpenMax的实现【2】AwesomePlayer中openmax的入口
16lz
2021-01-24
AwesomePlayer 中有个变量
OMXClient mClient;让我们看看 OMXClient
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 的构造函数中会调用
CHECK_EQ(mClient.connect(), (status_t)OK);
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;}
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服务。
sp<IOMX> interface() { return mOMX; }
mAudioSource = OMXCodec::Create( mClient.interface(), mAudioTrack->getFormat(), false, // createEncoder mAudioTrack);
mVideoSource = OMXCodec::Create( mClient.interface(), mVideoTrack->getFormat(), false, // createEncoder mVideoTrack, NULL, flags, USE_SURFACE_ALLOC ? mNativeWindow : NULL);
更多相关文章
- android绘制过程
- Android 开机动画源码分析
- Android 网络通信框架Volley的简单使用
- Android System Server大纲之LightsService
- Android startActivityForResult unfortunately 程序名 has stop
- Android Binder AIDL解析
- Android 使用Ant编译Android 工程
- Android Canvas练习(2)自已绘饼图(Pie Chart)