• SA8650 camera UsecaseId UsecaseAuto


    目录

    UsecaseAuto create

     UsecaseAuto::Initialize

    1)、获取输入输出流

    2)、ChiUsecase 获取usecase 的数组

    3)、判断是否具有裁剪属性 打印裁剪后的分辨率

    4)、解析UsecaseAuto_pipelines 的数组UsecaseAuto_AutoOfflineIFE_sink_TargetDescriptors数组配置,

    5)、初始化pipeline信息

    6)、初始化pipelineCreateData m_pipelineDescriptor 解析node支持的模式 配置output buffer的分辨率

    6)、创建session

    pipelineCreateDesc ChiPipelineCreateDescriptor 的结构体信息 

     Chi 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、判断是否支持裁剪 根据设置传感器模式 设置分辨率

    HDR科普


    UsecaseAuto create

    1. /// UsecaseAuto::Create
    2. UsecaseAuto* UsecaseAuto::Create(
    3. LogicalCameraInfo* pCameraInfo, ///< Camera info
    4. camera3_stream_configuration_t* pStreamConfig) ///< Stream configuration
    5. {
    6. CDKResult result = CDKResultSuccess;
    7. UsecaseAuto* pUsecaseAuto = CHX_NEW UsecaseAuto;
    8. if (NULL != pUsecaseAuto)
    9. {
    10. result = pUsecaseAuto->Initialize(pCameraInfo, pStreamConfig);
    11. if (CDKResultSuccess != result)
    12. {
    13. pUsecaseAuto->Destroy(FALSE);
    14. pUsecaseAuto = NULL;
    15. CHX_LOG_ERROR("pUsecaseAuto Initialize failed with error %s", CdkUtils::CDKResultToString(result));
    16. }
    17. }
    18. else
    19. {
    20. result = CDKResultEFailed;
    21. }
    22. return pUsecaseAuto;
    23. }

     UsecaseAuto::Initialize

    1)、获取输入输出流

    2)、ChiUsecase 获取usecase 的数组

    3)、判断是否具有裁剪属性 打印裁剪后的分辨率

    4)、解析UsecaseAuto_pipelines 的数组UsecaseAuto_AutoOfflineIFE_sink_TargetDescriptors数组配置,

    5)、初始化pipeline信息

    6)、初始化pipelineCreateData m_pipelineDescriptor 解析node支持的模式 配置output buffer的分辨率

    6)、创建session

    1. /// UsecaseAuto::Initialize
    2. CDKResult UsecaseAuto::Initialize(
    3. LogicalCameraInfo* pCameraInfo, ///< Camera info
    4. camera3_stream_configuration_t* pStreamConfig) ///< Stream configuration
    5. {
    6. CDKResult result = CDKResultSuccess;
    7. BOOL isMultiCamera = (pCameraInfo->numPhysicalCameras > 1);
    8. std::map<UINT, std::vector<CHISTREAM*>> cameraIdToStreamMap;
    9. std::map<UINT, std::vector<camera3_stream_t*>> cameraIdToCamera3StreamMap;
    10. m_pFrameNumCounter = 1;
    11. m_logicalCameraId = pCameraInfo->cameraId;
    12. m_pAppResultMutex = Mutex::Create();
    13. m_availableResultTags = getResultVendorTags();
    14. m_availableResultTagsOEM = ChiVendorTagUtilOEM::getResultVendorTags();
    15. if (NULL == m_pAppResultMutex)
    16. {
    17. CHX_LOG_ERROR("Mutex Create failed");
    18. result = CDKResultENoMemory;
    19. }
    20. if (CDKResultSuccess == result)
    21. {
    22. // 1. Initialize metadata Manager and initialize input client
    23. m_pMetadataManager = ChiMetadataManager::Create(m_logicalCameraId);
    24. if (NULL != m_pMetadataManager)
    25. {
    26. result = m_pMetadataManager->InitializeFrameworkInputClient(DefaultNumMetadataBuffers);
    27. }
    28. else
    29. {
    30. result = CDKResultENoMemory;
    31. }
    32. }
    33. // allocate memory for the local streamconfiguration
    34. camera3_stream_configuration_t* pStreamConfigPerPipeline = static_cast<camera3_stream_configuration_t*>(
    35. CHX_CALLOC(sizeof(camera3_stream_configuration_t)));
    36. if (NULL == pStreamConfigPerPipeline)
    37. {
    38. result = CDKResultENoMemory;
    39. }
    40. // 2. Get the default matching usecase for the stream combination.
    41. if (CDKResultSuccess == result)
    42. {
    43. // @todo Currently only one pipeline is returned for Auto usecase with RAW streams, handle for more?
    44. // Create and clone the realtime pipelines for each physical camera.
    45. for (UINT streamIdx = 0; streamIdx < pStreamConfig->num_streams; streamIdx++)
    46. {
    47. //获取输入输出流
    48. camera3_stream_t* pFwkStream = pStreamConfig->streams[streamIdx];
    49. UINT32 cameraIndex = 0;
    50. UINT32 physicalCameraId = InvalidCameraId;
    51. if ((NULL != pFwkStream) &&
    52. (NULL != pFwkStream->physical_camera_id) &&
    53. (0 < CdkUtils::StrLen(pFwkStream->physical_camera_id)))
    54. {
    55. physicalCameraId = static_cast<UINT32>(atoi(pFwkStream->physical_camera_id));
    56. }
    57. if (TRUE == isMultiCamera)
    58. {
    59. for (UINT32 index = 0; index < pCameraInfo->numPhysicalCameras; ++index)
    60. {
    61. if (pCameraInfo->ppDeviceInfo[index]->frameworkId == physicalCameraId)
    62. {
    63. cameraIndex = index;
    64. break;
    65. }
    66. }
    67. }
    68. cameraIdToStreamMap[cameraIndex].push_back(reinterpret_cast<CHISTREAM*>(pFwkStream));
    69. cameraIdToCamera3StreamMap[cameraIndex].push_back(pFwkStream);
    70. m_StreamToCameraIdMap[reinterpret_cast<CHISTREAM*>(pFwkStream)] = physicalCameraId;
    71. CHX_LOG_INFO("camera index %d stream %p camera ID %d", cameraIndex, pFwkStream, physicalCameraId);
    72. // @todo Should return failure if logical stream is present. Add validation check.
    73. }
    74. m_numRTPipelines = cameraIdToStreamMap.size();
    75. auto camera3StreamItr = cameraIdToCamera3StreamMap.begin();
    76. for (UINT index = 0; index < m_numRTPipelines; index++)
    77. {
    78. std::vector<camera3_stream_t*> pCamera3Streams = camera3StreamItr->second;
    79. pStreamConfigPerPipeline->num_streams = pCamera3Streams.size();
    80. pStreamConfigPerPipeline->streams = &pCamera3Streams[0];
    81. pStreamConfigPerPipeline->session_parameters = pStreamConfig->session_parameters;
    82. //ChiUsecase 获取usecase 的数组
    83. m_pChiUsecase[index] = UsecaseSelector::DefaultMatchingUsecase(pStreamConfigPerPipeline, 0);
    84. camera3StreamItr++;
    85. }
    86. //判断是否具有裁剪属性 打印裁剪后的分辨率
    87. camera_metadata_entry_t entry = {};
    88. ChxUtils::QuerySessionParam(pStreamConfig, "ScalerCropRegion", entry);
    89. m_isScalerCropRegionEnabled = FALSE;
    90. if (NULL != entry.data.i32)
    91. {
    92. CHX_LOG_INFO("m_scalerCropRegion set from session param successfully");
    93. m_scalerCropRegion = *(reinterpret_cast<ChiScalerCrop*>(entry.data.i32));
    94. m_isScalerCropRegionEnabled = TRUE;
    95. }
    96. else
    97. {
    98. CHX_LOG_INFO("session param not found: m_scalerCropRegion values will be 0");
    99. }
    100. CHX_LOG_INFO("m_scalerCropRegion {left, top, width, height} = {%d,%d,%d,%d}",
    101. m_scalerCropRegion.left,
    102. m_scalerCropRegion.top,
    103. m_scalerCropRegion.width,
    104. m_scalerCropRegion.height);
    105. m_pChiPipelineRecRequest = static_cast<CHIPIPELINERECURRENTREQUEST*>(
    106. CHX_CALLOC(sizeof(CHIPIPELINERECURRENTREQUEST) * m_numRTPipelines));
    107. m_pChiPipelineRecSetting = static_cast<CHIPIPELINERECURRENTSETTING*>(
    108. CHX_CALLOC(sizeof(CHIPIPELINERECURRENTSETTING) * m_numRTPipelines));
    109. // 3. Create pipeline and assign all pipeline parameters.
    110. // Handling only realtime pipelines for Auto
    111. auto itr = cameraIdToStreamMap.begin();//pStreamConfig->streams
    112. for (UINT index = 0; index < m_numRTPipelines; index++)
    113. {
    114. UINT32 cameraIndex = itr->first;
    115. UINT32 cameraId = pCameraInfo->ppDeviceInfo[cameraIndex]->cameraId;
    116. UINT32 fwkCameraId = pCameraInfo->ppDeviceInfo[cameraIndex]->frameworkId;
    117. m_cameraIdToPipelineIndexMap[fwkCameraId] = index;
    118. std::vector<CHISTREAM*> pChiStreams = itr->second;
    119. UINT32 numStreams = pChiStreams.size();
    120. CHX_LOG_INFO("Creating Pipeline %s index:%d camera Id %d numStreams %d",
    121. m_pChiUsecase[index]->pPipelineTargetCreateDesc[0].pPipelineName, index, cameraId, numStreams);
    122. //UsecaseAuto_pipelines
    123. //AutoOfflineIFE AutoYUVROI Auto AutoYUV
    124. ChiPipelineTargetCreateDescriptor* pPipelineDesc = &m_pChiUsecase[index]->pPipelineTargetCreateDesc[0];
    125. if (NULL != pPipelineDesc)
    126. {
    127. //pSinkTarget={5,UsecaseAuto_AutoOfflineIFE_sink_TargetDescriptors}
    128. ChiTargetPortDescriptorInfo* pSinkTarget = &pPipelineDesc->sinkTarget;
    129. ChiPortBufferDescriptor pipelineOutputBuffer[MaxChiStreams];
    130. ChxUtils::Memset(pipelineOutputBuffer, 0, sizeof(pipelineOutputBuffer));
    131. // Create an output buffer for every stream and its matching target
    132. for (UINT streamIdx = 0; streamIdx < numStreams; streamIdx++)
    133. {
    134. for (UINT sinkIdx = 0; sinkIdx < pSinkTarget->numTargets; sinkIdx++)
    135. { //解析UsecaseAuto_AutoOfflineIFE_sink_TargetDescriptors数组配置
    136. ChiTargetPortDescriptor* pSinkTargetDesc = &pSinkTarget->pTargetPortDesc[sinkIdx];
    137. if (pSinkTargetDesc->pTarget->pChiStream == pChiStreams[streamIdx])
    138. {
    139. //pStream = UsecaseAuto_TARGET_BUFFER_RAW2_target
    140. pipelineOutputBuffer[streamIdx].pStream = pSinkTargetDesc->pTarget->pChiStream;
    141. //pNodePort=s_69_TARGET_BUFFER_RAW2_Link_NodeDescriptors
    142. pipelineOutputBuffer[streamIdx].pNodePort = pSinkTargetDesc->pNodePort;
    143. //numNodePorts=1
    144. pipelineOutputBuffer[streamIdx].numNodePorts = pSinkTargetDesc->numNodePorts;
    145. CHX_LOG_INFO("Creating output buffer for stream: %p, idx: %d, format: %d and matching target idx: %d",
    146. pChiStreams[streamIdx], streamIdx, pChiStreams[streamIdx]->format, sinkIdx);
    147. }
    148. }
    149. }
    150. m_pPipelines[index] = Pipeline::Create(cameraId, PipelineType::Default);
    151. if (NULL != m_pPipelines[index])
    152. {
    153. //初始化pipeline信息
    154. m_pPipelines[index]->SetOutputBuf
    155. //配置node信息 UsecaseAuto_pipelines[0]的pipelineCreateDesc信息
    156. // pipelineCreateDesc={ 0, 3, UsecaseAuto_AutoOfflineIFENodes, 7, UsecaseAuto_AutoOfflineIFELinks, 1, 0, { 0 }, { 0 }}
    157. m_pPipelines[index]->SetPipelineNodePorts(&pPipelineDesc->pipelineCreateDesc);
    158. m_pPipelines[index]->SetPipelineName(pPipelineDesc->pPipelineName);
    159. m_pPipelines[index]->SetPipelineLogicalCameraId(m_logicalCameraId);
    160. m_pPipelines[index]->SetPipelineContext(ChiMultiContextType::DefaultContext);
    161. m_privData[index].streamIndex = index;
    162. m_physFwkCameraIds[index] = std::to_string(fwkCameraId);
    163. m_requiredResultVendorTag.tagIds.insert(
    164. end(m_requiredResultVendorTag.tagIds), begin(m_availableResultTagsOEM), end(m_availableResultTagsOEM));
    165. m_requiredResultVendorTag.tagIds.insert(
    166. end(m_requiredResultVendorTag.tagIds), begin(m_availableResultTags), end(m_availableResultTags));
    167. ChiMetadata* pMetadata = m_pPipelines[index]->GetDescriptorMetadata();
    168. result = pMetadata->SetTag("com.qti.chi.availableResults",
    169. "RequiredResultVendorTags",
    170. &m_requiredResultVendorTag,
    171. sizeof(RequiredResultVendorTags));
    172. if (CDKResultSuccess != result)
    173. {
    174. CHX_LOG_WARN("SetTag failed to setavailableResults");
    175. result = CDKResultSuccess;
    176. }
    177. //初始化pipelineCreateData m_pipelineDescriptor
    178. //解析node支持的模式 配置output buffer的分辨率
    179. result = m_pPipelines[index]->CreateDescriptor();
    180. }
    181. else
    182. {
    183. result = CDKResultEFailed;
    184. CHX_LOG_ERROR("Pipeline creation failed for pipeline with index: %d", index);
    185. }
    186. if (CDKResultSuccess != result)
    187. {
    188. CHX_LOG_ERROR("CreateDescriptor of pipeline %s failed with error %s",
    189. pPipelineDesc->pPipelineName, CdkUtils::CDKResultToString(result));
    190. }
    191. itr++;
    192. }
    193. }
    194. // 4. Create session
    195. if (CDKResultSuccess == result)
    196. {
    197. auto itr = cameraIdToStreamMap.begin();
    198. for (UINT index = 0; index < m_numRTPipelines; index++)
    199. {
    200. UINT32 cameraIndex = itr->first;
    201. UINT32 fwkCameraId = pCameraInfo->ppDeviceInfo[cameraIndex]->frameworkId;
    202. UINT32 pipelineIndex = m_cameraIdToPipelineIndexMap[fwkCameraId];
    203. UINT32 numPipelines = DefaultNumAutoPipeline;
    204. ChiCallBacks callbacks = { 0 };
    205. callbacks.ChiNotify = SessionCbNotifyMessage;
    206. callbacks.ChiProcessCaptureResult = SessionCbCaptureResult;
    207. callbacks.ChiProcessRecurrentCaptureResult = SessionCbRecurrentCaptureResult;
    208. m_RTSessionPvtData.sessionId = index;
    209. m_RTSessionPvtData.pUsecase = this;
    210. //创建session
    211. m_pRTSession[index] = Session::Create(&m_pPipelines[index], numPipelines, &callbacks, &m_RTSessionPvtData);
    212. if (NULL == m_pRTSession[index])
    213. {
    214. result = CDKResultEFailed;
    215. CHX_LOG_ERROR("Session creation failed");
    216. }
    217. m_pipelineIdxToSessionMap[pipelineIndex] = m_pRTSession[index];
    218. CHX_LOG_VERBOSE("Mapping Pipeline idx %d to stream %p", pipelineIndex, m_pRTSession[index]);
    219. itr++;
    220. }
    221. }
    222. }
    223. if (CDKResultSuccess == result)
    224. {
    225. result = AllocateRecurrentRequest();
    226. }
    227. // 5. Register metadata clients.
    228. if (CDKResultSuccess == result)
    229. {
    230. for (UINT index = 0; index < m_numRTPipelines; index++)
    231. {
    232. Pipeline* pPipeline = m_pPipelines[index];
    233. m_metadataClients[index] =
    234. m_pMetadataManager->RegisterClient(
    235. pPipeline->IsRealTime(),
    236. pPipeline->GetTagList(),
    237. pPipeline->GetTagCount(),
    238. pPipeline->GetPartialTagCount(),
    239. pPipeline->GetMetadataBufferCount() + BufferQueueDepth,
    240. ChiMetadataUsage::RealtimeOutput);
    241. CHX_LOG_ERROR("Register Client Id: %d", m_metadataClients[index]);
    242. pPipeline->SetMetadataClientId(m_metadataClients[index]);
    243. }
    244. }
    245. // get extension module instance for pipeline activation
    246. ExtensionModule * pExtensionModuleInstance = ExtensionModule::GetInstance();
    247. if (NULL == pExtensionModuleInstance)
    248. {
    249. result = CDKResultEFailed;
    250. CHX_LOG_ERROR("Extension module is NULL");
    251. }
    252. // 6. Activate the pipelines.
    253. // @todo Add resource manager checks before activating
    254. if (CDKResultSuccess == result)
    255. {
    256. for (UINT index = 0; index < m_numRTPipelines; index++)
    257. {
    258. CHX_LOG_CORE_CFG("ActivatePipeline %s", m_pPipelines[index]->GetPipelineName());
    259. result = pExtensionModuleInstance->ActivatePipeline(m_pRTSession[index]->GetSessionHandle(),
    260. m_pRTSession[index]->GetPipelineHandle(0));
    261. if (CDKResultSuccess == result)
    262. {
    263. m_pPipelines[index]->SetPipelineActivateFlag();
    264. }
    265. else
    266. {
    267. CHX_LOG_ERROR("Activate %s failed! result: %s", m_pPipelines[index]->GetPipelineName(),
    268. CdkUtils::CDKResultToString(result));
    269. break;
    270. }
    271. }
    272. // If any of activate failed, then deactivate all the pipelines and report error.
    273. if (CDKResultSuccess != result)
    274. {
    275. for (UINT index = 0; index < m_numRTPipelines; index++)
    276. {
    277. Pipeline* pPipeline = m_pPipelines[index];
    278. if (TRUE == pPipeline->IsPipelineActive())
    279. {
    280. CHX_LOG_CORE_CFG("DeActivatePipeline %s", pPipeline->GetPipelineName());
    281. result = pExtensionModuleInstance->DeactivatePipeline(m_pRTSession[index]->GetSessionHandle(),
    282. m_pRTSession[index]->GetPipelineHandle(index),
    283. CHIDeactivateModeDefault);
    284. if (CDKResultSuccess == result)
    285. {
    286. pPipeline->SetPipelineDeactivate();
    287. }
    288. else
    289. {
    290. CHX_LOG_ERROR("Deactivate %s failed! result: %s", pPipeline->GetPipelineName(),
    291. CdkUtils::CDKResultToString(result));
    292. }
    293. }
    294. }
    295. }
    296. }
    297. // release local stream configuration
    298. if (NULL != pStreamConfigPerPipeline)
    299. {
    300. CHX_FREE(pStreamConfigPerPipeline);
    301. }
    302. return result;
    303. }

    pipelineCreateDesc ChiPipelineCreateDescriptor 的结构体信息 

    1. /// @brief Structure that contains all information required to create a pipeline
    2. 1127typedef struct ChiPipelineCreateDescriptor
    3. 1128{
    4. 1129 UINT32 size; ///< Size of this structure
    5. 1130 UINT32 numNodes; ///< Number of pipeline nodes
    6. 1131 CHINODE* pNodes; ///< Pipeline nodes
    7. 1132 UINT32 numLinks; ///< Number of links
    8. 1133 CHINODELINK* pLinks; ///< Each link descriptor
    9. 1134 UINT32 isRealTime; ///< Is this a realtime pipeline
    10. 1135 UINT numPipelineModes; ///< Number of pipeline modes (transition modes)
    11. 1136 UINT pipelineModeIds[MaxNumberOfModes]; ///< Array of transition mode ids
    12. 1137 const CHAR* pipelineModeNames[MaxNumberOfModes]; ///< Array of transition mode names
    13. 1138 UINT numBatchedFrames; ///< Number of framework frames batched
    14. 1139 UINT maxFPSValue; ///< maxFPSValue info of batched frames
    15. 1140 UINT32 cameraId; ///< Camera Id of pipeline
    16. 1141 CHIMETAHANDLE hPipelineMetadata; ///< Valid Metadata buffer handle containing tags init tags
    17. 1142 BOOL HALOutputBufferCombined; ///< Is the HAL output buffer combined for batch mode
    18. 1143 UINT32 logicalCameraId;
    19. ///< Logical Camera Id of pipeline
    20. 1144} CHIPIPELINECREATEDESCRIPTOR;
    21. pipelineCreateDesc=
    22. {
    23. 0,
    24. 3,
    25. UsecaseAuto_AutoOfflineIFENodes,
    26. 7,
    27. UsecaseAuto_AutoOfflineIFELinks,
    28. 1,
    29. 0,
    30. { 0 },
    31. { 0 }
    32. }

     Chi node info 结构体信息

    1. /// @brief Chi node info
    2. 1086typedef struct ChiNode
    3. 1087{
    4. 1088 CHINODEPROPERTY* pNodeProperties; ///< Properties associated with the node
    5. 1089 UINT32 nodeId; ///< Node identifier
    6. 1090 UINT32 nodeInstanceId; ///< Node instance identifier
    7. 1091 CHINODEPORTS nodeAllPorts; ///< Information about all ports
    8. 1092 UINT32 numProperties; ///< Count of NodeProperty instances in pNodeProperties
    9. 1093 PruneSettings pruneProperties; ///< A list of prune properties
    10. 1094 UINT32 preferredMode; ///< Preferred mode to be used for sensor initialization
    11. 1095 UINT32 numTransitionModes; ///< Number of transition modes
    12. 1096 UINT32 transitionModeIds[MaxNumberOfModes]; ///< Transition mode Ids
    13. 1097} CHINODE;
    1. static ChiNodeProperty UsecaseAuto_AutoOfflineIFE_node0_0_properties[] =
    2. {
    3. {1, "com.qti.stats.pdlibwrapper"},
    4. };
    5. static ChiNodeProperty UsecaseAuto_AutoOfflineIFE_node65536_1_properties[] =
    6. {
    7. {2, "1"},
    8. {37, "0"},
    9. };
    10. static ChiNodeProperty UsecaseAuto_AutoOfflineIFE_node65636_0_properties[] =
    11. {
    12. {1, "com.qti.hvx.addconstant"},
    13. {6, "1"},
    14. };
    1. static ChiNode UsecaseAuto_AutoOfflineIFENodes[] =
    2. {
    3. {UsecaseAuto_AutoOfflineIFE_node0_0_properties, 0, 0, {0, { 0 }, NULL, 1, { 0 }, UsecaseAuto_AutoOfflineIFENode0_0OutputPortDescriptors}, 1, {0, NULL}, 0, 0, { 0 }},
    4. {UsecaseAuto_AutoOfflineIFE_node65536_1_properties, 65536, 1, {1, { 0 }, UsecaseAuto_AutoOfflineIFENode65536_1InputPortDescriptors, 2, { 0 }, UsecaseAuto_AutoOfflineIFENode65536_1OutputPortDescriptors}, 2, {0, NULL}, 0, 0, { 0 }},
    5. {UsecaseAuto_AutoOfflineIFE_node65636_0_properties, 65636, 0, {1, { 0 }, UsecaseAuto_AutoOfflineIFENode65636_0InputPortDescriptors, 4, { 0 }, UsecaseAuto_AutoOfflineIFENode65636_0OutputPortDescriptors}, 2, {0, NULL}, 0, 0, { 0 }},
    6. };
    1. typedef UINT32 NodeProperty;
    2. static const NodeProperty NodePropertyCustomLib = 1; ///< Custom lib
    3. static const NodeProperty NodePropertyProfileId = 2; ///< IPE/BPS Instance Property Profile
    4. static const NodeProperty NodePropertyStabilizationType = 3; ///< IPE Instance Property Stabilization Type
    5. static const NodeProperty NodePropertyProcessingType = 4; ///< IPE Instance Property Processing Type
    6. static const NodeProperty NodePropertyIPEDownscale = 5; ///< IPE Instance IPE downscale
    7. 139static const NodeProperty NodePropertyStatsSkipPattern = 6;
    8. static const NodeProperty NodePropertyIFECSIDHeight = 7;
    9. static const NodeProperty NodePropertyIFECSIDWidth = 8;
    10. static const NodeProperty NodePropertyIFECSIDLeft = 9;
    11. static const NodeProperty NodePropertyIFECSIDTop = 10;
    12. static const NodeProperty NodePropertyNodeClass = 11; ///< Node class -

    解析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. }

    HDR科普

    https://deepinout.com/hdr/img-sensor-hdr-mode-intro.html

    https://sspai.com/post/62228#!

    https://deepinout.com/hdr/understand-the-various-types-of-hdr.html

  • 相关阅读:
    JavaScript:实现ExponentialSearch指数搜索算法(附完整源码)
    算法拾遗十五补链表相关面试题
    PlacementAlias
    Linux Command htpasswd 创建密码文件
    回收站永久删除了如何恢复正常?
    Nacos
    关于 Kafka 你必须知道的知识点(图文详解)
    gds/网表导入virtuoso注意事项
    cmmi认证是怎么评估的?流程是什么
    MySQL8 Group By 新特性
  • 原文地址:https://blog.csdn.net/wing_7/article/details/132773995