OpenHarmony 5.0版本视频硬件编解码适配

一、简介

Codec HDI(Hardware Device Interface)对上层媒体服务提供视频编解码的驱动能力接口,主要功能有获取组件编解码能力,创建、销毁编解码器对象,启停编解码器操作,编解码处理等。

Codec HDI 2.0接口依赖OpenMax IL的标准接口,Codec HDI通过调用封装好的libOMX_Core.z.so获取支持的编解码器组件并创建组件运行。

本文主要介绍OpenHarmony 5.x版本视频硬件编解码Codec HDI的适配方法。

注:5.x版本的AVPlayer播放器histreamer引擎调用的视频硬件编解码框架和AVCodec视频硬件编解码框架都会调用到av_codec_service系统服务,通过IPC与Codec HDI通信。

二、适配流程

配置codec_host 服务

vendor/{company}/{product}/hdf_config/uhdf/device_info.hcs 文件配置codec_host服务

以rk3568为例,配置如下文件:vendor/hihope/rk3568/hdf_config/uhdf/device_info.hcs

复制代码
codec :: host {
    hostName = "codec_host";
    priority = 50;
    gid = ["codec_host", "uhdf_driver", "vendor_mpp_driver"];
    codec_omx_idl_device :: device {
        device0 :: deviceNode {
        policy = 2;
        priority = 100;
        moduleName = "libcodec_driver.z.so";
        serviceName = "codec_component_manager_service";
        deviceMatchAttr = "media_codec_capabilities";
        }
    }
    ...
}

codec_component_manager_service 服务被视频硬件编解码服务调用,重点是这个服务的配置。

配置codec_capabilities hcs文件

添加 vendor/{company}/{product}/hdf_config/uhdf/media_codec/media_codec_capabilities.hcs文件,该文件主要描述芯片支持的硬件编解码组件的能力集。

根据codec_component_manager_service 服务配置的deviceMatchAttr,media_codec_capabilities.hcs文件的match_attr字段为media_codec_capabilities。

以rk3568为例,添加 vendor/hihope/rk3568/hdf_config/uhdf/media_codec/media_codec_capabilities.hcs 文件

复制代码
root {
    module = "master";
    codec_config {
        match_attr = "media_codec_capabilities";
        use_openmax = true;
        // capsMask: 0x01, Adaptive playback; 0x02, Secure playback; 0x04, Tunnel playback.
        // allocateMask: 0x01, Input buffer allocated within the Codec module;
        // allocateMask: 0x02, Input buffer allocated by an external user;
        // allocateMask: 0x04, Output buffer allocated within the Codec module;
        // allocateMask: 0x08, Output buffer allocated by an external user.

        VideoHwEncoders {
            /* node name explanation -- HDF_video_hw_enc_avc_rk:
            **
            **    HDF____________video_________hw___________________enc_________avc____rk
            **       |                                |                       |                                          |                       |            |
            ** HDF or OMX    video or audio    hardware or software      encoder or decoder    mime    vendor
            */
            HDF_video_hw_enc_avc_rk {
                role = 1;
                type = 1;
                name = "OMX.rk.video_encoder.avc";
                supportProfiles = [1, 32768, 2, 32768, 8, 32768];
                maxInst = 4;
                isSoftwareCodec = false;
                processModeMask = [];
                capsMask = [0x01];
                minBitRate = 1;
                maxBitRate = 40000000;
                minWidth = 144;
                minHeight = 144;
                maxWidth = 4096;
                maxHeight = 4096;
                widthAlignment = 2;
                heightAlignment = 2;
                minBlockCount = 99;
                maxBlockCount = 8160;
                minBlocksPerSecond = 99;
                maxBlocksPerSecond = 489600;
                blockSizeWidth = 16;
                blockSizeHeight = 16;
                supportPixelFmts = [28, 24, 20, 12];
                measuredFrameRate = [320, 240, 165, 165, 720, 480, 149, 149, 1280, 720, 73, 73, 1920, 1080, 18, 18];
                bitRateMode = [1, 2];
                minFrameRate = 1;
                maxFrameRate = 60;
                canSwapWidthHeight = true;
            }
            ...
        }
        VideoHwDecoders {
            HDF_video_hw_dec_avc_rk {
                role = 1;
                type = 0;
                name = "OMX.rk.video_decoder.avc";
                supportProfiles = [1, 32768, 2, 32768, 8, 32768];
                maxInst = 6;
                isSoftwareCodec = false;
                processModeMask = [];
                capsMask = [0x01];
                minBitRate = 1;
                maxBitRate = 10000000;
                minWidth = 144;
                minHeight = 144;
                maxWidth = 4096;
                maxHeight = 4096;
                widthAlignment = 2;
                heightAlignment = 2;
                minBlockCount = 99;
                maxBlockCount = 34560;
                minBlocksPerSecond = 99;
                maxBlocksPerSecond = 2073600;
                blockSizeWidth = 16;
                blockSizeHeight = 16;
                supportPixelFmts = [24, 12, 20];
                measuredFrameRate = [320, 240, 617, 617, 720, 480, 559, 559, 1280, 720, 276, 276, 1920, 1080, 164, 164, 3840, 2160, 30, 30];
                bitRateMode = [];
                minFrameRate = 1;
                maxFrameRate = 60;
                canSwapWidthHeight = true;
            }
        ...
        }
    }
}

该文件需根据实际芯片能力配置,name组件名根据OMX组件层的定义配置,其他参数尽量按实际配置,否则系统服务层可能因检验参数失败导致编解码异常。

编解码能力配置文件添加编译

vendor/{company}/{product}/hdf_config/uhdf//hdf.hcs 引入media_codec_capabilities.hcs

以rk3568为例,vendor/hihope/rk3568/hdf_config/uhdf/hdf.hcs 添加

复制代码
+     #include "media_codec/media_codec_capabilities.hcs"

OMX Wrapper的封装

封装实现libOMX_Core.z.so,供Codec HDI通过dlopen调用。

不同厂商OMX组件层的实现是不同的,这里不再详细赘述。

三、适配验证

适配完成后可以通过应用调用AVPlayer播放码流验证。

开机后首次播放视频或kill av_codec_service进程后首次播放视频时,如果可以获取到可用的编解码组件会有如下打印:

复制代码
I C02b32/HCODEC: [GetManager xxx] need to get ICodecComponentManager
I C02b32/HCODEC: [GetCapList xxx] GetComponentCapabilityList return xxx components
I C02b32/HCODEC: [HdiCapToUserCap xxx] ----- codecName: xxx.encoder.avc -----
I C02b32/HCODEC: [HdiCapToUserCap xxx] codecType: 0, mimeType: video/avc, maxInstance x
...
I C02b32/HCODEC: [HdiCapToUserCap xxx] ----- codecName: xxx.decoder.avc -----
I C02b32/HCODEC: [HdiCapToUserCap xxx] codecType: 1, mimeType: video/avc, maxInstance x

硬件解码组件创建成功,正常解码播放会有如下打印:

复制代码
I C02b32/HCODEC: [0][dec.avc][Uninitialized][OnAllocateComponent xxx] create omx node xxx.decoder.avc succ
I C02b32/HCODEC: [ChangeStateTo xxx] Uninitialized -> Initialized
I C02b32/HCODEC: [ChangeStateTo xxx] Starting -> Running
相关推荐
一个小猴子`3 小时前
FFMpeg视频编码实战和音频编码实战
ffmpeg·音视频
EasyDSS5 小时前
国标GB28181视频平台EasyCVR如何搭建汽车修理厂远程视频网络监控方案
网络·音视频
心之所想,行之将至7 小时前
零基础开始学习鸿蒙开发-智能家居APP离线版介绍
学习·智能家居·harmonyos
无证驾驶梁嗖嗖8 小时前
FFMPEG大文件视频分割传输教程,微信不支持1G文件以上
音视频
__Benco10 小时前
OpenHarmony子系统开发 - 热管理(四)
人工智能·harmonyos
一个小猴子`10 小时前
FFMpeg音视频解码实战
ffmpeg·音视频
小白教程10 小时前
Python爬取视频的架构方案,Python视频爬取入门教程
python·架构·音视频·python爬虫·python视频爬虫·python爬取视频教程
小脑斧爱吃鱼鱼10 小时前
鸿蒙项目笔记(2)
笔记·学习·华为·harmonyos
Json____12 小时前
springboot 处理编码的格式为opus的音频数据解决方案【java8】
spring boot·后端·音视频·pcm·音频处理·解码器·opus
赤鸢QAQ12 小时前
ffpyplayer+Qt,制作一个视频播放器
python·qt·音视频