Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android多媒體開發【11】-- android中OpenMax的實現【2】AwesomePlayer中openmax的入口

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

編輯:關於Android編程

AwesomePlayer 中有個變量
[cpp] 
OMXClient mClient; 
讓我們看看   OMXClient
[cpp] 
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] 
CHECK_EQ(mClient.connect(), (status_t)OK); 
[cpp] 
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
sp<IOMX> interface() { 
      return mOMX; 
  } 
[cpp]  
mAudioSource = OMXCodec::Create( 
                mClient.interface(), mAudioTrack->getFormat(), 
                false, // createEncoder 
                mAudioTrack); 
[cpp] 
mVideoSource = OMXCodec::Create( 
            mClient.interface(), mVideoTrack->getFormat(), 
            false, // createEncoder 
            mVideoTrack, 
            NULL, flags, USE_SURFACE_ALLOC ? mNativeWindow : NULL); 
[cpp] 
 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved