Chinaunix首页 | 论坛 | 博客
  • 博客访问: 668714
  • 博文数量: 160
  • 博客积分: 2384
  • 博客等级: 大尉
  • 技术积分: 1366
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-01 11:35
文章分类
文章存档

2015年(45)

2014年(36)

2012年(28)

2011年(37)

2010年(2)

2009年(10)

2008年(2)

分类: Android平台

2015-06-02 18:32:29

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.   
阅读(1170) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~