/**
 * Copyright (c) 2025 Huawei Technologies Co., Ltd.
 * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
 * CANN Open Software License Agreement Version 2.0 (the "License").
 * Please refer to the License for details. You may not use this file except in compliance with the License.
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
 * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
 * See LICENSE in the root of the software repository for the full text of the License.
 */

#include <map>
#include "acl/acl_mdl.h"
#include "common/dynamic_aipp.h"
#include "model_desc_internal.h"
#include "common/log_inner.h"
#include "utils/math_utils.h"
#include "model/acl_model_impl_om2.h"
#include "model_common.h"

namespace acl {
struct Fp16Type {
 public:
  Fp16Type(void) : val_(0x0U) {}

  explicit Fp16Type(const float32_t fVal) : val_(0x0U) {
    this->operator=(fVal);
  }

  ~Fp16Type() = default;

  Fp16Type &operator=(const float32_t fVal) {
    uint16_t sRet;
    uint16_t mRet;
    int16_t eRet;
    uint32_t eF;
    uint32_t mF;

    const void *const pV = static_cast<const void *>(&fVal);
    const uint32_t ui32V = *(static_cast<const uint32_t *>(pV));
    uint32_t mLenDelta;

    sRet = static_cast<uint16_t>((ui32V & acl::FP32_SIGN_MASK) >> acl::FP32_SIGN_INDEX);
    eF = (ui32V & acl::FP32_EXP_MASK) >> acl::FP32_MAN_LEN;
    mF = (ui32V & acl::FP32_MAN_MASK);
    mLenDelta = acl::FP32_MAN_LEN - acl::FP16_MAN_LEN;

    bool needRound = false;
    if (eF > 0x8FU) {
      eRet = acl::FP16_MAX_EXP - 1;
      mRet = static_cast<uint16_t>(acl::FP16_MAX_MAN);
    }

    if (eF <= 0x70U) {
      eRet = 0;
      if (eF >= 0x67U) {
        mF = (mF | acl::FP32_MAN_HIDE_BIT);
        constexpr uint16_t shiftOut = static_cast<uint16_t>(acl::FP32_MAN_LEN);
        const uint64_t m_tmp = (static_cast<uint64_t>(mF)) << (eF - 0x67U);
        needRound = acl::IsRoundOne(m_tmp, shiftOut);
        mRet = static_cast<uint16_t>(m_tmp >> static_cast<uint64_t>(shiftOut));
        if (needRound) {
          mRet++;
        }
      } else if ((eF == 0x66U) && (mF > 0U)) {
        mRet = 1U;
      } else {
        mRet = 0U;
      }
    }

    if ((eF <= 0x8FU) && (eF > 0x70U)) {
      eRet = static_cast<int16_t>(eF - 0x70U);
      needRound = acl::IsRoundOne(static_cast<uint64_t>(mF), static_cast<uint16_t>(mLenDelta));
      mRet = static_cast<uint16_t>(mF >> mLenDelta);
      if (needRound) {
        mRet++;
      }
      if ((mRet & static_cast<uint16_t>(acl::FP16_MAN_HIDE_BIT)) != 0) {
        eRet++;
      }
    }
    acl::Fp16Normalize(eRet, mRet);
    val_ = static_cast<uint16_t>(((sRet) << static_cast<uint16_t>(acl::FP16_SIGN_INDEX)) |
                                 ((static_cast<uint16_t>(eRet)) << acl::FP16_MAN_LEN) |
                                 ((mRet) & static_cast<uint16_t>(acl::FP16_MAX_MAN)));
    return *this;
  }

  uint16_t GetVal() const {
    return val_;
  }

 private:
  uint16_t val_;
};
}  // namespace acl

aclmdlAIPP *aclmdlCreateAIPPImplOm2(uint64_t batchSize) {
  aclmdlAIPP *aippParmsSet = nullptr;
  try {
    ACL_LOG_INFO("start to execute aclmdlCreateAIPP, batchSize[%lu]", batchSize);
    if (batchSize == 0U) {
      ACL_LOG_INNER_ERROR("[Check][BatchSize]the batchSize can't be zero");
      return nullptr;
    }
    aippParmsSet = new (std::nothrow) aclmdlAIPP();
    if (aippParmsSet == nullptr) {
      ACL_LOG_INNER_ERROR("[Check][ParmsSet]new aclmdlAIPP fail");
      return nullptr;
    }

    aippParmsSet->batchSize = batchSize;
    aippParmsSet->aippParms.batchNum = static_cast<int8_t>(batchSize);
    aippParmsSet->aippBatchPara.resize(batchSize);
    ACL_LOG_INFO("the size of aippBatchPara is [%zu]", aippParmsSet->aippBatchPara.size());
    for (uint64_t i = 0U; i < batchSize; i++) {
      aippParmsSet->aippBatchPara[i].dtcPixelVarReciChn0 = acl::Fp16Type(1.0F).GetVal();
      aippParmsSet->aippBatchPara[i].dtcPixelVarReciChn1 = acl::Fp16Type(1.0F).GetVal();
      aippParmsSet->aippBatchPara[i].dtcPixelVarReciChn2 = acl::Fp16Type(1.0F).GetVal();
      aippParmsSet->aippBatchPara[i].dtcPixelVarReciChn3 = acl::Fp16Type(1.0F).GetVal();
    }
    return aippParmsSet;
  } catch (std::bad_alloc &) {
    ACL_LOG_INNER_ERROR("[Create][AIPP]aclmdlCreateAIPP fail, bad memory allocation, batchSize[%lu]", batchSize);
  } catch (std::length_error &) {
    ACL_LOG_INNER_ERROR("[Create][AIPP]aclmdlCreateAIPP fail with length error, batchSize[%lu]", batchSize);
  }

  ACL_DELETE(aippParmsSet);
  return nullptr;
}

aclError aclmdlDestroyAIPPImplOm2(const aclmdlAIPP *aippParmsSet) {
  ACL_LOG_INFO("start to execute aclmdlDestroyAIPP.");
  ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(aippParmsSet);
  ACL_DELETE_AND_SET_NULL(aippParmsSet);
  return ACL_SUCCESS;
}

aclError aclmdlGetAippDataSizeImplOm2(uint64_t batchSize, size_t *size) {
  ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(size);
  ACL_REQUIRES_POSITIVE_WITH_INPUT_REPORT(batchSize);
  ACL_LOG_INFO("start to execute aclmdlGetAippDataSize, batchSize is %lu", batchSize);
  constexpr size_t realAippParamSize = sizeof(kAippDynamicPara) - sizeof(kAippDynamicBatchPara);
  size_t retTmp = 0U;
  ACL_CHECK_ASSIGN_SIZET_MULTI(batchSize, sizeof(kAippDynamicBatchPara), retTmp);
  ACL_CHECK_ASSIGN_SIZET_ADD(retTmp, realAippParamSize, *size);
  ACL_LOG_INFO("end to execute aclmdlGetAippDataSize, batchSize is %lu, size is %zu", batchSize, *size);
  return ACL_SUCCESS;
}

aclError aclmdlSetAIPPInputFormatImplOm2(aclmdlAIPP *aippParmsSet, aclAippInputFormat inputFormat) {
  ACL_LOG_INFO("start to execute aclmdlSetAIPPInputFormat");
  ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(aippParmsSet);
  const std::map<aclAippInputFormat, acl::CceAippInputFormat> inputFormatMap = {
      {ACL_YUV420SP_U8, acl::CCE_YUV420SP_U8},
      {ACL_XRGB8888_U8, acl::CCE_XRGB8888_U8},
      {ACL_RGB888_U8, acl::CCE_RGB888_U8},
      {ACL_YUV400_U8, acl::CCE_YUV400_U8},
      {ACL_NC1HWC0DI_FP16, acl::CCE_NC1HWC0DI_FP16},
      {ACL_NC1HWC0DI_S8, acl::CCE_NC1HWC0DI_S8},
      {ACL_ARGB8888_U8, acl::CCE_ARGB8888_U8},
      {ACL_YUYV_U8, acl::CCE_YUYV_U8},
      {ACL_YUV422SP_U8, acl::CCE_YUV422SP_U8},
      {ACL_AYUV444_U8, acl::CCE_AYUV444_U8},
      {ACL_RAW10, acl::CCE_RAW10},
      {ACL_RAW12, acl::CCE_RAW12},
      {ACL_RAW16, acl::CCE_RAW16},
      {ACL_RAW24, acl::CCE_RAW24}};

  auto it = inputFormatMap.find(inputFormat);
  if (it == inputFormatMap.end()) {
    ACL_LOG_INNER_ERROR("[Unsupported][Format]unsupported inputFormat[%d]", static_cast<int32_t>(inputFormat));
    return ACL_ERROR_INVALID_PARAM;
  }

  aippParmsSet->aippParms.inputFormat = static_cast<uint8_t>(it->second);
  return ACL_SUCCESS;
}

aclError aclmdlSetAIPPCscParamsImplOm2(aclmdlAIPP *aippParmsSet, int8_t cscSwitch, int16_t cscMatrixR0C0,
                                       int16_t cscMatrixR0C1, int16_t cscMatrixR0C2, int16_t cscMatrixR1C0,
                                       int16_t cscMatrixR1C1, int16_t cscMatrixR1C2, int16_t cscMatrixR2C0,
                                       int16_t cscMatrixR2C1, int16_t cscMatrixR2C2, uint8_t cscOutputBiasR0,
                                       uint8_t cscOutputBiasR1, uint8_t cscOutputBiasR2, uint8_t cscInputBiasR0,
                                       uint8_t cscInputBiasR1, uint8_t cscInputBiasR2) {
  ACL_LOG_INFO("start to execute aclmdlSetAIPPCscParams");
  ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(aippParmsSet);
  ACL_CHECK_RANGE_INT(cscSwitch, acl::AIPP_SWITCH_OFF, acl::AIPP_SWITCH_ON);
  aippParmsSet->aippParms.cscSwitch = cscSwitch;
  if (cscSwitch == 0) {
    ACL_LOG_INFO("cscSwitch[%d] is off", static_cast<int32_t>(cscSwitch));
    return ACL_SUCCESS;
  }
  ACL_CHECK_RANGE_INT(cscMatrixR0C0, acl::CSC_MATRIX_MIN, acl::CSC_MATRIX_MAX);
  ACL_CHECK_RANGE_INT(cscMatrixR0C1, acl::CSC_MATRIX_MIN, acl::CSC_MATRIX_MAX);
  ACL_CHECK_RANGE_INT(cscMatrixR0C2, acl::CSC_MATRIX_MIN, acl::CSC_MATRIX_MAX);

  ACL_CHECK_RANGE_INT(cscMatrixR1C0, acl::CSC_MATRIX_MIN, acl::CSC_MATRIX_MAX);
  ACL_CHECK_RANGE_INT(cscMatrixR1C1, acl::CSC_MATRIX_MIN, acl::CSC_MATRIX_MAX);
  ACL_CHECK_RANGE_INT(cscMatrixR1C2, acl::CSC_MATRIX_MIN, acl::CSC_MATRIX_MAX);

  ACL_CHECK_RANGE_INT(cscMatrixR2C0, acl::CSC_MATRIX_MIN, acl::CSC_MATRIX_MAX);
  ACL_CHECK_RANGE_INT(cscMatrixR2C1, acl::CSC_MATRIX_MIN, acl::CSC_MATRIX_MAX);
  ACL_CHECK_RANGE_INT(cscMatrixR2C2, acl::CSC_MATRIX_MIN, acl::CSC_MATRIX_MAX);

  aippParmsSet->aippParms.cscMatrixR0C0 = cscMatrixR0C0;
  aippParmsSet->aippParms.cscMatrixR0C1 = cscMatrixR0C1;
  aippParmsSet->aippParms.cscMatrixR0C2 = cscMatrixR0C2;
  aippParmsSet->aippParms.cscMatrixR1C0 = cscMatrixR1C0;
  aippParmsSet->aippParms.cscMatrixR1C1 = cscMatrixR1C1;
  aippParmsSet->aippParms.cscMatrixR1C2 = cscMatrixR1C2;
  aippParmsSet->aippParms.cscMatrixR2C0 = cscMatrixR2C0;
  aippParmsSet->aippParms.cscMatrixR2C1 = cscMatrixR2C1;
  aippParmsSet->aippParms.cscMatrixR2C2 = cscMatrixR2C2;
  aippParmsSet->aippParms.cscOutputBiasR0 = cscOutputBiasR0;
  aippParmsSet->aippParms.cscOutputBiasR1 = cscOutputBiasR1;
  aippParmsSet->aippParms.cscOutputBiasR2 = cscOutputBiasR2;
  aippParmsSet->aippParms.cscInputBiasR0 = cscInputBiasR0;
  aippParmsSet->aippParms.cscInputBiasR1 = cscInputBiasR1;
  aippParmsSet->aippParms.cscInputBiasR2 = cscInputBiasR2;
  return ACL_SUCCESS;
}

aclError aclmdlSetAIPPRbuvSwapSwitchImplOm2(aclmdlAIPP *aippParmsSet, int8_t rbuvSwapSwitch) {
  ACL_LOG_INFO("start to execute aclmdlSetAIPPRbuvSwapSwitch");
  ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(aippParmsSet);
  ACL_CHECK_RANGE_INT(rbuvSwapSwitch, acl::AIPP_SWITCH_OFF, acl::AIPP_SWITCH_ON);
  aippParmsSet->aippParms.rbuvSwapSwitch = rbuvSwapSwitch;
  ACL_LOG_INFO("successfully execute aclmdlSetAIPPRbuvSwapSwitch");
  return ACL_SUCCESS;
}

aclError aclmdlSetAIPPAxSwapSwitchImplOm2(aclmdlAIPP *aippParmsSet, int8_t axSwapSwitch) {
  ACL_LOG_INFO("start to execute aclmdlSetAIPPAxSwapSwitch");
  ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(aippParmsSet);
  ACL_CHECK_RANGE_INT(axSwapSwitch, acl::AIPP_SWITCH_OFF, acl::AIPP_SWITCH_ON);
  aippParmsSet->aippParms.axSwapSwitch = axSwapSwitch;
  return ACL_SUCCESS;
}

aclError aclmdlSetAIPPSrcImageSizeImplOm2(aclmdlAIPP *aippParmsSet, int32_t srcImageSizeW, int32_t srcImageSizeH) {
  ACL_LOG_INFO("start to execute aclmdlSetAIPPSrcImageSize");
  ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(aippParmsSet);
  ACL_CHECK_RANGE_INT(srcImageSizeW, acl::IMAGE_SIZE_MIN + 1, acl::IMAGE_SIZE_MAX);
  ACL_CHECK_RANGE_INT(srcImageSizeH, acl::IMAGE_SIZE_MIN, acl::IMAGE_SIZE_MAX);
  aippParmsSet->aippParms.srcImageSizeW = srcImageSizeW;
  aippParmsSet->aippParms.srcImageSizeH = srcImageSizeH;
  ACL_LOG_INFO("successfully execute aclmdlSetAIPPSrcImageSize.");
  return ACL_SUCCESS;
}

aclError aclmdlSetAIPPScfParamsImplOm2(aclmdlAIPP *aippParmsSet, int8_t scfSwitch, int32_t scfInputSizeW,
                                       int32_t scfInputSizeH, int32_t scfOutputSizeW, int32_t scfOutputSizeH,
                                       uint64_t batchIndex) {
  ACL_LOG_INFO("start to execute aclmdlSetAIPPScfParams");
  ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(aippParmsSet);
  const uint64_t aippBatchParaSize = static_cast<uint64_t>(aippParmsSet->aippBatchPara.size());
  if (batchIndex >= aippBatchParaSize) {
    ACL_LOG_ERROR(
        "[Check][Param]Set batch parameter Failed, batch_index (%lu) is greater than or "
        "equal to batch_number (%lu)",
        batchIndex, aippBatchParaSize);
    const std::string errMsg = acl::AclErrorLogManager::FormatStr(
        "batch_index (%lu) is greater than or "
        "equal to batch_number (%lu)",
        batchIndex, aippBatchParaSize);
    acl::AclErrorLogManager::ReportInputError(acl::INVALID_AIPP_MSG, std::vector<const char *>({"param", "reason"}),
                                              std::vector<const char *>({"batch_index", errMsg.c_str()}));
    return ACL_ERROR_INVALID_PARAM;
  }
  ACL_CHECK_RANGE_INT(scfSwitch, acl::AIPP_SWITCH_OFF, acl::AIPP_SWITCH_ON);
  aippParmsSet->aippBatchPara[batchIndex].scfSwitch = scfSwitch;
  if (scfSwitch == 0) {
    ACL_LOG_INFO("scfSwitch[%d] is off", static_cast<int32_t>(scfSwitch));
    return ACL_SUCCESS;
  }
  ACL_CHECK_RANGE_INT(scfInputSizeW, acl::SCF_SIZE_MIN, acl::IMAGE_SIZE_MAX);
  ACL_CHECK_RANGE_INT(scfInputSizeH, acl::SCF_SIZE_MIN, acl::IMAGE_SIZE_MAX);
  ACL_CHECK_RANGE_INT(scfOutputSizeW, acl::SCF_SIZE_MIN, acl::SCF_SIZEW_MAX);
  ACL_CHECK_RANGE_INT(scfOutputSizeH, acl::SCF_SIZE_MIN, acl::IMAGE_SIZE_MAX);
  aippParmsSet->aippBatchPara[batchIndex].scfInputSizeW = scfInputSizeW;
  aippParmsSet->aippBatchPara[batchIndex].scfInputSizeH = scfInputSizeH;
  aippParmsSet->aippBatchPara[batchIndex].scfOutputSizeW = scfOutputSizeW;
  aippParmsSet->aippBatchPara[batchIndex].scfOutputSizeH = scfOutputSizeH;

  ACL_LOG_INFO("successfully execute aclmdlSetAIPPScfParams");
  return ACL_SUCCESS;
}

aclError aclmdlSetAIPPCropParamsImplOm2(aclmdlAIPP *aippParmsSet, int8_t cropSwitch, int32_t cropStartPosW,
                                        int32_t cropStartPosH, int32_t cropSizeW, int32_t cropSizeH,
                                        uint64_t batchIndex) {
  ACL_LOG_INFO("start to execute aclmdlSetAIPPCropParams");
  ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(aippParmsSet);
  const uint64_t aippBatchParaSize = static_cast<uint64_t>(aippParmsSet->aippBatchPara.size());
  if (batchIndex >= aippBatchParaSize) {
    ACL_LOG_ERROR(
        "[Check][Param]Set batch parameter Failed, batch_index (%lu) is greater than or "
        "equal to batch_number (%lu)",
        batchIndex, aippBatchParaSize);
    const std::string errMsg = acl::AclErrorLogManager::FormatStr(
        "batch_index (%lu) is greater than or "
        "equal to batch_number (%lu)",
        batchIndex, aippBatchParaSize);
    acl::AclErrorLogManager::ReportInputError(acl::INVALID_AIPP_MSG, std::vector<const char *>({"param", "reason"}),
                                              std::vector<const char *>({"batch_index", errMsg.c_str()}));
    return ACL_ERROR_INVALID_PARAM;
  }
  ACL_CHECK_RANGE_INT(cropSwitch, acl::AIPP_SWITCH_OFF, acl::AIPP_SWITCH_ON);
  aippParmsSet->aippBatchPara[batchIndex].cropSwitch = cropSwitch;
  if (cropSwitch == 0) {
    ACL_LOG_INFO("cropSwitch[%d] is off", static_cast<int32_t>(cropSwitch));
    return ACL_SUCCESS;
  }
  ACL_CHECK_RANGE_INT(cropStartPosW, acl::IMAGE_SIZE_MIN - 1, acl::IMAGE_SIZE_MAX - 1);
  ACL_CHECK_RANGE_INT(cropStartPosH, acl::IMAGE_SIZE_MIN - 1, acl::IMAGE_SIZE_MAX - 1);
  ACL_CHECK_RANGE_INT(cropSizeW, acl::IMAGE_SIZE_MIN, acl::IMAGE_SIZE_MAX);
  ACL_CHECK_RANGE_INT(cropSizeH, acl::IMAGE_SIZE_MIN, acl::IMAGE_SIZE_MAX);
  aippParmsSet->aippBatchPara[batchIndex].cropStartPosW = cropStartPosW;
  aippParmsSet->aippBatchPara[batchIndex].cropStartPosH = cropStartPosH;
  aippParmsSet->aippBatchPara[batchIndex].cropSizeW = cropSizeW;
  aippParmsSet->aippBatchPara[batchIndex].cropSizeH = cropSizeH;

  ACL_LOG_INFO("successfully execute aclmdlSetAIPPCropParams");
  return ACL_SUCCESS;
}

aclError aclmdlSetAIPPPaddingParamsImplOm2(aclmdlAIPP *aippParmsSet, int8_t paddingSwitch, int32_t paddingSizeTop,
                                           int32_t paddingSizeBottom, int32_t paddingSizeLeft, int32_t paddingSizeRight,
                                           uint64_t batchIndex) {
  ACL_LOG_INFO("start to execute aclmdlSetAIPPPaddingParams");
  ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(aippParmsSet);
  const uint64_t aippBatchParaSize = static_cast<uint64_t>(aippParmsSet->aippBatchPara.size());
  if (batchIndex >= aippBatchParaSize) {
    ACL_LOG_ERROR(
        "[Check][Param]Set batch parameter Failed, batch_index (%lu) is greater "
        "than or equal to batch_number (%lu)",
        batchIndex, aippBatchParaSize);
    const std::string errMsg = acl::AclErrorLogManager::FormatStr(
        "batch_index (%lu) is greater "
        "than or equal to batch_number (%lu)",
        batchIndex, aippBatchParaSize);
    acl::AclErrorLogManager::ReportInputError(acl::INVALID_AIPP_MSG, std::vector<const char *>({"param", "reason"}),
                                              std::vector<const char *>({"batch_index", errMsg.c_str()}));
    return ACL_ERROR_INVALID_PARAM;
  }
  ACL_CHECK_RANGE_INT(paddingSwitch, acl::AIPP_SWITCH_OFF, acl::AIPP_SWITCH_ON);
  aippParmsSet->aippBatchPara[batchIndex].paddingSwitch = paddingSwitch;
  if (paddingSwitch == 0) {
    ACL_LOG_INFO("paddingSwitch[%d] is off", static_cast<int32_t>(paddingSwitch));
    return ACL_SUCCESS;
  }
  ACL_CHECK_RANGE_INT(paddingSizeTop, acl::PADDING_MIN, acl::PADDING_MAX);
  ACL_CHECK_RANGE_INT(paddingSizeBottom, acl::PADDING_MIN, acl::PADDING_MAX);
  ACL_CHECK_RANGE_INT(paddingSizeLeft, acl::PADDING_MIN, acl::PADDING_MAX);
  ACL_CHECK_RANGE_INT(paddingSizeRight, acl::PADDING_MIN, acl::PADDING_MAX);
  aippParmsSet->aippBatchPara[batchIndex].paddingSizeTop = paddingSizeTop;
  aippParmsSet->aippBatchPara[batchIndex].paddingSizeBottom = paddingSizeBottom;
  aippParmsSet->aippBatchPara[batchIndex].paddingSizeLeft = paddingSizeLeft;
  aippParmsSet->aippBatchPara[batchIndex].paddingSizeRight = paddingSizeRight;

  ACL_LOG_INFO("successfully execute aclmdlSetAIPPPaddingParams");
  return ACL_SUCCESS;
}

aclError aclmdlSetAIPPDtcPixelMeanImplOm2(aclmdlAIPP *aippParmsSet, int16_t dtcPixelMeanChn0, int16_t dtcPixelMeanChn1,
                                          int16_t dtcPixelMeanChn2, int16_t dtcPixelMeanChn3, uint64_t batchIndex) {
  ACL_LOG_INFO("start to execute aclmdlSetAIPPDtcPixelMean");
  ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(aippParmsSet);
  const uint64_t aippBatchParaSize = static_cast<uint64_t>(aippParmsSet->aippBatchPara.size());
  if (batchIndex >= aippBatchParaSize) {
    ACL_LOG_ERROR(
        "[Check][Param]Set batch parameter Failed, batch_index (%lu) is greater than or "
        "equal to batch_number (%lu)",
        batchIndex, aippBatchParaSize);
    acl::AclErrorLogManager::ReportInputError(
        acl::INVALID_AIPP_MSG, std::vector<const char *>({"param", "reason"}),
        std::vector<const char *>({"InputAIPP", "parameters verification failed"}));
    return ACL_ERROR_INVALID_PARAM;
  }
  ACL_CHECK_RANGE_INT(dtcPixelMeanChn0, acl::MEAN_CHN_MIN, acl::MEAN_CHN_MAX);
  ACL_CHECK_RANGE_INT(dtcPixelMeanChn1, acl::MEAN_CHN_MIN, acl::MEAN_CHN_MAX);
  ACL_CHECK_RANGE_INT(dtcPixelMeanChn2, acl::MEAN_CHN_MIN, acl::MEAN_CHN_MAX);
  ACL_CHECK_RANGE_INT(dtcPixelMeanChn3, acl::MEAN_CHN_MIN, acl::MEAN_CHN_MAX);
  aippParmsSet->aippBatchPara[batchIndex].dtcPixelMeanChn0 = dtcPixelMeanChn0;
  aippParmsSet->aippBatchPara[batchIndex].dtcPixelMeanChn1 = dtcPixelMeanChn1;
  aippParmsSet->aippBatchPara[batchIndex].dtcPixelMeanChn2 = dtcPixelMeanChn2;
  aippParmsSet->aippBatchPara[batchIndex].dtcPixelMeanChn3 = dtcPixelMeanChn3;

  ACL_LOG_INFO("successfully execute aclmdlSetAIPPDtcPixelMean");
  return ACL_SUCCESS;
}

aclError aclmdlSetAIPPDtcPixelMinImplOm2(aclmdlAIPP *aippParmsSet, float dtcPixelMinChn0, float dtcPixelMinChn1,
                                         float dtcPixelMinChn2, float dtcPixelMinChn3, uint64_t batchIndex) {
  ACL_LOG_INFO("start to execute aclmdlSetAIPPDtcPixelMin");
  ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(aippParmsSet);
  const uint64_t aippBatchParaSize = static_cast<uint64_t>(aippParmsSet->aippBatchPara.size());
  if (batchIndex >= aippBatchParaSize) {
    ACL_LOG_ERROR(
        "[Check][Param]Set batch parameter Failed, batch_index (%lu) is greater than or "
        "equal to batch_number (%lu)",
        batchIndex, aippBatchParaSize);
    const std::string errMsg = acl::AclErrorLogManager::FormatStr(
        "batch_index (%lu) is greater than or "
        "equal to batch_number (%lu)",
        batchIndex, aippBatchParaSize);
    acl::AclErrorLogManager::ReportInputError(acl::INVALID_AIPP_MSG, std::vector<const char *>({"param", "reason"}),
                                              std::vector<const char *>({"batch_index", errMsg.c_str()}));
    return ACL_ERROR_INVALID_PARAM;
  }
  ACL_CHECK_RANGE_FLOAT(dtcPixelMinChn0, acl::MIN_CHN_MIN, acl::MIN_CHN_MAX);
  ACL_CHECK_RANGE_FLOAT(dtcPixelMinChn1, acl::MIN_CHN_MIN, acl::MIN_CHN_MAX);
  ACL_CHECK_RANGE_FLOAT(dtcPixelMinChn2, acl::MIN_CHN_MIN, acl::MIN_CHN_MAX);
  ACL_CHECK_RANGE_FLOAT(dtcPixelMinChn3, acl::MIN_CHN_MIN, acl::MIN_CHN_MAX);
  aippParmsSet->aippBatchPara[batchIndex].dtcPixelMinChn0 = acl::Fp16Type(dtcPixelMinChn0).GetVal();
  aippParmsSet->aippBatchPara[batchIndex].dtcPixelMinChn1 = acl::Fp16Type(dtcPixelMinChn1).GetVal();
  aippParmsSet->aippBatchPara[batchIndex].dtcPixelMinChn2 = acl::Fp16Type(dtcPixelMinChn2).GetVal();
  aippParmsSet->aippBatchPara[batchIndex].dtcPixelMinChn3 = acl::Fp16Type(dtcPixelMinChn3).GetVal();
  ACL_LOG_INFO(
      "successfully execute aclmdlSetAIPPDtcPixelMin, input dtcPixelMinChn0:%f,"
      "the dtcPixelMinChn0:%u of batchIndex:%lu",
      static_cast<float64_t>(dtcPixelMinChn0),
      static_cast<uint32_t>(aippParmsSet->aippBatchPara[batchIndex].dtcPixelMinChn0), batchIndex);
  return ACL_SUCCESS;
}

aclError aclmdlSetAIPPPixelVarReciImplOm2(aclmdlAIPP *aippParmsSet, float dtcPixelVarReciChn0,
                                          float dtcPixelVarReciChn1, float dtcPixelVarReciChn2,
                                          float dtcPixelVarReciChn3, uint64_t batchIndex) {
  ACL_LOG_INFO("start to execute aclmdlSetAIPPPixelVarReci");
  ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(aippParmsSet);
  const uint64_t aippBatchParaSize = static_cast<uint64_t>(aippParmsSet->aippBatchPara.size());
  if (batchIndex >= aippBatchParaSize) {
    ACL_LOG_ERROR(
        "[Check][Param]Set batch parameter Failed, batch_index (%lu) is greater than or "
        "equal to batch_number (%lu)",
        batchIndex, aippBatchParaSize);
    const std::string errMsg = acl::AclErrorLogManager::FormatStr(
        "batch_index (%lu) is greater than or "
        "equal to batch_number (%lu)",
        batchIndex, aippBatchParaSize);
    acl::AclErrorLogManager::ReportInputError(acl::INVALID_AIPP_MSG, std::vector<const char *>({"param", "reason"}),
                                              std::vector<const char *>({"batch_index", errMsg.c_str()}));
    return ACL_ERROR_INVALID_PARAM;
  }
  ACL_CHECK_RANGE_FLOAT(dtcPixelVarReciChn0, acl::VR_CHN_MIN, acl::VR_CHN_MAX);
  ACL_CHECK_RANGE_FLOAT(dtcPixelVarReciChn1, acl::VR_CHN_MIN, acl::VR_CHN_MAX);
  ACL_CHECK_RANGE_FLOAT(dtcPixelVarReciChn2, acl::VR_CHN_MIN, acl::VR_CHN_MAX);
  ACL_CHECK_RANGE_FLOAT(dtcPixelVarReciChn3, acl::VR_CHN_MIN, acl::VR_CHN_MAX);
  aippParmsSet->aippBatchPara[batchIndex].dtcPixelVarReciChn0 = acl::Fp16Type(dtcPixelVarReciChn0).GetVal();
  aippParmsSet->aippBatchPara[batchIndex].dtcPixelVarReciChn1 = acl::Fp16Type(dtcPixelVarReciChn1).GetVal();
  aippParmsSet->aippBatchPara[batchIndex].dtcPixelVarReciChn2 = acl::Fp16Type(dtcPixelVarReciChn2).GetVal();
  aippParmsSet->aippBatchPara[batchIndex].dtcPixelVarReciChn3 = acl::Fp16Type(dtcPixelVarReciChn3).GetVal();
  ACL_LOG_INFO("input dtcPixelVarReciChn0:%f, the dtcPixelVarReciChn0:%u of batchIndex:%lu",
               static_cast<float64_t>(dtcPixelVarReciChn0),
               static_cast<int32_t>(aippParmsSet->aippBatchPara[batchIndex].dtcPixelVarReciChn0), batchIndex);
  return ACL_SUCCESS;
}

// These 4 functions involve model operations, keep as stubs for now
aclError aclmdlSetInputAIPPImplOm2(uint32_t modelId, aclmdlDataset *dataset, size_t index,
                                   const aclmdlAIPP *aippParmsSet) {
  (void)modelId;
  (void)dataset;
  (void)index;
  (void)aippParmsSet;
  return ACL_ERROR_API_NOT_SUPPORT;
}

aclError aclmdlSetAIPPByInputIndexImplOm2(uint32_t modelId, aclmdlDataset *dataset, size_t index,
                                          const aclmdlAIPP *aippParmsSet) {
  (void)modelId;
  (void)dataset;
  (void)index;
  (void)aippParmsSet;
  return ACL_ERROR_API_NOT_SUPPORT;
}

aclError aclmdlGetAippTypeImplOm2(uint32_t modelId, size_t index, aclmdlInputAippType *type,
                                  size_t *dynamicAttachedDataIndex) {
  (void)modelId;
  (void)index;
  (void)type;
  (void)dynamicAttachedDataIndex;
  return ACL_ERROR_API_NOT_SUPPORT;
}

aclError aclmdlGetFirstAippInfoImplOm2(uint32_t modelId, size_t index, aclAippInfo *aippInfo) {
  (void)modelId;
  (void)index;
  (void)aippInfo;
  return ACL_ERROR_API_NOT_SUPPORT;
}

aclError aclmdlSetAttributeImplOm2(uint32_t modelId, aclmdlAttr attr, aclmdlAttrValue_t *attrValue) {
  (void)modelId;
  (void)attr;
  (void)attrValue;
  return ACL_ERROR_API_NOT_SUPPORT;
}

aclError aclmdlGetAttributeImplOm2(uint32_t modelId, aclmdlAttr attr, aclmdlAttrValue_t *attrValue) {
  (void)modelId;
  (void)attr;
  (void)attrValue;
  return ACL_ERROR_API_NOT_SUPPORT;
}