一、简介

目前AVCodec支持的视频编解码格式有限,只支持H264和H265视频编解码格式,但实际场景可能需要其他的编解码格式,本篇介绍如何扩展新的视频编解码格式。

二、前言

版本信息:OpenHarmony-4.0-Release(不同版本代码可能略有不同)
新增格式:以添加视频解码AV1为例,mimetype为"video/x-av1"
备注:下面代码中“+”代表新增,“-”代表删除

三、扩展流程

1、Codec HDI

(1) drivers/peripheral/codec/interfaces/include/codec_omx_ext.h

enum CodecVideoExType {
    CODEC_OMX_VIDEO_CodingVP9  = 10, /** VP9 Index in Codec HDI */
    CODEC_OMX_VIDEO_CodingHEVC = 11, /** HEVC Index in Codec HDI */
+   CODEC_OMX_VIDEO_CodingAV1 = 14,  /** AV1 Index in Codec HDI */
};

(2)drivers/peripheral/codec/interfaces/include/codec_component_type.h

typedef enum {
    /** JPEG image */
    MEDIA_ROLETYPE_IMAGE_JPEG = 0,
    /** H.264 video */
    MEDIA_ROLETYPE_VIDEO_AVC,
    /** H.265 video */
    MEDIA_ROLETYPE_VIDEO_HEVC,
    /** MPEG4 video */
    MEDIA_ROLETYPE_VIDEO_MPEG4,
    /** VP9 video */
    MEDIA_ROLETYPE_VIDEO_VP9,
+   /** AV1 video */
+   MEDIA_ROLETYPE_VIDEO_AV1 = 20,
    /** Audio codec */
    MEDIA_ROLETYPE_AUDIO_FIRST = 0x10000,
    /** Advanced Audio Coding (AAC) */
    MEDIA_ROLETYPE_AUDIO_AAC = 0x10000,
    ...
    /** Invalid type */
    MEDIA_ROLETYPE_INVALID,
} AvCodecRole;

(3) drivers/interface/codec/v1_0/CodecTypes.idl

enum AvCodecRole {
    MEDIA_ROLETYPE_IMAGE_JPEG = 0,          /**< JPEG image. */
    MEDIA_ROLETYPE_VIDEO_AVC,               /**< H.264 video. */
    MEDIA_ROLETYPE_VIDEO_HEVC,              /**< H.265 video. */
+   MEDIA_ROLETYPE_VIDEO_AV1 = 20,          /** <记住这个值20,后面的hcs文件配置role需要与该值保持一致.*/
    MEDIA_ROLETYPE_AUDIO_FIRST = 0x10000,   /**< Audio. */
    MEDIA_ROLETYPE_AUDIO_AAC = 0x10000,     /**< Advanced Audio Coding (AAC). */
    ...
    MEDIA_ROLETYPE_INVALID,                 /**< Invalid type. */
};

(4) 配置hcs文件 vendor/{company}/{product}/hdf_config/uhdf/media_codec/media_codec_capabilities.hcs
以rk3568为例,vendor/hihope/rk3568/hdf_config/uhdf/media_codec/media_codec_capabilities.hcs
在HDF_video_hw_dec_vp9_rk 下面新增加以下配置,假设该芯片已支持av1解码

HDF_video_hw_dec_av1_rk {
    role = 20;
    type = 0;
    name = "OMX.rk.video_decoder.av1";
    supportProfiles = [];
    maxInst = 6;
    isSoftwareCodec = false;
    processModeMask = [];
    capsMask = [0x01];
    minBitRate = 1;
    maxBitRate = 300000000;
    minWidth = 96;
    minHeight = 96;
    maxWidth = 4096;
    maxHeight = 2160;
    widthAlignment = 2;
    heightAlignment = 2;
    minBlockCount = 0xFFFFFFFF;
    maxBlockCount = 0xFFFFFFFF;
    minBlocksPerSecond = 1;
    maxBlocksPerSecond = 972000;
    blockSizeWidth = 16;
    blockSizeHeight = 16;
    supportPixelFmts = [24, 12, 20];
    measuredFrameRate = [320, 180, 500, 500, 640, 360, 387, 387, 1280, 720, 310, 318, 1920, 1080, 150, 200];
    bitRateMode = [];
    minFrameRate = 0;
    maxFrameRate = 0;
}

role的值需要和MEDIA_ROLETYPE_VIDEO_AV1的枚举值保持一致;type的值0代表解码器,1代表编码器;minWidth、minHeight、maxWidth、maxHeight、supportPixelFmts需要按照实际支持配置,其他参数默认即可。
(5)OMX适配
libOMX_Core.z.so 需要适配hcs文件中的name(组件名)"OMX.xxx.video_decoder.av1",组件层代码也需要适配AV1解码格式,不同芯片适配方案不同。

2、框架层

(1) foundation/multimedia/av_codec/interfaces/inner_api/native/avcodec_info.h

class CodecMimeType {
public:
    static constexpr std::string_view VIDEO_H263 = "video/h263";
    static constexpr std::string_view VIDEO_AVC = "video/avc";
    static constexpr std::string_view VIDEO_MPEG2 = "video/mpeg2";
    static constexpr std::string_view VIDEO_HEVC = "video/hevc";
    static constexpr std::string_view VIDEO_MPEG4 = "video/mp4v-es";
    static constexpr std::string_view VIDEO_VP8 = "video/x-vnd.on2.vp8";
    static constexpr std::string_view VIDEO_VP9 = "video/x-vnd.on2.vp9";
+   static constexpr std::string_view VIDEO_AV1 = "video/x-av1";
    ...
};

(2)foundation/multimedia/av_codec/services/engine/codec/video/hcodec/type_converter.cpp 添加Codec HDI和框架层的映射

vector<Protocol> g_protocolTable = {
    {
        OMX_VIDEO_CodingAVC,
        OHOS::HDI::Codec::V1_0::AvCodecRole::MEDIA_ROLETYPE_VIDEO_AVC,
        string(CodecMimeType::VIDEO_AVC),
    },
    {
        static_cast<OMX_VIDEO_CODINGTYPE>(CODEC_OMX_VIDEO_CodingHEVC),
        OHOS::HDI::Codec::V1_0::AvCodecRole::MEDIA_ROLETYPE_VIDEO_HEVC,
        string(CodecMimeType::VIDEO_HEVC),
    },
+   {
+        static_cast<OMX_VIDEO_CODINGTYPE>(CODEC_OMX_VIDEO_CodingAV1),
+        OHOS::HDI::Codec::V1_0::AvCodecRole::MEDIA_ROLETYPE_VIDEO_AV1,
+        string(CodecMimeType::VIDEO_AV1),
+   },
};

(3)foundation/multimedia/av_codec/services/engine/codec/video/hcodec/hcodec_list.cpp 去掉编解码格式限制

bool HCodecList::IsSupportedVideoCodec(const CodecCompCapability &hdiCap)
{
-   /*if (hdiCap.role == MEDIA_ROLETYPE_VIDEO_AVC || hdiCap.role == MEDIA_ROLETYPE_VIDEO_HEVC) {
-       return true;
-    }
-   return false;*/
+   return true;   
}

3、适配验证

适配完成后可以编译foundation/multimedia/av_codec/test/nativedemo/codeclist_demo/codeclist_demo.cpp 生成av_codec_demo简单测试或使用其他三方应用测试,看能否获取到新添加的硬件解码器

void CodecListDemo::RunCase()
{
    std::cout << "===== ============== ======" << std::endl;
    const char *mime = "video/x-av1";
    OH_AVCapability *cap = OH_AVCodec_GetCapability(mime, false);
    const char *name = OH_AVCapability_GetName(cap);
    std::cout << name << std::endl;
    std::cout << "get caps successful" << std::endl;
}

四、结语

...

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐