当前位置: 首页 > ds >正文

高通usecase理解

讲得非常不错:

高通 Camera HAL3:CAMX、CHI-CDK 详解_高通camera hal3:camx、chi-cdk详解-CSDN博客

CamraHAL3数据流向图:

Camera数据从sensor出来,首先会经过IFE,然后分预览/视频和拍照2种情况。

如果是预览或者录像,是先经过IPE处理,最后输出到显示。

如果是拍照,则是先经过BSP处理,然后再经过JPEG编码器,最后保存为图片输出。

 

一、usecase的理解 

1、usecaseid

UsecaseId:\chi-cdk\core\chiutils\chxdefs.h

/// @brief Usecase identifying enums
enum class UsecaseId
{NoMatch             = 0,Default             = 1,Preview             = 2,PreviewZSL          = 3,MFNR                = 4,MFSR                = 5,MultiCamera         = 6,QuadCFA             = 7,RawJPEG             = 8,MultiCameraVR       = 9,Torch               = 10,YUVInBlobOut        = 11,VideoLiveShot       = 12,SuperSlowMotionFRC  = 13,Feature2            = 14,Depth               = 15,AON                 = 16,MaxUsecases         = 17,
};

chi-cdk/oem/qcom/topology/titan/fillmore/fillmore_usecase.xml

 

 

这个 xml 文件里面描述了 82 个 usecase,但是我们的相机不一定全部跑了这些 usecase,

这些 xml 描述的只是配置,描述的 uscase 是否实现了,还要看代码里面是否实现,并使能了这些 usecase。

比如我们常接触到的有 UsecaseTorch,UsecasePreview , UsecaseVideo, UsecaseSnapshot, UsecaseZSL, UsecaseQuadCFA,UsecaseRTB,UsecaseSAT 等

选择UsecaseId

不同的UsecaseId分别对应的不同的"使用案例",

该阶段是通过调用UsecaseSelector::GetMatchingUsecase()方法来实现的,

该函数中通过传入的operation_mode、num_streams配置数据流、数量以及当前使用的Sensor个数来选择相应的UsecaseId,

比如当numPhysicalCameras值大于1,同时配置的数据流数量num_streams大于1时,选择的就是UsecaseId::MultiCamera,表示当前采用的是双摄场景。

获得usecaseid函数:chi-cdk\core\chiusecase\Chxusecaseutils.cpp

UsecaseId UsecaseSelector::GetMatchingUsecase(const LogicalCameraInfo*        pCamInfo,camera3_stream_configuration_t* pStreamConfig)
{UsecaseId usecaseId = UsecaseId::Default; //第一行代码......CHX_LOG_INFO("usecase ID:%d",usecaseId);return usecaseId;                         //最后一行代码
}

chi-cdk\core\chiframework\Chxextensionmodule.h 

UsecaseSelector*        m_pUsecaseSelector;                     ///< Usecase selector
UsecaseFactory*         m_pUsecaseFactory;                      ///< Usecase factory
Usecase*                m_pSelectedUsecase[MaxNumImageSensors]; ///< Selected usecase

创建Usecase:

根据之前选择的UsecaseId,通过UsecaseFactory来创建相应的Usecase

Class Usecase是所有Usecase的基类,其中定义并实现了一些通用接口,

CameraUsecaseBase继承于Usecase,并扩展了部分功能。

AdvancedCameraUsecase又继承于CameraUsecaseBase,作为主要负责大部分场景的Usecase实现类,

另外对于多摄场景,现提供了继承于AdvancedCameraUsecase的UsecaseMultiCamera来负责实现。

在这段代码中可以看到,除了双摄场景,其它大部分场景使用的都是AdvancedCameraUsecase类来创建Usecase的

创建Usecase文件以及函数:chi-cdk\core\chiframework\Chxextensionmodule.cpp

InitializeOverrideSession

CDKResult ExtensionModule::InitializeOverrideSession(uint32_t                        logicalCameraId,const camera3_device_t*         pCamera3Device,const chi_hal_ops_t*            chiHalOps,camera3_stream_configuration_t* pStreamConfig,int*                            pIsOverrideEnabled,VOID**                          pPrivate)
{...selectedUsecaseId = m_pUsecaseSelector->GetMatchingUsecase(&m_logicalCameraInfo[logicalCameraId],
pStreamConfig);...m_pSelectedUsecase[logicalCameraId] =m_pUsecaseFactory->CreateUsecaseObject(&m_logicalCameraInfo[logicalCameraId],selectedUsecaseId, m_pStreamConfig[logicalCameraId],m_multiCameraResources.hDescriptorConfig);                                                           
}

 工厂模式createusecaseobject函数,是根据usecaseid创建出我们的usecase对象

函数所在文件:chi-cdk\core\chiusecase\Chxusecaseutils.cpp

函数展示如下:

Usecase* UsecaseFactory::CreateUsecaseObject(
LogicalCameraInfo*              pLogicalCameraInfo,     ///< camera info
UsecaseId                       usecaseId,              ///< Usecase Id
camera3_stream_configuration_t* pStreamConfig,          ///< Stream config
ChiMcxConfigHandle              hDescriptorConfig)      ///< mcx config
{Usecase* pUsecase  = NULL;UINT     camera0Id = pLogicalCameraInfo->ppDeviceInfo[0]->cameraId;switch (usecaseId){case UsecaseId::PreviewZSL:case UsecaseId::VideoLiveShot:pUsecase = AdvancedCameraUsecase::Create(pLogicalCameraInfo, pStreamConfig, usecaseId);break;case UsecaseId::MultiCamera:if ((LogicalCameraType::LogicalCameraType_Default == pLogicalCameraInfo->logicalCameraType) &&(pLogicalCameraInfo->numPhysicalCameras > 1)){pUsecase = ChiMulticameraBase::Create(pLogicalCameraInfo, pStreamConfig, hDescriptorConfig);}break;case UsecaseId::MultiCameraVR://pUsecase = UsecaseMultiVRCamera::Create(pLogicalCameraInfo, pStreamConfig);break;case UsecaseId::QuadCFA:pUsecase = AdvancedCameraUsecase::Create(pLogicalCameraInfo, pStreamConfig, usecaseId);break;case UsecaseId::Torch:pUsecase = UsecaseTorch::Create(pLogicalCameraInfo, pStreamConfig);break;case UsecaseId::Depth:pUsecase = AdvancedCameraUsecase::Create(pLogicalCameraInfo, pStreamConfig, usecaseId);break;case UsecaseId::AON:pUsecase = CHXUsecaseAON::Create(pLogicalCameraInfo);break;default:pUsecase = AdvancedCameraUsecase::Create(pLogicalCameraInfo, pStreamConfig, usecaseId);break;}return pUsecase;
}

 

在AdvancedCameraUsecase::Create方法中做了很多初始化操作,其中包括了以下几个阶段:

获取XML文件中Usecase配置信息
创建Feature
保存数据流,重建Usecase的配置信息
调用父类CameraUsecaseBase的initialize方法,进行一些常规初始化工作。

调用流程:

createusecaseobject -> creat ->initialize ->  GetXMLUsecaseByName

总结:

usecase可以有很多的衍生类,因此会用到工厂模式来创建对象,创建对象create的过程中会回去xml的信息生成结构体到g_pipeline.h中,便于后面的使用。

UseCase在camx中很有很多衍生类,这是camx针对不同的stream来建立不同的usecase对象,用来管理选择feature,并且创建 pipeline以及session。

http://www.xdnf.cn/news/8627.html

相关文章:

  • 【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之如何形成高斯椭球
  • 【递归、搜索与回溯算法】专题三:穷举vs暴搜vs深搜vs回溯vs剪枝
  • 第十节第八部分:Lambda表达式、Lambda表达式的省略规则
  • YOLOV11网络图和数据增强
  • PotPlayer 4K 本地万能影音播放器
  • 基于厚度变化的分割点定位算法:以瓶口颈部为例
  • 【分组背包 数论】P12160 [蓝桥杯 2025 省 Java B] 2 的幂|普及+
  • MySQL 第五讲---基础篇 表的约束
  • 每个元素后面加“、”,但最后一个元素不加
  • 点云处理的瑞士军刀PCL几何库
  • 基于Java(GUI)实现五子棋
  • 【AI】小参数,大影响:从OpenAI参数看AI开发挑战
  • Python打卡训练营学习记录Day34
  • 文章记单词 | 第104篇(六级)
  • MySQL --- 事务
  • 【Linux系列】EVS 与 VBD 的对比
  • 文章记单词 | 第103篇(六级)
  • 永磁同步电机参数辨识算法--拓展卡尔曼滤波参数辨识
  • 探索微观世界的“度量衡”:显微测量仪器解析
  • 《C++20新特性全解析:模块、协程与概念(Concepts)》
  • Python包管理器:uv
  • 目前,Navicat 17.1 版本的用户管理功能无法使用,如何回退到上一个版本?关于之前提到的转置功能?
  • Three.js 中的 Octree(八叉树)详解
  • android studio第一次编译apk,用时6分钟
  • 安装openEuler操作系统
  • 49页 @《人工智能生命体 新启点》中國龍 原创连载
  • ResNet、MobileNet、YOLOv3、DeepLabv3+ 比较
  • 数据库表设计题目
  • OpenCV CUDA 模块图像过滤------创建一个线性滤波器(Linear Filter)函数createLinearFilter()
  • 【Golang笔记03】error、panic、fatal错误处理学习笔记