Files
third_party_dav1d/README_zh.md
T
ulimax_001 6ce37e54ea 根据孵化意见修改readme
Signed-off-by: ulimax_001 <wangwei234@huawei.com>
2026-02-04 19:40:43 +08:00

8.4 KiB
Raw Blame History

third_party_dav1d

概述

本文档适用于OpenHarmony 6.1及以上版本。

本仓库集成第三方开源软件dav1d(AV1标准的视频解码器的开源实现)。在OpenHarmony中,dav1d主要作为媒体子系统的基础组件,为AVCodec提供AV1码流的解码能力。

dav1d来源:https://code.videolan.org/videolan/dav1d

目录结构

//third_party_dav1d
|-- BUILD.gn       # GN构建配置文件,定义编译规则和依赖关系。
|-- bundle.json    # 组件包配置文件,描述组件信息和依赖。
|-- doc            # 项目文档目录
|-- examples       # 示例代码目录
|-- include        # 头文件目录
|-- package        # 打包相关文件目录
|-- src            # 源代码目录
|-- tests          # 测试代码目录
|-- tools          # 工具程序目录

OpenHarmony对解码器的要求

根据OpenHarmony产品兼容性规范

(1) 若支持AV1软件解码时,AV1解码建议规格至少为1080p (Main Profile(8bit、10bit)、High Profile(8bit、10bit) Level 4.0)。

OpenHarmony如何使用dav1d

部件AVCodec为OpenHarmony提供了统一的视频解码能力,参考AVCodec 框架图,其中:

(1) 框架层的编解码框架对应用开发者提供接口,例如:获取支持的编解码能力 查询编解码档次和级别支持情况

(2) 服务层中的软件解码器模块将对dav1d进行加载和封装。

集成与配置

(1) 部件AVCodec通过BUILD.gn文件引用部件dav1d,以集成并使用其AV1的解码能力。

// BUILD.gn
external_deps += ["dav1d:dav1d_ohos"]

(2) 部件AVCodec在bundle.json里声明的featuresav_codec_support_av1_decoder用于使能AV1软解码,并在Config.gni中做了初始化,方式如下:

declare_args() {
    av_codec_support_av1_decoder = true    // true表示默认开启AV1软解码
}

实现及调用

            +------------------+      +-----------------------------+
            |   CodecServer    |----->|   CodecFactory              |
            +------------------+      +-----------------------------+
            | - codec:CodecBase|      | + createByName():CodecBase  |
            +------------------+      +-----------------------------+
                                            | 调用静态方法
                                   +--------v----------+
                                   | AV1DecoderLoader  |
                                   +-------------------+
                                   | + createByName()  |
                                   |    :CodecBase     |
                                   +--------|----------+
                                            | 继承
                                  +---------▼-----------+
                                  |  VideoCodecLoader   |
                                  +---------------------+
                                            | 使用
                                    +-------v---------+
                                    |   CodecBase     |
                                    +-------▲---------+ 
                                            | 实现
                                    +-----------------+
                                    |   AV1Decoder    |
                                    +-----------------+
                             图1 AVCodec服务层AV1软件解码器创建示意图

(1) AVCodec服务层中CodecServer通过CodecFactory,调用AV1DecoderLoader的静态方法CreateByName()创建AV1的解码器(AV1Decoder)。

(2) AV1Decoder即是对dav1d中AV1解码器的封装,实现能力查询函数GetCodecCapability(std::vector &capaArray),即实现对包括Profile与Level在内的能力信息查询。

(3) AVCodec仓的avcodec_info.h中对Profile和Level进行了完整的定义:

enum AV1Profile : int32_t {
    AV1_PROFILE_MAIN = 0,
    AV1_PROFILE_HIGH = 1,
    AV1_PROFILE_PROFESSIONAL = 2,
};

enum AV1Level : int32_t {
    AV1_LEVEL_20 = 0,
    AV1_LEVEL_21 = 1,
    AV1_LEVEL_22 = 2,
    ...
    AV1_LEVEL_72 = 22,
    AV1_LEVEL_73 = 23,
};

同时在SDK仓AVCodec仓的native_avcodec_base.h中定义了Profile和Level,作为应用开发者的接口,详细描述见OH_AV1ProfileOH_AV1level:

typedef enum OH_AV1Profile {
    AV1_PROFILE_MAIN = 0,
    AV1_PROFILE_HIGH = 1,
    AV1_PROFILE_PROFESSIONAL = 2,
} OH_AV1Profile;

typedef enum OH_AV1Level {
    AV1_LEVEL_20 = 0,
    AV1_LEVEL_21 = 1,
    AV1_LEVEL_22 = 2,
    ...
    AV1_LEVEL_72 = 22,
    AV1_LEVEL_73 = 23,
} OH_AV1Level;

能力定制说明

(1) AV1软解码为OpenHarmony中的可选能力。厂商可通过配置文件使能,配置文件路径可以如下:

    //vendor/${product_company}/${product_name}/config.json

配置方式可以如下,在av_codec部件节点的features中配置av_codec_support_av1_decoder, 值为true表示开启,false表示关闭:

"multimedia:av_codec": {
    "features": {
        "av_codec_support_av1_decoder": false, // 设置false为关闭AV1软解码
    }
}

(2) 厂商可根据自身的CPU性能及系统能力修改AV1支持的Profile与Level,即在如下源码中,修改函数GetCodecCapability出参capaArray的赋值,完成后需重新编译相关组件,可通过OH_AVCapability_GetSupportedProfilesOH_AVCapability_GetSupportedLevelsForProfile接口获取实际支持的Profile与Level情况来验证:

    //foundation/multimedia/av_codec/services/engine/codec/video/av1decoder/av1decoder.cpp
void Av1Decoder::GetCodecCapability(std::vector<CapabilityData> &capaArray)
{
    ...
    CapabilityData capsData;
    ...
    // 配置支持的Profile,例如支持AV1 Main ProfileHigh Profile
    capsData.profile = {
        static_cast<int32_t>(AV1_PROFILE_MAIN),
        static_cast<int32_t>(AV1_PROFILE_HIGH)
    };
    std::vector<int32_t> levels;
    // 为Profile设置支持的Level范围,例如为Main Profile最高支持到Level 4.0
    for (int32_t j = 0; j <= static_cast<int32_t>(AV1Level::AV1_LEVEL_40); j++) {
        levels.emplace_back(j);
    }
    capsData.profileLevelsMap.insert({static_cast<int32_t>(AV1_PROFILE_MAIN), levels}); // 能力信息写入输出参数
    ...
    capaArray.emplace_back(capsData);
}

注:配置Main Profile(10-bit), High Profile(10-bit)和Professional Profile(10-bit, 12-bit)时,依赖OH图形系统(的SurfaceBuffer)支持10-bit和12-bit,否则会出现内存申请失败导致解码器初始化失败。

(3) 另外,dav1d仅适用于软解解码。对硬件解码场景:服务层CodecFactory调用HCodecLoader的静态方法CreateByName()创建HCodec/HCodecList,它们通过HDI接口调用HAL或硬件解码器,厂商需适配并满足HDI接口的要求。

License

具体许可条款请参见仓库根目录下的 LICENSE 文件。