
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2021-2024 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file camxgeolibwrapper.h
/// @brief Define wrapper for geolib
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef CAMXGEOLIBWRAPPER_H
#define CAMXGEOLIBWRAPPER_H

#include "CommonDefs.h"
#include "GeoLib.h"
#include "GeoLibUtils.h"
#include "camxincs.h"
#include "chivendortag.h"
#include "camxcsl.h"
#include "camxifeproperty.h"

CAMX_NAMESPACE_BEGIN


// ROI Wrapper structure
struct ROIWrapper
{
    GeoLibAPIVersion       apiVersion;                          ///< GeoLib still frame configuration version

    union
    {
        GeoLibROI          ROIv1;                               ///< For GeoLib V1
        NcLibROI           ROIv2;                               ///< For GeoLib V2, V3
    };
};

// Container struct for GeoLib Inputs
struct GeoLibInputContainer
{
    GeoLibStillFlowMode           flowMode;                             ///< GeoLib flow mode
    GeoLibMultiFrameMode          mfMode;                               ///< GeoLib multiframe mode
    GeoLibImageSize*              pSensorSize;                          ///< sensor size
    GeoLibImageSize*              pStillOutSize;                        ///< still out size
    BOOL                          displayOutputFlag;                    ///< display output flag
    GeoLibImageSize*              pDisplayOutSize;                      ///< display output size
    BOOL                          appOutputFlag;                        ///< display output flag
    GeoLibImageSize*              pAppOutSize;                          ///< display output size
    GeoLibImageSize*              pRegOutSize;                          ///< reg out size
    ROIWrapper*                   pZoomWindow;                          ///< zoom window
    GeoLibHdrFlowMode             hdrFlowMode;                          ///< HDR flow mode
    NcLibIcaGrid*                 pLdFullOutToIn;                       ///< ld full out to in
    GeoLibImageSize*              pLdFullOutSize;                       ///< ld full out size
    float                         fovcRatio;                            ///< FOVC ratio
    float                         maxSrScaling;                         ///< max SR scaling
    float                         qllMLds;                              ///< QLL2.0 ML downscale factor
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief This utils class for retrieving the fileds from geolib still frame configuration
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class CAMX_VISIBILITY_PUBLIC GeoLibWrapper
{
public:

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// SetApiVersion
    ///
    /// @brief  Get MF mode from Geolib still frame configuration
    ///
    /// @param  pStillFrameConfig      Geolib still frame Configuraiton
    /// @param  titanVersion           Titan version
    ///
    /// @return MF mode
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static CamxResult SetApiVersion(
        GeoLibStillFrameConfigWrapper stillFrameConfig[],
        UINT32                        titanVersion);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// StillCalcFrame
    ///
    /// @brief  Get MF mode from Geolib still frame configuration
    ///
    /// @param  stillFrameConfig         Geolib still frame Configuraiton
    /// @param  rGeoLibInputContainer     Geolib input container struct
    ///
    /// @return MF mode
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static CamxResult StillCalcFrame(
        GeoLibStillFrameConfigWrapper stillFrameConfig[],
        GeoLibInputContainer& rGeoLibInputContainer);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetGeoLibStillFrameMFmode
    ///
    /// @brief  Get MF mode from Geolib still frame configuration
    ///
    /// @param  rStillFrameConfig      Geolib still frame Configuraiton
    ///
    /// @return MF mode
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLibMultiFrameMode GetGeoLibStillFrameMFmode(
        GeoLibStillFrameConfigWrapper& rStillFrameConfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetGeoLibStillFrameBPSOutSizeFull
    ///
    /// @brief  Get MF mode from Geolib still frame configuration
    ///
    /// @param  rStillFrameConfig      Geolib still frame Configuraiton
    ///
    /// @return Full output size for BPS
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLibImageSize* GetGeoLibStillFrameBPSOutSizeFull(
        GeoLibStillFrameConfigWrapper& rStillFrameConfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetGeoLibStillFrameBPSOutSizeDS4
    ///
    /// @brief  Get BPS Node DS4 output size
    ///
    /// @param  rStillFrameConfig      Geolib still frame Configuraiton
    ///
    /// @return BPS DS4 output size
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLibImageSize* GetGeoLibStillFrameBPSOutSizeDS4(
        GeoLibStillFrameConfigWrapper& rStillFrameConfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetGeoLibStillFrameBPSOutSizeDS16
    ///
    /// @brief  Get BPS Node DS16 output size
    ///
    /// @param  rStillFrameConfig      Geolib still frame Configuraiton
    ///
    /// @return BPS DS16 output size
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLibImageSize* GetGeoLibStillFrameBPSOutSizeDS16(
        GeoLibStillFrameConfigWrapper& rStillFrameConfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetGeoLibStillFrameBPSOutSizeDS64
    ///
    /// @brief  Get BPS Node DS64 output size
    ///
    /// @param  rStillFrameConfig      Geolib still frame Configuraiton
    ///
    /// @return BPS DS64 output size
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLibImageSize* GetGeoLibStillFrameBPSOutSizeDS64(
        GeoLibStillFrameConfigWrapper& rStillFrameConfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetGeoLibStillFrameBPSOutFullCrop
    ///
    /// @brief  Get BPS node full output crop and scale
    ///
    /// @param  rStillFrameConfig      Geolib still frame Configuraiton
    ///
    /// @return BPS full output crop
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLibCropAndScale* GetGeoLibStillFrameBPSOutFullCrop(
        GeoLibStillFrameConfigWrapper& rStillFrameConfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetGeoLibStillFrameBPSRegCropAndScale
    ///
    /// @brief  Get BPS registration output crop and scale
    ///
    /// @param  rStillFrameConfig      Geolib still frame Configuraiton
    ///
    /// @return BPS Reg Crop and scale
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLibCropAndScale* GetGeoLibStillFrameBPSRegCropAndScale(
        GeoLibStillFrameConfigWrapper& rStillFrameConfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetGeoLibStillFrameIca1Mapping
    ///
    /// @brief  Get ICA1 mapping
    ///
    /// @param  rStillFrameConfig      Geolib still frame Configuraiton
    ///
    /// @return ICA1 mapping
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLibIcaPassMapping* GetGeoLibStillFrameIca1Mapping(
        GeoLibStillFrameConfigWrapper& rStillFrameConfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetGeoLibStillFrameICAGridRoi
    ///
    /// @brief  Get ICA Grid Roi
    ///
    /// @param  rStillFrameConfig      Geolib still frame Configuraiton
    ///
    /// @return ICA Grid Roi
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLibGridRoi* GetGeoLibStillFrameICAGridRoi(
        GeoLibStillFrameConfigWrapper& rStillFrameConfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetGeoLibStillFrameIca1MappingUnconverted
    ///
    /// @brief  Get ICA1 mapping
    ///
    /// @param  rStillFrameConfig      Geolib still frame Configuraiton
    ///
    /// @return ICA1 mapping
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLib2IcaPassMapping* GetGeoLibStillFrameIca1MappingUnconverted(
        GeoLibStillFrameConfigWrapper& rStillFrameConfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetGeoLibStillFrameIca2MappingUnconverted
    ///
    /// @brief  Get ICA1 mapping
    ///
    /// @param  rStillFrameConfig      Geolib still frame Configuraiton
    ///
    /// @return ICA2 mapping
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLib2IcaPassMapping* GetGeoLibStillFrameIca2MappingUnconverted(
        GeoLibStillFrameConfigWrapper& rStillFrameConfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetGeoLibStillFrameResidualZoom
    ///
    /// @brief  Get residual zoom information mapping
    ///
    /// @param  rStillFrameConfig      Geolib still frame Configuraiton
    ///
    /// @return residual zoom
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLib2ResidualFovs* GetGeoLibStillFrameResidualZoom(
        GeoLibStillFrameConfigWrapper& rStillFrameConfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetGeoLibStillFrameIca2Mapping
    ///
    /// @brief  Get ICA2 mapping
    ///
    /// @param  rStillFrameConfig      Geolib still frame Configuraiton
    ///
    /// @return ICA2 mapping
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLibIcaPassMapping* GetGeoLibStillFrameIca2Mapping(
        GeoLibStillFrameConfigWrapper& rStillFrameConfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetGeoLibStillFrameCVPIcaMapping
    ///
    /// @brief  Get CVP ICA Mapping
    ///
    /// @param  rStillFrameConfig      Geolib still frame Configuraiton
    ///
    /// @return CVP ICA mapping
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLibIcaMapping* GetGeoLibStillFrameCVPIcaMapping(
        GeoLibStillFrameConfigWrapper& rStillFrameConfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetGeoLibStillFrameIPEStripingInputs
    ///
    /// @brief  Get IPE striping input
    ///
    /// @param  rStillFrameConfig      Geolib still frame Configuraiton
    ///
    /// @return IPE striping input
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLibIpeStripingConfig* GetGeoLibStillFrameIPEStripingInputs(
        GeoLibStillFrameConfigWrapper& rStillFrameConfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetGeoLibStillFrameCoarse2FullScale
    ///
    /// @brief  Get coarse 2 full scale coord
    ///
    /// @param  rStillFrameConfig      Geolib still frame Configuraiton
    ///
    /// @return coarse 2 full scale coord
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLibFloat2* GetGeoLibStillFrameCoarse2FullScale(
        GeoLibStillFrameConfigWrapper& rStillFrameConfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetGeoLibStillFrameCoarseCenter
    ///
    /// @brief  Get coarse Center coord
    ///
    /// @param  rStillFrameConfig       Geolib still frame Configuraiton
    ///
    /// @return Coarse Center coord
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLibFloat2* GetGeoLibStillFrameCoarseCenter(
        GeoLibStillFrameConfigWrapper& rStillFrameConfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// DumpGeolibResultInput
    ///
    /// @brief  Dump GeoLib still frame configuration output
    ///
    /// @param  rGeoLibInputContainer   Geolib still frame Configuraiton
    /// @param  hasDisplayOutput        whether has display output as input paramter
    /// @param  pLdFullInToOut          LD full in to out
    /// @param  apiVersion              GeoLib API
    /// @param  pFile                   Current request Id
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static VOID DumpGeolibResultInput(
        GeoLibInputContainer& rGeoLibInputContainer,
        BOOL                  hasDisplayOutput,
        NcLibIcaGrid*         pLdFullInToOut,
        GeoLibAPIVersion      apiVersion,
        FILE*                 pFile);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// DumpGeolibResultOutput
    ///
    /// @brief  Dump GeoLib still frame configuration output
    ///
    /// @param  rStillFrameConfig       Geolib still frame Configuraiton
    /// @param  pFile                   Current request Id
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static VOID DumpGeolibResultOutput(
        GeoLibStillFrameConfigWrapper& rStillFrameConfig,
        FILE* pFile);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// DumpGeoLibStillFrameInput
    ///
    /// @brief  Dump GeoLib still frame configuration output
    ///
    /// @param  rStillFrameConfig       Geolib still frame Configuraiton
    /// @param  flowMode                Geolib flow mode
    /// @param  mfMode                  Geolib mf mode
    /// @param  sensorSize              Geolib sensor size
    /// @param  ldFullOutToIn           Geolib ld full out to in
    /// @param  ldFullInToOut           Geolib ld full in to out
    /// @param  stillOutSize            Geolib still output size
    /// @param  displayOutputFlag       Geolib display output flag
    /// @param  displayOutSize          Geolib display output size
    /// @param  regOutSize              Geolib reg out size
    /// @param  zoomWindow              Geolib zooom window
    /// @param  pFile                   Dump file
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static VOID DumpGeoLibStillFrameInput(
        GeoLibStillFrameConfigWrapper& rStillFrameConfig,
        GeoLibStillFlowMode            flowMode,
        GeoLibMultiFrameMode           mfMode,
        GeoLibImageSize                sensorSize,
        NcLibIcaGrid                   ldFullOutToIn,
        NcLibIcaGrid                   ldFullInToOut,
        GeoLibImageSize                stillOutSize,
        BOOL                           displayOutputFlag,
        GeoLibImageSize                displayOutSize,
        GeoLibImageSize                regOutSize,
        NcLibROI                       zoomWindow,
        FILE*                          pFile);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetGeoLibROI
    ///
    /// @brief  Dump GeoLib still frame configuration output
    ///
    /// @param  rRoiWrapper       Node name of the caller
    ///
    /// @return geolib V1 ROI
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLibROI GetGeoLibROI(
        ROIWrapper& rRoiWrapper);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// FillZoomWindow
    ///
    /// @brief  Fill zoom window
    ///
    /// @param  rStillFrameConfig             Geolib still frame Configuraiton
    /// @param  pCropWindow                   Crop window
    /// @param  pRefCropWindow                Ref Crop Window
    /// @param  pSensorSize                   Still out size
    /// @param  enablepGeolibOffCenterZoom    Off center Zoom enabled
    ///
    /// @return zoomWindow
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static ROIWrapper FillZoomWindow(
        GeoLibStillFrameConfigWrapper& rStillFrameConfig,
        CropWindow*                    pCropWindow,
        RefCropWindowSize*             pRefCropWindow,
        GeoLibImageSize*               pSensorSize,
        BOOL                           enablepGeolibOffCenterZoom);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ConvertGeoLibCropAndScale
    ///
    /// @brief  Convert GeoLib2CropAndScale to GeoLibCropAndScale
    ///
    /// @param  version2      GeoLib2 Struct
    ///
    /// @return MF mode
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLibCropAndScale ConvertGeoLibCropAndScale(
        GeoLib2CropAndScale version2);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ConvertGeoLibIcaMapping
    ///
    /// @brief  Convert GeoLib2IcaMapping to GeoLibIcaMapping
    ///
    /// @param  version2      GeoLib2 Struct
    ///
    /// @return MF mode
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLibIcaMapping ConvertGeoLibIcaMapping(
        GeoLib2IcaMapping version2);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ConvertGeoLibIcaInRoi
    ///
    /// @brief  Convert GeoLib2IcaMapping to GeoLibIcaMapping
    ///
    /// @param  version2      GeoLib2 Struct
    ///
    /// @return MF mode
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLibIcaMapping ConvertGeoLibIcaInRoi(
        NcLibROI version2);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ConvertGeoLibIca1PassMapping
    ///
    /// @brief  Convert GeoLib2IcaPassMapping to GeoLibIcaPassMapping
    ///
    /// @param  rMfAnchor        GeoLib2 anchor frame config
    /// @param  rMfBlend         GeoLib2 blend frame config
    /// @param  rMfEqualization  GeoLib2 equalization frame config
    /// @param  rMfFinal         GeoLib2 ifinal frame config
    ///
    /// @return GeoLibIcaPassMappingContainer struct
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLibIcaPassMappingContainer ConvertGeoLibIca1PassMapping(
        GeoLib2IpeFrameCfg& rMfAnchor,
        GeoLib2IpeFrameCfg& rMfBlend,
        GeoLib2IpeFrameCfg& rMfEqualization,
        GeoLib2IpeFrameCfg& rMfFinal);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ConvertGeoLibIca2PassMapping
    ///
    /// @brief  Convert GeoLib2IcaPassMapping to GeoLibIcaPassMapping
    ///
    /// @param  rMfAnchor        GeoLib2 anchor frame config
    /// @param  rMfBlend         GeoLib2 blend frame config
    /// @param  rMfEqualization  GeoLib2 equalization frame config
    /// @param  rMfFinal         GeoLib2 ifinal frame config
    ///
    /// @return GeoLibIcaPassMappingContainer struct
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLibIcaPassMappingContainer ConvertGeoLibIca2PassMapping(
        GeoLib2IpeFrameCfg& rMfAnchor,
        GeoLib2IpeFrameCfg& rMfBlend,
        GeoLib2IpeFrameCfg& rMfEqualization,
        GeoLib2IpeFrameCfg& rMfFinal);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GeolibV2toV1ICAMapping
    ///
    /// @brief  Convert GeoLib2IcaMapping to GeoLibIcaMapping
    ///
    /// @param  pGeoIcaMapping      pGeoIcaMapping Pointer ICA mapping V1
    /// @param  pGeoLib2IcaMapping  pGeoLib2IcaMapping Pointer ICA mapping V2
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static VOID GeolibV2toV1ICAMapping(
        GeoLibIcaPassMapping*   pGeoIcaMapping,
        GeoLib2IcaPassMapping*  pGeoLib2IcaMapping);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ConvertGeoLibStillIpeStripingConfig
    ///
    /// @brief  Convert GeoLib2IpeStripingConfig to GeoLibIpeStripingConfig
    ///
    /// @param  rMfAnchor        GeoLib2 anchor frame config
    /// @param  rMfBlend         GeoLib2 blend frame config
    /// @param  rMfEqualization  GeoLib2 equalization frame config
    /// @param  rMfFinal         GeoLib2 ifinal frame config
    ///
    /// @return GeoLibIpeStripingConfigContainer struct
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLibIpeStripingConfigContainer ConvertGeoLibStillIpeStripingConfig(
        GeoLib2IpeFrameCfg& rMfAnchor,
        GeoLib2IpeFrameCfg& rMfBlend,
        GeoLib2IpeFrameCfg& rMfEqualization,
        GeoLib2IpeFrameCfg& rMfFinal);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ConvertGeoLibRTIpeStripingConfig
    ///
    /// @brief  Convert GeoLib2IpeStripingConfig to GeoLibIpeStripingConfig
    ///
    /// @param  rVersion2      GeoLib2 Struct
    ///
    /// @return MF mode
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static GeoLibIpeStripingConfig ConvertGeoLibRTIpeStripingConfig(
        GeoLib2IpeStripingConfig& rVersion2);

private:

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// StillCalcFrameV1
    ///
    /// @brief  Get MF mode from Geolib still frame configuration
    ///
    /// @param  rGeoLibInputContainer   Geolib input struct
    /// @param  rStillFrameConfig       Geolib still frame configuraiton (output)
    ///
    /// @return result
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static CamxResult StillCalcFrameV1(
        GeoLibInputContainer&           rGeoLibInputContainer,
        GeoLibStillFrameConfigWrapper&  rStillFrameConfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// StillCalcFrameV2
    ///
    /// @brief  Get MF mode from Geolib still frame configuration
    ///
    /// @param  rGeoLibInputContainer   Geolib input struct
    /// @param  rStillFrameConfig       Geolib still frame configuraiton (output)
    ///
    /// @return result
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static CamxResult StillCalcFrameV2(
        GeoLibInputContainer&          rGeoLibInputContainer,
        GeoLibStillFrameConfigWrapper& rStillFrameConfig);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// StillCalcFrameV3
    ///
    /// @brief  Get MF mode from Geolib still frame configuration
    ///
    /// @param  rGeoLibInputContainer   Geolib input struct
    /// @param  rStillFrameConfig       Geolib still frame configuraiton (output)
    ///
    /// @return result
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static CamxResult StillCalcFrameV3(
        GeoLibInputContainer&          rGeoLibInputContainer,
        GeoLibStillFrameConfigWrapper& rStillFrameConfig);


    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// FillZoomWindowV1
    ///
    /// @brief  Fill zoom window
    ///
    /// @param  pCropWindow                   Crop window
    /// @param  pRefCropWindow                Ref crop window
    /// @param  enablepGeolibOffCenterZoom    enable GeoLib offCenter zoom
    ///
    /// @return zoomWindow
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static ROIWrapper FillZoomWindowV1(
        CropWindow*                    pCropWindow,
        RefCropWindowSize*             pRefCropWindow,
        BOOL                           enablepGeolibOffCenterZoom);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// FillZoomWindowV2
    ///
    /// @brief  Fill zoom window
    ///
    /// @param  pCropWindow                   Crop window
    /// @param  pRefCropWindow                Ref crop window
    /// @param  pSensorSize                   Sensor size struct
    /// @param  enablepGeolibOffCenterZoom    enable GeoLib offCenter zoom
    ///
    /// @return zoomWindow
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static ROIWrapper FillZoomWindowV2(
        CropWindow*                    pCropWindow,
        RefCropWindowSize*             pRefCropWindow,
        GeoLibImageSize*               pSensorSize,
        BOOL                           enablepGeolibOffCenterZoom);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// FillZoomWindowV3
    ///
    /// @brief  Fill zoom window
    ///
    /// @param  pCropWindow                   Crop window
    /// @param  pRefCropWindow                Ref crop window
    /// @param  pSensorSize                   Sensor size struct
    /// @param  enablepGeolibOffCenterZoom    enable GeoLib offCenter zoom
    ///
    /// @return zoomWindow
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static ROIWrapper FillZoomWindowV3(
        CropWindow*                    pCropWindow,
        RefCropWindowSize*             pRefCropWindow,
        GeoLibImageSize*               pSensorSize,
        BOOL                           enablepGeolibOffCenterZoom);

    GeoLibWrapper() = default;
    GeoLibWrapper(const GeoLibWrapper&)             = delete; ///< Disallow the copy constructor
    GeoLibWrapper& operator= (const GeoLibWrapper&) = delete; ///< Disallow assignment operator

};

CAMX_NAMESPACE_END

#endif // CAMXGEOLIBWRAPPER_H
