/*  Copyright (c) MediaArea.net SARL. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license that can
 *  be found in the License.html file in the root of the source tree.
 */
 
//---------------------------------------------------------------------------
#ifndef MediaInfo_File_Mpegh3daH
#define MediaInfo_File_Mpegh3daH
//---------------------------------------------------------------------------
 
//---------------------------------------------------------------------------
#include "MediaInfo/Tag/File__Tags.h"
#include "MediaInfo/Audio/File_Usac.h"
#include "MediaInfo/Audio/File_Aac.h"
//---------------------------------------------------------------------------
 
namespace MediaInfoLib
{
 
//***************************************************************************
// Class File_Mpegh3da
//***************************************************************************
 
struct speaker_info
{
    Aac_OutputChannel CICPspeakerIdx;
    int16u AzimuthAngle;
    bool AzimuthDirection;
    int16u ElevationAngle;
    bool ElevationDirection;
    bool isLFE;
};
 
class File_Mpegh3da : public File_Usac
{
public :
    //In
    bool   MustParse_mhaC;
    bool   MustParse_mpegh3daFrame;
 
    //Constructor/Destructor
    File_Mpegh3da();
 
private :
    //Info
    enum SignalGroupType
    {
        SignalGroupTypeChannels,
        SignalGroupTypeObject,
        SignalGroupTypeSAOC,
        SignalGroupTypeHOA,
    };
 
    enum UsacElementType
    {
        ID_USAC_SCE,
        ID_USAC_CPE,
        ID_USAC_LFE,
        ID_USAC_EXT,
    };
 
    enum UsacExtElementType
    {
        ID_EXT_ELE_FILL,
        ID_EXT_ELE_MPEGS,
        ID_EXT_ELE_SAOC,
        ID_EXT_ELE_AUDIOPREROLL,
        ID_EXT_ELE_UNI_DRC,
        ID_EXT_ELE_OBJ_METADATA,
        ID_EXT_ELE_SAOC_3D,
        ID_EXT_ELE_HOA,
        ID_EXT_ELE_FMT_CNVRTR,
        ID_EXT_ELE_MCT,
        ID_EXT_ELE_TCC,
        ID_EXT_ELE_HOA_ENH_LAYER,
        ID_EXT_ELE_HREP,
        ID_EXT_ELE_ENHANCED_OBJ_METADATA,
    };
 
    enum UsacConfigExtType
    {
        ID_CONFIG_EXT_FILL,
        ID_CONFIG_EXT_DOWNMIX,
        ID_CONFIG_EXT_LOUDNESS_INFO,
        ID_CONFIG_EXT_AUDIOSCENE_INFO,
        ID_CONFIG_EXT_HOA_MATRIX,
        ID_CONFIG_EXT_ICG,
        ID_CONFIG_EXT_SIG_GROUP_INFO,
        ID_CONFIG_EXT_COMPATIBLE_PROFILE_LEVEL_SET,
    };
 
    enum MaeDataType
    {
        ID_MAE_GROUP_DESCRIPTION,
        ID_MAE_SWITCHGROUP_DESCRIPTION,
        ID_MAE_GROUP_CONTENT,
        ID_MAE_GROUP_COMPOSITE,
        ID_MAE_SCREEN_SIZE,
        ID_MAE_GROUP_PRESET_DESCRIPTION,
        ID_MAE_DRC_UI_INFO,
        ID_MAE_SCREEN_SIZE_EXTENSION,
        ID_MAE_GROUP_PRESET_EXTENSION,
        ID_MAE_LOUDNESS_COMPENSATION,
    };
 
    struct usac_element
    {
        UsacElementType Type;
 
        usac_element(UsacElementType Type) :
            Type(Type)
        {};
    };
    vector<usac_element> Elements;
 
    struct speaker_layout
    {
        int32u numSpeakers;
        vector<Aac_OutputChannel> CICPspeakerIdxs;
        vector<speaker_info> SpeakersInfo;
 
        int8u ChannelLayout;
        speaker_layout() :
            numSpeakers(0),
            ChannelLayout(0)
        {};
    };
 
    speaker_layout referenceLayout;
 
    int32u numElements;
 
    int16u numAudioChannels;
    int16u numAudioObjects;
    int16u numSAOCTransportChannels;
    int16u numHOATransportChannels;
 
    int8u bsNumSignalGroups;
 
    int8u isMainStream;
    int8u audioSceneInfoID;
    int8u mpegh3daProfileLevelIndication;
    vector<int8u> mpegh3daCompatibleProfileLevelSet;
    int32u usacSamplingFrequency;
    int8u coreSbrFrameLengthIndex;
    std::map<int8u, std::map<int16u, drc_info> > Mpegh3da_drcInstructionsUniDrc_Data[4]; // By type, by group id, By id
    struct loudness_info_data
    {
        std::map<Ztring, loudness_info> Data[2];
    };
    std::map<int8u, loudness_info_data> Mpegh3da_loudnessInfo_Data[4]; // By type, by group id, By non-album/album then by id
    set<int32u> MHASPacketLabels;
 
    struct switch_group
    {
        vector<int8u> MemberID;
        map<string, string> Description;
        int8u ID;
        int8u DefaultGroupID;
        bool allowOnOff;
        bool defaultOnOff;
    };
    vector<switch_group> SwitchGroups;
 
    struct group
    {
        vector<int8u> MemberID;
        map<string, string> Description;
        string Language;
        int8u ID;
        int8u Kind;
        bool allowOnOff;
        bool defaultOnOff;
 
        group() :
            Kind(0)
        {}
    };
    vector<group> Groups;
 
    struct group_preset
    {
        struct condition
        {
            int8u ReferenceID;
            bool ConditionOnOff;
        };
        vector<condition> Conditions;
        map<string, string> Description;
        int8u ID;
        int8u Kind;
    };
    vector<group_preset> GroupPresets;
 
    struct signal_group
    {
        int8u Type;
        int32u bsNumberOfSignals;
        speaker_layout Layout;
    };
    vector<signal_group> SignalGroups;
 
    //Streams management
    void Streams_Fill();
    void Streams_Finish();
 
    //Buffer - Global
    void Read_Buffer_Continue();
 
    //Buffer - Per element
    void Header_Parse();
    void Data_Parse();
 
    //Elements
    void Sync();
    void Marker();
    void Crc16();
    void BufferInfo();
    void mpegh3daConfig();
    void SpeakerConfig3d(speaker_layout& Layout);
    void mpegh3daFlexibleSpeakerConfig(speaker_layout& Layout);
    void mpegh3daSpeakerDescription(speaker_info& SpeakerInfo, bool angularPrecision);
    void mpegh3daFrame();
    void FrameworkConfig3d();
    void mpegh3daDecoderConfig();
    void mpegh3daSingleChannelElementConfig(int8u sbrRatioIndex);
    void mpegh3daChannelPairElementConfig(int8u sbrRatioIndex);
    void mpegh3daExtElementConfig();
    bool mpegh3daCoreConfig();
    void mpegh3daUniDrcConfig();
    void downmixConfig();
    void mpegh3daLoudnessInfoSet();
    void ObjectMetadataConfig();
    void SAOC3DSpecificConfig();
    int32u SAOC3DgetNumChannels(speaker_layout Layout);
    void MCTConfig();
    void TccConfig();
    void EnhancedObjectMetadataConfig();
    void mpegh3daConfigExtension();
    void SignalGroupInformation();
    void CompatibleProfileLevelSet();
    void HoaRenderingMatrixSet();
    void ICGConfig();
    void mae_AudioSceneInfo();
    void mae_GroupDefinition(int8u numGroups);
    void mae_SwitchGroupDefinition(int8u numSwitchGroups);
    void mae_GroupPresetDefinition(int8u numGroupPresets);
    void mae_Data(int8u numGroups, int8u numGroupPresets);
    void mae_Description(MaeDataType type);
    void mae_ContentData();
    void mae_CompositePair();
    void mae_ProductionScreenSizeData();
    void mae_DrcUserInterfaceInfo(int16u dataLength);
    void mae_ProductionScreenSizeDataExtension();
    void mae_GroupPresetDefinitionExtension(int8u numGroupPresets);
    void mae_LoudnessCompensationData(int8u numGroups, int8u numGroupPresets);
    void audioTruncationInfo();
    void mhaC();
 
    //Helpers
    size_t num_objects_Get();
    void Streams_Fill_ChannelLayout(const string& Prefix, const speaker_layout& Layout, int8u speakerLayoutType=0);
};
 
} //NameSpace
 
#endif

V730 Not all members of a class are initialized inside the constructor. Consider inspecting: ID, allowOnOff, defaultOnOff.