• SA8650 camx pipeline node xml 配置信息


    目录

    usecases

    pipeline

    node

    UsecaseAuto::Initialize

    1. Initialize metadata Manager and initialize input client

    2. Get the default matching usecase for the stream combination

    3. Create pipeline and assign all pipeline parameters

    4. Create session

    5. Register metadata clients

    6. get extension module instance for pipeline activation  pExtensionModuleInstance->ActivatePipeline

    UsecaseSelector::DefaultMatchingUsecaseSelection 获取对应 Usecaseid 对应的usecase数组

    1、对分辨率进行判断

       1)、获取 Usecase 的streamConfigMode

        2)、获取Usecase 的 pChiUsecases 对数组UsecaseAuto_Targets中的        UsecaseAuto_TARGET_BUFFER_RAW1_target 的 ChiTarget BufferDimension 中的分辨进行判断 ,再根据 ChiStreamFormat UsecaseAuto_TARGET_BUFFER_RAW1_formats 与 pStreamConfig比较判断使用哪一个格式

    2、如果有rawStream enable PruneRawTargetStrings

    3、如果是YUV的stream enable PruneYUVTargetStrings

    4、如果是PruneUBWCTp10的数据流 enble PruneUBWCTp10TargetStrings

    5、如果是PreviewStreams enable PrunePreviewTargetStrings

    6、确认m_enableAutoNoIPE是否配置

    7、确认缩放裁剪是否enable

    8、UsecaseMatches(g_UsecaseNameToUsecaseInstanceMap.at("g_pUsecaseAuto")))

       解析g_SocIdNameToFunctionPointerMap获取pSelectedUsecase数组

    pipeline 创建成功,Node:BPS\IPE\JPEG\JPEG AGRREGATOR\Links 

     Pipeline::CreateDescriptor

     1、初始化m_pipelineDescriptor pipelineCreateData

      2、解析ChiNode 中的node info 信息

       1、pNodeProperties[i].pValues中保存的是支持的node 节点支持的算法信息com.qti.stats.pdlibwrapper com.qti.hvx.addconstant

       2、获取HDR 模式信息 m_HDRInfo[logicalCameraId]

       3、如果usecases(torch widget, AON),那么 IsNoBufferUsecase=true

       4、当前场景中没使用torch widget, AON, auto usecase的 IsNoBufferUsecase = FALSE

      5、获取帧率,判断是否支持HDR 模式

      6、获取pLogicalCameraInfo 的m_cameraCaps.numSensorModes pSensorModeInfo

       7、根据pLogicalCameraInfo判断支持那种模式的HDR

    8、判断是否支持裁剪 根据设置传感器模式 设置分辨率


    usecases

    apps/qnx_ap/AMSS/multimedia/qcamera/camera_qcx/cdk_qcx/oem/qcom/topology/titan/sa8650/

    sa8650_usecase.xml

    pipeline

    apps/qnx_ap/AMSS/multimedia/qcamera/camera_qcx/cdk_qcx/oem/qcom/topology/titan/usecase-components/usecases/UsecaseAuto/pipelines

    camxAutoYUV.xml

    引用RealTimeBaseAuto &StatsSegmentAuto node算法

    node

    segments/sa8650/

    RealTimeBaseAuto.xml

    com.qti.hvx.addconstant &com.qti.stats.pdlibwrapper 算法

    在camx中ExtensionModule加载时初始化获取m_platformID

    ExtensionModule::ExtensionModule()

    m_platformID = SocUtils::GetSocId();

    1. ChiPopulatePipelineData pFuncPopulatePipelineData =
    2. reinterpret_cast<ChiPopulatePipelineData>(ChxUtils::LibGetAddr(m_chiUsecaseHandle, "PopulatePipelineData"));
    3. if (NULL != pFuncPopulatePipelineData)
    4. {
    5. pFuncPopulatePipelineData(m_platformID);
    6. }
    7. else
    8. {
    9. CHX_LOG_ERROR("Failed to load PopulatePipelineData lib");
    10. }
    1. /// PopulatePipelineData
    2. ///
    3. /// @brief Populate the global map variable with correct data from usecase xml generated file based on socId
    4. ///
    5. /// @param socID [IN] SocId for current target
    6. ///
    7. /// @return None
    8. VOID UsecaseSelector::PopulatePipelineData(SocId socId)
    9. {
    10. OSLIBRARYHANDLE handle = ExtensionModule::GetInstance()->GetChiUsecaseSelectorHandle();
    11. ChiPopulatePipelineData pFuncPopulatePipelineData =
    12. reinterpret_cast<ChiPopulatePipelineData>(ChxUtils::LibGetAddr(handle, "PopulatePipelineData"));
    13. if (NULL != pFuncPopulatePipelineData)
    14. {
    15. pFuncPopulatePipelineData(socId);
    16. }
    17. else
    18. {
    19. CHX_LOG_ERROR("Failed to load pFuncPopulatePipelineData lib");
    20. }
    21. }

    获取对应平台的g_SocIdNameToFunctionPointerMap 配置

    1. // PopulatePipelineData
    2. extern "C" CAMX_VISIBILITY_PUBLIC VOID PopulatePipelineData(
    3. SocId socId)
    4. {
    5. pFunc pPopulateUseCaseInfo = NULL;
    6. FillMapdata();
    7. switch (socId)
    8. {
    9. case SocId::SM8450:
    10. pPopulateUseCaseInfo = g_SocIdNameToFunctionPointerMap.at("sm8450");
    11. break;
    12. case SocId::SA8650P:
    13. pPopulateUseCaseInfo = g_SocIdNameToFunctionPointerMap.at("sa8650");
    14. break;
    15. case SocId::SA8630P:
    16. pPopulateUseCaseInfo = g_SocIdNameToFunctionPointerMap.at("sa8630");
    17. break;
    18. default:
    19. break;
    20. }
    21. if (NULL != pPopulateUseCaseInfo)
    22. {
    23. pPopulateUseCaseInfo();
    24. }
    25. else
    26. {
    27. CHX_LOG_ERROR("Error Failed to populate pipleine data");
    28. }
    29. }

    cdk_qcx/oem/qcom/chiusecase/common/g_pipelines.cpp 

    1. void FillMapssa8650()
    2. {
    3. g_EnumNameToEnumValueMap["InvalidVariantGroup"] = sa8650::InvalidVariantGroup;
    4. g_EnumNameToEnumValueMap["PruneGroupAEC"] = sa8650::PruneGroupAEC;
    5. g_EnumNameToEnumValueMap["PruneGroupAWB"] = sa8650::PruneGroupAWB;
    6. g_EnumNameToEnumValueMap["PruneGroupNoIPE"] = sa8650::PruneGroupNoIPE;
    7. g_EnumNameToEnumValueMap["PruneGroupP010Format"] = sa8650::PruneGroupP010Format;
    8. g_EnumNameToEnumValueMap["PruneGroupP010LSBFormat"] = sa8650::PruneGroupP010LSBFormat;
    9. g_EnumNameToEnumValueMap["PruneGroupP01208Format"] = sa8650::PruneGroupP01208Format;
    10. g_EnumNameToEnumValueMap["PruneGroupP01208LSBFormat"] = sa8650::PruneGroupP01208LSBFormat;
    11. g_EnumNameToEnumValueMap["PruneGroupP01210Format"] = sa8650::PruneGroupP01210Format;
    12. g_EnumNameToEnumValueMap["PruneGroupP01210LSBFormat"] = sa8650::PruneGroupP01210LSBFormat;
    13. g_EnumNameToEnumValueMap["PruneGroupPlain16_12"] = sa8650::PruneGroupPlain16_12;
    14. g_EnumNameToEnumValueMap["PruneGroupPreview"] = sa8650::PruneGroupPreview;
    15. g_EnumNameToEnumValueMap["PruneGroupPreview2"] = sa8650::PruneGroupPreview2;
    16. g_EnumNameToEnumValueMap["PruneGroupPreview3"] = sa8650::PruneGroupPreview3;
    17. g_EnumNameToEnumValueMap["PruneGroupRGBIFormat"] = sa8650::PruneGroupRGBIFormat;
    18. g_EnumNameToEnumValueMap["PruneGroupRGBPFormat"] = sa8650::PruneGroupRGBPFormat;
    19. g_EnumNameToEnumValueMap["PruneGroupRaw1"] = sa8650::PruneGroupRaw1;
    20. g_EnumNameToEnumValueMap["PruneGroupRaw16"] = sa8650::PruneGroupRaw16;
    21. g_EnumNameToEnumValueMap["PruneGroupRaw2"] = sa8650::PruneGroupRaw2;
    22. g_EnumNameToEnumValueMap["PruneGroupRaw3"] = sa8650::PruneGroupRaw3;
    23. g_EnumNameToEnumValueMap["PruneGroupRaw4"] = sa8650::PruneGroupRaw4;
    24. g_EnumNameToEnumValueMap["PruneGroupVideo"] = sa8650::PruneGroupVideo;
    25. g_EnumNameToEnumValueMap["PruneGroupYuv"] = sa8650::PruneGroupYuv;
    26. g_EnumNameToEnumValueMap["PruneGroupYuv2"] = sa8650::PruneGroupYuv2;
    27. g_EnumNameToEnumValueMap["PruneGroupYuv3"] = sa8650::PruneGroupYuv3;
    28. g_StringArrayNameToStringArray["g_stringMapVariantGroup"] = sa8650::g_stringMapVariantGroup;
    29. g_EnumNameToEnumValueMap["g_stringMapVariantGroupSize"] = sizeof(sa8650::g_stringMapVariantGroup) / sizeof(sa8650::g_stringMapVariantGroup[0]);
    30. g_EnumNameToEnumValueMap["InvalidVariantType"] = sa8650::InvalidVariantType;
    31. g_EnumNameToEnumValueMap["PruneTypeDisabled"] = sa8650::PruneTypeDisabled;
    32. g_EnumNameToEnumValueMap["PruneTypeEnabled"] = sa8650::PruneTypeEnabled;
    33. g_StringArrayNameToStringArray["g_stringMapVariantType"] = sa8650::g_stringMapVariantType;
    34. g_EnumNameToEnumValueMap["g_stringMapVariantTypeSize"] = sizeof(sa8650::g_stringMapVariantType) / sizeof(sa8650::g_stringMapVariantType[0]);
    35. g_EnumNameToEnumValueMap["ICMSMono"] = sa8650::ICMSMono;
    36. g_EnumNameToEnumValueMap["RawAuto"] = sa8650::RawAuto;
    37. g_EnumNameToEnumValueMap["AutoNoIPE"] = sa8650::AutoNoIPE;
    38. g_EnumNameToEnumValueMap["AutoICMS3"] = sa8650::AutoICMS3;
    39. g_EnumNameToEnumValueMap["AutoICMS4"] = sa8650::AutoICMS4;
    40. g_EnumNameToEnumValueMap["AutoICMS"] = sa8650::AutoICMS;
    41. g_EnumNameToEnumValueMap["AutoICMS2"] = sa8650::AutoICMS2;
    42. g_EnumNameToEnumValueMap["AutoFFCChiNode"] = sa8650::AutoFFCChiNode;
    43. g_EnumNameToEnumValueMap["AutoFFCCVSOC"] = sa8650::AutoFFCCVSOC;
    44. g_EnumNameToEnumValueMap["AutoSRV"] = sa8650::AutoSRV;
    45. g_EnumNameToEnumValueMap["AutoFFC"] = sa8650::AutoFFC;
    46. g_EnumNameToEnumValueMap["AutoFFCMeta"] = sa8650::AutoFFCMeta;
    47. g_EnumNameToEnumValueMap["AutoOfflineIFE"] = sa8650::AutoOfflineIFE;
    48. g_EnumNameToEnumValueMap["AutoYUVROI"] = sa8650::AutoYUVROI;
    49. g_EnumNameToEnumValueMap["Auto"] = sa8650::Auto;
    50. g_EnumNameToEnumValueMap["AutoYUV"] = sa8650::AutoYUV;
    51. g_UsecaseCollectionNameToUsecaseCollectionMap["PerNumTargetUsecases"] =sa8650::PerNumTargetUsecases;
    52. g_EnumNameToEnumValueMap["PerNumTargetUsecasesSize"] = sizeof(sa8650::PerNumTargetUsecases) / sizeof(sa8650::PerNumTargetUsecases[0]);
    53. g_EnumNameToEnumValueMap["UsecaseICMSMonoId"] = sa8650::UsecaseICMSMonoId;
    54. g_UsecaseNameToUsecaseInstanceMap["g_pUsecaseICMSMono"] = &(sa8650::Usecases1Target[sa8650::UsecaseICMSMonoId]);
    55. g_UsecaseNameToUsecaseInstanceMap["Usecases1Target"] = sa8650::Usecases1Target;
    56. g_EnumNameToEnumValueMap["UsecaseRawAutoId"] = sa8650::UsecaseRawAutoId;
    57. g_UsecaseNameToUsecaseInstanceMap["g_pUsecaseRawAuto"] = &(sa8650::Usecases5Target[sa8650::UsecaseRawAutoId]);
    58. g_UsecaseNameToUsecaseInstanceMap["Usecases5Target"] = sa8650::Usecases5Target;
    59. g_EnumNameToEnumValueMap["UsecaseICMSId"] = sa8650::UsecaseICMSId;
    60. g_UsecaseNameToUsecaseInstanceMap["g_pUsecaseICMS"] = &(sa8650::Usecases6Target[sa8650::UsecaseICMSId]);
    61. g_UsecaseNameToUsecaseInstanceMap["Usecases6Target"] = sa8650::Usecases6Target;
    62. g_EnumNameToEnumValueMap["UsecaseFFCChiNodeId"] = sa8650::UsecaseFFCChiNodeId;
    63. g_UsecaseNameToUsecaseInstanceMap["g_pUsecaseFFCChiNode"] = &(sa8650::Usecases6Target[sa8650::UsecaseFFCChiNodeId]);
    64. g_UsecaseNameToUsecaseInstanceMap["Usecases6Target"] = sa8650::Usecases6Target;
    65. g_EnumNameToEnumValueMap["UsecaseFFCCVSOCId"] = sa8650::UsecaseFFCCVSOCId;
    66. g_UsecaseNameToUsecaseInstanceMap["g_pUsecaseFFCCVSOC"] = &(sa8650::Usecases6Target[sa8650::UsecaseFFCCVSOCId]);
    67. g_UsecaseNameToUsecaseInstanceMap["Usecases6Target"] = sa8650::Usecases6Target;
    68. g_EnumNameToEnumValueMap["UsecaseSRVId"] = sa8650::UsecaseSRVId;
    69. g_UsecaseNameToUsecaseInstanceMap["g_pUsecaseSRV"] = &(sa8650::Usecases7Target[sa8650::UsecaseSRVId]);
    70. g_UsecaseNameToUsecaseInstanceMap["Usecases7Target"] = sa8650::Usecases7Target;
    71. g_EnumNameToEnumValueMap["UsecaseFFCId"] = sa8650::UsecaseFFCId;
    72. g_UsecaseNameToUsecaseInstanceMap["g_pUsecaseFFC"] = &(sa8650::Usecases8Target[sa8650::UsecaseFFCId]);
    73. g_UsecaseNameToUsecaseInstanceMap["Usecases8Target"] = sa8650::Usecases8Target;
    74. g_EnumNameToEnumValueMap["UsecaseAutoId"] = sa8650::UsecaseAutoId;
    75. //UsecaseAutoId=0 UsecaseAuto 初始化usecase name pUsecaseName;
    76. g_UsecaseNameToUsecaseInstanceMap["g_pUsecaseAuto"] = &(sa8650::Usecases18Target[sa8650::UsecaseAutoId]);
    77. g_UsecaseNameToUsecaseInstanceMap["Usecases18Target"] = sa8650::Usecases18Target;
    78. g_EnumNameToEnumValueMap["ChiMaxNumTargets"] =18;
    79. }

    apps/qnx_ap/AMSS/multimedia/qcamera/camera_qcx/cdk_qcx/oem/qcom/chiusecase/auto/chxusecaseselector.cpp

    chxusecaseselector.cpp:

    解析pStreamConfig 判断pipeline 的配置情况 && 解析g_SocIdNameToFunctionPointerMap 参数

    UsecaseAuto::Initialize

    1. Initialize metadata Manager and initialize input client

    2. Get the default matching usecase for the stream combination

    3. Create pipeline and assign all pipeline parameters

    Pipeline::Create m_pPipelines[index]->GetDescriptorMetadata

    result = m_pPipelines[index]->CreateDescriptor =Pipeline::CreateDescriptor

    4. Create session

       Session::Create

    5. Register metadata clients

       pPipeline->SetMetadataClientId(m_metadataClients[index])

    6. get extension module instance for pipeline activation
      pExtensionModuleInstance->ActivatePipeline

    UsecaseSelector::DefaultMatchingUsecase(pStreamConfigPerPipeline, 0);调用各类平台的cdk_qcx/oem/qcom/chiusecase/(platform)/chxusecaseselector.cpp

    GetDefaultMatchingUsecase获取usecase信息最终会调用到DefaultMatchingUsecaseSelection

    DefaultMatchingUsecaseSelection根据pStreamConfig的分辨率 、格式 operation_mode选择对应支持的usecase

    Pipeline::Create 创建pipe

    1. // UsecaseSelector::DefaultMatchingUsecase
    2. ChiUsecase* UsecaseSelector::DefaultMatchingUsecase(
    3. camera3_stream_configuration_t* pStreamConfig,
    4. UINT32 bpp)
    5. {
    6. ChiUsecase* pSelectedUsecase = NULL;
    7. OSLIBRARYHANDLE handle = ExtensionModule::GetInstance()->GetChiUsecaseSelectorHandle();
    8. if (NULL == handle)
    9. {
    10. CHX_LOG_ERROR("Failed to load ChiusecaseSelector lib");
    11. }
    12. else
    13. {
    14. CHX_LOG_INFO("ChiusecaseSelector able to load handle lib %p", handle);
    15. }
    16. ChiUsecaseSelector pFuncChiUsecaseSelector =
    17. reinterpret_cast<ChiUsecaseSelector>(ChxUtils::LibGetAddr(handle, "GetDefaultMatchingUsecase"));
    18. if (NULL == pFuncChiUsecaseSelector)
    19. {
    20. CHX_LOG_ERROR("Failed to load pFuncChiUsecaseSelector lib");
    21. }
    22. else
    23. {
    24. pSelectedUsecase = pFuncChiUsecaseSelector(pStreamConfig, bpp);
    25. }
    26. return pSelectedUsecase;
    27. }

    UsecaseSelector::DefaultMatchingUsecaseSelection 获取对应 Usecaseid 对应的usecase数组

    1、对分辨率进行判断

       1)、获取 Usecase 的streamConfigMode
        2)、获取Usecase 的 pChiUsecases 对数组UsecaseAuto_Targets中的        UsecaseAuto_TARGET_BUFFER_RAW1_target 的 ChiTarget BufferDimension 中的分辨进行判断 ,再根据 ChiStreamFormat UsecaseAuto_TARGET_BUFFER_RAW1_formats 与 pStreamConfig比较判断使用哪一个格式

    2、如果有rawStream enable PruneRawTargetStrings

    3、如果是YUV的stream enable PruneYUVTargetStrings

    4、如果是PruneUBWCTp10的数据流 enble PruneUBWCTp10TargetStrings

    5、如果是PreviewStreams enable PrunePreviewTargetStrings

    6、确认m_enableAutoNoIPE是否配置

    7、确认缩放裁剪是否enable

    8、UsecaseMatches(g_UsecaseNameToUsecaseInstanceMap.at("g_pUsecaseAuto")))

       解析g_SocIdNameToFunctionPointerMap获取pSelectedUsecase数组

    1. // UsecaseSelector::DefaultMatchingUsecaseSelection
    2. extern "C" CAMX_VISIBILITY_PUBLIC ChiUsecase* UsecaseSelector::DefaultMatchingUsecaseSelection(
    3. camera3_stream_configuration_t* pStreamConfig,
    4. UINT32 bpp)
    5. {
    6. ChiUsecase* pSelectedUsecase = NULL;
    7. CDKResult result = CDKResultSuccess;
    8. UINT32 numRawStreams = 0;
    9. UINT32 numYUVStreams = 0;
    10. UINT32 numUBWCStreams = 0;
    11. UINT32 numPreviewStreams = 0;
    12. BOOL isRaw16Stream = FALSE;
    13. BOOL isRawPlain1612Stream = FALSE;
    14. BOOL isNoIPEEnabled = FALSE;
    15. BOOL isP01208Stream = FALSE;
    16. BOOL isP01210Stream = FALSE;
    17. BOOL isP01208LSBStream = FALSE;
    18. BOOL isP01210LSBStream = FALSE;
    19. BOOL isRGBIStream = FALSE;
    20. BOOL isRGBPStream = FALSE;
    21. BOOL isCropEnabled = FALSE;
    22. BOOL isP010Stream = FALSE;
    23. BOOL isP010LSBStream = FALSE;
    24. UINT32 numMetaStreams = 0;
    25. PruneSettings pruneSettings;
    26. PruneVariant variants[MaxPruneTargetStrings]; // update MaxOtherStreamsPerPipeline when adding more pruneVariants
    27. pruneSettings.numSettings = 0;
    28. pruneSettings.pVariants = variants;
    29. if (NULL == pStreamConfig)
    30. {
    31. CHX_LOG_ERROR("Failed to match usecase. pStreamConfig is NULL");
    32. }
    33. else
    34. {
    35. for (UINT32 streamIdx = 0; streamIdx < pStreamConfig->num_streams; streamIdx++)
    36. {
    37. camera3_stream_t* pFwkStream = pStreamConfig->streams[streamIdx];
    38. if (pFwkStream->height > MaxMetaHeight)
    39. {
    40. if (UsecaseSelector::IsRawStream(pFwkStream))
    41. {
    42. numRawStreams++;
    43. }
    44. //pStream->format
    45. if (UsecaseSelector::IsRaw16Stream(pFwkStream))
    46. {
    47. // decrement the number of raw stream when using Raw 16
    48. // it is also raw stream, but has different pruning
    49. // so when numRawStream will decrement as much raw 16 Streams
    50. // enabled.
    51. numRawStreams--;
    52. isRaw16Stream = TRUE;
    53. }
    54. //pStream->stream_type & pStream->format
    55. if (UsecaseSelector::IsYUVOutStream(pFwkStream))
    56. {
    57. numYUVStreams++;
    58. }
    59. if (UsecaseSelector::IsPreviewStream(pFwkStream))
    60. {
    61. numPreviewStreams++;
    62. }
    63. if (UsecaseSelector::IsUBWCTP10Stream(pFwkStream))
    64. {
    65. numUBWCStreams++;
    66. }
    67. if (UsecaseSelector::IsP01208Stream(pFwkStream))
    68. {
    69. isP01208Stream = TRUE;
    70. }
    71. if (UsecaseSelector::IsP01210Stream(pFwkStream))
    72. {
    73. isP01210Stream = TRUE;
    74. }
    75. if (UsecaseSelector::IsP010Stream(pFwkStream))
    76. {
    77. isP010Stream = TRUE;
    78. }
    79. if (UsecaseSelector::IsP01208LSBStream(pFwkStream))
    80. {
    81. isP01208LSBStream = TRUE;
    82. }
    83. if (UsecaseSelector::IsP01210LSBStream(pFwkStream))
    84. {
    85. isP01210LSBStream = TRUE;
    86. }
    87. if (UsecaseSelector::IsP010LSBStream(pFwkStream))
    88. {
    89. isP010LSBStream = TRUE;
    90. }
    91. if (UsecaseSelector::IsRGBIStream(pFwkStream))
    92. {
    93. isRGBIStream = TRUE;
    94. }
    95. if (UsecaseSelector::IsRGBPStream(pFwkStream))
    96. {
    97. isRGBPStream = TRUE;
    98. }
    99. if (UsecaseSelector::IsRawPlain1612Stream(pFwkStream))
    100. {
    101. isRawPlain1612Stream++;
    102. }
    103. }
    104. else
    105. {
    106. numMetaStreams++;
    107. }
    108. }
    109. auto AddSetting = [&pruneSettings, &variants](const CHAR* pGroup, const CHAR* pType) -> VOID
    110. {
    111. VariantGroup group = GetVariantGroup(pGroup);
    112. VariantType type = GetVariantType(pType);
    113. if ((g_EnumNameToEnumValueMap.at("InvalidVariantGroup") != group) &&
    114. (g_EnumNameToEnumValueMap.at("InvalidVariantType") != type))
    115. {
    116. if (pruneSettings.numSettings < MaxPruneTargetStrings)
    117. {
    118. CHX_LOG_INFO("Adding prune setting #%u - %s = %s", pruneSettings.numSettings, pGroup, pType);
    119. PruneVariant* pVariant = &variants[pruneSettings.numSettings++];
    120. pVariant->group = group;
    121. pVariant->type = type;
    122. }
    123. else
    124. {
    125. CHX_LOG_ERROR("prunSettings added exceeds allowed max pruneSettings: %d", MaxPruneTargetStrings);
    126. }
    127. }
    128. else
    129. {
    130. CHX_LOG_WARN("Invalid Prune Setting - Group: %s(%u) Setting: %s(%u)", pGroup, group, pType, type);
    131. }
    132. };
    133. auto UsecaseMatches = [&](const ChiUsecase* const pUsecase) -> BOOL
    134. { //对分辨率进行判断
    135. //获取 Usecase 的streamConfigMode
    136. // 获取Usecase 的 pChiUsecases 对数组UsecaseAuto_Targets中的
    137. //UsecaseAuto_TARGET_BUFFER_RAW1_target 的 ChiTarget BufferDimension 中的分辨进行判断
    138. //再根据 ChiStreamFormat UsecaseAuto_TARGET_BUFFER_RAW1_formats 与 pStreamConfig比较判断使用哪一个格式
    139. return IsMatchingUsecase(pStreamConfig, pUsecase, &pruneSettings);
    140. };
    141. // Pruning raw streams
    142. for (UINT32 i = 0; i < MaxRawStreamsPerPipeline; i++)
    143. { //如果有rawStream enable PruneRawTargetStrings
    144. AddSetting(PruneRawTargetStrings[i], (i < numRawStreams) ? "Enabled" : "Disabled");
    145. }
    146. // Pruning for auto YUV targets
    147. for (UINT32 i = 0; i < MaxYuvStreamsPerPipeline; i++)
    148. {//如果是YUV的stream enable PruneYUVTargetStrings
    149. AddSetting(PruneYUVTargetStrings[i], (i < numYUVStreams) ? "Enabled" : "Disabled");
    150. }
    151. for (UINT32 i = 0; i < MaxUBWCStreamsPerPipeline; i++)
    152. { //如果是PruneUBWCTp10的数据流 enble PruneUBWCTp10TargetStrings
    153. AddSetting(PruneUBWCTp10TargetStrings[i], (i < numUBWCStreams) ? "Enabled" : "Disabled");
    154. }
    155. // Pruning Preview Streams
    156. for (UINT32 i = 0; i < MaxPreviewStreamsPerPipeline; i++)
    157. { //如果是PreviewStreams enable PrunePreviewTargetStrings
    158. AddSetting(PrunePreviewTargetStrings[i], (i < numPreviewStreams) ? "Enabled" : "Disabled");
    159. }
    160. // get override settings
    161. //确认m_enableAutoNoIPE是否配置
    162. isNoIPEEnabled = ExtensionModule::GetInstance()->EnableAutoNoIPEpipeline();
    163. CHX_LOG_INFO("numPreviewStreams %d, numUBWCStreams %d, numYUVStreams %d, numRawStreams %d",
    164. numPreviewStreams, numUBWCStreams, numYUVStreams, numRawStreams);
    165. AddSetting("Raw16", (TRUE == isRaw16Stream) ? "Enabled" : "Disabled");
    166. AddSetting("Plain16_12", (TRUE == isRawPlain1612Stream) ? "Enabled" : "Disabled");
    167. AddSetting("NoIPE", (TRUE == isNoIPEEnabled) ? "Enabled" : "Disabled");
    168. AddSetting("AWB", (TRUE == ExtensionModule::GetInstance()->EnableAutoAWB()) ? "Enabled" : "Disabled");
    169. AddSetting("AEC", (TRUE == ExtensionModule::GetInstance()->EnableAutoAEC()) ? "Enabled" : "Disabled");
    170. AddSetting("P01208Format", (TRUE == isP01208Stream) ? "Enabled" : "Disabled");
    171. AddSetting("P01210Format", (TRUE == isP01210Stream) ? "Enabled" : "Disabled");
    172. AddSetting("P010Format", (TRUE == isP010Stream) ? "Enabled" : "Disabled");
    173. AddSetting("P01208LSBFormat", (TRUE == isP01208LSBStream) ? "Enabled" : "Disabled");
    174. AddSetting("P01210LSBFormat", (TRUE == isP01210LSBStream) ? "Enabled" : "Disabled");
    175. AddSetting("P010LSBFormat", (TRUE == isP010LSBStream) ? "Enabled" : "Disabled");
    176. AddSetting("RGBIFormat", (TRUE == isRGBIStream) ? "Enabled" : "Disabled");
    177. AddSetting("RGBPFormat", (TRUE == isRGBPStream) ? "Enabled" : "Disabled");
    178. for (UINT32 i = 0; i < MaxRawStreamsPerPipeline; i++)
    179. {
    180. AddSetting(PruneRawTargetStrings[i], (i < numMetaStreams) ? "Enabled" : "Disabled"); // to match usecase
    181. AddSetting(PruneMetaTargetStrings[i], (i < numMetaStreams) ? "Enabled" : "Disabled");
    182. }
    183. //check Vendortag
    184. // 1 for bayer, 2 for mono
    185. camera_metadata_entry_t entry = {};
    186. UINT32 enableICMS = ChxUtils::QuerySessionParam(pStreamConfig, "EnableICMS", entry);
    187. UINT32 enableSRV = ChxUtils::QuerySessionParam(pStreamConfig, "EnableSRV", entry);
    188. UINT32 enableFFC = ChxUtils::QuerySessionParam(pStreamConfig, "EnableFFC", entry);
    189. ChxUtils::QuerySessionParam(pStreamConfig, "ScalerCropRegion", entry);
    190. if (NULL != entry.data.i32)
    191. {
    192. if ((0 != entry.data.i32[0]) || (0 != entry.data.i32[1]))
    193. { //缩放裁剪enable
    194. isCropEnabled = TRUE;
    195. }
    196. }
    197. CHX_LOG_INFO("enableICMS %d, enableSRV %d, enableFFC %d", enableICMS, enableSRV, enableFFC);
    198. //解析g_SocIdNameToFunctionPointerMap获取pSelectedUsecase
    199. // assign the logical camera usecase and pipelines accordingly
    200. // bayer ICMS usecase
    201. if ((1 == enableICMS) && (TRUE == UsecaseMatches(g_UsecaseNameToUsecaseInstanceMap.at("g_pUsecaseICMS"))))
    202. {
    203. pSelectedUsecase = g_UsecaseNameToUsecaseInstanceMap.at("g_pUsecaseICMS");
    204. }
    205. // mono usecase
    206. if ((2 == enableICMS) && (TRUE == UsecaseMatches(g_UsecaseNameToUsecaseInstanceMap.at("g_pUsecaseICMSMono"))))
    207. {
    208. pSelectedUsecase = g_UsecaseNameToUsecaseInstanceMap.at("g_pUsecaseICMSMono");
    209. }
    210. // SRV usecase
    211. if ((1 == enableSRV) && (TRUE == UsecaseMatches(g_UsecaseNameToUsecaseInstanceMap.at("g_pUsecaseSRV"))))
    212. {
    213. pSelectedUsecase = g_UsecaseNameToUsecaseInstanceMap.at("g_pUsecaseSRV");
    214. }
    215. // FFC usecase
    216. if ((1 == enableFFC))
    217. {
    218. if ((1 == ExtensionModule::GetInstance()->getCurrentSoc()) &&
    219. TRUE == UsecaseMatches(g_UsecaseNameToUsecaseInstanceMap.at("g_pUsecaseFFCChiNode")))
    220. {
    221. CHX_LOG_INFO("Selected FFC: ISOC chinode usecase");
    222. pSelectedUsecase = g_UsecaseNameToUsecaseInstanceMap.at("g_pUsecaseFFCChiNode");
    223. }
    224. else if ((2 == ExtensionModule::GetInstance()->getCurrentSoc()) &&
    225. TRUE == UsecaseMatches(g_UsecaseNameToUsecaseInstanceMap.at("g_pUsecaseFFCCVSOC")))
    226. {
    227. CHX_LOG_INFO("Selected FFC: CVSOC usecase");
    228. pSelectedUsecase = g_UsecaseNameToUsecaseInstanceMap.at("g_pUsecaseFFCCVSOC");
    229. }
    230. else
    231. {
    232. // Select ISOC usecase by default
    233. if ( TRUE == UsecaseMatches(g_UsecaseNameToUsecaseInstanceMap.at("g_pUsecaseFFC")))
    234. {
    235. CHX_LOG_INFO("Selected FFC usecase, FFC sensor %d",
    236. ExtensionModule::GetInstance()->IsFFCSensor());
    237. pSelectedUsecase = g_UsecaseNameToUsecaseInstanceMap.at("g_pUsecaseFFC");
    238. }
    239. }
    240. }
    241. if (NULL == pSelectedUsecase)
    242. {
    243. if ((numYUVStreams > 0) || (numPreviewStreams > 0) || (TRUE == isRGBPStream) ||
    244. (TRUE == isP01208Stream) || (TRUE == isP01210Stream) || (TRUE == isRGBIStream) ||
    245. (numUBWCStreams> 0) || (TRUE == isRaw16Stream) || (TRUE == isP010Stream) ||
    246. (TRUE == isP01208LSBStream) || (TRUE == isP01210LSBStream) || (TRUE == isP010LSBStream))
    247. {
    248. if (TRUE == UsecaseMatches(g_UsecaseNameToUsecaseInstanceMap.at("g_pUsecaseAuto")))
    249. {
    250. pSelectedUsecase = g_UsecaseNameToUsecaseInstanceMap.at("g_pUsecaseAuto");
    251. }
    252. }
    253. else
    254. {
    255. if (TRUE == UsecaseMatches(g_UsecaseNameToUsecaseInstanceMap.at("g_pUsecaseRawAuto")))
    256. {
    257. pSelectedUsecase = g_UsecaseNameToUsecaseInstanceMap.at("g_pUsecaseRawAuto");
    258. }
    259. }
    260. }
    261. if (NULL == pSelectedUsecase)
    262. {
    263. CHX_LOG_ERROR("Fatal: no Usecase Selected or Usecase Matching Failed");
    264. }
    265. else
    266. {
    267. // Handle more usecases, currently handling only RAW usecase.
    268. UINT32 totalPipelineIdx = DefaultPipelineIdx;
    269. UINT32 pipelineDescIdx[5] = {0};
    270. ChiUsecase* pClonedUsecase = NULL;
    271. // Select the right pipeline index based on override setting
    272. if ((2 != enableICMS) || (1 != enableSRV))
    273. {
    274. totalPipelineIdx = DefaultPipelineIdx;
    275. for (UINT32 i = 0; i < pSelectedUsecase->numPipelines; i++)
    276. {
    277. if (1 == enableICMS)
    278. {
    279. if (0 == CdkUtils::StrCmp(pSelectedUsecase->pPipelineTargetCreateDesc[i].pPipelineName,
    280. PruneICMSPipelineStrings[numPreviewStreams + numYUVStreams - 1]))
    281. {
    282. pipelineDescIdx[0] = i;
    283. }
    284. }
    285. else if (1 == enableFFC)
    286. {
    287. if (TRUE == ExtensionModule::GetInstance()->IsFFCSensor())
    288. {
    289. CHX_LOG_INFO("Selected FFC usecase, FFC sensor, pipeline %s, i %d",
    290. pSelectedUsecase->pPipelineTargetCreateDesc[i].pPipelineName, i);
    291. if (0 == CdkUtils::StrCmp(pSelectedUsecase->pPipelineTargetCreateDesc[i].pPipelineName, "AutoFFCMeta"))
    292. {
    293. pipelineDescIdx[0] = i;
    294. }
    295. }
    296. else if ((1 == ExtensionModule::GetInstance()->getCurrentSoc()) &&
    297. (2 == ExtensionModule::GetInstance()->getCurrentSoc()))
    298. {
    299. if ((0 == CdkUtils::StrCmp(pSelectedUsecase->pPipelineTargetCreateDesc[i].pPipelineName, "AutoFFCChiNode")) ||
    300. (0 == CdkUtils::StrCmp(pSelectedUsecase->pPipelineTargetCreateDesc[i].pPipelineName, "AutoFFCCVSOC")))
    301. {
    302. pipelineDescIdx[0] = i;
    303. }
    304. }
    305. else
    306. {
    307. if (0 == CdkUtils::StrCmp(pSelectedUsecase->pPipelineTargetCreateDesc[i].pPipelineName, "AutoFFC"))
    308. {
    309. pipelineDescIdx[0] = i;
    310. }
    311. }
    312. }
    313. else if (TRUE == ExtensionModule::GetInstance()->EnableAutoNoIPEpipeline())
    314. {
    315. if ((TRUE == isCropEnabled) &&
    316. (0 == CdkUtils::StrCmp(
    317. pSelectedUsecase->pPipelineTargetCreateDesc[i].pPipelineName , "AutoYUVROI")))
    318. {
    319. pipelineDescIdx[0] = i;
    320. break;
    321. }
    322. if ((0 == CdkUtils::StrCmp(
    323. pSelectedUsecase->pPipelineTargetCreateDesc[i].pPipelineName, "AutoNoIPE")) ||
    324. (0 == CdkUtils::StrCmp(
    325. pSelectedUsecase->pPipelineTargetCreateDesc[i].pPipelineName , "AutoYUV")))
    326. {
    327. pipelineDescIdx[0] = i;
    328. break;
    329. }
    330. }
    331. else if (TRUE == ExtensionModule::GetInstance()->IsOfflineIFEEnabled())
    332. {
    333. if (0 == CdkUtils::StrCmp(
    334. pSelectedUsecase->pPipelineTargetCreateDesc[i].pPipelineName, "AutoOfflineIFE"))
    335. {
    336. pipelineDescIdx[0] = i;
    337. break;
    338. }
    339. }
    340. else
    341. {
    342. if (0 == CdkUtils::StrCmp(pSelectedUsecase->pPipelineTargetCreateDesc[i].pPipelineName, "Auto"))
    343. {
    344. pipelineDescIdx[0] = i;
    345. break;
    346. }
    347. }
    348. }
    349. }
    350. // Prune
    351. pClonedUsecase = UsecaseSelector::CloneUsecase(pSelectedUsecase, totalPipelineIdx, pipelineDescIdx);
    352. result = UsecaseSelector::PruneUsecaseDescriptor(pClonedUsecase,
    353. pruneSettings.numSettings,
    354. pruneSettings.pVariants,
    355. &pSelectedUsecase);
    356. if (NULL != pClonedUsecase)
    357. {
    358. UsecaseSelector::DestroyUsecase(pClonedUsecase);
    359. pClonedUsecase = NULL;
    360. }
    361. if (NULL != pSelectedUsecase)
    362. {
    363. // showing which pipelines are being selected for the usecase
    364. for (UINT i = 0; i < totalPipelineIdx; i++)
    365. {
    366. CHX_LOG_INFO("SelectedUsecase %s, PipelineName %s %p",
    367. pSelectedUsecase->pUsecaseName,
    368. pSelectedUsecase->pPipelineTargetCreateDesc[i].pPipelineName,
    369. &pSelectedUsecase->pPipelineTargetCreateDesc[i]);
    370. }
    371. }
    372. else
    373. {
    374. CHX_LOG_ERROR("Failed to match usecase. pSelectedUsecase is NULL");
    375. }
    376. }
    377. }
    378. return pSelectedUsecase;
    379. }

     Pipeline::Create

    1)、CHX_NEW Pipeline  pPipeline->Initialize

    2)、初始化pPipeline->m_pPipelineName = pName;

    1. // Pipeline::Create
    2. Pipeline* Pipeline::Create(
    3. UINT32 cameraId,
    4. PipelineType type,
    5. const CHAR* pName)
    6. {
    7. Pipeline* pPipeline = CHX_NEW Pipeline;
    8. if (NULL != pPipeline)
    9. {
    10. const UINT32 logicalCameraId = ExtensionModule::GetInstance()->GetLogicalCameraId(cameraId);
    11. if (CDKResultSuccess != pPipeline->Initialize(cameraId, logicalCameraId, type))
    12. {
    13. CHX_LOG_ERROR("Failed to initialize %s", pName ? pName : "NULL");
    14. CHX_DELETE pPipeline;
    15. pPipeline = NULL;
    16. }
    17. else
    18. {
    19. pPipeline->m_pPipelineName = pName;
    20. }
    21. }
    22. return pPipeline;
    23. }
    1. // Pipeline::Initialize
    2. CDKResult Pipeline::Initialize(
    3. UINT32 cameraId,
    4. UINT32 logicalCameraId,
    5. PipelineType type)
    6. {
    7. CDKResult result = CDKResultSuccess;
    8. CHX_LOG_INFO("Initializing Pipeline with cameraId %u logicalCameraId %u, type:%d", cameraId, logicalCameraId, type);
    9. m_cameraId = cameraId;
    10. m_logicalCameraId = logicalCameraId;
    11. m_type = type;
    12. m_pipelineActivated = FALSE;
    13. m_isDeferFinalizeNeeded = FALSE;
    14. m_SensorModePickhint = {};
    15. m_isNameAllocated = FALSE;
    16. m_isSensorModeHintSet = FALSE;
    17. m_numInputBuffers = 0;
    18. m_pPipelineDescriptorMetadata = ChiMetadata::Create();
    19. if (NULL == m_pPipelineDescriptorMetadata)
    20. {
    21. result = CDKResultENoMemory;
    22. CHX_LOG_ERROR("Failed to allocate memory for Pipeline Metadata");
    23. }
    24. if (m_type == PipelineType::OfflinePreview)
    25. {
    26. m_numInputBuffers = 1; // Sensor - so no input buffer
    27. m_numOutputBuffers = 1; // Preview
    28. SetupRealtimePreviewPipelineDescriptor();
    29. }
    30. return result;
    31. }

    pipeline 创建成功,Node:BPS\IPE\JPEG\JPEG AGRREGATOR\Links 

    m_pipelineDescriptor.pNodes   nodeId = 65538

    m_nodes[nodeIndex].nodeAllPorts.pInputPorts    portId=8

     m_nodes[nodeIndex].nodeAllPorts.pOutputPorts   portId=0

    m_pipelineDescriptor.pLinks   

    srcNode.nodeId = 65538

    m_links[0].numDestNodes = 1;

    m_linkNodeDescriptors[0].nodeId  = 2
     

    1. /// Pipeline::SetupRealtimePreviewPipelineDescriptor
    2. VOID Pipeline::SetupRealtimePreviewPipelineDescriptor()
    3. {
    4. m_pipelineDescriptor.size = sizeof(CHIPIPELINECREATEDESCRIPTOR);
    5. m_pipelineDescriptor.numNodes = 1;
    6. m_pipelineDescriptor.pNodes = &m_nodes[0];
    7. m_pipelineDescriptor.numLinks = 1;
    8. m_pipelineDescriptor.pLinks = &m_links[0];
    9. m_pipelineDescriptor.isRealTime = FALSE;
    10. // Nodes
    11. UINT32 nodeIndex = 0;
    12. #if 0
    13. // ---------------------------------------------------------------------------
    14. // ---------------------------------- BPS ------------------------------------
    15. // ---------------------------------------------------------------------------
    16. m_nodes[nodeIndex].nodeId = 65539;
    17. m_nodes[nodeIndex].nodeInstanceId = 0;
    18. m_nodes[nodeIndex].nodeAllPorts.numInputPorts = 1;
    19. m_nodes[nodeIndex].nodeAllPorts.pInputPorts = &m_inputPorts[BPSNode];
    20. m_nodes[nodeIndex].nodeAllPorts.numOutputPorts = 1;
    21. m_nodes[nodeIndex].nodeAllPorts.pOutputPorts = &m_outputPorts[BPSNode];
    22. // BPS output port
    23. m_outputPorts[BPSNode].portId = 1;
    24. m_outputPorts[BPSNode].isSinkPort = FALSE;
    25. m_outputPorts[BPSNode].isOutputStreamBuffer = FALSE;
    26. // BPS input port
    27. m_inputPorts[BPSNode].portId = 0;
    28. m_inputPorts[BPSNode].isInputStreamBuffer = TRUE;
    29. // ---------------------------------------------------------------------------
    30. // ---------------------------------- IPE ------------------------------------
    31. // ---------------------------------------------------------------------------
    32. nodeIndex++;
    33. #endif
    34. m_nodes[nodeIndex].nodeId = 65538;
    35. m_nodes[nodeIndex].nodeInstanceId = 0;
    36. m_nodes[nodeIndex].nodeAllPorts.numInputPorts = 1;
    37. m_nodes[nodeIndex].nodeAllPorts.pInputPorts = &m_inputPorts[IPENode];
    38. m_nodes[nodeIndex].nodeAllPorts.numOutputPorts = 1;
    39. m_nodes[nodeIndex].nodeAllPorts.pOutputPorts = &m_outputPorts[IPENode];
    40. // IPE output port
    41. m_outputPorts[IPENode].portId = 8;
    42. m_outputPorts[IPENode].isSinkPort = TRUE;
    43. m_outputPorts[IPENode].isOutputStreamBuffer = TRUE;
    44. // IPE input port
    45. m_inputPorts[IPENode].portId = 0;
    46. m_inputPorts[IPENode].isInputStreamBuffer = TRUE;
    47. #if 0
    48. // ---------------------------------------------------------------------------
    49. // ---------------------------------- JPEG -----------------------------------
    50. // ---------------------------------------------------------------------------
    51. nodeIndex++;
    52. m_nodes[nodeIndex].nodeId = 65537;
    53. m_nodes[nodeIndex].nodeInstanceId = 0;
    54. m_nodes[nodeIndex].nodeAllPorts.numInputPorts = 1;
    55. m_nodes[nodeIndex].nodeAllPorts.pInputPorts = &m_inputPorts[JPEGNode];
    56. m_nodes[nodeIndex].nodeAllPorts.numOutputPorts = 1;
    57. m_nodes[nodeIndex].nodeAllPorts.pOutputPorts = &m_outputPorts[JPEGNode];
    58. // JPEG output port
    59. m_outputPorts[JPEGNode].portId = 1;
    60. m_outputPorts[JPEGNode].isSinkPort = FALSE;
    61. m_outputPorts[JPEGNode].isOutputStreamBuffer = FALSE;
    62. // JPEG input port
    63. m_inputPorts[JPEGNode].portId = 0;
    64. m_inputPorts[JPEGNode].isInputStreamBuffer = FALSE;
    65. // ---------------------------------------------------------------------------
    66. // ---------------------------------- JPEG AGRREGATOR ------------------------
    67. // ---------------------------------------------------------------------------
    68. nodeIndex++;
    69. m_nodes[nodeIndex].nodeId = 6;
    70. m_nodes[nodeIndex].nodeInstanceId = 0;
    71. m_nodes[nodeIndex].nodeAllPorts.numInputPorts = 1;
    72. m_nodes[nodeIndex].nodeAllPorts.pInputPorts = &m_inputPorts[JPEGAgrregatorNode];
    73. m_nodes[nodeIndex].nodeAllPorts.numOutputPorts = 1;
    74. m_nodes[nodeIndex].nodeAllPorts.pOutputPorts = &m_outputPorts[JPEGAgrregatorNode];
    75. // JPEG output port
    76. m_outputPorts[JPEGAgrregatorNode].portId = 1;
    77. m_outputPorts[JPEGAgrregatorNode].isSinkPort = TRUE;
    78. m_outputPorts[JPEGAgrregatorNode].isOutputStreamBuffer = TRUE;
    79. // JPEG input port
    80. m_inputPorts[JPEGAgrregatorNode].portId = 0;
    81. m_inputPorts[JPEGAgrregatorNode].isInputStreamBuffer = FALSE;
    82. #endif
    83. // ---------------------------------------------------------------------------
    84. // --------------------------------- Links -----------------------------------
    85. // ---------------------------------------------------------------------------
    86. #if 0
    87. // BPS --> IPE
    88. m_links[0].srcNode.nodeId = 65539;
    89. m_links[0].srcNode.nodeInstanceId = 0;
    90. m_links[0].srcNode.nodePortId = 1;
    91. m_links[0].numDestNodes = 1;
    92. m_links[0].pDestNodes = &m_linkNodeDescriptors[0];
    93. m_linkNodeDescriptors[0].nodeId = 65538;
    94. m_linkNodeDescriptors[0].nodeInstanceId = 0;
    95. m_linkNodeDescriptors[0].nodePortId = 0;
    96. m_links[0].bufferProperties.bufferFlags = BufferMemFlagHw;
    97. m_links[0].bufferProperties.bufferFormat = ChiFormatUBWCTP10;
    98. m_links[0].bufferProperties.bufferHeap = BufferHeapIon;
    99. m_links[0].bufferProperties.bufferQueueDepth = 8;
    100. // IPE --> JPEG
    101. m_links[1].srcNode.nodeId = 65538;
    102. m_links[1].srcNode.nodeInstanceId = 0;
    103. m_links[1].srcNode.nodePortId = 8;
    104. m_links[1].numDestNodes = 1;
    105. m_links[1].pDestNodes = &m_linkNodeDescriptors[1];
    106. m_linkNodeDescriptors[1].nodeId = 65537;
    107. m_linkNodeDescriptors[1].nodeInstanceId = 0;
    108. m_linkNodeDescriptors[1].nodePortId = 0;
    109. m_links[1].bufferProperties.bufferFlags = (BufferMemFlagHw | BufferMemFlagLockable);
    110. m_links[1].bufferProperties.bufferFormat = ChiFormatYUV420NV12;
    111. m_links[1].bufferProperties.bufferHeap = BufferHeapIon;
    112. m_links[1].bufferProperties.bufferQueueDepth = 8;
    113. // JPEG --> JPEG Agrregator
    114. m_links[2].srcNode.nodeId = 65537;
    115. m_links[2].srcNode.nodeInstanceId = 0;
    116. m_links[2].srcNode.nodePortId = 1;
    117. m_links[2].numDestNodes = 1;
    118. m_links[2].pDestNodes = &m_linkNodeDescriptors[2];
    119. m_linkNodeDescriptors[2].nodeId = 6;
    120. m_linkNodeDescriptors[2].nodeInstanceId = 0;
    121. m_linkNodeDescriptors[2].nodePortId = 0;
    122. m_links[2].bufferProperties.bufferFlags = (BufferMemFlagHw | BufferMemFlagLockable);
    123. m_links[2].bufferProperties.bufferFormat = ChiFormatYUV420NV12;
    124. m_links[2].bufferProperties.bufferHeap = BufferHeapIon;
    125. m_links[2].bufferProperties.bufferQueueDepth = 8;
    126. // JPEG Aggregator --> Sink Buffer
    127. m_links[3].srcNode.nodeId = 6;
    128. m_links[3].srcNode.nodeInstanceId = 0;
    129. m_links[3].srcNode.nodePortId = 1;
    130. m_links[3].numDestNodes = 1;
    131. m_links[3].pDestNodes = &m_linkNodeDescriptors[3];
    132. m_linkNodeDescriptors[3].nodeId = 2;
    133. m_linkNodeDescriptors[3].nodeInstanceId = 0;
    134. m_linkNodeDescriptors[3].nodePortId = 0;
    135. #endif
    136. m_links[0].srcNode.nodeId = 65538;
    137. m_links[0].srcNode.nodeInstanceId = 0;
    138. m_links[0].srcNode.nodePortId = 8;
    139. m_links[0].numDestNodes = 1;
    140. m_links[0].pDestNodes = &m_linkNodeDescriptors[0];
    141. m_linkNodeDescriptors[0].nodeId = 2;
    142. m_linkNodeDescriptors[0].nodeInstanceId = 0;
    143. m_linkNodeDescriptors[0].nodePortId = 0;
    144. }

     Pipeline::CreateDescriptor

     1、初始化m_pipelineDescriptor pipelineCreateData

        在UsecaseAuto::Initialize 解析UsecaseAuto_pipelines是初始化获取的

          pipelineOutputBuffer[streamIdx].pStream      = pSinkTargetDesc->pTarget->pChiStream;
          pipelineOutputBuffer[streamIdx].pNodePort    = pSinkTargetDesc->pNodePort;

          pipelineOutputBuffer[streamIdx].numNodePorts = pSinkTargetDesc->numNodePorts;
     

      2、解析ChiNode 中的node info 信息

       1、pNodeProperties[i].pValues中保存的是支持的node 节点支持的算法信息com.qti.stats.pdlibwrapper com.qti.hvx.addconstant

       2、获取HDR 模式信息 m_HDRInfo[logicalCameraId]

       3、如果usecases(torch widget, AON),那么 IsNoBufferUsecase=true

       4、当前场景中没使用torch widget, AON, auto usecase的 IsNoBufferUsecase = FALSE

      5、获取帧率,判断是否支持HDR 模式

      6、获取pLogicalCameraInfo 的m_cameraCaps.numSensorModes pSensorModeInfo

        modeCount:

        pLogicalCameraInfo->m_cameraCaps.numSensorModes

       pAllModes:

       pLogicalCameraInfo->pSensorModeInfo

       7、根据pLogicalCameraInfo判断支持那种模式的HDR

       1)、采用三曝光实现实时HDR预览

       2)、Staggered HDR 行交织 HD

       3)、MFHDR 多帧 HDR

       4)、QHDR(Quad HDR,四像素HDR)

    8、判断是否支持裁剪 根据设置传感器模式 设置分辨率

    1. // Pipeline::CreateDescriptor
    2. CDKResult Pipeline::CreateDescriptor()
    3. {
    4. CDKResult result = CDKResultSuccess;
    5. PipelineCreateData pipelineCreateData = {};
    6. m_pipelineDescriptor.isRealTime = HasSensorNode(&m_pipelineDescriptor);
    7. // m_cameraId from usecase side must be correct, even for pipelines without sensor Node
    8. m_pipelineDescriptor.cameraId = m_cameraId;
    9. m_pipelineDescriptor.logicalCameraId = m_logicalCameraId;
    10. m_pipelineDescriptor.context = m_context;
    11. pipelineCreateData.pPipelineName = m_pPipelineName;
    12. pipelineCreateData.numOutputs = m_numOutputBuffers;
    13. pipelineCreateData.pOutputDescriptors = &m_pipelineOutputBuffer[0];
    14. pipelineCreateData.numInputs = m_numInputBuffers;
    15. pipelineCreateData.pInputOptions = &m_pipelineInputOptions[0];
    16. pipelineCreateData.pPipelineCreateDescriptor = &m_pipelineDescriptor;
    17. CHIPIPELINECREATEDESCRIPTOR* pCreateDesc = pipelineCreateData.pPipelineCreateDescriptor;
    18. pCreateDesc->numBatchedFrames = ExtensionModule::GetInstance()->GetNumBatchedFrames(m_logicalCameraId);
    19. pCreateDesc->HALOutputBufferCombined = ExtensionModule::GetInstance()->GetHALOutputBufferCombined();
    20. pCreateDesc->maxFPSValue = ExtensionModule::GetInstance()->GetUsecaseMaxFPS(m_logicalCameraId);
    21. const CHAR* pClientName = "Chi::Pipeline::CreateDescriptor";
    22. SetTuningUsecase();
    23. m_pPipelineDescriptorMetadata->AddReference(pClientName);
    24. m_pipelineDescriptor.hPipelineMetadata = m_pPipelineDescriptorMetadata->GetHandle();
    25. CHX_LOG_CORE_CFG("Pipeline[%s] pipeline pointer %p numInputs=%d, numOutputs=%d stream w x h: %d x %d "
    26. "format: %d, numBatchedFrames: %d, HALOutputBufferCombined: %d maxFPSValue: %d cameraId: %d logicalCameraId:%d",
    27. m_pPipelineName,
    28. this,
    29. pipelineCreateData.numInputs,
    30. pipelineCreateData.numOutputs,
    31. (NULL != pipelineCreateData.pOutputDescriptors->pStream) ? pipelineCreateData.pOutputDescriptors->pStream->width : 0,
    32. (NULL != pipelineCreateData.pOutputDescriptors->pStream) ? pipelineCreateData.pOutputDescriptors->pStream->height : 0,
    33. (NULL != pipelineCreateData.pOutputDescriptors->pStream) ? pipelineCreateData.pOutputDescriptors->pStream->format : 0,
    34. pCreateDesc->numBatchedFrames,
    35. pCreateDesc->HALOutputBufferCombined,
    36. pCreateDesc->maxFPSValue,
    37. pipelineCreateData.pPipelineCreateDescriptor->cameraId,
    38. pipelineCreateData.pPipelineCreateDescriptor->logicalCameraId);
    39. UINT32 enableSWMCTFwithReferenceFrame = ExtensionModule::GetInstance()->GetMCTFwithReferenceFrameStatus(m_logicalCameraId);
    40. ChxUtils::SetVendorTagValue(m_pPipelineDescriptorMetadata,
    41. VendorTag::SWMCTFEnableWithRef,
    42. 1,
    43. &enableSWMCTFwithReferenceFrame);
    44. UINT32 facialContourVersion = ExtensionModule::GetInstance()->GetFacialContourVersion(m_logicalCameraId);
    45. ChxUtils::SetVendorTagValue(m_pPipelineDescriptorMetadata,
    46. VendorTag::FacialContourVersion,
    47. 1,
    48. &facialContourVersion);
    49. // Update stats skip pattern in node property with value from override
    50. //m_pipelineDescriptor.numNodes=3
    51. for (UINT node = 0; node < m_pipelineDescriptor.numNodes; node++)
    52. {
    53. //pNodes[node]=UsecaseAuto_AutoOfflineIFENodes[node]
    54. const ChiNode* const pChiNode = &m_pipelineDescriptor.pNodes[node];
    55. //pChiNode->numProperties=1 2 4
    56. //pChiNode->pNodeProperties=UsecaseAuto_AutoOfflineIFE_node0_0_properties
    57. // UsecaseAuto_AutoOfflineIFE_node65536_1_properties
    58. // UsecaseAuto_AutoOfflineIFE_node65536_0_properties
    59. for (UINT i = 0; i < pChiNode->numProperties; i++)
    60. {
    61. //pChiNode->pNodeProperties[i].id=1
    62. switch(pChiNode->pNodeProperties[i].id)
    63. { //解析node的算法
    64. //pNodeProperties[i].pValues = com.qti.stats.pdlibwrapper com.qti.hvx.addconstant
    65. case NodePropertyStatsSkipPattern://6
    66. m_statsSkipPattern = ExtensionModule::GetInstance()->GetStatsSkipPattern();
    67. pChiNode->pNodeProperties[i].pValue = &m_statsSkipPattern;
    68. break;
    69. case NodePropertyEnableFOVC://16
    70. m_enableFOVC = ExtensionModule::GetInstance()->EnableFOVCUseCase();
    71. pChiNode->pNodeProperties[i].pValue = &m_enableFOVC;
    72. break;
    73. case NodePropertyNISInternalTrigger://21
    74. m_isNISInternalTrigger = ExtensionModule::GetInstance()->IsInternalTriggered(m_logicalCameraId);
    75. pChiNode->pNodeProperties[i].pValue = &m_isNISInternalTrigger;
    76. break;
    77. default:
    78. break;
    79. }
    80. }
    81. }
    82. //初始化pCreatePipelineDescriptor m_hPipelineHandle
    83. m_hPipelineHandle = ExtensionModule::GetInstance()->CreatePipelineDescriptor(&pipelineCreateData);
    84. m_pPipelineDescriptorMetadata->ReleaseReference(pClientName);
    85. if (NULL == m_hPipelineHandle)
    86. {
    87. result = CDKResultEFailed;
    88. CHX_LOG_ERROR("Fail due to NULL pipeline handle");
    89. }
    90. else
    91. {//获取HDR 模式信息 m_HDRInfo[logicalCameraId]
    92. const HDRInfo& rHDRInfo = ExtensionModule::GetInstance()->GetHDRInfo(m_logicalCameraId);
    93. HDRDeviceInfo* pLogicalHDRDeviceInfo = rHDRInfo.pLogicalHDRDeviceInfo;
    94. ChiHDRModeInfo physicalHDRModeInfo =
    95. ExtensionModule::GetInstance()->GetPhysicalDeviceHDRModeInfo(m_logicalCameraId, m_cameraId);
    96. ChiHDRFeatureMode physicalHDRMode = physicalHDRModeInfo.HDRMode;
    97. //usecases(torch widget, AON). IsNoBufferUsecase=true
    98. //auto usecase IsNoBufferUsecase = FALSE
    99. if ((FALSE == ExtensionModule::GetInstance()->IsNoBufferUsecase()))
    100. {
    101. // sensor mode selection not required for no buffer usecases(torch widget, AON).
    102. DesiredSensorMode desiredSensorMode = {};
    103. //获取帧率
    104. desiredSensorMode.frameRate = ExtensionModule::GetInstance()->GetUsecaseMaxFPS(m_logicalCameraId);
    105. //判断是否支持HDR 模式
    106. if (ExtensionModule::GetInstance()->IsVideoHDRMode())
    107. {
    108. const auto sensorModes = [&]() -> ChiPtrView<CHISENSORMODEINFO>
    109. {
    110. UINT32 modeCount = 0;
    111. CHISENSORMODEINFO* pAllModes = NULL;
    112. //获取pLogicalCameraInfo modeCount pAllModes
    113. //pLogicalCameraInfo->m_cameraCaps.numSensorModes
    114. //pLogicalCameraInfo->pSensorModeInfo;
    115. if (CDKResultSuccess == ExtensionModule::GetInstance()->GetPhysicalCameraSensorModes(m_cameraId,
    116. &modeCount,
    117. &pAllModes))
    118. {
    119. return ChiPtrView{static_cast<SIZE_T>(modeCount), pAllModes};
    120. }
    121. return ChiPtrView<CHISENSORMODEINFO>(static_cast<SIZE_T>(0), NULL);
    122. }();
    123. auto SupportsZZHDR = [&](const ChiSensorModeInfo& rSensorModeInfo)
    124. {
    125. return rSensorModeInfo.sensorModeCaps.u.ZZHDR;
    126. };
    127. desiredSensorMode.sensorModeCaps.u.ZZHDR = std::any_of(sensorModes.begin(), sensorModes.end(), SupportsZZHDR);
    128. }//采用三曝光实现实时HDR预览
    129. else if (SelectInSensorHDR3ExpUsecase::InSensorHDR3ExpPreview ==
    130. ExtensionModule::GetInstance()->SelectInSensorHDR3ExpUsecase())
    131. {
    132. desiredSensorMode.sensorModeCaps.u.IHDR = 1;
    133. }//Staggered HDR 行交织 HDR
    134. else if (HDRFeatureModeSHDR == physicalHDRMode)
    135. {
    136. desiredSensorMode.sensorModeCaps.u.SHDR = 1;
    137. desiredSensorMode.sensorHDRExposureType = ChiHDRExposureType::TwoExposure;
    138. if (FALSE == rHDRInfo.isAutoHDREnabled)
    139. {
    140. switch (rHDRInfo.appReqNumHDRExposure)
    141. {
    142. case SingleHDRExposure:
    143. desiredSensorMode.sensorHDRExposureType = ChiHDRExposureType::OneExposure;
    144. break;
    145. case TwoHDRExposure:
    146. desiredSensorMode.sensorHDRExposureType = ChiHDRExposureType::TwoExposure;
    147. break;
    148. case ThreeHDRExposure:
    149. desiredSensorMode.sensorHDRExposureType = ChiHDRExposureType::ThreeExposure;
    150. break;
    151. default:
    152. desiredSensorMode.sensorHDRExposureType = ChiHDRExposureType::TwoExposure;
    153. break;
    154. }
    155. }
    156. }//MFHDR 多帧 HDR
    157. else if (HDRFeatureModeMFHDR == physicalHDRMode)
    158. {
    159. desiredSensorMode.sensorModeCaps.u.Normal = TRUE;
    160. // For MFHDR case, we will run sensor @ twice the desired output framerate
    161. desiredSensorMode.frameRate *= 2;
    162. }//QHDR(Quad HDR,四像素HDR)
    163. else if (HDRFeatureModeQHDR == physicalHDRMode)
    164. {
    165. if (TRUE == rHDRInfo.appEnabledQHDR)
    166. {
    167. desiredSensorMode.sensorModeCaps.u.QHDR = 1;
    168. desiredSensorMode.sensorHDRExposureType = ChiHDRExposureType::ThreeExposure;
    169. }
    170. }
    171. UINT index = FindHighestWidthInputIndex(m_pipelineInputOptions, m_numInputOptions);
    172. // @todo Select the highest width/height from all the input buffer requirements
    173. desiredSensorMode.optimalWidth = m_pipelineInputOptions[index].bufferOptions.optimalDimension.width;
    174. desiredSensorMode.optimalHeight = m_pipelineInputOptions[index].bufferOptions.optimalDimension.height;
    175. desiredSensorMode.maxWidth = m_pipelineInputOptions[index].bufferOptions.maxDimension.width;
    176. desiredSensorMode.maxHeight = m_pipelineInputOptions[index].bufferOptions.maxDimension.height;
    177. desiredSensorMode.minWidth = m_pipelineInputOptions[index].bufferOptions.minDimension.width;
    178. desiredSensorMode.minHeight = m_pipelineInputOptions[index].bufferOptions.minDimension.height;
    179. desiredSensorMode.forceMode = ExtensionModule::GetInstance()->GetForceSensorMode(m_cameraId);
    180. if (TRUE == m_isSensorModeHintSet)
    181. {
    182. CHX_LOG("input option:%dx%d, upscale:%d, override optimal size:%dx%d, sensor mode caps:%x",
    183. desiredSensorMode.optimalWidth, desiredSensorMode.optimalHeight,
    184. m_SensorModePickhint.postSensorUpscale,
    185. m_SensorModePickhint.sensorOutputSize.width,
    186. m_SensorModePickhint.sensorOutputSize.height,
    187. m_SensorModePickhint.sensorModeCaps.value);
    188. //判断是否支持裁剪 根据设置传感器模式 设置分辨率
    189. if ((TRUE == m_SensorModePickhint.postSensorUpscale) &&
    190. (m_SensorModePickhint.sensorOutputSize.width < desiredSensorMode.optimalWidth) &&
    191. (m_SensorModePickhint.sensorOutputSize.height < desiredSensorMode.optimalHeight))
    192. {
    193. desiredSensorMode.optimalWidth = m_SensorModePickhint.sensorOutputSize.width;
    194. desiredSensorMode.optimalHeight = m_SensorModePickhint.sensorOutputSize.height;
    195. desiredSensorMode.maxWidth = desiredSensorMode.optimalWidth;
    196. desiredSensorMode.maxHeight = desiredSensorMode.optimalHeight;
    197. desiredSensorMode.minWidth = desiredSensorMode.optimalWidth;
    198. desiredSensorMode.minHeight = desiredSensorMode.optimalHeight;
    199. }
    200. if (0 != m_SensorModePickhint.sensorModeCaps.value)
    201. {
    202. desiredSensorMode.sensorModeCaps.value = m_SensorModePickhint.sensorModeCaps.value;
    203. }
    204. if (0 != m_SensorModePickhint.frameRateMultiplier)
    205. {
    206. desiredSensorMode.frameRate *= m_SensorModePickhint.frameRateMultiplier;
    207. }
    208. if (TRUE == m_SensorModePickhint.sensorModeCaps.u.QuadCFA)
    209. {
    210. desiredSensorMode.sensorRemosaicType = ExtensionModule::GetInstance()->GetRemosaicType();
    211. }
    212. }
    213. if (StreamConfigModeFastShutter == ExtensionModule::GetInstance()->GetOpMode(m_cameraId))
    214. {
    215. desiredSensorMode.sensorModeCaps.u.FS = 1;
    216. }
    217. if (HDRFeatureModeQHDR == physicalHDRMode)
    218. {
    219. // QCFA binning mode
    220. if (FALSE == rHDRInfo.appEnabledQHDR)
    221. {
    222. desiredSensorMode.optimalWidth = m_pipelineInputOptions[index].bufferOptions.optimalDimension.width >> 1;
    223. desiredSensorMode.optimalHeight = m_pipelineInputOptions[index].bufferOptions.optimalDimension.height >> 1;
    224. }
    225. }
    226. m_pSelectedSensorMode = ChxSensorModeSelect::FindBestSensorMode(m_cameraId, &desiredSensorMode);
    227. m_pSelectedSensorMode->batchedFrames = ExtensionModule::GetInstance()->GetNumBatchedFrames(m_logicalCameraId);
    228. m_pSelectedSensorMode->HALOutputBufferCombined = ExtensionModule::GetInstance()->GetHALOutputBufferCombined();
    229. }
    230. if (TRUE == m_pipelineDescriptor.isRealTime)
    231. {
    232. if ((NULL != pLogicalHDRDeviceInfo) &&
    233. (HDRFeatureModeSHDR == pLogicalHDRDeviceInfo->HDRModeInfo.HDRMode) &&
    234. (InvalidMode != ExtensionModule::GetInstance()->GetForceSensorMode(m_cameraId)))
    235. {
    236. // This is to handle the case wherre overridesensor mode is used
    237. pLogicalHDRDeviceInfo->numHDRExposure = static_cast<UINT>(m_pSelectedSensorMode->HDRExposureType) + 1;
    238. }
    239. m_pipelineInfo.pipelineInputInfo.isInputSensor = TRUE;
    240. m_pipelineInfo.pipelineInputInfo.sensorInfo.cameraId = m_cameraId;
    241. m_pipelineInfo.pipelineInputInfo.sensorInfo.pSensorModeInfo = m_pSelectedSensorMode;
    242. CHX_LOG_CORE_CFG("Pipeline[%s] Pipeline pointer %p Selected sensor Mode W=%d, H=%d Mode=%d",
    243. m_pPipelineName,
    244. this,
    245. m_pipelineInfo.pipelineInputInfo.sensorInfo.pSensorModeInfo->frameDimension.width,
    246. m_pipelineInfo.pipelineInputInfo.sensorInfo.pSensorModeInfo->frameDimension.height,
    247. m_pipelineInfo.pipelineInputInfo.sensorInfo.pSensorModeInfo->modeIndex);
    248. std::vector transition_modes = {1, 2, 3};
    249. std::copy(transition_modes.begin(), transition_modes.end(), std::back_inserter(m_transitionModesList));
    250. // add changes to get the list of seamless mode transitions possible for this sensor mode
    251. }
    252. else
    253. {
    254. m_pipelineInfo.pipelineInputInfo.isInputSensor = FALSE;
    255. m_pipelineInfo.pipelineInputInfo.inputBufferInfo.numInputBuffers = m_numInputBuffers;
    256. m_pipelineInfo.pipelineInputInfo.inputBufferInfo.pInputBufferDescriptors = GetInputBufferDescriptors();
    257. if ((FALSE == ExtensionModule::GetInstance()->IsNoBufferUsecase()))
    258. {
    259. CHIBUFFERDIMENSION sensorOutDim = {};
    260. sensorOutDim.width = m_pSelectedSensorMode->frameDimension.width;
    261. sensorOutDim.height = m_pSelectedSensorMode->frameDimension.height;
    262. for (UINT32 i = 0; i < m_numInputOptions; i++)
    263. {
    264. CHIBUFFEROPTIONS& rBufferOptions = m_pipelineInputOptions[i].bufferOptions;
    265. if ((rBufferOptions.minDimension.width > sensorOutDim.width) ||
    266. (rBufferOptions.minDimension.height > sensorOutDim.height))
    267. {
    268. CHX_LOG_INFO("override min requirement to sensor output size. %dx%d -> %dx%d",
    269. rBufferOptions.minDimension.width, rBufferOptions.minDimension.height,
    270. sensorOutDim.width, sensorOutDim.height);
    271. rBufferOptions.minDimension = sensorOutDim;
    272. }
    273. if ((rBufferOptions.minDimension.width > rBufferOptions.optimalDimension.width) ||
    274. (rBufferOptions.minDimension.height > rBufferOptions.optimalDimension.height))
    275. {
    276. rBufferOptions.optimalDimension = rBufferOptions.minDimension;
    277. }
    278. }
    279. }
    280. }
    281. m_pipelineInfo.hPipelineDescriptor = reinterpret_cast<CHIPIPELINEDESCRIPTOR>(m_hPipelineHandle);
    282. m_pipelineInfo.pipelineOutputInfo.hPipelineHandle = NULL;
    283. m_pipelineInfo.pipelineResourcePolicy = m_resourcePolicy;
    284. m_pipelineInfo.isDeferFinalizeNeeded = m_isDeferFinalizeNeeded;
    285. }
    286. return result;
    287. }

  • 相关阅读:
    【SQL server速成之路】触发器
    LocalDateTime、LocalDate、LocalTime相关使用记录(未完)
    这就是你了解的指针吗?
    git commit 后 发现提交信息写错了怎么办
    亚马逊美国站CPC认证ASTM F963测试项目要求有哪些?
    ADAS行业进入深水区,高阶自动驾驶迎战行业分水岭
    MyBatis详解(一)
    计算机毕业设计Java毕业生就业管理系统(源码+系统+mysql数据库+lw文档)
    Mac 中修改默认 的Python 版本
    XMLHttpRequest拦截请求和响应
  • 原文地址:https://blog.csdn.net/wing_7/article/details/132774724