【Android】从libavenhancements.so的调用分析高通封装

写在前面:
在学习高通多媒体架构的代码的过程中间,很多地方跑着跑着,就找不到调用的地方了,通过堆栈发现,很多找不到的东西,就被如下几个不开源的库文件给打包调用了,所以这里记录下,高通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.h

typedef 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.hpp
template <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)
}
//static
AVFactory *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

你可能感兴趣的:(android,Linux,驱动,多媒体技术)