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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/76322.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76322.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/76322.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度解析基于 Web Search MCP的Deep Research 實現邏輯

寫在前面 大型語言模型(LLM)已成為我們獲取信息、生成內容的重要工具。但它們的知識大多截止于訓練數據的時間點,對于需要實時信息、跨領域知識整合、多角度觀點比較的深度研究 (Deep Research) 任務,它們往往力有不逮。如何讓 LLM 突破自身知識的局限,像人類研究員一樣,…

鴻蒙案例---生肖抽卡

案例源碼: Zodiac_cards: 鴻蒙生肖抽獎卡片 效果演示 初始布局 1. Badge 角標組件 此處為語雀內容卡片,點擊鏈接查看:https://www.yuque.com/kevin-nzthp/lvl039/rccg0o4pkp3v6nua 2. Grid 布局 // 定義接口 interface ImageCount {url:…

基于RV1126開發板實現自學習圖像分類方案

1. 方案簡介 自學習:在識別前對物體圖片進行模型學習,訓練完成后通過算法分類得出圖像的模型ID。 方案設計邏輯流程圖,方案代碼分為分為兩個業務流程,主體代碼負責抓取、合成圖像,算法代碼負責訓練和檢測功能。 2. 快速…

cat命令查看文件行數

在Linux和Unix-like操作系統中,cat命令主要用于查看文件內容,而不是直接用來查看文件行數。如果你想要查看一個文件的行數,可以使用以下幾種方法: 方法1:使用wc命令 wc(word count)命令可以用…

git清理已經刪除的遠程分支

目錄 命令作用 使用場景 示例流程 注意事項 常見問題 git remote update origin --prune git remote update origin --prune 是一個 Git 命令,用于 更新本地遠程跟蹤分支 并 清理(刪除)本地已失效的遠程分支引用。以下是詳細分解&#…

NLP高頻面試題(四十)——什么是 BitFit?

BitFit(Bias-term Fine-tuning)是一種參數高效的微調方法,專注于在預訓練模型中僅調整偏置項(bias term),而將其他參數保持不變。這種方法在自然語言處理領域,尤其是在中小規模數據集上,展現出了與全量微調相媲美的性能,同時顯著減少了計算資源的消耗。 什么是 BitFi…

Java-servlet(完結篇)過濾器亂碼解決與監聽器

Java-servlet(完結篇)過濾器亂碼解決與監聽器 前言一、過濾器亂碼解決二、監聽器1. HttpSessionListener2. ServletContextListener3. ServletRequestListener 三、監聽器的使用場景Java-servlet 結語 前言 在之前的 Java Servlet 學習中,我…

為了避免unboundLocalError和為什么X的值一直不變呢?

## 1.為了避免unboundLocalError 發生unboundLocalError! def generate_integer(level):if level 1:X randint(1,9)return X這里出錯的原因在于,一旦if 后面的條件沒有成立,然后X根本沒出生,然后你去使用它,這是有…

opencv-python基礎

一.opencv-python簡述 其使用Numpy,所有OpenCV數組結構都轉換為Numpy數組,是一個高度優化的數據庫操作庫。 二.環境安裝 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python 三.基本概念 - 像素是圖像的基本單元,每個…

ReentrantLock 實現公平鎖和非公平鎖的原理!

🌟我的其他文章也講解的比較有趣😁,如果喜歡博主的講解方式,可以多多支持一下,感謝🤗! 🌟了解 ThreadLocal請看: ThreadLocal有趣講解,小白也能聽懂&#xff…

NLP高頻面試題(四十一)——什么是 IA3 微調?

隨著大型語言模型的廣泛應用,如何高效地將這些模型適配到特定任務中,成為了研究和工程實踐中的重要課題。IA3(Infused Adapter by Adding and Adjusting)微調技術,作為參數高效微調的一種新穎方法,提供了在保持模型性能的同時,顯著減少可訓練參數數量的解決方案。 IA3 …

swift菜鳥教程14(閉包)

一個樸實無華的目錄 今日學習內容:1.Swift 閉包1.1閉包定義1.2閉包實例1.3閉包表達式1.3.1sorted 方法:據您提供的用于排序的閉包函數將已知類型數組中的值進行排序。1.3.2參數名稱縮寫:直接通過$0,$1,$2來順序調用閉包的參數。1.3.3運算符函…

藍橋杯-藍橋幼兒園(Java-并查集)

并查集的核心思想 并查集主要由兩個操作構成: Find:查找某個元素所在集合的根節點。并查集的特點是,每個元素都指向它自己的父節點,根節點的父節點指向它自己。查找過程中可以通過路徑壓縮來加速后續的查找操作,即將路…

ruby內置全局變量

以下是 Ruby 中常見的 內置全局變量 及其用途的詳細說明。這些變量以 $ 開頭,由 Ruby 解釋器自動管理,用于訪問系統狀態、異常、輸入輸出等核心信息。 一、異常處理相關 全局變量說明示例$!當前作用域最后拋出的異常對象(等同于 rescue >…

tcp轉串口

windows 在 Windows 系統上,可以使用以下成熟的串口轉 TCP 工具: HW VSP3 (HW Virtual Serial Port) 提供串口到 TCP/IP 的映射功能。支持虛擬串口和網絡通信。下載地址:HW Group com0com com2tcp 開源工具,支持虛擬串口和 TCP…

HTML視頻和音頻

<video>元素 <video>元素用于在HTML文檔中嵌入視頻內容。 <video controls><source src"movie.mp4" type"video/mp4"><source src"movie.ogg" type"video/ogg">您的瀏覽器不支持 HTML5 video 標簽。 …

DeepSeek:重構辦公效率的AI新范式

目錄 一、效率躍遷的三重引擎 二、效率提升的量級突破 三、智能辦公的范式轉移 四、未來辦公的效率奇點 當企業主面對堆積如山的文件審批、跨時區協作的溝通損耗、重復機械的數據整理時&#xff0c;是否想過這些場景正在吞噬團隊的生產力&#xff1f;據麥肯錫研究顯示&…

redis 延遲雙刪

Redis延遲雙刪是一種用于解決緩存與數據庫數據一致性問題的策略&#xff0c;通常在高并發場景下使用。以下是其核心內容&#xff1a; 1. 問題背景 當更新數據庫時&#xff0c;如果未及時刪除或更新緩存&#xff0c;可能導致后續讀請求仍從緩存中讀取舊數據&#xff0c;造成數…

Python設計模式:策略模式

1. 什么是策略模式 策略模式&#xff08;Strategy Pattern&#xff09;是一種行為型設計模式&#xff0c;它定義了一系列算法&#xff0c;將每個算法封裝起來&#xff0c;并使它們可以互換。策略模式使得算法的變化獨立于使用算法的客戶。換句話說&#xff0c;策略模式允許在運…

SpringBoot集成Ollama本地模型

SpringBoot集成Ollama本地模型 目錄 項目準備創建Ollama服務客戶端創建控制器配置應用屬性創建前端界面添加靜態資源支持完整項目結構啟動應用高級功能擴展部署注意事項性能優化 1. 項目準備 創建一個SpringBoot項目&#xff0c;可以使用Spring Initializr或IDE創建添加必要…