C2ComponentStore

1. C2ComponentStore

這是 Codec 2.0 HAL 的抽象接口frameworks/av/media/codec2/core/include/C2ComponentStore.h)。

  • 代表一個「組件工廠」,負責:

    • 枚舉當前可用的 Codec2 組件(解碼器、編碼器)。

    • 創建組件(createComponent())。

    • 創建接口對象(createInterface())。

  • 它本身只是一個 純虛基類 (abstract class),并沒有具體實現。

  • AOSP 里有個默認實現 C2PlatformComponentStore,用于加載 Google 自帶的軟件 codec (比如 C2SoftAvcDec, C2SoftHevcEnc 等)。

所以 C2ComponentStore 是一個 標準定義,Android 框架通過它來訪問 codec,而不會關心具體廠商的實現。

2. QC2ComponentStore

這是 高通(Qualcomm)在 AOSP 基礎上實現的廠商版本

  • 位于 QTI 的源碼中(通常在 vendor/qcom/opensource 或者 hardware/qcom/media 里)。

  • 繼承自 C2ComponentStore,并實現了其中的接口,比如:

    • createComponent() → 創建一個 Qualcomm 硬件加速 codec 對象。

    • queryComponents() → 返回 Qualcomm 支持的編解碼器列表。

  • QC2ComponentStore 通過 binderized Codec2.0 HAL(IComponentStore AIDL/HIDL) 暴露給 Android Framework。
    也就是說,QC2ComponentStore 就是 Qualcomm 的 組件工廠實現,背后調用的是硬件驅動/NPU/DSP 的 codec。


3. 二者關系總結

  • C2ComponentStore:接口定義(Google AOSP,抽象類)。

  • QC2ComponentStore:廠商實現(Qualcomm,繼承并實現 C2ComponentStore,用于硬件 codec)。

  • 其他廠商(聯發科 MTK、三星 Exynos 等)也會有自己的 MC2ComponentStoreExynosC2ComponentStore,邏輯類似。


4. 常見誤區澄清

C2ComponentStore 本身沒有具體實現。
AOSP 默認實現是 C2PlatformComponentStore,但這只是 Google 提供的軟件 codec。
真正跑在手機硬件上的 codec,一般都來自廠商,比如 Qualcomm 的 QC2ComponentStore

C2ComponentQC2Component 的關系,跟 C2ComponentStoreQC2ComponentStore 的關系基本一致:


1. C2Component

這是 Codec 2.0 的抽象接口(定義在 C2Component.h)。

  • 表示一個 實際的編解碼器實例(而不是工廠)。

  • 定義了組件的核心行為,比如:

    • queue_nb() / queue() → 提交工作 (work item)。

    • flush_sm() → 刷新隊列。

    • reset_sm() → 重置。

    • release_sm() → 釋放資源。

  • 這些方法全部是 純虛函數,沒有具體實現。

所以,C2Component 只是一個統一的接口規范。


2. QC2Component

這是 Qualcomm 的 具體實現類,繼承自 C2Component

  • 封裝了對 Qualcomm DSP/NPU/硬件 Codec 的調用。

  • 會和 Qualcomm 自己的 codec driver / firmware 打交道。

  • 例如:

    • QC2Component::queue_nb() → 實際會把 buffer/work 通過 Qualcomm 的 HAL 層下發到 DSP。

    • QC2Component::release_sm() → 釋放 Qualcomm 硬件資源。


3. 對照關系

  • C2ComponentStore → 抽象工廠接口。

  • QC2ComponentStore → Qualcomm 的工廠實現。

  • C2Component → 抽象組件接口。

  • QC2Component → Qualcomm 的組件實現(由 QC2ComponentStore 創建)。


4. 實際調用鏈

當 App 使用 MediaCodec 播放視頻時,大概是這樣:

MediaCodec (Java)  ↓  
Codec2Client (C++)  ↓  
IComponentStore (AIDL/HIDL)  ↓  
QC2ComponentStore::createComponent()  ↓  
QC2Component (具體硬件解碼器實例)  ↓  
Qualcomm DSP/driver

1. Codec2Client

位置:frameworks/av/media/codec2/hidl/client/Codec2Client.cpp (Android 14 已經遷移到 AIDL)。

  • 它是 framework 與 Codec2.0 HAL(IComponentStore / IComponent)交互的客戶端封裝

  • 主要功能:

    • 負責連接到 IComponentStore(binderized HAL 服務)。

    • 調用 createComponent() 來實例化一個硬件/軟件 codec(比如 QC2Component)。

    • 提供 ComponentConfigurable 等子類,封裝了 HAL 的 AIDL/HIDL 接口。

👉 簡單說:Codec2Client 就是 HAL 客戶端,直接和廠商的 C2ComponentStore / C2Component 打交道


2. CCodec

位置:frameworks/av/media/codec2/sfplugin/CCodec.cpp

  • 它是 Stagefright 層的一個 Adapter,讓 MediaCodec 可以驅動 Codec2.0 backend。

  • 繼承自 MediaCodec 的基類 CodecBase

  • 內部持有一個 Codec2Client::Component 對象,用來真正調用 HAL。

  • 功能:

    • MediaCodec 創建 codec 時,如果走 Codec2.0 路徑,就會用 CCodec 作為實現類。

    • 負責生命周期管理(init、start、stop、reset)。

    • 負責 buffer queue 的組織,把 MediaCodec 層的 buffer 請求映射到 Codec2 HAL 的工作單元。

👉 簡單說:CCodec 是 Stagefright 插件,實現了 MediaCodec 的統一接口;它內部通過 Codec2Client 來訪問 HAL


3. 兩者關系總結

  • Codec2Client

    • 面向 HAL,封裝 AIDL/HIDL,提供 API 給 framework 使用。

    • 就像「鑰匙」,能打開 HAL 的 codec 工廠和組件。

  • CCodec

    • 面向 Stagefright/MediaCodec 層,是 Codec2.0 的插件。

    • 內部依賴 Codec2Client 去真正調用 HAL。

    • 就像「駕駛員」,通過 Codec2Client 去開車(HAL codec)。


4. 調用鏈示意

App↓ (Java)
MediaCodec↓ (native 層選擇 CCodec 作為實現類)
CCodec↓ (創建 Codec2Client)
Codec2Client↓ (調用 AIDL/HIDL)
IComponentStore / IComponent (HAL)↓
QC2ComponentStore / QC2Component (廠商實現)↓
DSP / Driver / Hardware

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

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

相關文章

AI 在醫療領域的應用與挑戰

引言介紹 AI 技術迅猛發展的大背景,引出其在醫療領域的重要應用。闡述研究 AI 醫療應用及挑戰對推動醫療行業進步的重要意義。AI 在醫療領域的應用現狀疾病診斷輔助:描述 AI 影像識別技術在識別 X 光、CT、MRI 影像中疾病特征的應用,如對肺癌…

【GPT入門】第51課 Conda環境遷移教程:將xxzh環境從默認路徑遷移到指定目錄

【GPT入門】第51課 Conda環境遷移教程:將xxzh環境從默認路徑遷移到指定目錄步驟1:創建目標目錄(若不存在)步驟2:克隆環境到新路徑步驟3:驗證新環境可用性步驟4:刪除舊環境(可選&…

應急響應-模擬服務器掛馬后的應急相關操作

工具:攻擊機: kail:192.168.108.131 kail下載地址:https://mirrors.aliyun.com/kali-images/kali-2021.3/kali-linux-2021.3-live-i386.iso靶機:windows 7: 192.168.108.1321、在kali中制作木馬文件:vhost.exe&#xf…

記一次 .NET 某光譜檢測軟件 內存暴漲分析

一:背景 1. 講故事 訓練營里的一位學員找到我,說他們的系統會出現內存暴漲的情況,看了下也不是托管堆的問題,讓我協助一下到底怎么回事?既然有dump了,那就開始分析之旅吧。 二:內存暴漲分析 1. …

基于OpenCV的物體識別與計數

在計算機視覺領域,利用圖像處理技術進行物體識別和計數是一項基礎且重要的任務。本文將介紹一種使用OpenCV庫實現的高效物體識別與計數方法,并提供一些代碼片段以幫助理解各個步驟。 這是前幾年做過傳統圖像處理計數的項目,通過傳統圖像處理之…

算法題打卡力扣第34題:在排序數組中查找元素的第一個和最后一個位置(mid)

題目描述提示&#xff1a; 0 < nums.length < 105 -109 < nums[i] < 109 nums 是一個非遞減數組 -109 < target < 109 解題思路一 暴力解 頭到尾遍歷整個數組。 用一個變量 first 記錄第一次遇到 target 的索引。 繼續遍歷&#xff0c;用另一個變量 last 不斷…

虛幻基礎:曲線

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄曲線&#xff1a;數值變化的曲線動畫曲線動畫曲線get curve value只有curve所在動畫被播放才返回曲線數值沒播放時 返回0一個曲線可以在多個動畫中使用 且可以設置曲線的不同值曲線&#xff1a;數值變化的曲線 動畫…

MFC隨筆—不使用對話框資源模板創建對話框

在MFC程序中使用對話框時一般都是首先在資源模版里創建對話框資源,然后DoModal()或者Create顯示出模式對話框或者非模式對話框。然而采用該方式創建出的對話框移植性差,從一個工程移動到另一個工程比較麻煩。 在MFC中還有另一種創建對話框的方法,即利用DLGTEMPLATE、DLGITEM…

第八十六章:實戰篇:文本生成腳本 → TTS + 鏡頭 → 視頻整合——讓你的文字“動聽”又“好看”!

AI導演鏈路前言&#xff1a;AI的“智能制片人”——文本 → 視頻&#xff0c;你的想法“一鍵出片”&#xff01;第一章&#xff1a;痛點直擊——傳統視頻制作&#xff0c;累到“吐血”&#xff01;第二章&#xff1a;探秘“智能制片廠”&#xff1a;流水線上的四大核心模塊&…

Linux內核源碼詳解--缺頁異常(Page Fault)處理的核心函數handle_pte_fault

handle_pte_fault 是 Linux 內核中處理缺頁異常&#xff08;Page Fault&#xff09;的核心函數&#xff0c;負責根據頁表項&#xff08;PTE&#xff09;的狀態和訪問權限&#xff0c;分發到不同的子處理邏輯&#xff08;如匿名頁映射、文件頁映射、寫時復制、NUMA 遷移等&#…

基于混合注意力網絡和深度信念網絡的魯棒視頻水印技術基礎理論深度解析

1. 引言隨著數字媒體技術的迅猛發展和互聯網的普及&#xff0c;視頻內容的創作、傳播和分享變得前所未有的便捷。然而&#xff0c;這種便利性也帶來了嚴重的版權保護挑戰。數字視頻的易復制性使得盜版和非法傳播成為困擾內容創作者和版權所有者的重大問題。傳統的加密技術雖然能…

linux 之virtio 的驅動框架

1、基本知識 上一篇文章介紹了 virtio 的核心數據的實現和邏輯&#xff1a;linux 之 virtio 子系統核心的數據結構-CSDN博客 virtio 是對半虛擬化 hypervisor 中的一組通用模擬設備的抽象。它允許 hypervisor 導出一組通用的模擬設備&#xff0c;并通過一個通用的應用編程接口…

項目1總結其三(圖片上傳功能)

1、UploadService public interface UploadService {//上傳圖片String uploadImage(MultipartFile file, String type); }upload.location D:/upload Value("${upload.location}")private String uploadLocation;//文件上傳路徑Overridepublic String uploadImage(M…

Linux應用層開發--線程池介紹

Glib 線程池 1. 線程池簡介 線程池是一種管理和重用多個線程的設計模式&#xff1a; 避免頻繁創建/銷毀線程的開銷。提高性能與資源利用率。任務提交后&#xff0c;由線程池內的線程自動執行&#xff0c;任務執行完線程不會退出&#xff0c;而是繼續等待下一個任務。 2. Gli…

【Python】Python 多進程與多線程:從原理到實踐

Python 多進程與多線程&#xff1a;從原理到實踐 文章目錄Python 多進程與多線程&#xff1a;從原理到實踐前言一、并發編程基礎&#xff1a;進程與線程1.1 進程&#xff08;Process&#xff09;1.2 線程&#xff08;Thread&#xff09;1.3 進程與線程的關系二、Python 中的 &q…

electron-vite_18Less和Sass共用樣式指定

項目中可以封裝less公用樣式和方法&#xff0c;比如自動以滾動條樣式、單行省略號、多行省略號、display:none等&#xff1b;關于additionalData的配置生效,請在main.js中引入一個別的樣式或vue組件中使用“<style lang“scss”><style>”找到electron.vite.config…

Python面試題及詳細答案150道(71-80) -- 文件操作篇

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

python新工具-uv包管理工具

uv 是一個由 Astral (Ruff 的創建者) 開發的極速 Python 包和項目管理器&#xff0c;用 Rust 編寫。它旨在作為傳統 Python 包管理工具&#xff08;如 pip、pip-tools、pipx、poetry、pyenv、twine 和 virtualenv 等&#xff09;的替代品&#xff0c;通過其高性能和多功能集成&…

有關spring-ai的defaultSystem與systemMessage優先級

今天在寫項目的時候想用nacos隨時修改system的prompt&#xff0c;突然發現defaultSystem的優先級比systemMessage高很多&#xff0c;廢話我就不說了&#xff0c;看圖吧。你覺得證據不夠&#xff1f;那這樣呢&#xff1f;

#運維 | 前端 # Linux http.server 實踐:隱藏長文件名,簡短路徑 (http://IP:port/別名 ) 訪問

如何運行頁面為 http://ip:port/名稱 1. 準備文件目錄 假設文件原始位置&#xff1a; /home/ubuntu/projects/yinran/ckd.html將它移動到子目錄并改名為 index.html&#xff1a; mkdir -p /home/ubuntu/projects/yinran/ckd mv /home/ubuntu/projects/yinran/ckd.html \/home/u…