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

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  chifeature2typescommon.h
/// @brief CHI feature2 type definitions
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef CHIFEATURE2TYPESCOMMON_H
#define CHIFEATURE2TYPESCOMMON_H

#include "camxcdktypes.h"

typedef UINT32 OfflineOpModeType;
static const OfflineOpModeType         OpModeOfflineOffset         =  0x8000;
static const OfflineOpModeType         OpModeOfflineExtOffset      =  0x800000;

typedef UINT32 OfflineFeaturesTagType;
static const OfflineFeaturesTagType    OfflineFeaturesTagExtOffset =  0x800000;

typedef UINT32 OfflineFeatureProfileType;
static const OfflineFeatureProfileType OfflineFeatureProfileOffset =  0x0;

/**
 *  @brief Offline camera operation modes. Values are used during configuration of offline session.
 *  Operation mode avaialable here to have graph descriptor in graphselector or graphselectorOEM files.
 *  Offline Provider extension to use "OfflineOpModeExtStart" as start offset for any opmode customization
 **/
typedef enum OfflineOpModeValues : OfflineOpModeType
{
    OfflineOpModeStart            = OpModeOfflineOffset,                ///< Operation mode start offset for offline camera
    OpModeOfflineBayer2Yuv,                                             ///< Operation mode offline bayer input to yuv output.
    OpModeOfflineYuv2Jpeg,                                              ///< Operation mode offline yuv input to jpeg output.
    OpModeOfflineYuv2Yuv,                                               ///< Operation mode offline yuv input to yuv output.
    OpModeOfflineQLL,                                                   ///< Operation mode QLL raw to yuv snapshot.
    OpModeOfflineHWMF,                                                  ///< Operation mode offline hwmf
    OpModeOfflineRaw2Raw,                                               ///< Operation mode offline Raw input to Raw output.


/**
 *  Offline extension modules to use below offset as start offset and define op modes.
 **/
    OfflineOpModeExtStart         = OpModeOfflineExtOffset,             ///< Operation mode start offset for offline camera customization
} OFFLINEOPMODEVALUES;

/**
 *  @brief Offline Camera Features tag values. Values are used to choose features/graph per request.
 * Values are passed as vendor tag per request and used during graph selection on top of existing selection logic in
 * graph selector.
 * Values listed below shall be part of graphs defined in graphselector or graphselectorOEM files
 **/
typedef enum OfflineFeaturesTagValues : OfflineFeaturesTagType
{
    OfflineFeaturesTagExtStart    = OfflineFeaturesTagExtOffset         ///< Feature request tag start offset
} OFFLINEFEATURESTAGVALUES;

/**
 *  @brief Offline Camera Feature profiles. Values are used to control feature hw IQ profiles.
 *  Values are passed as session parameter. All profiles are supported as config parameter and cannot change run time.
 **/
typedef enum OfflineFeatureProfileValues : OfflineFeatureProfileType
{
    OfflineFeatureProfileDefault  = OfflineFeatureProfileOffset,  ///< Default profile -> FullPostProcessing
    OfflineFeatureProfileNoise,                                   ///< Noise profile -> NoiseProcessing + NoZOOM + NoScale
    OfflineFeatureProfilePostProcessing,                          ///< Post Processing profile
    OfflineFeatureProfileScale,                                   ///< Scale profile ->  Scale + NoZoom
    OfflineFeatureProfileFullFOV,                                 ///< Full FOV profile
    OfflineFeatureProfileZoom,                                    ///< Zoom only profile
    OfflineFeatureProfileAICamera,                                ///< AI camera profile

    /**
     *  Offline interface feature level profile
     **/
    OfflineFeatureY2JProfileDefault = OfflineFeatureProfileOffset + 0x100,   ///< Y2J default profile
    OfflineFeatureY2JProfileRotation,                                        ///< Y2J + GPU rotation
} OFFLINEFEATUREPROFILEVALUES;

/// @brief feature2 Type of Exp Frames
/**
 *  @brief Offline Camera Feature Exposure Type. Values are used to indicate the snapshot exposure type per number
 *  of frames requested for the request. Values are passed as input settings, may change per request. This enum
 *  is strictly for use in CHI, for reference in CAMX, we must translate to "ChiContextType"
 **/
enum class ChiFeature2ExposureType
{
    Default              = 0,        ///< Default exp frame type
    ShortExposure        = 1,        ///< Short exposure frame type
    LongExposure         = 2,        ///< Long eExposure frame type
    UltraLongExposure    = 3,        ///< Ultra long exposure frame type
    MiddleExposure       = 4,        ///< Middle exposure frame type
    AllExposures         = 5,        ///< Context to Stream All exposure frames
    Max                  = 6,        ///< Max
};

#endif // CHIFEATURE2TYPESCOMMON_H
