zoukankan      html  css  js  c++  java
  • android中OpenMax的实现【2】AwesomePlayer中openmax的入口

    AwesomePlayer 中有个变量 

    [cpp] view plaincopy
     
    1. OMXClient mClient;  
    让我们看看   OMXClient 
    [cpp] view plaincopy
     
    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 的构造函数中会调用 
    [cpp] view plaincopy
     
    1. CHECK_EQ(mClient.connect(), (status_t)OK);  
    [cpp] view plaincopy
     
    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. }  
    [cpp] view plaincopy
     
    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服务。
    [cpp] view plaincopy
     
    1. sp<IOMX> interface() {  
    2.       return mOMX;  
    3.   }  
    [cpp] view plaincopy
     
    1. mAudioSource = OMXCodec::Create(  
    2.                 mClient.interface(), mAudioTrack->getFormat(),  
    3.                 false, // createEncoder  
    4.                 mAudioTrack);  
    [cpp] view plaincopy
     
    1. mVideoSource = OMXCodec::Create(  
    2.             mClient.interface(), mVideoTrack->getFormat(),  
    3.             false, // createEncoder  
    4.             mVideoTrack,  
    5.             NULL, flags, USE_SURFACE_ALLOC ? mNativeWindow : NULL);  
  • 相关阅读:
    93. Restore IP Addresses
    92. Reverse Linked List II
    阿里巴巴 内推 面试
    hulu
    287. Find the Duplicate Number *HARD*
    89. Gray Code
    87. Scramble String *HARD* 动态规划
    84. Largest Rectangle in Histogram *HARD* -- 柱状图求最大面积 85. Maximal Rectangle *HARD* -- 求01矩阵中的最大矩形
    BZOJ2693jzptab
    最大公约数和
  • 原文地址:https://www.cnblogs.com/nsnow/p/3808049.html
Copyright © 2011-2022 走看看