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

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxtitan5xtuningdump.h
/// @brief Tuning dump definitions for Titan5x
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef CAMXTITAN5XTUNINGDUMP_H
#define CAMXTITAN5XTUNINGDUMP_H

#include "camxstatsdebugdatawriter.h"

CAMX_NAMESPACE_BEGIN

CAMX_BEGIN_PACKED

/// @brief LSC tuning data
const UINT      LSC35HorizontalMeshPoint             = 17;
const UINT      LSC35VerticalMeshPoint               = 13;
const UINT32    LSC35MeshSize                        = LSC35HorizontalMeshPoint * LSC35VerticalMeshPoint;

/// @brief TFE LSC tuning data
const UINT      TFELSCConfigRegisters1               = 3;
const UINT      TFELSCConfigRegisters2               = 8;

/// @brief TFE WBBDSDPC tuning data
const UINT      TFEWBBDSDPC_ConfigRegisters1         = 1;
const UINT      TFEWBBDSDPC_ConfigRegisters2         = 52;

/// @brief TFE Demux register sizes
const UINT      TFEDemuxConfigRegisters1             = 1;
const UINT      TFEDemuxConfigRegisters2             = 12;

/// @brief Demux141 register sizes
const UINT      TFEDemux141ConfigRegisters1          = 1;
const UINT      TFEDemux141ConfigRegisters2          = 12;

/// @brief LSC351 tuning data
const UINT      TFELSC351ConfigRegisters1            = 3;
const UINT      TFELSC351ConfigRegisters2            = 6;
const UINT      TFELSC351ConfigRegisters3            = 2;

/// @brief PDPC321 register sizes
const UINT      TFEPDPC321Registers0                  = 3;
const UINT      TFEPDPC321Registers1                  = 1;
const UINT      TFEPDPC321Registers2                  = 1;
const UINT      TFEPDPC321Registers3                  = 6;
const UINT      TFEPDPC321Registers4                  = 2;
const UINT      TFEPDPC321Registers5                  = 2;
const UINT      TFEPDPC321LUTEntries                  = 64;

/// @brief WBBDS111 tuning data
const UINT      TFEWBBDS111ConfigRegisters1          = 1;
const UINT      TFEWBBDS111ConfigRegisters2          = 9;
const UINT      TFEWBBDS111ConfigRegisters3          = 4;

/// @brief BDS4 tuning data
const UINT      TFEBDS4ConfigRegisters1              = 1;
const UINT      TFEBDS4ConfigRegisters2              = 10;

/// @brief BDS2 tuning data
const UINT      TFEBDS2ConfigRegisters1              = 1;
const UINT      TFEBDS2ConfigRegisters2              = 4;

/// @brief WB14 tuning data
const UINT      TFEWB14ConfigRegisters1              = 1;
const UINT      TFEWB14ConfigRegisters2              = 9;

/// @brief DS4CST tuning data
const UINT      TFEDS4CSTConfigRegisters1            = 1;
const UINT      TFEDS4CSTConfigRegisters2            = 18;

/// @brief AICST tuning data
const UINT      TFEAICSTConfigRegisters1             = 1;
const UINT      TFEAICSTConfigRegisters2             = 18;

 /// @brief TFE BLS121 tuning data
 const UINT      TFEBLS121Registers1                 = 1;
 const UINT      TFEBLS121Registers2                 = 6;

/// @brief ABF211 tuning data
const UINT      TFEABF211Registers0                  = 1;
const UINT      TFEABF211Registers1                  = 14;
const UINT      TFEABF211Registers2                  = 17;

/// @brief GTM121 tuning data
const UINT      TFEGTM121Registers                   = 3;

/// @brief Gamma101 tuning data
const UINT      TFEGamma101Registers                 = 3;

/// @brief GTM 121 LUT details
const UINT      TFEGTM121LUTEntries                  = 64 * 2;

/// @brief AECBG 18 data
const UINT      TFEAECBG18Registers                  = 9;

/// @brief BHist 15 data
const UINT      TFEBHist15Registers                  = 3;

/// @brief TintlessBG18 data
const UINT      TFETintlessBG18Registers             = 8;

/// @brief AWBBG18 data
const UINT      TFEAWBBG18Registers                  = 9;

/// @brief RS16 data
const UINT      TFERS16Registers                     = 26;

/// @brief BAF27 Gamma TFE LUT details
const UINT      BAF27GammaLUTEntries                 = 32;

const UINT      TFEGammaLUTEntries                   = 64;

/// @brief BAF28 Gamma TFE LUT details
const UINT      BAF28GammaLUTEntries                 = 32;
const UINT      BAF28FlexiRegionIndicationLUTEntries = 32;
const UINT      BAF28FlexiWidthLUTEntries            = 32;
const UINT      BAF28FlexiHeightLUTEntries           = 24;

/// @brief  BF27 data
const UINT      TFEBAF27ConfigRegisters              = 5;
const UINT      TFEBAF27HFIRIIRConfigRegisters       = 11;
const UINT      TFEBAF27VIIRConfigRegisters          = 4;
const UINT      TFEBAF27HThresholdConfRegisters      = 5;
const UINT      TFEBAF27VThresholdConfRegisters      = 5;
const UINT      TFEBAF27CoringConfigRegisters        = 2;
const UINT      TFEBAF27InterruptConfRegisters       = 5;
const UINT      TFEBAF27RegionConfigRegisters        = 4;
const UINT      TFEBAF27BLConfigRegisters            = 2;
const UINT      TFEBAF27ActWinConfigRegisters        = 2;

/// @brief  BF28 data
const UINT      TFEBAF28ConfigRegisters              = 5;
const UINT      TFEBAF28HFIRIIRConfigRegisters       = 11;
const UINT      TFEBAF28V1IIRConfigRegisters         = 4;
const UINT      TFEBAF28V2IIRConfigRegisters         = 4;
const UINT      TFEBAF28HThresholdConfRegisters      = 5;
const UINT      TFEBAF28VThresholdConfRegisters      = 5;
const UINT      TFEBAF28CoringConfigRegisters        = 2;
const UINT      TFEBAF28InterruptConfRegisters       = 5;
const UINT      TFEBAF28RegionConfigRegisters        = 4;
const UINT      TFEBAF28BLConfigRegisters            = 2;
const UINT      TFEBAF28ActWinConfigRegisters        = 2;

/// @brief PDAF 31 tuning data
const UINT TFEPDAFRegistersTitan670                  = 84; //< TFEPDAF31RegCmd

/// @brief OPE BPC ABF tuning data
const UINT      OPEBPCABFConfigRegisters1            = 3;
const UINT      OPEBPCABFConfigRegisters2            = 2;
const UINT      OPEBPCABFConfigRegisters3            = 4;
const UINT      OPEBPCABFConfigRegisters4            = 8;
const UINT      OPEBPCABFConfigRegisters5            = 7;
const UINT      OPEBPCABFConfigRegisters6            = 2;
const UINT32    OPEBPCABFLUTEntriesNoise             = 64;

/// @brief OPE LSC tuning data
const UINT      OPELSCConfigRegisters1               = 2;
const UINT      OPELSCConfigRegisters2               = 1;
const UINT      OPELSCConfigRegisters3               = 4;
const UINT      OPELSCConfigRegisters4               = 1;
const UINT      OPELSCConfigRegisters5               = 3;
const UINT      OPELSC35LUTTableEntries              = 221;

/// @brief OPE BPC BLS register size
const UINT      OPEBLSConfigRegisters1               = 1;
const UINT      OPEBLSConfigRegisters2               = 6;

/// @brief OPE Gamma LUT Data
const UINT32    OPEGammaLUTEntries                   = 256;

/// @brief OPE Gamma Max Channels
const UINT32    OPEGammaMaxChannel                   = 3;

/// @brief GTM v1.2 LUT details
const UINT GTM12LUTEntries                           = 64 * 2;

/// @brief OPE Demosaic tuning data
const UINT      OPEDemosaicConfigRegisters1          = 1;
const UINT      OPEDemosaicConfigRegisters2          = 3;

/// @brief OPE Chroma Suppression data
const UINT32    OPECSMCEConfigRegisters              = 13;

/// @brief OPE Chroma Enhancement data
const UINT32    OPEChromaEnhancementConfigRegisters1 = 1;
const UINT32    OPEChromaEnhancementConfigRegisters2 = 9;

/// @brief OPE WNR data
const UINT32    OPEWNRConfigRegisters1               = 16;
const UINT32    OPEWNRConfigRegisters2               = 3;
const UINT32    OPEWNRConfigRegisters3               = 22;
const UINT32    OPEWNRConfigRegisters4               = 3;

/// @brief OPE Upscale data
const UINT32    OPEUpscalerConfigRegisters1          = 1;
const UINT32    OPEUpscalerConfigRegisters2          = 9;
const UINT32    OPEUpscalerConfigRegisters3          = 1;
const UINT32    OPEUpscalerConfigRegisters4          = 9;

/// @brief OPE Color Correction data
const UINT      OPECCConfigRegisters1                = 1;
const UINT      OPECCConfigRegisters2                = 10;

/// @brief OPE LTM data
const UINT32    OPELTMLUTEntriesWeight               = 24;
const UINT32    OPELTMLUTEntriesCurve                = 64;
const UINT32    OPELTMLUTEntriesScale                = 64;
const UINT32    OPELTMLUTEntriesMask                 = 64;
const UINT32    OPELTMLUTEntriesLCEPositive          = 16;
const UINT32    OPELTMLUTEntriesLCENegative          = 16;
const UINT32    OPELTMLUTEntriesAverage              = 130 * 3;

/// @brief OPE Skin Color Enhancement data
const UINT32    OPESCEConfigRegisters1               = 1;
const UINT32    OPESCEConfigRegisters2               = 30;
const UINT32    OPESCEConfigRegisters3               = 6;
const UINT32    OPESCEConfigRegisters4               = 6;
const UINT32    OPESCEConfigRegisters5               = 6;
const UINT32    OPESCEConfigRegisters6               = 6;

/// @brief OPE Adaptive Spatial Filter (ASF) data
const UINT32    OPEASFConfigRegisters1               = 3;
const UINT32    OPEASFConfigRegisters2               = 13;
const UINT32    OPEASFConfigRegisters3               = 1;
const UINT32    OPEASFConfigRegisters4               = 3;
const UINT32    OPEASFConfigRegisters5               = 2;
const UINT32    OPEASFConfigRegisters6               = 18;
const UINT32    OPEASFConfigRegisters7               = 3;
const UINT32    OPEASFLayer1LUTEntries               = 512;
const UINT32    OPEASFLayer1LUTEntriesWeight         = 256;

/// @brief OPE WB data
const UINT32    OPEWBConfigRegisters1                = 1;
const UINT32    OPEWBConfigRegisters2                = 9;

/// @brief OPE GTM data
const UINT32    OPEGTMConfigRegisters                 = 3;

/// @brief OPE LTM data
const UINT32    OPELTMConfigRegisters1                = 2;
const UINT32    OPELTMConfigRegisters2                = 1;
const UINT32    OPELTMConfigRegisters3                = 3;
const UINT32    OPELTMConfigRegisters4                = 1;
const UINT32    OPELTMConfigRegisters5                = 7;
const UINT32    OPELTMConfigRegisters6                = 1;
const UINT32    OPELTMConfigRegisters7                = 6;

/// @brief OPE Gamma data
const UINT32    OPEGammaConfigRegisters               = 1;

/// @brief OPE CST data
const UINT32    OPECSTConfigRegisters                = 19;

/// @brief OPE Demux register sizes
const UINT      OPEDemuxConfigRegisters1             = 1;
const UINT      OPEDemuxConfigRegisters2             = 12;

/// @brief IQ OEM Custom tuning data
const UINT32    IQOEMTuning5xData                    = 256;

/// @brief Structure to encapsulate LSC 35 LUT data
struct LSC35MeshLUT
{
    /// register info also from register dump
    UINT32 GRRLUT[LSC35MeshSize];
    UINT32 GBBLUT[LSC35MeshSize];
} CAMX_PACKED;

/// @brief Structure to encapsulate LSC 351 LUT data
struct TFELSC351LUT
{
    /// register info also from register dump
    UINT32 GRRLUT[LSC35MeshSize];
    UINT32 GBBLUT[LSC35MeshSize];
} CAMX_PACKED;

/// @brief Structure to encapsulate GTM 121 LUT data
struct TFEGTM121LUT
{
    UINT32            LUT[TFEGTM121LUTEntries];
} CAMX_PACKED;

/// @brief Structure to encapsulate PDPC 321 LUT data
struct TFEPDPC321LUT
{
    UINT64            LUT[TFEPDPC321LUTEntries];
} CAMX_PACKED;

/// @brief Structure to encapsulate Gamma 101 curve data
struct Gamma101Curve
{
    UINT32             ChannelGLUT[TFEGammaLUTEntries];
    UINT32             ChannelBLUT[TFEGammaLUTEntries];
    UINT32             ChannelRLUT[TFEGammaLUTEntries];
} CAMX_PACKED;

/// @brief Structure to encapsulate BAF27 Gamma LUT data
struct BAF27Gamma
{
    UINT32             ChannelLUT[BAF27GammaLUTEntries];
} CAMX_PACKED;

/// @brief Structure to encapsulate BAF28 Gamma LUT data
struct BAF28LUT
{
    UINT32             GammaLUT[BAF28GammaLUTEntries];
    UINT32             FlexiRegionIndicationLUT[BAF28FlexiRegionIndicationLUTEntries];
    UINT32             FlexiWidthLUT[BAF28FlexiWidthLUTEntries];
    UINT32             FlexiHeightLUT[BAF28FlexiHeightLUTEntries];
} CAMX_PACKED;

/// @brief Structure to encapsulate ABF LUTs data
struct OPEABF41LUT
{
    UINT32 noiseLUT[OPEBPCABFLUTEntriesNoise];
} CAMX_PACKED;

struct OPEGamma15Curve
{
    UINT32 curve[OPEGammaLUTEntries];
} CAMX_PACKED;

/// @brief Structure to encapsulate OPE GTM12 curve data
struct OPEGTM12LUT
{
    UINT32  LUT[GTM12LUTEntries];  ///< GTM LUT
} CAMX_PACKED;

/// @brief Structure to encapsulate OPE LTM15 LUTs data
struct OPELTM15LUT
{
    UINT32 WeightLUT[OPELTMLUTEntriesWeight];
    UINT32 CurveLUT[OPELTMLUTEntriesCurve];
    UINT32 ScaleLUT[OPELTMLUTEntriesScale];
    UINT32 MaskLUT[OPELTMLUTEntriesMask];
    UINT32 LCEPositiveLUT[OPELTMLUTEntriesLCEPositive];
    UINT32 LCENegativeLUT[OPELTMLUTEntriesLCENegative];
    UINT32 AverageLUT[OPELTMLUTEntriesAverage];
} CAMX_PACKED;

/// @brief Structure to encapsulate OPE ASF LUTs
struct OPEASF32LUT
{
    UINT32 Layer1LUT[OPEASFLayer1LUTEntries];
    UINT32 Layer1WeightLUT[OPEASFLayer1LUTEntriesWeight];
} CAMX_PACKED;

/// @brief Structure to encapsulate OPE ASF LUTs
struct OPELSC35LUT
{
    UINT32 OPELSCRedLUT[OPELSC35LUTTableEntries];
    UINT32 OPELSCBlueLUT[OPELSC35LUTTableEntries];
} CAMX_PACKED;

/// @brief Demux registers configuration
struct TFEDemuxTuningMetadata
{
    UINT32  demuxConfig1[TFEDemuxConfigRegisters1];
    UINT32  demuxConfig2[TFEDemuxConfigRegisters2];
} CAMX_PACKED;

struct TFELSCTuningMetadata
{
    UINT32  rolloffConfig1[TFELSCConfigRegisters1];
    UINT32  rolloffConfig2[TFELSCConfigRegisters2];
} CAMX_PACKED;

/// @brief WBBDS registers configuration
struct TFEWBBDSDPCTuningMetadata
{
    UINT32 TFEWBBDSDPCConfig1[TFEWBBDSDPC_ConfigRegisters1];
    UINT32 TFEWBBDSDPCConfig2[TFEWBBDSDPC_ConfigRegisters2];
}CAMX_PACKED;

/// @brief DemuxBLS141 Tuning Metadata
struct TFEDemux141TuningMetadata
{
    UINT32              demux141Config1[TFEDemux141ConfigRegisters1];
    UINT32              demux141Config2[TFEDemux141ConfigRegisters2];
} CAMX_PACKED;

/// @brief LSC351 Tuning Metadata
struct TFELSC351TuningMetadata
{
    UINT32              rolloffConfig1[TFELSC351ConfigRegisters1];
    UINT32              rolloffConfig2[TFELSC351ConfigRegisters2];
    UINT32              rolloffConfig3[TFELSC351ConfigRegisters3];
} CAMX_PACKED;

/// @brief PDPC321 Tuning Metadata
struct TFEPDPC321TuningMetadata
{
    UINT32              PDPC321Config0[TFEPDPC321Registers0];
    UINT32              PDPC321Config1[TFEPDPC321Registers1];
    UINT32              PDPC321Config2[TFEPDPC321Registers2];
    UINT32              PDPC321Config3[TFEPDPC321Registers3];
    UINT32              PDPC321Config4[TFEPDPC321Registers4];
    UINT32              PDPC321Config5[TFEPDPC321Registers4];
} CAMX_PACKED;

/// @brief WBBDS111 Tuning Metadata
struct TFEWBBDS111TuningMetadata
{
    UINT32              WBBDS111Config1[TFEWBBDS111ConfigRegisters1];
    UINT32              WBBDS111Config2[TFEWBBDS111ConfigRegisters2];
    UINT32              WBBDS111Config3[TFEWBBDS111ConfigRegisters3];
} CAMX_PACKED;

/// @brief BDS4 Tuning Metadata
struct TFEBDS4TuningMetadata
{
    UINT32              BDS4Config1[TFEBDS4ConfigRegisters1];
    UINT32              BDS4Config2[TFEBDS4ConfigRegisters2];
} CAMX_PACKED;

/// @brief BDS2 Tuning Metadata
struct TFEBDS2TuningMetadata
{
    UINT32              BDS2Config1[TFEBDS2ConfigRegisters1];
    UINT32              BDS2Config2[TFEBDS2ConfigRegisters2];
} CAMX_PACKED;

/// @brief WB14 Tuning Metadata
struct TFEWB14TuningMetadata
{
    UINT32              WB14Config1[TFEWB14ConfigRegisters1];
    UINT32              WB14Config2[TFEWB14ConfigRegisters2];
} CAMX_PACKED;

/// @brief DS4CST Tuning Metadata
struct TFEDS4CSTTuningMetadata
{
    UINT32              DS4CSTConfig1[TFEDS4CSTConfigRegisters1];
    UINT32              DS4CSTConfig2[TFEDS4CSTConfigRegisters2];
} CAMX_PACKED;

/// @brief AICST Tuning Metadata
struct TFEAICSTTuningMetadata
{
    UINT32              AICSTConfig1[TFEAICSTConfigRegisters1];
    UINT32              AICSTConfig2[TFEAICSTConfigRegisters2];
} CAMX_PACKED;

/// @bried BLS register configuration
struct TFEBLS121TuningMetadata
 {
     UINT32            BLS121Config1[TFEBLS121Registers1];
     UINT32            BLS121Config2[TFEBLS121Registers2];
 } CAMX_PACKED;

/// @biref ABF 211 Tuning metadata
struct TFEABF211TuningMetadata
{
    UINT32              ABF211Config0[TFEABF211Registers0];
    UINT32              ABF211Config1[TFEABF211Registers1];
    UINT32              ABF211Config2[TFEABF211Registers2];
} CAMX_PACKED;

/// @brief GTM 121 Tuning Metadata
struct TFEGTM121TuningMetadata
{
    UINT32              GTM121Config[TFEGTM121Registers];
} CAMX_PACKED;

/// @brief Gamma Tuning Metadata
struct TFEGamma101TuningMetadata
{
    UINT32               gammaConfig[TFEGamma101Registers];
} CAMX_PACKED;

/// @brief AECBG 18 Tuning Metadata
struct TFEAECBG18TuningMetadata
{
    UINT32               AECBGConfig[TFEAECBG18Registers];
} CAMX_PACKED;

/// @brief BHist15 Tuning Metadata
struct TFEBHist15TuningMetadata
{
    UINT32               moduleConfig;
    UINT32               BHistConfig[TFEBHist15Registers];
} CAMX_PACKED;

/// @brief TintlessBG18 Tuning metadata
struct TFETintlessBG18TuningMetadata
{
    UINT32               moduleConfig;
    UINT32               regionConfig[TFETintlessBG18Registers];
} CAMX_PACKED;

/// @brief AWBBG18 Tuning metadata
struct TFEAWBBG18TuningMetadata
{
    UINT32               moduleConfig[TFEAWBBG18Registers];
} CAMX_PACKED;

/// @brief RS16 Tuning metadata
struct TFERS16TuningMetadata
{
    UINT32               moduleConfig;
    UINT32               regionConfig[TFERS16Registers];
} CAMX_PACKED;

/// @brief BAF27 Tuning metadata
struct TFEBAF27TuningMetadata
{
    UINT32               BAFConfig[TFEBAF27ConfigRegisters];
    UINT32               hFIRIIRConfig[TFEBAF27HFIRIIRConfigRegisters];
    UINT32               vIIRConfig[TFEBAF27VIIRConfigRegisters];
    UINT32               shiftBitsConfig;
    UINT32               hThresholdConfig[TFEBAF27HThresholdConfRegisters];
    UINT32               vThresholdConfig[TFEBAF27VThresholdConfRegisters];
    UINT32               coringConfig[TFEBAF27CoringConfigRegisters];
    UINT32               interruptConfig[TFEBAF27InterruptConfRegisters];
    UINT32               regionConfig[TFEBAF27RegionConfigRegisters];
    UINT32               BLConfig[TFEBAF27BLConfigRegisters];
    UINT32               activeWindowConfig[TFEBAF27ActWinConfigRegisters];
} CAMX_PACKED;

/// @brief BAF28 Tuning metadata
struct TFEBAF28TuningMetadata
{
    UINT32               BAFConfig[TFEBAF28ConfigRegisters];
    UINT32               hFIRIIRConfig[TFEBAF28HFIRIIRConfigRegisters];
    UINT32               v1IIRConfig[TFEBAF28V1IIRConfigRegisters];
    UINT32               v2IIRConfig[TFEBAF28V2IIRConfigRegisters];
    UINT32               shiftBitsConfig;
    UINT32               hThresholdConfig[TFEBAF28HThresholdConfRegisters];
    UINT32               vThresholdConfig[TFEBAF28VThresholdConfRegisters];
    UINT32               coringConfig[TFEBAF28CoringConfigRegisters];
    UINT32               interruptConfig[TFEBAF28InterruptConfRegisters];
    UINT32               regionConfig[TFEBAF28RegionConfigRegisters];
    UINT32               BLConfig[TFEBAF28BLConfigRegisters];
    UINT32               activeWindowConfig[TFEBAF28ActWinConfigRegisters];
} CAMX_PACKED;

/// @brief TFE PDAF Tuning Metadata
struct TFEPDAFMetadata670
{
    DebugDataHeaderV1   header;
    UINT32              PDAFConfig[TFEPDAFRegistersTitan670];
} CAMX_PACKED;

/// @brief OPE BPCABF registers configuration
struct OPEBPCABFTuningMetadata
{
    UINT32  OPEBPCABFConfig1[OPEBPCABFConfigRegisters1];
    UINT32  OPEBPCABFConfig2[OPEBPCABFConfigRegisters2];
    UINT32  OPEBPCABFConfig3[OPEBPCABFConfigRegisters3];
    UINT32  OPEBPCABFConfig4[OPEBPCABFConfigRegisters4];
    UINT32  OPEBPCABFConfig5[OPEBPCABFConfigRegisters5];
    UINT32  OPEBPCABFConfig6[OPEBPCABFConfigRegisters6];
} CAMX_PACKED;

/// @brief OPE LSC registers configuration
struct OPELSCTuningMetadata
{
    UINT32  rolloffConfig1[OPELSCConfigRegisters1];
    UINT32  rolloffConfig2[OPELSCConfigRegisters2];
    UINT32  rolloffConfig3[OPELSCConfigRegisters3];
    UINT32  rolloffConfig4[OPELSCConfigRegisters4];
    UINT32  rolloffConfig5[OPELSCConfigRegisters5];
} CAMX_PACKED;

/// @brief OPE BLS12 registers configuration
struct OPEBLSTuningMetadata
{
    UINT32 OPEBLSConfig1[OPEBLSConfigRegisters1];
    UINT32 OPEBLSConfig2[OPEBLSConfigRegisters2];
}CAMX_PACKED;

/// @brief OPE Demosaic registers configuration
struct OPEDemosaicTuningMetadata
{
    UINT32 OPEDemosaicConfig1[OPEDemosaicConfigRegisters1];
    UINT32 OPEDemosaicConfig2[OPEDemosaicConfigRegisters2];
}CAMX_PACKED;

/// @brief OPE Color Correction registers configuration
struct OPECCTuningMetadata
{
    UINT32 OPECCConfig1[OPECCConfigRegisters1];
    UINT32 OPECCConfig2[OPECCConfigRegisters2];
}CAMX_PACKED;

/// @brief OPE Chroma Enhancement registers configuration
struct OPEChromaEnhancementMetadata
{
    UINT32  OPECEConfig1[OPEChromaEnhancementConfigRegisters1];
    UINT32  OPECEConfig2[OPEChromaEnhancementConfigRegisters2];
} CAMX_PACKED;

/// @brief OPE CSMCE registers configuration
struct OPECSMCEMetadata
{
    UINT32  CSConfig[OPECSMCEConfigRegisters];
} CAMX_PACKED;

/// @brief OPE Skin Color Enhancement registers configuration
struct OPESCEMetadata
{
    UINT32  OPESCEConfig1[OPESCEConfigRegisters1];
    UINT32  OPESCEConfig2[OPESCEConfigRegisters2];
    UINT32  OPESCEConfig3[OPESCEConfigRegisters3];
    UINT32  OPESCEConfig4[OPESCEConfigRegisters4];
    UINT32  OPESCEConfig5[OPESCEConfigRegisters5];
    UINT32  OPESCEConfig6[OPESCEConfigRegisters6];
} CAMX_PACKED;

/// @brief OPE WNR registers configuration
struct OPEWNRMetadata
{
    UINT32  OPEWNRConfig1[OPEWNRConfigRegisters1];
    UINT32  OPEWNRConfig2[OPEWNRConfigRegisters2];
    UINT32  OPEWNRConfig3[OPEWNRConfigRegisters3];
    UINT32  OPEWNRConfig4[OPEWNRConfigRegisters4];
} CAMX_PACKED;

/// @brief OPE Upscaler registers configuration
struct OPEUpscalerMetadata
{
    UINT32  OPEUpscalerConfig1[OPEUpscalerConfigRegisters1];
    UINT32  OPEUpscalerConfig2[OPEUpscalerConfigRegisters2];
    UINT32  OPEUpscalerConfig3[OPEUpscalerConfigRegisters3];
    UINT32  OPEUpscalerConfig4[OPEUpscalerConfigRegisters4];
} CAMX_PACKED;

/// @brief OPE ASF registers configuration
struct OPEASFMetadata
{
    UINT32  OPEASFConfig1[OPEASFConfigRegisters1];
    UINT32  OPEASFConfig2[OPEASFConfigRegisters2];
    UINT32  OPEASFConfig3[OPEASFConfigRegisters3];
    UINT32  OPEASFConfig4[OPEASFConfigRegisters4];
    UINT32  OPEASFConfig5[OPEASFConfigRegisters5];
    UINT32  OPEASFConfig6[OPEASFConfigRegisters6];
    UINT32  OPEASFConfig7[OPEASFConfigRegisters7];
} CAMX_PACKED;

struct OPEWBMetadata
{
    UINT32  OPEWBConfig1[OPEWBConfigRegisters1];
    UINT32  OPEWBConfig2[OPEWBConfigRegisters2];
} CAMX_PACKED;

struct OPEGTMMetadata
{
    UINT32  OPEGTMConfig[OPEGTMConfigRegisters];
} CAMX_PACKED;

struct OPELTMMetadata
{
    UINT32  OPELTMConfig1[OPELTMConfigRegisters1];
    UINT32  OPELTMConfig2[OPELTMConfigRegisters2];
    UINT32  OPELTMConfig3[OPELTMConfigRegisters3];
    UINT32  OPELTMConfig4[OPELTMConfigRegisters4];
    UINT32  OPELTMConfig5[OPELTMConfigRegisters5];
    UINT32  OPELTMConfig6[OPELTMConfigRegisters6];
    UINT32  OPELTMConfig7[OPELTMConfigRegisters7];
} CAMX_PACKED;


/// @brief OPE Gamma registers configuration
struct OPEGammaMetadata
{
    UINT32  OPEGammaConfig[OPEGammaConfigRegisters];
} CAMX_PACKED;

/// @brief OPE CST registers configuration
struct OPECSTMetadata
{
    UINT32  OPECSTConfig[OPECSTConfigRegisters];
} CAMX_PACKED;

/// @brief Demux registers configuration
struct OPEDemuxTuningMetadata
{
    UINT32  demuxConfig1[OPEDemuxConfigRegisters1];
    UINT32  demuxConfig2[OPEDemuxConfigRegisters2];
} CAMX_PACKED;

/// @brief Structure to encapsulate TFE DMI metadata
struct TFEDMILUTData
{
     LSC35MeshLUT LSCMesh;                 ///< LSC mesh LUT
} CAMX_PACKED;

/// @brief Structure to encapsulate TFE DMI LUT packed data for titan640
struct TFEDMILUTData640
{
    TFEGTM121LUT           GTM;                    ///< GTM LUT
    TFELSC351LUT           LSC;                    ///< LSC LUT
    TFEPDPC321LUT          PDPC;                   ///< PDPC LUT
    Gamma101Curve          gamma;                  ///< Gamma LUT curve
    union
    {
        BAF27Gamma             BAF27Gamma;         ///< BAF27 Gamma curve
        BAF28LUT               BAF28LUT;           ///< BAF28 LUT
    };
} CAMX_PACKED;

struct TFEDMITuningMetadata
{
    TFEDMILUTData   packedLUT;
} CAMX_PACKED;

/// @brief Structure to encapsulate OPE DMI metadata
struct OPEDMILUTData
{
    OPEABF41LUT         ABFLUT;                     ///< ABF mesh LUT
    OPEGTM12LUT         GTM;                        ///< GTM LUT
    OPELTM15LUT         LTMLUT;                     ///< LTM LUT
    OPEGamma15Curve     gamma[OPEGammaMaxChannel];  ///< Gamma LUT curve
    OPEASF32LUT         ASFLUT;                     ///< ASF LUT
    OPELSC35LUT         LSCLUT;                     ///< LSC LUT
} CAMX_PACKED;

struct OPEDMITuningMetadata
{
    OPEDMILUTData   packedLUT;
} CAMX_PACKED;

/// @brief Defines the exposure parameters to control the frame exposure setting to sensor and ISP
struct Tuning5xAECExposureData
{
    UINT64  exposureTime;         ///< The exposure time in nanoseconds used by sensor
    FLOAT   linearGain;           ///< The total gain consumed by sensor only
    FLOAT   sensitivity;          ///< The total exposure including exposure time and gain
    FLOAT   deltaEVFromTarget;    ///< The current exposure delta compared with the desired target
} CAMX_PACKED;

/// @brief Structure to encapsulate AEC Frame Control

struct Tuning5xAECFrameControl
{
    Tuning5xAECExposureData exposureInfo[ExposureIndexCount];    ///< Exposure info including gain and exposure time
    FLOAT                   luxIndex;                            ///< Future frame lux index,  consumed by ISP
    UINT8                   flashInfo;                           ///< Flash information if it is main or preflash
    UINT8                   preFlashState;                       ///< Preflash state from AEC, consumed by Sensor
    UINT32                  LEDCurrents[LEDSettingCount];        ///< The LED currents value for the use case of LED snapshot
} CAMX_PACKED;

/// @brief Structure to encapsulate AWB Frame Control
struct Tuning5xAWBFrameControl
{
    FLOAT   AWBGains[RGBChannelCount];          ///< R/G/B gains
    UINT32  colorTemperature;                   ///< Color temperature
    UINT8   isCCMOverrideEnabled;               ///< Flag indicates if CCM override is enabled.
    FLOAT   CCMOffset[AWBNumCCMRows];           ///< The offsets for color correction matrix
    FLOAT   CCM[AWBNumCCMRows][AWBNumCCMCols]; ///< The color correction matrix
} CAMX_PACKED;

/// @brief Structure to encapsulate Sensor data
struct SensorTuning5xData
{
    PixelFormat         format;            ///< Pixel format
    UINT                numPixelsPerLine;  ///< Number of pixels per line (lineLengthPclk)
    UINT                numLinesPerFrame;  ///< Number of lines per frame (frameLengthLines)
    UINT                maxLineCount;      ///< Max line count
    SensorResolution    resolution;        ///< Sensor output resolution for this mode
    SensorCropInfo      cropInfo;          ///< Crop info for this modes
    UINT                binningTypeH;      ///< Binning horizontal
    UINT                binningTypeV;      ///< Binning vertical
} CAMX_PACKED;

/// @brief Structure encapsulating Trigger data
struct TFETuningTriggerData
{
    FLOAT       AECexposureGainRatio;       ///< Input trigger value:  AEC exposure/gain ratio
    FLOAT       AECexposureTime;            ///< Input trigger value:  AEC exposure time
    FLOAT       AECSensitivity;             ///< Input trigger value:  AEC sensitivity data
    FLOAT       AECGain;                    ///< Input trigger value:  AEC Gain Value
    FLOAT       AECLuxIndex;                ///< Input trigger value:  Lux index
    FLOAT       AWBleftGGainWB;             ///< Input trigger value:  AWB G channel gain
    FLOAT       AWBleftBGainWB;             ///< Input trigger value:  AWB B channel gain
    FLOAT       AWBleftRGainWB;             ///< Input trigger value:  AWB R channel gain
    FLOAT       AWBColorTemperature;        ///< Input Trigger value:  AWB CCT value
    FLOAT       DRCGain;                    ///< Input trigger value:  DRCGain
    FLOAT       DRCGainDark;                ///< Input trigger value:  DRCGainDark
    FLOAT       lensPosition;               ///< Input trigger value:  Lens position
    FLOAT       lensZoom;                   ///< Input trigger value:  Lens Zoom
    FLOAT       postScaleRatio;             ///< Input trigger value:  Post scale ratio
    FLOAT       preScaleRatio;              ///< Input trigger value:  Pre scale ratio
    UINT32      sensorImageWidth;           ///< Current Sensor Image Output Width
    UINT32      sensorImageHeight;          ///< Current Sensor Image Output Height
    UINT32      CAMIFWidth;                 ///< Width of CAMIF Output
    UINT32      CAMIFHeight;                ///< Height of CAMIF Output
    UINT16      numberOfLED;                ///< Number of LED
    INT32       LEDSensitivity;             ///< LED Sensitivity
    UINT32      bayerPattern;               ///< Bayer pattern
    UINT32      sensorOffsetX;              ///< Current Sensor Image Output horizontal offset
    UINT32      sensorOffsetY;              ///< Current Sensor Image Output vertical offset
    UINT32      blackLevelOffset;           ///< Black level offset
    FLOAT       LEDFirstEntryRatio;         ///< Ratio of Dual LED
} CAMX_PACKED;

/// @brief Structure encapsulating Sensor configuration data
struct TFESensorConfigData
{
    INT32                           isBayer;                    ///< Flag to indicate Bayer sensor
    INT32                           format;                     ///< Image Format
    FLOAT                           digitalGain;                ///< Digital Gain Value
    UINT32                          ZZHDRColorPattern;          ///< ZZHDR Color Pattern Information
    ZZHDRFirstExposurePattern       ZZHDRFirstExposure;  ///< ZZHDR First Exposure Pattern
} CAMX_PACKED;

/// @brief: Node information
struct TFENodeInformation
{
    UINT32  instanceId;
    UINT64  requestId;
    UINT32  isRealTime;
    UINT32  profileId;
    UINT32  processingType;
} CAMX_PACKED;

/// @brief TFE Unified HDR data, TuningTFEUnifiedHDRData
struct TFEUnifiedHDRData
{
    UINT32              numExposures;   ///< Number of exposures
    UINT32              numSubRequests; ///< Number of sub-request
    UINT32              contextType;    ///< Exposure context type
    UINT32              hdrMode;        ///< HDR mode
    UINT32              exposureIndex;  ///< Exposure index, used
    UINT32              reserved[3];    ///< Reserved for additional feature data
} CAMX_PACKED;

/// @brief Structure to encapsulate custom OEM data from IQ modules
struct IQOEMTuning5xMetadata
{
    FLOAT   IQOEMTuning5xData[IQOEMTuning5xData];
} CAMX_PACKED;

/// @brief: CAMX Tuning mode data
struct OPETuningModeDebugData
{
    UINT32  base;       ///< Default tuning data
    UINT32  sensor;     ///< Sensor mode
    UINT32  usecase;    ///< Usecase mode
    UINT32  feature1;   ///< Feature 1 mode
    UINT32  feature2;   ///< Feature 2 mode
    UINT32  scene;      ///< Scene mode
    UINT32  effect;     ///< Effect mode
} CAMX_PACKED;

/// @brief Structure encapsulating Trigger data
struct OPETuningTriggerData
{
    FLOAT       predictiveGain;                        ///< digital gain from predictive convergence algorithm
    FLOAT       AECYHistStretchClampOffset;            ///< Dark Clamp Value for Hist Stretch
    FLOAT       AECYHistStretchScaleFactor;            ///< Scaling Value for Hist Stretch
} CAMX_PACKED;

struct OPETuningMetadata
{
    OPEDMITuningMetadata           OPEDMIData;
    OPEBPCABFTuningMetadata        OPEBPCABFData;
    OPEBLSTuningMetadata           OPEBLSData;
    OPEDemosaicTuningMetadata      OPEDemosaicData;
    OPECCTuningMetadata            OPECCData;
    OPECSMCEMetadata               OPEChromaCSMCEData;
    OPEChromaEnhancementMetadata   OPEChromaEnhancementData;
    OPESCEMetadata                 OPESCEData;
    OPEWNRMetadata                 OPEWNRData;
    OPEASFMetadata                 OPEASFData;
    OPEUpscalerMetadata            OPEUpsclaerData;
    OPEWBMetadata                  OPEWBData;
    OPEGTMMetadata                 OPEGTMData;
    OPELTMMetadata                 OPELTMData;
    OPEGammaMetadata               OPEGammaData;
    OPECSTMetadata                 OPECSTData;
    OPETuningModeDebugData         OPETuningModeDebugData;
    OPETuningTriggerData           OPETuningTriggers;
    OPEDemuxTuningMetadata         OPEDemuxData;
    OPELSCTuningMetadata           OPELSCData;
} CAMX_PACKED;

/// @brief Structure to encapsulate metadata TFE
struct TFETuningMetadata5x
{
    // IQ Module's Metadata
    TFEDMITuningMetadata           TFEDMIData;
    TFELSCTuningMetadata           TFELSCData;
    TFEDemuxTuningMetadata         TFEDemuxData;
    TFEWBBDSDPCTuningMetadata      TFEWBBDSDPCData;
} CAMX_PACKED;

/// @brief Structure to encapsulate metadata TFE
struct TFETuningMetadata640
{
    // IQ Module's Metadata
    TFEDMILUTData640                  TFEDMIData;              ///< TFE DMI LUT packed data
    TFEDemux141TuningMetadata         TFEDemuxData;            ///< TFE Demux data
    TFELSC351TuningMetadata           TFELSCData;              ///< TFE LSC data
    TFEPDPC321TuningMetadata          TFEPDPCData;             ///< TFE PDPC data
    TFEWBBDS111TuningMetadata         TFEWBBDSData;            ///< TFE WBBDS data
    TFEBDS4TuningMetadata             TFEBDS4Data;             ///< TFE BDS4 data
    TFEBDS2TuningMetadata             TFEBDS2Data;             ///< TFE BDS2 data
    TFEWB14TuningMetadata             TFEWB14Data;             ///< TFE WB14 data
    TFEDS4CSTTuningMetadata           TFEDS4CSTData;           ///< TFE DS4CST data
    TFEAICSTTuningMetadata            TFEAICSTData;            ///< TFE AICST data
    TFEBLS121TuningMetadata           TFEBLSData;              ///< TFE BLS data
    TFEABF211TuningMetadata           TFEABFData;              ///< TFE ABF data
    TFEGamma101TuningMetadata         TFEGammaData;            ///< TFE Gamma data
    TFEGTM121TuningMetadata           TFEGTMData;              ///< TFE GTM data
    TFEAECBG18TuningMetadata          TFEBGData;               ///< TFE BG data
    TFEBHist15TuningMetadata          TFEBHistData;            ///< TFE BHist data
    TFETintlessBG18TuningMetadata     TFEBG18Data;             ///< TFE Tintless BG18 data
    TFEAWBBG18TuningMetadata          TFEAWBBG18Data;          ///< TFE AWBBG18 data
    TFERS16TuningMetadata             TFERS16Data;             ///< TFE RS16 data
    TFEBAF27TuningMetadata            TFEBAF27Data;            ///< TFE BAF27 data
}CAMX_PACKED;

/// @brief Structure to encapsulate metadata TFE
struct TFETuningMetadata670
{
    // IQ Module's Metadata
    TFEDMILUTData640                  TFEDMIData;              ///< TFE DMI LUT packed data
    TFEDemux141TuningMetadata         TFEDemuxData;            ///< TFE Demux data
    TFELSC351TuningMetadata           TFELSCData;              ///< TFE LSC data
    TFEPDPC321TuningMetadata          TFEPDPCData;             ///< TFE PDPC data
    TFEWBBDS111TuningMetadata         TFEWBBDSData;            ///< TFE WBBDS data
    TFEBDS4TuningMetadata             TFEBDS4Data;             ///< TFE BDS4 data
    TFEBDS2TuningMetadata             TFEBDS2Data;             ///< TFE BDS2 data
    TFEWB14TuningMetadata             TFEWB14Data;             ///< TFE WB14 data
    TFEDS4CSTTuningMetadata           TFEDS4CSTData;           ///< TFE DS4CST data
    TFEAICSTTuningMetadata            TFEAICSTData;            ///< TFE AICST data
    TFEBLS121TuningMetadata           TFEBLSData;              ///< TFE BLS data
    TFEABF211TuningMetadata           TFEABFData;              ///< TFE ABF data
    TFEGamma101TuningMetadata         TFEGammaData;            ///< TFE Gamma data
    TFEGTM121TuningMetadata           TFEGTMData;              ///< TFE GTM data
    TFEAECBG18TuningMetadata          TFEBGData;               ///< TFE BG data
    TFEBHist15TuningMetadata          TFEBHistData;            ///< TFE BHist data
    TFETintlessBG18TuningMetadata     TFEBG18Data;             ///< TFE Tintless BG18 data
    TFEAWBBG18TuningMetadata          TFEAWBBG18Data;          ///< TFE AWBBG18 data
    TFERS16TuningMetadata             TFERS16Data;             ///< TFE RS16 data
    TFEBAF28TuningMetadata            TFEBAF28Data;            ///< TFE BAF28 data
    TFEPDAFMetadata670                TFEPDAFData670;          ///< TFE PDAF31 data
}CAMX_PACKED;

/// @brief Structure to encapsulate metadata from TFE
struct TFETuningMetadata
{
    // Common Metadata for Mimas targets
    SensorTuning5xData             sensorData;
    TFESensorConfigData            TFESensorConfig;
    TFETuningTriggerData           TFETuningTriggers;
    IQOEMTuning5xMetadata          oemTuningData;
    TFENodeInformation             TFENodeInformation;         ///< TFE Node related information
    TFEUnifiedHDRData              TFEUnifiedHDRInformation;   ///< TFE Unified HDR information
    union
    {
        // Tintan5x tuning metadata
        TFETuningMetadata5x            metadata5x;                ///< Tuning metadata
        // Tintan640 tuning metadata
        TFETuningMetadata640           metadata640;               ///< Tuning metadata
        // 640 and 670 Tuning Metadata structs are same till RS16. So, taking advantage of Union
        // Tintan670 tuning metadata
        TFETuningMetadata670           metadata670;               ///< Tuning metadata
    };
} CAMX_PACKED;

CAMX_END_PACKED

class Titan5xTDDebugDataWriter : public DebugDataWriter
{
public:
    Titan5xTDDebugDataWriter()
        : DebugDataWriter(WriterId::OtherWriter)
    {
    }

protected:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// PopulateTypeDefinitionTag
    ///
    /// @brief  Adds all fields for this specific type of tag. This is an implementation of a pure virtual function.
    ///
    /// @param  type    The tag type to be added
    ///
    /// @return CamxResult
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult PopulateTypeDefinitionTag(
        DebugDataTagType type)
    {
        BOOL bSuccess = FALSE;

        switch (type)
        {
            // Data helpers using DebugDataHeaderV1 struct as header
            case DebugDataTagType::DebugDataHeaderV1:
                bSuccess |= AddTypedefField(DebugDataTagType::UInt16);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt8);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt8);
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt16,
                                                 CAMX_ARRAY_SIZE(DebugDataHeaderV1::reservedID));
                break;
            case DebugDataTagType::H1Char:
                bSuccess |= AddTypedefField(DebugDataTagType::DebugDataHeaderV1);
                bSuccess |= AddTypedefField(DebugDataTagType::Char);
                break;
            case DebugDataTagType::H1Bool:
                // Explicitly ensure that bool is one byte. Depending on implementation, BOOL/bool could be 4 bytes
                bSuccess |= AddTypedefField(DebugDataTagType::DebugDataHeaderV1);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt8);
                break;
            case DebugDataTagType::H1UInt8:
                bSuccess |= AddTypedefField(DebugDataTagType::DebugDataHeaderV1);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt8);
                break;
            case DebugDataTagType::H1UInt16:
                bSuccess |= AddTypedefField(DebugDataTagType::DebugDataHeaderV1);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt16);
                break;
            case DebugDataTagType::H1UInt32:
                bSuccess |= AddTypedefField(DebugDataTagType::DebugDataHeaderV1);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                break;
            case DebugDataTagType::H1UInt64:
                bSuccess |= AddTypedefField(DebugDataTagType::DebugDataHeaderV1);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt64);
                break;
            case DebugDataTagType::H1Int8:
                bSuccess |= AddTypedefField(DebugDataTagType::DebugDataHeaderV1);
                bSuccess |= AddTypedefField(DebugDataTagType::Int8);
                break;
            case DebugDataTagType::H1Int16:
                bSuccess |= AddTypedefField(DebugDataTagType::DebugDataHeaderV1);
                bSuccess |= AddTypedefField(DebugDataTagType::Int16);
                break;
            case DebugDataTagType::H1Int32:
                bSuccess |= AddTypedefField(DebugDataTagType::DebugDataHeaderV1);
                bSuccess |= AddTypedefField(DebugDataTagType::Int32);
                break;
            case DebugDataTagType::H1Int64:
                bSuccess |= AddTypedefField(DebugDataTagType::DebugDataHeaderV1);
                bSuccess |= AddTypedefField(DebugDataTagType::Int64);
                break;
            case DebugDataTagType::H1Float:
                bSuccess |= AddTypedefField(DebugDataTagType::DebugDataHeaderV1);
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                break;
            case DebugDataTagType::H1Double:
                bSuccess |= AddTypedefField(DebugDataTagType::DebugDataHeaderV1);
                bSuccess |= AddTypedefField(DebugDataTagType::Double);
                break;
            case DebugDataTagType::H1QNumber:
                bSuccess |= AddTypedefField(DebugDataTagType::DebugDataHeaderV1);
                bSuccess |= AddTypedefField(DebugDataTagType::QNumber);
                break;
            case DebugDataTagType::H1UQNumber:
                bSuccess |= AddTypedefField(DebugDataTagType::DebugDataHeaderV1);
                bSuccess |= AddTypedefField(DebugDataTagType::UQNumber);;
                break;
            case DebugDataTagType::H1Rational:
                bSuccess |= AddTypedefField(DebugDataTagType::DebugDataHeaderV1);
                bSuccess |= AddTypedefField(DebugDataTagType::Rational);;
                break;
            case DebugDataTagType::H1URational:
                bSuccess |= AddTypedefField(DebugDataTagType::DebugDataHeaderV1);
                bSuccess |= AddTypedefField(DebugDataTagType::URational);;
                break;
            // End-of-data helpers using DebugDataHeaderV1 struct as header

            case DebugDataTagType::TuningTFELSC35MeshLUT:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(LSC35MeshLUT::GRRLUT));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(LSC35MeshLUT::GBBLUT));
                break;

            case DebugDataTagType::TuningTFEDemux14Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(TFEDemuxTuningMetadata::demuxConfig1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(TFEDemuxTuningMetadata::demuxConfig2));
                break;

            case DebugDataTagType::TuningTFELSC35Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFELSCTuningMetadata::rolloffConfig1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFELSCTuningMetadata::rolloffConfig2));
                break;

            case DebugDataTagType::TuningTFEWBBDSDPC10Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEWBBDSDPCTuningMetadata::TFEWBBDSDPCConfig1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEWBBDSDPCTuningMetadata::TFEWBBDSDPCConfig2));
                break;

            case DebugDataTagType::TuningTFEDemuxBLS141Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEDemux141TuningMetadata::demux141Config1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEDemux141TuningMetadata::demux141Config2));
                break;

            case DebugDataTagType::TuningTFELSC351Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFELSC351TuningMetadata::rolloffConfig1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFELSC351TuningMetadata::rolloffConfig2));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFELSC351TuningMetadata::rolloffConfig3));
                break;

            case DebugDataTagType::TuningTFEPDPC321Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEPDPC321TuningMetadata::PDPC321Config0));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEPDPC321TuningMetadata::PDPC321Config1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEPDPC321TuningMetadata::PDPC321Config2));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEPDPC321TuningMetadata::PDPC321Config3));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEPDPC321TuningMetadata::PDPC321Config4));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEPDPC321TuningMetadata::PDPC321Config5));
                break;

            case DebugDataTagType::TuningTFEWBBDS111Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEWBBDS111TuningMetadata::WBBDS111Config1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEWBBDS111TuningMetadata::WBBDS111Config2));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEWBBDS111TuningMetadata::WBBDS111Config3));
                break;

            case DebugDataTagType::TuningTFEBLS121Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBLS121TuningMetadata::BLS121Config1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBLS121TuningMetadata::BLS121Config2));
                break;

            case DebugDataTagType::TuningTFEBDS4Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBDS4TuningMetadata::BDS4Config1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBDS4TuningMetadata::BDS4Config2));
                break;

            case DebugDataTagType::TuningTFEBDS2Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBDS2TuningMetadata::BDS2Config1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBDS2TuningMetadata::BDS2Config2));
                break;

            case DebugDataTagType::TuningTFEWB14Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEWB14TuningMetadata::WB14Config1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEWB14TuningMetadata::WB14Config2));
                break;

            case DebugDataTagType::TuningTFEDS4CSTConfig:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEDS4CSTTuningMetadata::DS4CSTConfig1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEDS4CSTTuningMetadata::DS4CSTConfig2));
                break;

            case DebugDataTagType::TuningTFEAICSTConfig:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEAICSTTuningMetadata::AICSTConfig1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEAICSTTuningMetadata::AICSTConfig2));
                break;

            case DebugDataTagType::TuningTFEABF211Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEABF211TuningMetadata::ABF211Config0));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEABF211TuningMetadata::ABF211Config1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEABF211TuningMetadata::ABF211Config2));
                break;

            case DebugDataTagType::TuningTFEGTM121Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEGTM121TuningMetadata::GTM121Config));
                break;
            case DebugDataTagType::TuningTFEGamma101Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEGamma101TuningMetadata::gammaConfig));
                break;

            case DebugDataTagType::TuningTFELSC351LUT:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFELSC351LUT::GRRLUT));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFELSC351LUT::GBBLUT));
                break;

            case DebugDataTagType::TuningTFEPDPC321LUT:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt64,
                    CAMX_ARRAY_SIZE(TFEPDPC321LUT::LUT));
                break;

            case DebugDataTagType::TuningTFEGTM121LUT:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEGTM121LUT::LUT));
                break;

            case DebugDataTagType::TuningTFEGamma101Curve:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(Gamma101Curve::ChannelGLUT));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(Gamma101Curve::ChannelBLUT));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(Gamma101Curve::ChannelRLUT));
                break;

            case DebugDataTagType::TuningTFEAECBG18Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEAECBG18TuningMetadata::AECBGConfig));
                break;

            case DebugDataTagType::TuningTFEBHist15Config:
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBHist15TuningMetadata::BHistConfig));
                break;

            case DebugDataTagType::TuningTFETintlessBG18Config:
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFETintlessBG18TuningMetadata::regionConfig));
                break;

            case DebugDataTagType::TuningTFEAWBBG18Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEAWBBG18TuningMetadata::moduleConfig));
                break;

            case DebugDataTagType::TuningTFERS16Config:
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFERS16TuningMetadata::regionConfig));
                break;

            case DebugDataTagType::TuningTFEBAF27Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBAF27TuningMetadata::BAFConfig));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBAF27TuningMetadata::hFIRIIRConfig));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBAF27TuningMetadata::vIIRConfig));
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBAF27TuningMetadata::hThresholdConfig));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBAF27TuningMetadata::vThresholdConfig));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBAF27TuningMetadata::coringConfig));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBAF27TuningMetadata::interruptConfig));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBAF27TuningMetadata::regionConfig));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBAF27TuningMetadata::BLConfig));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBAF27TuningMetadata::activeWindowConfig));
                break;

            case DebugDataTagType::TuningTFEBAF28Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBAF28TuningMetadata::BAFConfig));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBAF28TuningMetadata::hFIRIIRConfig));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBAF28TuningMetadata::v1IIRConfig));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBAF28TuningMetadata::v2IIRConfig));
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBAF28TuningMetadata::hThresholdConfig));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBAF28TuningMetadata::vThresholdConfig));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBAF28TuningMetadata::coringConfig));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBAF28TuningMetadata::interruptConfig));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBAF28TuningMetadata::regionConfig));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBAF28TuningMetadata::BLConfig));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(TFEBAF28TuningMetadata::activeWindowConfig));
                break;

            case DebugDataTagType::TuningTFEPDAF31Config:
                bSuccess |= AddTypedefField(DebugDataTagType::DebugDataHeaderV1);
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(TFEPDAFMetadata670::PDAFConfig));
            break;

            case DebugDataTagType::TuningTFEBAF27GammaCurve:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(BAF27Gamma::ChannelLUT));
                break;

            case DebugDataTagType::TuningTFEBAF28LUT:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(BAF28LUT::GammaLUT));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(BAF28LUT::FlexiRegionIndicationLUT));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(BAF28LUT::FlexiWidthLUT));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                    CAMX_ARRAY_SIZE(BAF28LUT::FlexiHeightLUT));
                break;

            case DebugDataTagType::TuningOPEBPCABF41LUT:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEABF41LUT::noiseLUT));
                break;

            case DebugDataTagType::TuningOPEASF32LUT:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEASF32LUT::Layer1LUT));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEASF32LUT::Layer1WeightLUT));
                break;

            case DebugDataTagType::TuningOPEGamma15Curve:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEGamma15Curve::curve));
                break;

            case DebugDataTagType::TuningOPEGTM12LUT:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEGTM12LUT::LUT));
                break;

            case DebugDataTagType::TuningOPELSC35LUT:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPELSC35LUT::OPELSCRedLUT));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPELSC35LUT::OPELSCBlueLUT));
                break;

            case DebugDataTagType::TuningOPELTM15LUT:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPELTM15LUT::WeightLUT));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPELTM15LUT::CurveLUT));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPELTM15LUT::ScaleLUT));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPELTM15LUT::MaskLUT));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPELTM15LUT::LCEPositiveLUT));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPELTM15LUT::LCENegativeLUT));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPELTM15LUT::AverageLUT));
                break;

            case DebugDataTagType::TuningOPEDemux14Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEDemuxTuningMetadata::demuxConfig1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEDemuxTuningMetadata::demuxConfig2));
                break;

            case DebugDataTagType::TuningOPEBPCABF41Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEBPCABFTuningMetadata::OPEBPCABFConfig1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEBPCABFTuningMetadata::OPEBPCABFConfig2));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEBPCABFTuningMetadata::OPEBPCABFConfig3));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEBPCABFTuningMetadata::OPEBPCABFConfig4));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEBPCABFTuningMetadata::OPEBPCABFConfig5));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEBPCABFTuningMetadata::OPEBPCABFConfig6));
                break;

            case DebugDataTagType::TuningOPEBLS12Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEBLSTuningMetadata::OPEBLSConfig1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEBLSTuningMetadata::OPEBLSConfig2));
                break;

            case DebugDataTagType::TuningOPELSC35Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPELSCTuningMetadata::rolloffConfig1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPELSCTuningMetadata::rolloffConfig2));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPELSCTuningMetadata::rolloffConfig3));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPELSCTuningMetadata::rolloffConfig4));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPELSCTuningMetadata::rolloffConfig5));
                break;

            case DebugDataTagType::TuningOPEDemosaic36Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEDemosaicTuningMetadata::OPEDemosaicConfig1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEDemosaicTuningMetadata::OPEDemosaicConfig2));
                break;

            case DebugDataTagType::TuningOPECC13Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPECCTuningMetadata::OPECCConfig1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPECCTuningMetadata::OPECCConfig2));
                break;

            case DebugDataTagType::TuningOPECE12Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEChromaEnhancementMetadata::OPECEConfig1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEChromaEnhancementMetadata::OPECEConfig2));
                break;

            case DebugDataTagType::TuningOPESCE11Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPESCEMetadata::OPESCEConfig1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPESCEMetadata::OPESCEConfig2));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPESCEMetadata::OPESCEConfig3));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPESCEMetadata::OPESCEConfig4));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPESCEMetadata::OPESCEConfig5));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPESCEMetadata::OPESCEConfig6));
                break;

            case DebugDataTagType::TuningOPEWNR24Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEWNRMetadata::OPEWNRConfig1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEWNRMetadata::OPEWNRConfig2));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEWNRMetadata::OPEWNRConfig3));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEWNRMetadata::OPEWNRConfig4));
                break;

            case DebugDataTagType::TuningOPEASF32Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEASFMetadata::OPEASFConfig1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEASFMetadata::OPEASFConfig2));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEASFMetadata::OPEASFConfig3));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEASFMetadata::OPEASFConfig4));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEASFMetadata::OPEASFConfig5));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEASFMetadata::OPEASFConfig6));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEASFMetadata::OPEASFConfig7));
                break;

            case DebugDataTagType::TuningOPEUpscaler13Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEUpscalerMetadata::OPEUpscalerConfig1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEUpscalerMetadata::OPEUpscalerConfig2));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEUpscalerMetadata::OPEUpscalerConfig3));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEUpscalerMetadata::OPEUpscalerConfig4));
                break;

            case DebugDataTagType::TuningOPEWB14Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEWBMetadata::OPEWBConfig1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEWBMetadata::OPEWBConfig2));
                break;

            case DebugDataTagType::TuningOPEGTM12Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEGTMMetadata::OPEGTMConfig));
                break;

            case DebugDataTagType::TuningOPELTM15Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPELTMMetadata::OPELTMConfig1));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPELTMMetadata::OPELTMConfig2));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPELTMMetadata::OPELTMConfig3));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPELTMMetadata::OPELTMConfig4));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPELTMMetadata::OPELTMConfig5));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPELTMMetadata::OPELTMConfig6));
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPELTMMetadata::OPELTMConfig7));
                break;

            case DebugDataTagType::TuningOPEGamma15Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPEGammaMetadata::OPEGammaConfig));
                break;

            case DebugDataTagType::TuningOPECST12Config:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(OPECSTMetadata::OPECSTConfig));
                break;

            case DebugDataTagType::TuningAECExposureData:
                bSuccess |= AddTypedefField(DebugDataTagType::UInt64);
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                break;

            case DebugDataTagType::TuningAECFrameControl:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::TuningAECExposureData,
                                                 CAMX_ARRAY_SIZE(Tuning5xAECFrameControl::exposureInfo));
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt8);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt8);
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::UInt32,
                                                 CAMX_ARRAY_SIZE(Tuning5xAECFrameControl::LEDCurrents));
                break;

           case DebugDataTagType::TuningAWBFrameControl:
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::Float,
                                                 CAMX_ARRAY_SIZE(Tuning5xAWBFrameControl::AWBGains));
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::Bool);
                bSuccess |= AddTypedefFieldArray(DebugDataTagType::Float,
                                                 CAMX_ARRAY_SIZE(Tuning5xAWBFrameControl::CCMOffset));
                bSuccess |= AddTypedefField2DArray(DebugDataTagType::Float,
                                                   CAMX_ARRAY_ROWS(Tuning5xAWBFrameControl::CCM),
                                                   CAMX_ARRAY_COLS(Tuning5xAWBFrameControl::CCM));
                break;

            case DebugDataTagType::TuningSensorResolution:
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                break;

            case DebugDataTagType::TuningSensorCropInfo:
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                break;

            case DebugDataTagType::TuningTFETriggerData:
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt16);
                bSuccess |= AddTypedefField(DebugDataTagType::Int32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                break;

            case DebugDataTagType::TuningTFESensorConfig:
                bSuccess |= AddTypedefField(DebugDataTagType::Int32);
                bSuccess |= AddTypedefField(DebugDataTagType::Int32);
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                break;

            case DebugDataTagType::TuningOPEModeInfo:
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                break;

            case DebugDataTagType::TuningOPETriggerData:
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                bSuccess |= AddTypedefField(DebugDataTagType::Float);
                break;

            case DebugDataTagType::TuningTFENodeInfo:
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt64);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                break;

            case DebugDataTagType::TuningTFEUnifiedHDRData:
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                bSuccess |= AddTypedefField(DebugDataTagType::UInt32);
                break;

            default:
                return CamxResultEUnsupported;
                break;
        }

        if (FALSE == bSuccess)
        {
            return CamxResultENoMemory;
        }

        return CamxResultSuccess;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetSizeOfType
    ///
    /// @brief  Get the size of customer type
    ///
    /// @param  type    The data type to get the size of
    ///
    /// @return Size of data
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    SIZE_T GetSizeOfType(
        DebugDataTagType type)
    {
        SIZE_T size;

        // Short circuit this method if its a built-in type
        size = GetSizeOfBuiltInType(type);
        if (0 != size)
        {
            return size;
        }
        switch(type)
        {
            // Data helpers using DebugDataHeaderV1 struct as header
            case DebugDataTagType::DebugDataHeaderV1:
                size = sizeof(DebugDataHeaderV1);
                break;
            case DebugDataTagType::H1Char:
                size = sizeof(DebugDataHeaderV1Char);
                break;
            case DebugDataTagType::H1Bool:
                // Explicitly ensure that bool is one byte. Depending on implementation, BOOL/bool could be 4 bytes
                size = sizeof(DebugDataHeaderV1UINT8);
                break;
            case DebugDataTagType::H1UInt8:
                size = sizeof(DebugDataHeaderV1UINT8);
                break;
            case DebugDataTagType::H1UInt16:
                size = sizeof(DebugDataHeaderV1UINT16);
                break;
            case DebugDataTagType::H1UInt32:
                size = sizeof(DebugDataHeaderV1UINT32);
                break;
            case DebugDataTagType::H1UInt64:
                size = sizeof(DebugDataHeaderV1UINT64);
                break;
            case DebugDataTagType::H1Int8:
                size = sizeof(DebugDataHeaderV1INT8);
                break;
            case DebugDataTagType::H1Int16:
                size = sizeof(DebugDataHeaderV1INT16);
                break;
            case DebugDataTagType::H1Int32:
                size = sizeof(DebugDataHeaderV1INT32);
                break;
            case DebugDataTagType::H1Int64:
                size = sizeof(DebugDataHeaderV1INT64);
                break;
            case DebugDataTagType::H1Float:
                size = sizeof(DebugDataHeaderV1Float);
                break;
            case DebugDataTagType::H1Double:
                size = sizeof(DebugDataHeaderV1Double);
                break;
            case DebugDataTagType::H1QNumber:
                size = sizeof(DebugDataHeaderV1QNumber);
                break;
            case DebugDataTagType::H1UQNumber:
                size = sizeof(DebugDataHeaderV1UQNumber);
                break;
            case DebugDataTagType::H1Rational:
                size = sizeof(DebugDataHeaderV1Rational);
                break;
            case DebugDataTagType::H1URational:
                size = sizeof(DebugDataHeaderV1URational);
                break;

            case DebugDataTagType::TuningTFELSC35MeshLUT:
                size = sizeof(LSC35MeshLUT);
                break;

            case DebugDataTagType::TuningTFEDemux14Config:
                size = sizeof(TFEDemuxTuningMetadata);
                break;

            case DebugDataTagType::TuningTFELSC35Config:
                size = sizeof(TFELSCTuningMetadata);
                break;

            case DebugDataTagType::TuningTFEWBBDSDPC10Config:
                size = sizeof(TFEWBBDSDPCTuningMetadata);
                break;

           case DebugDataTagType::TuningTFEDemuxBLS141Config:
                size = sizeof(TFEDemux141TuningMetadata);
                break;

            case DebugDataTagType::TuningTFELSC351Config:
                size = sizeof(TFELSC351TuningMetadata);
                break;

            case DebugDataTagType::TuningTFEPDPC321Config:
                size = sizeof(TFEPDPC321TuningMetadata);
                break;

            case DebugDataTagType::TuningTFEWBBDS111Config:
                size = sizeof(TFEWBBDS111TuningMetadata);
                break;

            case DebugDataTagType::TuningTFEBLS121Config:
                size = sizeof(TFEBLS121TuningMetadata);
                break;

            case DebugDataTagType::TuningTFEBDS4Config:
                size = sizeof(TFEBDS4TuningMetadata);
                break;

            case DebugDataTagType::TuningTFEBDS2Config:
                size = sizeof(TFEBDS2TuningMetadata);
                break;

            case DebugDataTagType::TuningTFEWB14Config:
                size = sizeof(TFEWB14TuningMetadata);
                break;

            case DebugDataTagType::TuningTFEDS4CSTConfig:
                size = sizeof(TFEDS4CSTTuningMetadata);
                break;

            case DebugDataTagType::TuningTFEAICSTConfig:
                size = sizeof(TFEAICSTTuningMetadata);
                break;

            case DebugDataTagType::TuningTFEABF211Config:
                size = sizeof(TFEABF211TuningMetadata);
                break;

            case DebugDataTagType::TuningTFEGTM121Config:
                size = sizeof(TFEGTM121TuningMetadata);
                break;

            case DebugDataTagType::TuningTFELSC351LUT:
                size = sizeof(TFELSC351LUT);
                break;

            case DebugDataTagType::TuningTFEPDPC321LUT:
                size = sizeof(TFEPDPC321LUT);
                break;

            case DebugDataTagType::TuningTFEGamma101Config:
                size = sizeof(TFEGamma101TuningMetadata);
                break;

            case DebugDataTagType::TuningTFEGTM121LUT:
                size = sizeof(TFEGTM121LUT);
                break;

            case DebugDataTagType::TuningTFEGamma101Curve:
                size = sizeof(Gamma101Curve);
                break;

            case DebugDataTagType::TuningTFEAECBG18Config:
                size = sizeof(TFEAECBG18TuningMetadata);
                break;

            case DebugDataTagType::TuningTFEBHist15Config:
                size = sizeof(TFEBHist15TuningMetadata);
                break;

            case DebugDataTagType::TuningTFETintlessBG18Config:
                size = sizeof(TFETintlessBG18TuningMetadata);
                break;

            case DebugDataTagType::TuningTFEAWBBG18Config:
                size = sizeof(TFEAWBBG18TuningMetadata);
                break;

            case DebugDataTagType::TuningTFERS16Config:
                size = sizeof(TFERS16TuningMetadata);
                break;

            case DebugDataTagType::TuningTFEBAF27Config:
                size = sizeof(TFEBAF27TuningMetadata);
                break;

            case DebugDataTagType::TuningTFEBAF28Config:
                size = sizeof(TFEBAF28TuningMetadata);
                break;

            case DebugDataTagType::TuningTFEPDAF31Config:
                size = sizeof(TFEPDAFMetadata670);
                break;

            case DebugDataTagType::TuningTFEBAF27GammaCurve:
                size = sizeof(BAF27Gamma);
                break;

            case DebugDataTagType::TuningTFEBAF28LUT:
                size = sizeof(BAF28LUT);
                break;

            case DebugDataTagType::TuningOPEBPCABF41LUT:
                size = sizeof(OPEABF41LUT);
                break;

            case DebugDataTagType::TuningOPEASF32LUT:
                size = sizeof(OPEASF32LUT);
                break;

            case DebugDataTagType::TuningOPELSC35LUT:
                size = sizeof(OPELSC35LUT);
                break;

            case DebugDataTagType::TuningOPEGamma15Curve:
                size = sizeof(OPEGamma15Curve);
                break;

            case DebugDataTagType::TuningOPEGTM12LUT:
                size = sizeof(OPEGTM12LUT);
                break;

            case DebugDataTagType::TuningOPELTM15LUT:
                size = sizeof(OPELTM15LUT);
                break;

            case DebugDataTagType::TuningOPEBPCABF41Config:
                size = sizeof(OPEBPCABFTuningMetadata);
                break;

            case DebugDataTagType::TuningOPEBLS12Config:
                size = sizeof(OPEBLSTuningMetadata);
                break;

            case DebugDataTagType::TuningOPELSC35Config:
                size = sizeof(OPELSCTuningMetadata);
                break;

            case DebugDataTagType::TuningOPEDemosaic36Config:
                size = sizeof(OPEDemosaicTuningMetadata);
                break;

            case DebugDataTagType::TuningOPECC13Config:
                size = sizeof(OPECCTuningMetadata);
                break;

            case DebugDataTagType::TuningOPECE12Config:
                size = sizeof(OPEChromaEnhancementMetadata);
                break;

            case DebugDataTagType::TuningOPESCE11Config:
                size = sizeof(OPESCEMetadata);
                break;

            case DebugDataTagType::TuningOPEWNR24Config:
                size = sizeof(OPEWNRMetadata);
                break;

            case DebugDataTagType::TuningOPEASF32Config:
                size = sizeof(OPEASFMetadata);
                break;

            case DebugDataTagType::TuningOPEUpscaler13Config:
                size = sizeof(OPEUpscalerMetadata);
                break;

            case DebugDataTagType::TuningOPEWB14Config:
                size = sizeof(OPEWBMetadata);
                break;

            case DebugDataTagType::TuningOPEGTM12Config:
                size = sizeof(OPEGTMMetadata);
                break;

            case DebugDataTagType::TuningOPELTM15Config:
                size = sizeof(OPELTMMetadata);
                break;

            case DebugDataTagType::TuningOPEGamma15Config:
                size = sizeof(OPEGammaMetadata);
                break;

            case DebugDataTagType::TuningOPECST12Config:
                size = sizeof(OPECSTMetadata);
                break;

            case DebugDataTagType::TuningAECExposureData:
                size = sizeof(Tuning5xAECExposureData);
                break;

            case DebugDataTagType::TuningAECFrameControl:
                size = sizeof(Tuning5xAECFrameControl);
                break;

            case DebugDataTagType::TuningAWBFrameControl:
                size = sizeof(Tuning5xAWBFrameControl);
                break;

            case DebugDataTagType::TuningSensorResolution:
                size = sizeof(SensorResolution);
                break;

            case DebugDataTagType::TuningSensorCropInfo:
                size = sizeof(SensorCropInfo);
                break;

            case DebugDataTagType::TuningTFETriggerData:
                size = sizeof(TFETuningTriggerData);
                break;

            case DebugDataTagType::TuningTFESensorConfig:
                size = sizeof(TFESensorConfigData);
                break;

            case DebugDataTagType::TuningOPEModeInfo:
                size = sizeof(OPETuningModeDebugData);
                break;

            case DebugDataTagType::TuningOPETriggerData:
                size = sizeof(OPETuningTriggerData);
                break;

            case DebugDataTagType::TuningOPEDemux14Config:
                size = sizeof(OPEDemuxTuningMetadata);
                break;

            case DebugDataTagType::TuningTFENodeInfo:
                size = sizeof(TFENodeInformation);
                break;

            case DebugDataTagType::TuningTFEUnifiedHDRData:
                size = sizeof(TFEUnifiedHDRData);
                break;

            default:
                break;
        }

        return size;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// AddTypeDefinitionTags
    ///
    /// @brief  Add a set of custom type definition tags based on the implementation requirements
    ///
    /// @return  CamxResult
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult AddTypeDefinitionTags()
    {
        CamxResult result = CamxResultSuccess;

        result = DebugDataWriter::AddTypeDefinitionTags(DebugDataTagType::TuningTypeBegin1,
                                                        DebugDataTagType::TuningSensorCropInfo);

        if (CamxResultSuccess == result)
        {
            result = DebugDataWriter::AddTypeDefinitionTags(DebugDataTagType::TuningTFEOPETypeBegin,
                                                            DebugDataTagType::TuningTFEOPETypeEnd);
        }
        else
        {
            CAMX_LOG_WARN(CamxLogGroupDebugData, "Failed to add 3A/Sensor types");
        }

        if (CamxResultSuccess == result)
        {
            result = DebugDataWriter::AddTypeDefinitionTags(DebugDataTagType::DebugDataHeaderV1,
                                                            DebugDataTagType::H1Double);
        }
        else
        {
            CAMX_LOG_WARN(CamxLogGroupDebugData, "Failed to add H1 types");
        }

        return result;
    }
};


CAMX_NAMESPACE_END
#endif // CAMXTITAN5XTUNINGDUMP_H
