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 等)也會有自己的
MC2ComponentStore
或ExynosC2ComponentStore
,邏輯類似。
4. 常見誤區澄清
C2ComponentStore
本身沒有具體實現。
AOSP 默認實現是 C2PlatformComponentStore
,但這只是 Google 提供的軟件 codec。
真正跑在手機硬件上的 codec,一般都來自廠商,比如 Qualcomm 的 QC2ComponentStore
。
C2Component
和 QC2Component
的關系,跟 C2ComponentStore
和 QC2ComponentStore
的關系基本一致:
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)。提供
Component
、Configurable
等子類,封裝了 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