blob: be227f8218a4f1d8b9c7022d08d82d7fe91ed0fb [file] [log] [blame]
/*
* Copyright (C) 2019 MediaTek Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define LOG_TAG "mtkcam-ConfigSettingPolicyMediator"
#include <memory>
#include <mtkcam/pipeline/policy/IConfigSettingPolicyMediator.h>
#include <mtkcam/pipeline/policy/InterfaceTableDef.h>
#include "MyUtils.h"
/******************************************************************************
*
******************************************************************************/
/******************************************************************************
*
******************************************************************************/
class ConfigSettingPolicyMediator_Default
: public NSCam::v3::pipeline::policy::pipelinesetting::
IConfigSettingPolicyMediator {
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Data Members.
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
protected: //// Static data (unchangable)
std::shared_ptr<NSCam::v3::pipeline::policy::PipelineStaticInfo const>
mPipelineStaticInfo;
std::shared_ptr<NSCam::v3::pipeline::policy::PipelineUserConfiguration const>
mPipelineUserConfiguration;
std::shared_ptr<
NSCam::v3::pipeline::policy::pipelinesetting::PolicyTable const>
mPolicyTable;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Operations.
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
public: //// Instantiation.
explicit ConfigSettingPolicyMediator_Default(
NSCam::v3::pipeline::policy::pipelinesetting::
MediatorCreationParams const& params);
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// IConfigSettingPolicyMediator Interfaces.
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
public: //// Interfaces.
auto evaluateConfiguration(
NSCam::v3::pipeline::policy::pipelinesetting::ConfigurationOutputParams*
out,
NSCam::v3::pipeline::policy::pipelinesetting::
ConfigurationInputParams const& in) -> int override;
};
/******************************************************************************
*
******************************************************************************/
std::shared_ptr<
NSCam::v3::pipeline::policy::pipelinesetting::IConfigSettingPolicyMediator>
makeConfigSettingPolicyMediator_Default(
NSCam::v3::pipeline::policy::pipelinesetting::MediatorCreationParams const&
params) {
return std::make_shared<ConfigSettingPolicyMediator_Default>(params);
}
/******************************************************************************
*
******************************************************************************/
ConfigSettingPolicyMediator_Default::ConfigSettingPolicyMediator_Default(
NSCam::v3::pipeline::policy::pipelinesetting::MediatorCreationParams const&
params)
: IConfigSettingPolicyMediator(),
mPipelineStaticInfo(params.pPipelineStaticInfo),
mPipelineUserConfiguration(params.pPipelineUserConfiguration),
mPolicyTable(params.pPolicyTable) {}
/******************************************************************************
*
******************************************************************************/
auto ConfigSettingPolicyMediator_Default::evaluateConfiguration(
NSCam::v3::pipeline::policy::pipelinesetting::ConfigurationOutputParams*
out,
NSCam::v3::pipeline::policy::pipelinesetting::
ConfigurationInputParams const& in __unused) -> int {
//---------------------------------
// 1st level
NSCam::v3::pipeline::policy::featuresetting::ConfigurationInputParams
featureIn;
NSCam::v3::pipeline::policy::featuresetting::ConfigurationOutputParams
featureOut;
featureIn.pSessionParams =
&mPipelineUserConfiguration->pParsedAppConfiguration->sessionParams;
// check zsl enable tag in config stage
MUINT8 bConfigEnableZsl = MFALSE;
if (NSCam::IMetadata::getEntry<MUINT8>(featureIn.pSessionParams,
MTK_CONTROL_ENABLE_ZSL,
&bConfigEnableZsl)) {
MY_LOGD("Get ZSL enable in config meta (%d) : %d", MTK_CONTROL_ENABLE_ZSL,
bConfigEnableZsl);
}
featureIn.isZslMode = (bConfigEnableZsl) ? true : false;
// VR mode do not to enable ZSL
if (mPipelineUserConfiguration->pParsedAppImageStreamInfo->hasVideoConsumer) {
MY_LOGD("Force to disable ZSL in VR");
featureIn.isZslMode = false;
}
if ((mPipelineUserConfiguration->pParsedAppImageStreamInfo
->pAppImage_Input_Yuv) ||
(mPipelineUserConfiguration->pParsedAppImageStreamInfo
->pAppImage_Output_Priv) ||
(mPipelineUserConfiguration->pParsedAppImageStreamInfo
->pAppImage_Input_Priv)) {
MY_LOGD("Force to disable ZSL in reprocessing mode");
featureIn.isZslMode = false;
}
RETURN_IF_ERROR(mPolicyTable->mFeaturePolicy->evaluateConfiguration(
&featureOut, &featureIn),
"mFeaturePolicy->evaluateConfiguration");
*(out->pStreamingFeatureSetting) = featureOut.StreamingParams;
*(out->pCaptureFeatureSetting) = featureOut.CaptureParams;
if (out->pIsZSLMode != nullptr) {
*(out->pIsZSLMode) = featureIn.isZslMode;
}
RETURN_IF_ERROR(
mPolicyTable->fConfigPipelineNodesNeed(
NSCam::v3::pipeline::policy::Configuration_PipelineNodesNeed_Params{
.pOut = out->pPipelineNodesNeed,
.pPipelineStaticInfo = mPipelineStaticInfo.get(),
.pPipelineUserConfiguration = mPipelineUserConfiguration.get()}),
"fConfigPipelineNodesNeed");
//---------------------------------
// 2nd level
if (!in.bypassSensorSetting) {
RETURN_IF_ERROR(
mPolicyTable->fSensorSetting(
out->pSensorSetting, out->pStreamingFeatureSetting,
mPipelineStaticInfo.get(), mPipelineUserConfiguration.get()),
"fSensorSetting");
}
//---------------------------------
// 3rd level
RETURN_IF_ERROR(
mPolicyTable->fConfigP1HwSetting(
out->pP1HwSetting, out->pSensorSetting, out->pStreamingFeatureSetting,
out->pPipelineNodesNeed, mPipelineStaticInfo.get(),
mPipelineUserConfiguration.get()),
"fConfigP1HwSetting");
RETURN_IF_ERROR(
mPolicyTable->fConfigP1DmaNeed(
out->pP1DmaNeed, out->pP1HwSetting, out->pStreamingFeatureSetting,
mPipelineStaticInfo.get(), mPipelineUserConfiguration.get()),
"fConfigP1DmaNeed");
RETURN_IF_ERROR(
mPolicyTable->fConfigStreamInfo_P1(
NSCam::v3::pipeline::policy::Configuration_StreamInfo_P1_Params{
.pvOut = out->pParsedStreamInfo_P1,
.pvP1HwSetting = out->pP1HwSetting,
.pvP1DmaNeed = out->pP1DmaNeed,
.pPipelineNodesNeed = out->pPipelineNodesNeed,
.pCaptureFeatureSetting = out->pCaptureFeatureSetting,
.pPipelineStaticInfo = mPipelineStaticInfo.get(),
.pPipelineUserConfiguration = mPipelineUserConfiguration.get()}),
"fConfigStreamInfo_P1");
//---------------------------------
// 4th level
RETURN_IF_ERROR(
mPolicyTable->fConfigStreamInfo_NonP1(
NSCam::v3::pipeline::policy::Configuration_StreamInfo_NonP1_Params{
.pOut = out->pParsedStreamInfo_NonP1,
.pPipelineNodesNeed = out->pPipelineNodesNeed,
.pCaptureFeatureSetting = out->pCaptureFeatureSetting,
.pPipelineStaticInfo = mPipelineStaticInfo.get(),
.pPipelineUserConfiguration = mPipelineUserConfiguration.get()}),
"fConfigStreamInfo_NonP1");
return NSCam::OK;
}