Android CCodec Codec2 (五)C2Param - Ⅲ

这一节我们来看看简单参数的定义方式

1、C2SimpleValueStruct

Codec2框架提供了模板类C2SimpleValueStruct来帮助我们定义非灵活数组的简单参数。C2SimpleValueStruct的定义如下:

cpp 复制代码
template<typename T>
struct C2SimpleValueStruct {
    T value; ///< simple value of the structure
    // Default constructor.
    inline C2SimpleValueStruct() = default;
    // Constructor with an initial value.
    inline C2SimpleValueStruct(T value) : value(value) {}
    DEFINE_BASE_C2STRUCT(SimpleValue)
};

宏展开后还是很简单:

cpp 复制代码
template<typename T>
struct C2SimpleValueStruct {
    T value; ///< simple value of the structure
    // Default constructor.
    inline C2SimpleValueStruct() = default;
    // Constructor with an initial value.
    inline C2SimpleValueStruct(T value) : value(value) {}

private: 
    const static std::vector<C2FieldDescriptor> _FIELD_LIST __unused; 
public: 
    typedef C2SimpleValueStruct _type; 
    static const std::vector<C2FieldDescriptor> FieldList();
};

与复杂参数不一样的是,C2SimpleValueStruct是没有CORE_INDEX(BaseIndex)的。由于只有一个参数value,FieldList返回的C2FieldDescriptor列表只有一个元素。

cpp 复制代码
template<typename T>
const std::vector<C2FieldDescriptor> C2SimpleValueStruct<T>::FieldList() {
    return { DESCRIBE_C2FIELD(value, "value") };
}

框架帮我们预定义了一些常用的简单参数,其中混入了两个异类C2BlobValue和C2StringValue,它们是什么?

cpp 复制代码
typedef C2SimpleValueStruct<int32_t> C2Int32Value;
typedef C2SimpleValueStruct<uint32_t> C2Uint32Value;
typedef C2SimpleValueStruct<int64_t> C2Int64Value;
typedef C2SimpleValueStruct<uint64_t> C2Uint64Value;
typedef C2SimpleValueStruct<float> C2FloatValue;
typedef C2SimpleValueStruct<uint8_t[]> C2BlobValue;
typedef C2SimpleValueStruct<char[]> C2StringValue;

C2SimpleValueStruct还提供了一个模板特化,传入的模板参数为数组时会使用此特化模板:

cpp 复制代码
template<typename T>
struct C2SimpleValueStruct<T[]> {
    static_assert(std::is_same<T, char>::value || std::is_same<T, uint8_t>::value,
                  "C2SimpleValueStruct<T[]> is only for BLOB or STRING");
    T value[];

    inline C2SimpleValueStruct() = default;
    DEFINE_BASE_C2STRUCT(SimpleValue)
    FLEX(C2SimpleValueStruct, value)

private:
    inline C2SimpleValueStruct(size_t flexCount, const C2MemoryBlock<T> &block) {
        _C2ValueArrayHelper::init(value, flexCount, block);
    }

    inline C2SimpleValueStruct(size_t flexCount, const std::initializer_list<T> &init) {
        _C2ValueArrayHelper::init(value, flexCount, init);
    }

    inline C2SimpleValueStruct(size_t flexCount, const std::vector<T> &init) {
        _C2ValueArrayHelper::init(value, flexCount, init);
    }

    template<unsigned N>
    inline C2SimpleValueStruct(size_t flexCount, const T(&init)[N]) {
        _C2ValueArrayHelper::init(value, flexCount, init);
    }
};

是不是所有类型的数组都能用此特化模板呢?答案是否定的,模板中有个静态断言来检查传入的模板类型是否是char或者uint8_t,如果不是将抛出error。也就是说这个模板特化是专为char数组和uint8_t数组定义的。

将模板中宏展开:

cpp 复制代码
template<typename T>
struct C2SimpleValueStruct<T[]> {
    static_assert(std::is_same<T, char>::value || std::is_same<T, uint8_t>::value,
                  "C2SimpleValueStruct<T[]> is only for BLOB or STRING");
    T value[];

    inline C2SimpleValueStruct() = default;

private:
    const static std::vector<C2FieldDescriptor> _FIELD_LIST __unused;

public:
    typedef C2SimpleValueStruct _type;
    static const std::vector<C2FieldDescriptor> FieldList(); 

    C2_DO_NOT_COPY(C2SimpleValueStruct)
private:
    C2PARAM_MAKE_FRIENDS

    template<typename, typename> friend struct _C2FlexHelper;
public:
    typedef decltype(value) _FlexMemberType;

    inline C2SimpleValueStruct(size_t) : C2SimpleValueStruct() {}

    typedef typename _C2FlexHelper<_FlexMemberType>::FlexType FlexType;
    static_assert(
            !std::is_void<FlexType>::value,
            "member is not flexible, or a flexible array of a flexible type");
    enum : uint32_t { FLEX_SIZE = _C2FlexHelper<_FlexMemberType>::FLEX_SIZE };

private:
    inline C2SimpleValueStruct(size_t flexCount, const C2MemoryBlock<T> &block) {
        _C2ValueArrayHelper::init(value, flexCount, block);
    }

    inline C2SimpleValueStruct(size_t flexCount, const std::initializer_list<T> &init) {
        _C2ValueArrayHelper::init(value, flexCount, init);
    }

    inline C2SimpleValueStruct(size_t flexCount, const std::vector<T> &init) {
        _C2ValueArrayHelper::init(value, flexCount, init);
    }

    template<unsigned N>
    inline C2SimpleValueStruct(size_t flexCount, const T(&init)[N]) {
        _C2ValueArrayHelper::init(value, flexCount, init);
    }
};

FieldList不是由宏提供的,代码实现位于C2ParamDef.h最后:

cpp 复制代码
template<typename T>
const std::vector<C2FieldDescriptor> C2SimpleValueStruct<T[]>::FieldList() {
    return { DESCRIBE_C2FIELD(value, "value") };
}

2、C2ENUM

3、C2SimpleArrayStruct

相关推荐
EasyDSS2 小时前
视频监控从安装到优化的技术指南,视频汇聚系统EasyCVR智能安防系统构建之道
大数据·网络·网络协议·音视频
似霰2 小时前
安卓adb shell串口基础指令
android·adb
fatiaozhang95274 小时前
中兴云电脑W102D_晶晨S905X2_2+16G_mt7661无线_安卓9.0_线刷固件包
android·adb·电视盒子·魔百盒刷机·魔百盒固件
CYRUS_STUDIO5 小时前
Android APP 热修复原理
android·app·hotfix
阿酷tony5 小时前
将视频生成视频二维码步骤
音视频·视频格式·视频二维码·视频生成二维码
鸿蒙布道师6 小时前
鸿蒙NEXT开发通知工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
鸿蒙布道师6 小时前
鸿蒙NEXT开发网络相关工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
9527华安6 小时前
国产紫光同创FPGA视频采集转SDI编码输出,基于HSSTHP高速接口,提供2套工程源码和技术支持
fpga开发·音视频·紫光同创·sdi·高速接口·hssthp
大耳猫6 小时前
【解决】Android Gradle Sync 报错 Could not read workspace metadata
android·gradle·android studio
ta叫我小白6 小时前
实现 Android 图片信息获取和 EXIF 坐标解析
android·exif·经纬度