一、簡介
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