(1)决定Scenario的源码
Sensor Scenario是根据App下的Config参数中的image size决定的Scenario。
代码如下:
//vendor/mediatek/proprietary/hardware/mtkcam3/pipeline/policy/config/SensorSettingPolicy.cpp
enum eMode
{
eNORMAL_PREVIEW = 0,
eNORMAL_VIDEO,
eNORMAL_CAPTURE,
eSLIM_VIDEO1,
eSLIM_VIDEO2,
eCUSTOM1,
eCUSTOM2,
eCUSTOM3,
eCUSTOM4,
eCUSTOM5,
eCUSTOM6,
eCUSTOM7,
eCUSTOM8,
eCUSTOM9,
eCUSTOM10,
eCUSTOM11,
eCUSTOM12,
eCUSTOM13,
eCUSTOM14,
eCUSTOM15,
eNUM_SENSOR_MODE,
};
enum
{
SENSOR_SCENARIO_ID_NORMAL_PREVIEW,
SENSOR_SCENARIO_ID_NORMAL_CAPTURE,
SENSOR_SCENARIO_ID_NORMAL_VIDEO,
SENSOR_SCENARIO_ID_SLIM_VIDEO1,
SENSOR_SCENARIO_ID_SLIM_VIDEO2,
SENSOR_SCENARIO_ID_CUSTOM1,
SENSOR_SCENARIO_ID_CUSTOM2,
SENSOR_SCENARIO_ID_CUSTOM3,
SENSOR_SCENARIO_ID_CUSTOM4,
SENSOR_SCENARIO_ID_CUSTOM5,
/**************************************************************************
* All unnamed scenario id for a specific sensor must be started with
* values >= SENSOR_SCENARIO_ID_UNNAMED_START.
**************************************************************************/
SENSOR_SCENARIO_ID_UNNAMED_START = 0x100,
};
FunctionType_Configuration_SensorSettingPolicy makePolicy_Configuration_SensorSetting_Default()
{
//...
// 3. default rules policy:
// find the smallest size that is "larger" than max of stream size
// (not the smallest difference)
CHECK_ERROR( determineScenDefault(res, pStatic, pParsedAppImageInfo, false) );
//...
{
MINT32 forceSensorMode = ::property_get_int32("vendor.debug.cameng.force_sensormode", -1);
if( forceSensorMode != -1 )
{
switch( forceSensorMode )
{
case SENSOR_SCENARIO_ID_NORMAL_PREVIEW:
res = pStatic->mSetting[eNORMAL_PREVIEW];
break;
case SENSOR_SCENARIO_ID_NORMAL_CAPTURE:
res = pStatic->mSetting[eNORMAL_CAPTURE];
break;
case SENSOR_SCENARIO_ID_NORMAL_VIDEO:
res = pStatic->mSetting[eNORMAL_VIDEO];
break;
case SENSOR_SCENARIO_ID_SLIM_VIDEO1:
res = pStatic->mSetting[eSLIM_VIDEO1];
break;
case SENSOR_SCENARIO_ID_SLIM_VIDEO2:
res = pStatic->mSetting[eSLIM_VIDEO2];
break;
case SENSOR_SCENARIO_ID_CUSTOM1:
res = pStatic->mSetting[eCUSTOM1];
break;
case SENSOR_SCENARIO_ID_CUSTOM2:
res = pStatic->mSetting[eCUSTOM2];
break;
case SENSOR_SCENARIO_ID_CUSTOM3:
res = pStatic->mSetting[eCUSTOM3];
break;
case SENSOR_SCENARIO_ID_CUSTOM4:
res = pStatic->mSetting[eCUSTOM4];
break;
case SENSOR_SCENARIO_ID_CUSTOM5:
res = pStatic->mSetting[eCUSTOM5];
break;
case SENSOR_SCENARIO_ID_CUSTOM6:
res = pStatic->mSetting[eCUSTOM6];
break;
case SENSOR_SCENARIO_ID_CUSTOM7:
res = pStatic->mSetting[eCUSTOM7];
break;
case SENSOR_SCENARIO_ID_CUSTOM8:
res = pStatic->mSetting[eCUSTOM8];
break;
case SENSOR_SCENARIO_ID_CUSTOM9:
res = pStatic->mSetting[eCUSTOM9];
break;
case SENSOR_SCENARIO_ID_CUSTOM10:
res = pStatic->mSetting[eCUSTOM10];
break;
case SENSOR_SCENARIO_ID_CUSTOM11:
res = pStatic->mSetting[eCUSTOM11];
break;
case SENSOR_SCENARIO_ID_CUSTOM12:
res = pStatic->mSetting[eCUSTOM12];
break;
case SENSOR_SCENARIO_ID_CUSTOM13:
res = pStatic->mSetting[eCUSTOM13];
break;
case SENSOR_SCENARIO_ID_CUSTOM14:
res = pStatic->mSetting[eCUSTOM14];
break;
case SENSOR_SCENARIO_ID_CUSTOM15:
res = pStatic->mSetting[eCUSTOM15];
break;
default:
MY_LOGW("Unknown sensorMode: %d", forceSensorMode);
break;
}
CAM_ULOGMI("Force set sensorMode: %d. Selected sensorMode: %d", forceSensorMode, res.sensorMode);
}
}
CAM_ULOGMI("select size(%4dx%-4d)@%-3d sensorMode:%d hdrSensorMode:%d hdrHalMode:%d, hfpsMode:%d",
res.sensorSize.w, res.sensorSize.h, res.sensorFps,
res.sensorMode,
pStreamingFeatureSetting->p1ConfigParam.at(sensorId).hdrSensorMode, pStreamingFeatureSetting->p1ConfigParam.at(sensorId).hdrHalMode, streamHfpsMode);
(*pvOut).emplace(sensorId, res);
}
return OK;
};
}
static auto
determineScenDefault(
SensorSetting& res,
std::shared_ptr<SensorParams>& pParams,
std::shared_ptr<ParsedAppImageStreamInfo> const& pParsedAppImageInfo,
bool isVideo
) -> int
{
bool hit = false;
for ( int i=0; i<eNUM_SENSOR_MODE; ++i ) {
auto const& mode = static_cast<eMode>(i);
auto const& size = pParams->mSetting[ pParams->mAltMode[mode] ].sensorSize;
MY_LOGI("dxf_determineScenDefault Image.w = %d , Image.h = %d , size.w = %d , size.h = %d , mode = %d",pParsedAppImageInfo->maxImageSize.w,pParsedAppImageInfo->maxImageSize.h,size.w,size.h,mode);
if ( !isVideo
&& ( mode == eNORMAL_VIDEO
|| mode == eSLIM_VIDEO1
|| mode == eSLIM_VIDEO2 ) )
{
MY_LOGI("skip video related mode since it didn't have full capbility");
continue;
}
//通过判断Image Size与Sensor Size来决定Sensor Mode
if ( pParsedAppImageInfo->maxImageSize.w <= size.w &&
pParsedAppImageInfo->maxImageSize.h <= size.h )
{
res = pParams->mSetting[ pParams->mAltMode[mode] ];
hit = true;
break;
}
}
if ( !hit ) {
// pick largest one
MY_LOGW("select capture mode");
res = pParams->mSetting[eNORMAL_CAPTURE];
}
return OK;
}
(2)Log分析
04-07 01:16:25.919811 987 987 I mtkcam-SensorSettingPolicy: [parseSensorParamsSetting] candidate [0] (1632x1224)@30 sensorMode:0(PREVIEW)
04-07 01:16:25.919832 987 987 I mtkcam-SensorSettingPolicy: [parseSensorParamsSetting] candidate [1] (3264x2448)@30 sensorMode:2(VIDEO)
04-07 01:16:25.919850 987 987 I mtkcam-SensorSettingPolicy: [parseSensorParamsSetting] candidate [2] (3264x2448)@30 sensorMode:1(CAPTURE)
04-07 01:16:25.919865 987 987 I mtkcam-SensorSettingPolicy: [parseSensorParamsSetting] candidate [3] (1632x1224)@30 sensorMode:3(SLIM_VIDEO1)
04-07 01:16:25.919878 987 987 I mtkcam-SensorSettingPolicy: [parseSensorParamsSetting] candidate [4] (1632x1224)@30 sensorMode:4(SLIM_VIDEO2)
04-07 01:16:25.919893 987 987 I mtkcam-SensorSettingPolicy: [parseSensorParamsSetting] candidate [5] ( 0x0 )@0 sensorMode:5(CUSTOM1)
04-07 01:16:25.919907 987 987 I mtkcam-SensorSettingPolicy: [parseSensorParamsSetting] candidate [6] ( 0x0 )@0 sensorMode:6(CUSTOM2)
04-07 01:16:25.919919 987 987 I mtkcam-SensorSettingPolicy: [parseSensorParamsSetting] candidate [7] ( 0x0 )@0 sensorMode:7(CUSTOM3)
04-07 01:16:25.919931 987 987 I mtkcam-SensorSettingPolicy: [parseSensorParamsSetting] candidate [8] ( 0x0 )@0 sensorMode:8(CUSTOM4)
04-07 01:16:25.919945 987 987 I mtkcam-SensorSettingPolicy: [parseSensorParamsSetting] candidate [9] ( 0x0 )@0 sensorMode:9(CUSTOM5)
04-07 01:16:25.919957 987 987 I mtkcam-SensorSettingPolicy: [parseSensorParamsSetting] candidate [10] ( 0x0 )@0 sensorMode:10(CUSTOM6)
04-07 01:16:25.919972 987 987 I mtkcam-SensorSettingPolicy: [parseSensorParamsSetting] candidate [11] ( 0x0 )@0 sensorMode:11(CUSTOM7)
04-07 01:16:25.919985 987 987 I mtkcam-SensorSettingPolicy: [parseSensorParamsSetting] candidate [12] ( 0x0 )@0 sensorMode:12(CUSTOM8)
04-07 01:16:25.919999 987 987 I mtkcam-SensorSettingPolicy: [parseSensorParamsSetting] candidate [13] ( 0x0 )@0 sensorMode:13(CUSTOM9)
04-07 01:16:25.920011 987 987 I mtkcam-SensorSettingPolicy: [parseSensorParamsSetting] candidate [14] ( 0x0 )@0 sensorMode:14(CUSTOM10)
04-07 01:16:25.920023 987 987 I mtkcam-SensorSettingPolicy: [parseSensorParamsSetting] candidate [15] ( 0x0 )@0 sensorMode:15(CUSTOM11)
04-07 01:16:25.920036 987 987 I mtkcam-SensorSettingPolicy: [parseSensorParamsSetting] candidate [16] ( 0x0 )@0 sensorMode:16(CUSTOM12)
04-07 01:16:25.920048 987 987 I mtkcam-SensorSettingPolicy: [parseSensorParamsSetting] candidate [17] ( 0x0 )@0 sensorMode:17(CUSTOM13)
04-07 01:16:25.920061 987 987 I mtkcam-SensorSettingPolicy: [parseSensorParamsSetting] candidate [18] ( 0x0 )@0 sensorMode:18(CUSTOM14)
04-07 01:16:25.920074 987 987 I mtkcam-SensorSettingPolicy: [parseSensorParamsSetting] candidate [19] ( 0x0 )@0 sensorMode:19(CUSTOM15)
//Image.w和Image.h为最大配置的Picture Size,size.w和size.h为sensor的pre/cap/video mode配置的grabwindow_width和grabwindow_height
04-07 01:16:25.920378 987 987 I mtkcam-SensorSettingPolicy: [determineScenDefault] dxf_determineScenDefault Image.w = 3264 , Image.h = 2448 , size.w = 3264 , size.h = 2448 , mode = 2
04-07 01:16:25.920395 987 987 I mtkcam-SensorSettingPolicy: select size(3264x2448)@30 sensorMode:1 hdrSensorMode:0 hdrHalMode:0, hfpsMode:0
04-07 01:16:25.920424 987 987 D mtkcam-ConfigSettingPolicyMediator: [evaluateConfiguration] Configuring fConfigP1HwSetting
04-07 01:16:25.920446 987 987 W mtkcam-P1HwSettingPolicy: [evaluateDeviceRawBitDepth] By default bitdepth:10
04-07 01:16:25.920489 987 987 D mtkcam-P1HwSettingPolicy: [configP1HwSetting] max_rrzo_size: target size(6144x4608)
04-07 01:16:25.920514 987 987 D mtkcam-P1HwSettingPolicy: [configP1HwSetting] sensor size: target size(3264x2448)
04-07 01:16:25.920526 987 987 D mtkcam-P1HwSettingPolicy: [configP1HwSetting] target rrzo stream: target size(1440x1080)
04-07 01:16:25.920537 987 987 D mtkcam-P1HwSettingPolicy: [configP1HwSetting] eis lower bound limitation: target size(1440x1080)
04-07 01:16:25.920549 987 987 D mtkcam-P1HwSettingPolicy: [configP1HwSetting] preview upper bound limitation: target size(1440x1080)
04-07 01:16:25.920559 987 987 D mtkcam-P1HwSettingPolicy: [configP1HwSetting] rrzo size(1440x1080)
04-07 01:16:25.920569 987 987 D mtkcam-P1HwSettingPolicy: [configP1HwSetting] sensor size upper bound limitation: target size(1440x1088)
04-07 01:16:25.920580 987 987 D mtkcam-P1HwSettingPolicy: aligned rrzo size(1440x1088)
//kernel log
<4>[46737.150910] (7)[20254:camerahalserver]gc08a3_camera_sensor[control] scenario_id = 1
<4>[46737.174331] (2)[20254:camerahalserver]gc08a3_camera_sensor[get_default_framerate_by_scenario] scenario_id = 1
(3)问题
问:发现预览走某一个Scenario后,拍照并不会重新设定Scenario,这是符合原本设计吗?
答:
符合原本设计,从log中看,拍照帧走的是zsl(零快拍)模式,所以不会在拍照时切换Scenario(sensor mode)
04-07 01:18:34.487293 987 1156 I mtkcam-PipelineModelSession: [submitRequest] <Default/0> requestNo:71 { repeating:0 control.aeTargetFpsRange:5,30 control.captureIntent:2 control.enableZsl:1 control.processRawEn:0 control.mode:1 control.sceneMode:0 control.videoStabilizationMode:0 edge.mode:2 }
04-07 01:18:34.503388 987 1156 D mtkcam-PipelineModelSessionDefault: [onProcessEvaluatedFrame] [requestNo:71] submit Zsl Request