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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…