一、重要log关键字: cameraservice::conn //查看api和camera id
camxpipeline.cpp "Topology: Creating Pipeline %s, numNodes %d isSensorInput %d isRealTime %d", //查看pipeline和node数 "Topology::%s Node::%s Type %d numInputPorts %d numOutputPorts %d", "Topology: Pipeline[%s] Link: Node::%s(outPort %d) --> (inPort %d) Node::%s using format %d" ///检查一切pipeline和link node
chxsensorselectmode.cpp "cameraId:%d, Selected Usecase: %d, SelectedMode W=%d, H=%d, FPS:%d, NumBatchedFrames:%d, modeIndex:%d" //检查最终选择usecase(见底部SensorModeSelectUseCase)和sensormode以及modeIndex
CHX_LOG_CONFIG("Session_parameters FPS range %d:%d, previewFPS %d, videoFPS %d " "BatchSize: %u HALOutputBufferCombined %d FPS: %u SkipPattern: %u, " "cameraId = %d selected use case = %d", minSessionFps, maxSessionFps, m_previewFPS, m_videoFPS, m_usecaseNumBatchedFrames, m_HALOutputBufferCombined, m_usecaseMaxFPS, *m_pStatsSkipPattern, logicalCameraId, selectedUsecaseId);
CHX_LOG_CONFIG("MultiCamera usecase selected"); CHX_LOG_CONFIG("ZSL usecase selected"); CHX_LOG_CONFIG("Raw JPEG usecase selected"); CHX_LOG_CONFIG("Default usecase selected");
CHX_LOG_INFO("usecase ID:%d",usecaseId); ///最终选择usecaseId
CHX_LOG("Selected EISv3 usecase"); CHX_LOG("Selected EISv2 usecase"); CHX_LOG_INFO("usecase %s, pipelineName %s",///最终选择usecase pSelectedUsecase->pUsecaseName, pSelectedUsecase->pPipelineTargetCreateDesc->pPipelineName);
二、usecaseId和usecase关键流程: CDKResult ExtensionModule::InitializeOverrideSession( uint32_t logicalCameraId, const camera3_device_t* pCamera3Device, const chi_hal_ops_t* chiHalOps, camera3_stream_configuration_t* pStreamConfig, int* pIsOverrideEnabled, VOID** pPrivate) { selectedUsecaseId = m_pUsecaseSelector->GetMatchingUsecase(...) //选择的usecaseId CHX_LOG_CONFIG("Session_parameters FPS range %d:%d, previewFPS %d, videoFPS %d " "BatchSize: %u HALOutputBufferCombined %d FPS: %u SkipPattern: %u, " &nbp; "cameraId = %d selected use case = %d", minSessionFps, maxSessionFps, m_previewFPS, m_videoFPS, m_usecaseNumBatchedFrames, m_HALOutputBufferCombined, m_usecaseMaxFPS, *m_pStatsSkipPattern, logicalCameraId, selectedUsecaseId);
m_pSelectedUsecase[logicalCameraId] = m_pUsecaseFactory->CreateUsecaseObject(...) //根据usecaseId,创建usecase }
chxusecaseutils.cpp UsecaseId UsecaseSelector::GetMatchingUsecase( const LogicalCameraInfo* pCamInfo, camera3_stream_configuration_t* pStreamConfig, cam_app_type appType) { CHX_LOG_CONFIG("MultiCamera usecase selected"); CHX_LOG_CONFIG("ZSL usecase selected"); CHX_LOG_CONFIG("Raw + JPEG usecase selected"); CHX_LOG_CONFIG("Default usecase selected");
CHX_LOG_INFO("usecase ID:%d",usecaseId); //最终选择的usecaseId }
chxusecaseutils.cpp ChiUsecase* UsecaseSelector::DefaultMatchingUsecase( camera3_stream_configuration_t* pStreamConfig) { CHX_LOG_INFO("Adding prune setting #%u - %s = %s", pruneSettings.numSettings, pGroup, pType); CHX_LOG("Only selecting GPU usecases"); CHX_LOG("UsecaseVideoHFRNo3A is selected for HFR"); CHX_LOG("Selected EISv3 usecase"); CHX_LOG("Selected EISv2 usecase"); CHX_LOG_INFO("usecase %s, pipelineName %s", //最终选择的usecase pSelectedUsecase->pUsecaseName, pSelectedUsecase->pPipelineTargetCreateDesc->pPipelineName); }
chxusecaseutils.cpp Usecase* UsecaseFactory::CreateUsecaseObject( LogicalCameraInfo* pLogicalCameraInfo, ///< camera info UsecaseId usecaseId, ///< Usecase Id camera3_stream_configuration_t* pStreamConfig) ///< Stream config { switch (usecaseId) { case UsecaseId::PreviewZSL: case UsecaseId::VideoLiveShot: pUsecase = AdvancedCameraUsecase::Create(pLogicalCameraInfo, pStreamConfig, usecaseId); break; case UsecaseId::MultiCamera: ... pUsecase = UsecaseDualCamera::Create(pLogicalCameraInfo, pStreamConfig); ... pUsecase = UsecaseMultiCamera::Create(pLogicalCameraInfo, pStreamConfig); .... break; case UsecaseId::Torch: pUsecase = UsecaseTorch::Create(pLogicalCameraInfo, pStreamConfig); break; case UsecaseId::SuperSlowMotionFRC: pUsecase = UsecaseSuperSlowMotionFRC::Create(pLogicalCameraInfo, pStreamConfig); break; ... } }
chxadvancedcamerausecase.cpp AdvancedCameraUsecase* AdvancedCameraUsecase::Create( LogicalCameraInfo* pCameraInfo, camera3_stream_configuration_t* pStreamConfig, UsecaseId usecaseId) { pAdvancedCameraUsecase->Initialize(pCameraInfo, pStreamConfig, usecaseId); }
CDKResult AdvancedCameraUsecase::Initialize( LogicalCameraInfo* pCameraInfo, ///< Camera info camera3_stream_configuration_t* pStreamConfig, ///< Stream configuration UsecaseId usecaseId) ///< Identifier for the usecase function { FeatureSetup(pStreamConfig); SelectUsecaseConfig(pCameraInfo, pStreamConfig); }
CDKResult AdvancedCameraUsecase::SelectUsecaseConfig( LogicalCameraInfo* pCameraInfo, ///< Camera info camera3_stream_configuration_t* pStreamConfig) ///< Stream configuration { if ((UsecaseId::PreviewZSL == m_usecaseId) || (UsecaseId::YUVInBlobOut == m_usecaseId) || (UsecaseId::VideoLiveShot == m_usecaseId) || (UsecaseId::MultiCamera == m_usecaseId) || (UsecaseId::QuadCFA == m_usecaseId) || (UsecaseId::RawJPEG == m_usecaseId)) { ConfigureStream(pCameraInfo, pStreamConfig); BuildUsecase(pCameraInfo, pStreamConfig); } else { m_pChiUsecase = UsecaseSelector::DefaultMatchingUsecase(pStreamConfig); } }
AdvancedCameraUsecase::ConfigureStream(..) { AdvancedCameraUsecase::ConfigFdStream() //在640x480的基础上进行裁剪, // 4:3 -> 640x480 // 16:9 -> 640x360 // 1:1 -> 480x480 // 20:9 -> 640x288 (全屏2400x1080,20:9) }
/// @brief Usecase identifying enums
enum class UsecaseId { NoMatch = 0, Default = 1, Preview = 2, PreviewZSL = 3, MFNR = 4, MFSR = 5, MultiCamera = 6, QuadCFA = 7, RawJPEG = 8, MultiCameraVR = 9, Torch = 10, YUVInBlobOut = 11, VideoLiveShot = 12, SuperSlowMotionFRC = 13, VivoReprocess = 14, MaxUsecases = 15, };
/// @brief This enumerates usecases for sensor select mode enum SensorModeSelectUseCase { UsecaseFastAEC = 0, ///< Fast AEC UsecaseQuadra, ///< Quadra UsecaseHFR, ///< High frame rate //2 UsecaseIHDR, ///< Interlaced HDR UsecaseRHDR, ///< RHDR //4 UsecaseVHDR, ///< Video HDR UsecaseSnapshot, ///< Snapshot //6 UsecaseVideoPreview, ///< Video preview //7 UsecaseFS, ///< Fast shutter UsecaseRTBO, ///< RTB //9 UsecaseFD, ///< FD //10 UsecaseVideo8K, ///< Video8K UsecaseVideo, ///< Video UsecaseUNBINNING, ///Remosaic ROI UsecaseVideoSurperEis, ///< VideoSurperEis MaxModeSelectUsecase ///< Max };