Android多媒体开发【3】-- android中OpenMax的实现【2】AwesomePlayer中openmax的入口

1220阅读 0评论2015-06-02 mandagod
分类:Android平台

AwesomePlayer 中有个变量 

  1. OMXClient mClient;  
让我们看看   OMXClient 
  1. class OMXClient {  
  2. public:  
  3.     OMXClient();  
  4.   
  5.     status_t connect();  
  6.     void disconnect();  
  7.   
  8.     sp interface() {  
  9.         return mOMX;  
  10.     }  
  11.   
  12. private:  
  13.     sp mOMX;  
  14.   
  15.     OMXClient(const OMXClient &);  
  16.     OMXClient &operator=(const OMXClient &);  
  17. };  
OMXClient 有个IOMX 的变量 mOMX ,这个就是和OMX服务进行binder通讯的。
在 AwesomePlayer 的构造函数中会调用 
  1. CHECK_EQ(mClient.connect(), (status_t)OK);  
  1. status_t OMXClient::connect() {  
  2.     sp sm = defaultServiceManager();  
  3.     sp binder = sm->getService(String16("media.player"));  
  4.     sp service = interface_cast(binder);  
  5.   
  6.     CHECK(service.get() != NULL);  
  7.   
  8.     mOMX = service->getOMX();  
  9.     CHECK(mOMX.get() != NULL);  
  10.   
  11.     if (!mOMX->livesLocally(NULL /* node */, getpid())) {  
  12.         ALOGI("Using client-side OMX mux.");  
  13.         mOMX = new MuxOMX(mOMX);  
  14.     }  
  15.   
  16.     return OK;  
  17. }  
  1. sp MediaPlayerService::getOMX() {  
  2.     Mutex::Autolock autoLock(mLock);  
  3.   
  4.     if (mOMX.get() == NULL) {  
  5.         mOMX = new OMX;  
  6.     }  
  7.   
  8.     return mOMX;  
  9. }  

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服务。
  1. sp interface() {  
  2.       return mOMX;  
  3.   }  
  1. mAudioSource = OMXCodec::Create(  
  2.                 mClient.interface(), mAudioTrack->getFormat(),  
  3.                 false// createEncoder  
  4.                 mAudioTrack);  
  1. mVideoSource = OMXCodec::Create(  
  2.             mClient.interface(), mVideoTrack->getFormat(),  
  3.             false// createEncoder  
  4.             mVideoTrack,  
  5.             NULL, flags, USE_SURFACE_ALLOC ? mNativeWindow : NULL);  
  1.   
上一篇:Android多媒体开发【2】-- android中OpenMax的实现【1】整体框架
下一篇:Android多媒体开发【4】-- android中OpenMax的实现【3】OMX中主要成员