一、重要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, "
"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
};