Android多媒體開發【11】-- android中OpenMax的實現【2】AwesomePlayer中openmax的入口

原文鏈接地址:http://blog.csdn.net/tx3344/article/details/8126732

AwesomePlayer 中有個變量 

  1. OMXClient mClient;  
讓我們看看   OMXClient 
  1. class OMXClient {  
  2. public:  
  3.     OMXClient();  
  4.   
  5.     status_t connect();  
  6.     void disconnect();  
  7.   
  8.     sp<IOMX> interface() {  
  9.         return mOMX;  
  10.     }  
  11.   
  12. private:  
  13.     sp<IOMX> 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<IServiceManager> sm = defaultServiceManager();  
  3.     sp<IBinder> binder = sm->getService(String16("media.player"));  
  4.     sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(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<IOMX> 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<IOMX> mOMX的實例 傳給mVideoSource、mAudioSource來共享使用這個OMX的入口。
也就是說一個AwesomePlayer對應着 一個IOMX 變量,AwesomePlayer中的音視頻解碼器共用這個IOMX變量來獲得OMX服務。
  1. sp<IOMX> 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);  

 

發佈了90 篇原創文章 · 獲贊 17 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章