• 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);  
  • 相关阅读:
    centos 7 nginx 安装
    搭建Nuget.Server push时,"Failed to process request. 'Method Not Allowed'"
    Failed to create prime the NuGet cache
    Centos 7 安装 Visual stdio Code
    diskpart 格式化u盘 制作u盘启动盘方法
    sql server 2012 数据库日志文件过大,怎么缩小?
    浏览器同源政策及其规避方法
    redis底层数据结构--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表
    php的闭包
    hash一致性算法
  • 原文地址:https://www.cnblogs.com/nsnow/p/3808049.html
Copyright © 2020-2023  润新知