写在前面:
在学习高通多媒体架构的代码的过程中间,很多地方跑着跑着,就找不到调用的地方了,通过堆栈发现,很多找不到的东西,就被如下几个不开源的库文件给打包调用了,所以这里记录下,高通Android是如何封装调用的,以及最重要的,这个封装的包到底是什么。

封装库文件:
vendor/qcom/proprietary/prebuilt_HY11/target/product/msm8909/system/vendor/lib/下面:
libExtendedExtractor.so
libmmparser_lite.so
libmmparser.so
libavenhancements.so(会调用上面三个库文件)
。。。

下面以libavenhancements.so库为例,分析这个封装的包里面到底是什么?:

//frameworks/av/media/libavextensions/common/AVExtensionsCommon.htypedef void *(*createFunction_t)(void);//函数指针template <typename T>struct ExtensionsLoader {//根据封装库中的工厂方法名字,创建被封装的扩展类实例,返回类型是 T    static T *createInstance(const char *createFunctionName);private:    static void loadLib();    //从封装库中间,通过名字映射方法,返回一个盒函数指针    static createFunction_t loadCreateFunction(const char *createFunctionName);    static void *mLibHandle;};//==============================================//模板类,声明一个单态的模版类/* * Boiler-plate to declare the class as a singleton (with a static getter) * which can be loaded (dlopen'd) via ExtensionsLoader */#define DECLARE_LOADABLE_SINGLETON(className)   \protected:                                      \    className();                                \    virtual ~className();                       \    static className *sInst;                    \private:                                        \    className(const className&);                \    className &operator=(className &);          \public:                                         \//get方法,返回一个实例    static className *get() {                   \        return sInst;                           \    }                                           \    friend struct ExtensionsLoader;//下面看具体的函数实现://frameworks/av/media/libavextensions/common/ExtensionsLoader.hpptemplate <typename T>T *ExtensionsLoader::createInstance(const char *createFunctionName) {        ALOGV("createInstance(%lubit) : %s", (unsigned long)sizeof(intptr_t)*8, createFunctionName);        // create extended object if extensions-lib is available and        // AV_ENHANCEMENTS is enabled#if ENABLE_AV_ENHANCEMENTS        createFunction_t createFunc = loadCreateFunction(createFunctionName);        if (createFunc) {            return reinterpret_cast((*createFunc)());        }#endif        // Else, create the default object        return new T;}//=======================================================//接下来,看如何操作库文件template <typename T>createFunction_t ExtensionsLoader::loadCreateFunction(const char *createFunctionName) {        loadLib();        if (!mLibHandle) {            return NULL;        }  //dlsym方法映射        createFunction_t func = (createFunction_t)dlsym(mLibHandle, createFunctionName);        if (!func) {            ALOGE("symbol %s not found:  %s",createFunctionName, dlerror());        }        return func;}

上面的代码,主要就是做两件事情:
1,加载库文件,根据工厂方法名字,查找封装库文件,返回一个模板类
2,通过宏,声明一个单态类

其中1,2两点如何联系起来?可以看下如下例子:

struct AVFactory{//...DECLARE_LOADABLE_SINGLETON(AVFactory)}//staticAVFactory *AVFactory::sInst =        ExtensionsLoader::createInstance("createExtendedFactory");

通过上面的分析,我们可以通过如下的关键字搜索全局,看看这个库里面有什么。关键字如下:
T *ExtensionsLoader::createInstance(const char *createFunctionName)

搜索结果:

frameworks/av/media/libavextensions/stagefright/AVFactory.cpp
frameworks/av/media/libavextensions/stagefright/AVUtils.cpp
frameworks/av/media/libavextensions/mediaplayerservice/AVNuUtils.cpp
frameworks/av/media/libavextensions/mediaplayerservice/AVMediaServiceFactory.cpp
frameworks/av/media/libavextensions/mediaplayerservice/AVMediaServiceUtils.cpp
frameworks/av/media/libavextensions/mediaplayerservice/AVNuFactory.cpp
frameworks/av/media/libavextensions/media/AVMediaUtils.cpp

搜索 DECLARE_LOADABLE_SINGLETON:

DECLARE_LOADABLE_SINGLETON(AVFactory)
DECLARE_LOADABLE_SINGLETON(AVUtils);
DECLARE_LOADABLE_SINGLETON(AVNuFactory);
DECLARE_LOADABLE_SINGLETON(AVNuUtils);
DECLARE_LOADABLE_SINGLETON(AVMediaServiceFactory);
DECLARE_LOADABLE_SINGLETON(AVMediaServiceUtils);
DECLARE_LOADABLE_SINGLETON(AVMediaUtils);

分析到这里,可见libavenhancements.so中间存在这些类的扩展子类,这些子类有什么功能呢?需要去看声明接口的地方,仍然以AVFactory为例。

struct AVFactory {    virtual sp createACodec();    //创建解析音视频的拆分器    virtual MediaExtractor* createExtendedExtractor(            const sp &source, const char *mime, const sp &meta,            const uint32_t flags);    virtual ElementaryStreamQueue* createESQueue(            ElementaryStreamQueue::Mode mode, uint32_t flags = 0);    virtual CameraSource *CreateCameraSourceFromCamera(            const sp &camera,            const sp &proxy,            int32_t cameraId,            const String16& clientName,            uid_t clientUid,            pid_t clientPid,            Size videoSize,            int32_t frameRate,            const sp& surface,            bool storeMetaDataInVideoBuffers = true);    virtual CameraSourceTimeLapse *CreateCameraSourceTimeLapseFromCamera(            const sp &camera,            const sp &proxy,            int32_t cameraId,            const String16& clientName,            uid_t clientUid,            pid_t clientPid,            Size videoSize,            int32_t videoFrameRate,            const sp& surface,            int64_t timeBetweenFrameCaptureUs,            bool storeMetaDataInVideoBuffers = true);    virtual AudioSource* createAudioSource(            audio_source_t inputSource,            const String16 &opPackageName,            uint32_t sampleRate,            uint32_t channels,            uint32_t outSampleRate = 0,            uid_t clientUid = -1,            pid_t clientPid = -1);    virtual MPEG4Writer *CreateMPEG4Writer(int fd);    // ----- NO TRESSPASSING BEYOND THIS LINE ------    DECLARE_LOADABLE_SINGLETON(AVFactory);};

涉及的C++知识点:

c++ 泛型

函数指针
形式1:返回类型(*函数名)(参数表)
形式2:typedef 返回类型(*新类型)(参数表)

static_cast、dynamic_cast、const_cast和reinterpret_cast

dlsym 、dlopen,dlclose

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. Android使用系统文件管理器选择文件,并将Uri转换为File
  6. android存放本地数据
  7. Android(安卓)ScrollView嵌套WebView出现大面积空白页解决方法
  8. Activity源码之Android(安卓)6.0权限相关完全解析
  9. android 网络下载PDF文件并打开PDF文件内容

随机推荐

  1. Android(安卓)Button的背景图片拉伸变形
  2. 2020-08-07
  3. Android(安卓)系统图标大全
  4. Android:自动完成文本框
  5. android studio软件下载地址
  6. Android自动化测试之MonkeyRunner-startA
  7. Ubuntu10.04 64(32)位 android开发环境建
  8. Android中各种Span的用法
  9. Android:如何设计一个完全不可见的Activi
  10. 代码设置android:icon,android:label