MTK平台如何决定SensorMode

本文详细解析了Android系统中SensorScenario的配置逻辑,主要关注代码`SensorSettingPolicy`如何根据App配置和系统参数决定Sensor的工作模式。通过Log分析,可以看到预览和拍照时SensorMode的选择过程,预览采用特定Scenario,而拍照则维持在同一Scenario下,这符合系统设计以优化性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪舞飞影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值