​ChiMetadata ChiMetadataManager​

news/2024/7/1 3:11:30

目录

ChiMetadata

chiMetadata与metabuffer的调用关系

ChiMetadata的成员变量

ChiMetadata的成员函数解析

ChiMetadataManager

ChiMetadataManager的成员变量

ChiMetadataManager的成员函数

configure_stream过程中的metadata


ChiMetadata

chiMetadata与metabuffer的调用关系

   chiMetadata是通过pMetadataOps调用camx中metabuffer的函数。

    pMetadataOps的赋值: 

         chxmetadata.cpp ExtensionModule::GetInstance()→GetMetadataOps(pMetadataOps);

                          Chxextensionmodule.cpp    g_chiContextOps.pMetadataOps(pMetadataOps);

                                      camxchi.cpp ChiEntry(ChiContextOps* pChiContextOps)中加载了这些接口     pChiContextOps->pMetadataOps = CamX::ChiGetMetadataOps;

ChiMetadata的成员变量

          ChiMetadata是对Metabuffer的封装, chimetabuffer中有一个指向MetaBuffer的指针.    在chi模块使用的Chimetadata. camx中使用Metabuffer

ChiMetadata的成员函数解析

(1)创建ChiMetadata  

static ChiMetadata* Create( const UINT32* pTagList = NULL,   UINT32 tagCount = 0, bool useDefaultFrameworkKeys = false, ChiMetadataManager* pManager = NULL, UINT logicalCameraId = InvalidCameraId);

参数: pTagList  预分配内存的taglist

              tagCount  预分配内存的tag总数

              useDefaultFrameworkKeys 是否使用默认的Tag

              pManager 该chimetadata所属的metadata manager

              logicalCameraId 该chimetadata所属的logical camera id

作用:创建一个chimetadata对象,然后创建一个metabuffer对象存到m_metaHandle中

返回:chimetadata的指针

ChiMetadata* ChiMetadata::Create(const UINT32* pTagList, UINT32 tagCount, bool useDefaultKeys, ChiMetadataManager* pManager,  UINT logicalCameraId)
{
    ChiMetadata*   pMetadata = CHX_NEW ChiMetadata;
    pMetadata->m_pManager = pManager;
    InitializeMetadataOps(&pMetadata->m_metadataOps); //初始化m_metadataOps操作

    pMetadata->m_metadataManagerClientId = ChiMetadataManager::InvalidClientId;
    pMetadata->m_logicalCameraId         = logicalCameraId;
    //使用默认的tag集合
    if ((NULL == pTagList) && useDefaultKeys)
    {
        tagList.resize(ChxMaxRequestKeys);  // ChxMaxRequestKeys = 100
        ExtensionModule::GetInstance()->GetAvailableRequestKeys(0, tagList.data(), tagList.size(), &tagCount); //获取ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS tag中存的默认的 default keys(82个)
        pTagList = tagList.data();
    }
    result = pMetadata->Initialize(pTagList, tagCount);
    return pMetadata;
}
//useContextMeta默认为TRUE
CDKResult ChiMetadata::Initialize(const UINT32* pTagList, UINT32 tagCount, BOOL useContextMeta)
{
    ChiCMBCreateParams createParams = {};
    createParams.useExpContextMeta  = (TRUE == useContextMeta) || (TRUE == ExtensionModule::GetInstance()->EnableMFHDR(m_logicalCameraId));

    if ((NULL != pTagList) && (0 < tagCount))
    {
        result = m_metadataOps.pCreateWithTagArray(pTagList, tagCount, &m_metaHandle, this, &createParams);//创建一个新的metabuffer,并给pTagList中的tag分配内存,然后存到m_metaHandle中
    }
    else
    {
        result = m_metadataOps.pCreate(&m_metaHandle, this, &createParams);创建一个新的metabuffer,不分配额外的内存(memory region),然后存到m_metaHandle中
    }

    for (UINT32 index = 0; index < MaxChiMetaClients; ++index)
    {
        m_clientName[index] = NULL;
    }
}
//m_metadataOps.pCreateWithTagArray
static CDKResult ChiMetabufferCreateWithTaglist(const UINT32* pTagList, UINT32 tagListCount, CHIMETAHANDLE* phMetaHandle, CHIMETAPRIVATEDATA pPrivateData, CHICMBCREATEPARAMS* pCMBParams)
{
    if ((NULL != phMetaHandle) && (NULL != pTagList) && (0 < tagListCount))
    {
        MetaBuffer* pMetaBuffer = MetaBuffer::Create(pPrivateData, pCMBParams); //创建一个metabuffer
        if (NULL != pMetaBuffer)
        {
            result = pMetaBuffer->AllocateBuffer(pTagList, tagListCount); //给tagList中的外置tag分配内存
            if (CamxResultSuccess == result)
            {
                *phMetaHandle = pMetaBuffer;
                result        = CDKResultSuccess;
            }
            else
            {
                pMetaBuffer->Destroy();
            }
        }
    }
}
//m_metadataOps.pCreate
static CDKResult ChiMetabufferCreate( CHIMETAHANDLE* phMetaHandle, CHIMETAPRIVATEDATA pPrivateData, CHICMBCREATEPARAMS* pCMBParams)
{
    if (NULL != phMetaHandle)
    {
        MetaBuffer* pMetaBuffer = MetaBuffer::Create(pPrivateData, pCMBParams); //创建一个metabuffer,没有分配额外的空间
        if (NULL != pMetaBuffer)
        {
            *phMetaHandle = pMetaBuffer;
        }
    }
}

(2)TranslateToCameraPartialMetadata   &   TranslateToCameraMetadata

CDKResult ChiMetadata::TranslateToCameraPartialMetadata(camera_metadata* pDstCameraMetadata, UINT32* pPartial, UINT32 partialCount)

参数: pDstCameraMetadata 是返回给framework的 Andriod camera

              pPartial  要更新的tag数组

              partialCount 要更新的tag总数

作用:将pPartial tag从chiMetadata中更新到pDstCameraMetadata

CDKResult TranslateToCameraMetadata(camera_metadata* pDstCameraMetadata, bool frameworkTagsOnly = true,bool filterProperties = true, UINT32 filterTagCount = 0, UINT32* pFilterTagArray = NULL);

参数: pDstCameraMetadata 是返回给framework的 Andriod camera

              frameworkTagsOnly  是否只更新 visiblity为TagSectionVisibleToFramework的tag

              filterProperties 是否更新property, filterProperties为true时,不更新

              filterTagCount 不更新的tag总数

              pFilterTagArray 不更新的tag数组

作用:将除了pFilterTagArray之外的其他tag, 从chiMetadata中更新到pDstCameraMetadata

例如:

Chxadvancedcamerausecase.cpp (vendor\qcom\proprietary\chi-cdk\core\chiusecase)

                 pChiOutputMetadata→TranslateToCameraMetadata(m_batchFrameworkOutput, TRUE, TRUE, partialTagCount, pPartialTagList);

Chxmulticamerabase.cpp (vendor\qcom\proprietary\chi-cdk\core\chiframework)

                 pChiMetadata->TranslateToCameraMetadata(pFrameworkOutput, TRUE, !m_pUseCase→IsReprocessUsecase());

                 pChiMetadata->TranslateToCameraPartialMetadata(pFrameworkOutput, pPartialTagList, partialTagCount);

//将pPartial tag从chiMetadata中更新到pDstCameraMetadata
CDKResult ChiMetadata::TranslateToCameraPartialMetadata(camera_metadata* pDstCameraMetadata, UINT32* pPartial, UINT32 partialCount)
{
    std::unordered_set::iterator partialIdIterator;
    ChiMetadataEntry                     chiMetaEntry = {0};
    camera_metadata_entry_t              cameraMetaEntry;

    for(UINT i = 0; i < partialCount; i++)
    {
        result = GetTag(pPartial[i], chiMetaEntry); //从metabuffer中获取tag对应的entry
        if (0 == find_camera_metadata_entry(pDstCameraMetadata, chiMetaEntry.tagID, &cameraMetaEntry))
        {
            camera_metadata_entry_t updatedEntry;
            status = update_camera_metadata_entry( pDstCameraMetadata, cameraMetaEntry.index, chiMetaEntry.pTagData, chiMetaEntry.count, &updatedEntry);
        }
        else
        {
            status = add_camera_metadata_entry( pDstCameraMetadata, chiMetaEntry.tagID, chiMetaEntry.pTagData, chiMetaEntry.count);
        }
    }
}
//将除了pFilterTagArray之外的其他tag, 从chiMetadata中更新到pDstCameraMetadata
CDKResult ChiMetadata::TranslateToCameraMetadata(camera_metadata* pDstCameraMetadata,bool frameworkTagsOnly, bool filterProperties, UINT32 filterTagCount, UINT32* pFilterTagArray)
{
    m_metadataOps.pFilter(m_metaHandle, pDstCameraMetadata, frameworkTagsOnly, filterProperties, filterTagCount, pFilterTagArray);
}
//m_metadataOps.pFilter
CDKResult ChiMetaBufferFilter(CHIMETAHANDLE hMetaHandle, VOID* pAndroidMeta, BOOL frameworkTagsOnly, BOOL filterProperties, UINT32 filterTagCount, UINT32* pFilterTagArray)
{
    MetaBuffer* pMetaBuffer = static_castfer*>(hMetaHandle);
    if ((NULL != pMetaBuffer) && (NULL != pAndroidMeta) && (TRUE == MetaBuffer::IsValid(pMetaBuffer)))
    {
        result = pMetaBuffer->GetAndroidMeta(static_cast(pAndroidMet

http://lihuaxi.xjx100.cn/news/2196562.html

相关文章

「前端+鸿蒙」鸿蒙应用开发简介

鸿蒙应用开发是指使用华为鸿蒙操作系统&#xff08;HarmonyOS&#xff09;提供的API和开发工具&#xff0c;创建可以在鸿蒙设备上运行的应用程序。鸿蒙系统是华为开发的全场景、分布式操作系统&#xff0c;它支持多种设备类型&#xff0c;包括智能手机、平板电脑、智能电视、智…

一个月速刷leetcodeHOT100 day15 彻底搞懂回溯算法 以及相关题目

回溯算法采用试错的思想&#xff0c;它尝试分步的去解决一个问题。在分步解决问题的过程中&#xff0c;当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候&#xff0c;它将取消上一步甚至是上几步的计算&#xff0c;再通过其它的可能的分步解答再次尝试寻找问题的…

Java - Date类与Calendar类

在Java中&#xff0c;Date 类和 Calendar 类都被用于处理日期和时间&#xff0c;但它们之间存在一些重要的差异。下面是对这两个类的简要说明以及它们之间的主要区别。 Date 类 java.util.Date 类表示一个特定的时间点&#xff08;精确到毫秒&#xff09;。它包含自1970年1月…

【全开源】JAVA打车小程序APP打车顺风车滴滴车跑腿源码微信小程序打车源码

&#xff1a;构建便捷出行新体验 一、引言&#xff1a;探索打车系统小程序源码的重要性 在数字化快速发展的今天&#xff0c;打车系统小程序已成为我们日常生活中不可或缺的一部分。它以其便捷、高效的特点&#xff0c;极大地改变了我们的出行方式。而背后的关键&#xff0c;…

JavaScrip轮播图

前言 在网页设计中&#xff0c;轮播图&#xff08;Carousel&#xff09;已经成为一种常见的元素&#xff0c;用于展示一系列的图片或内容卡片。它们不仅能够吸引用户的注意力&#xff0c;还能节省空间&#xff0c;使得用户可以在有限的空间内获得更多的信息。今天&#xff0c;我…

【红黑树变色+旋转】

文章目录 一. 红黑树规则二. 情况一叔叔存在且为红情况二.变色旋旋 一. 红黑树规则 对于红黑树&#xff0c;进行变色旋转处理&#xff0c;终究都是为了维持颜色以下几条规则&#xff0c;只有颜色和规则维持住了&#xff0c;红黑树就维持住了最长路径的长度不超过最短路径的两倍…

LitCTF2024部分wp

litctf wp 第一次ak了web和misc&#xff0c;非常激动&#xff0c;感谢lictf给我这个机会 最终成果 全靠队里的密码逆向✌带飞。一个人就砍了近一半的分数 这里是我们队的wp web exx 题目名反过来就是xxe&#xff0c;考察xxe&#xff0c;查看登录的数据包 发现传的就是xml…

springboot配置集成RedisTemplate和Redisson,使用分布式锁案例

文章要点 自定义配置属性类集成配置RedisTemplate集成配置分布式锁Redisson使用分布式锁简单实现超卖方案 1. 项目结构 2. 集成RedisTemplate和Redisson 添加依赖 依赖的版本与继承的spring-boot-starter-parent工程相对应&#xff0c;可写可不写 <!--spring data redis…