现在的位置: 首页 > 综合 > 正文

android中OpenMax + AwesomePlayer中openmax的入口

2013年09月25日 ⁄ 综合 ⁄ 共 1809字 ⁄ 字号 评论关闭

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] 

【上篇】
【下篇】

抱歉!评论已关闭.