OpenHarmony AVCodec模块分析(五):扩展新的视频编解码格式
一、简介 目前AVCodec支持的视频编解码格式有限,只支持H264和H265视频编解码格式,但实际场景可能需要其他的编解码格式,本篇介绍如何扩展新的视频编解码格式。 二、前言 版本信息:OpenHarmony-4.0-Release(不同版本代码可能略有不同)新增格式:以添加视频解码AV1为例,mimetype为"video/x-av1"备注:下面代码中“+”代表新增,“-”
一、简介
目前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;
}
四、结语
...
更多推荐
所有评论(0)