#ifndef __ProgDVBChannelsListFormat
#define __ProgDVBChannelsListFormat

#pragma pack(push,1)

namespace ChListFormat
{
// Channels.dat file
///////////////////////////////////////////////////////////////////////////////////////

	enum ETunerType : byte
	{
		TUNER_TYPE_ERROR	= 0,
		TUNER_TYPE_UNKNOW	= 1,
		TUNER_TYPE_DVB_S	= 2,
		TUNER_TYPE_DVB_C	= 3,
		TUNER_TYPE_DVB_T	= 4,
		TUNER_TYPE_IPTV		= 5,
		TUNER_TYPE_MPEG2	= 6,
		TUNER_TYPE_ATSC		= 7,	                                            	
		TUNER_TYPE_AnalogTV	= 8,
		TUNER_TYPE_OnlineTV	= 9,
		TUNER_TYPE_ISDB_T	= 10
	};

    
	const char CHT_TV			= 0;
	const char CHT_RADIO			= 1;
	const char CHT_OTHER			= 2;
	

	const char EST_AUDIO				= 1;
	const char EST_SUBTITLE				= 2;
	const char EST_OLD_TELETEXT_PAGE	= 3;
	//const char EST_AC3_AUDIO			= 4;		
	const char EST_CA_SYSTEM			= 5;		
	const char EST_PROG_DVB_BIN			= 6;		
        
	const __int32 StorageFileHeaderID		=0x22DFBC3B;
	const __int32 StorageFileHeaderVer		=117;

	enum EAudioType
	{
		EST_ST_AUDIO_UNKNOW		= -1,
		EST_ST_AUDIO_MPEG		= 0,
		EST_ST_AUDIO_AC3		= 1,
		EST_ST_AUDIO_AAC		= 2,
		EST_ST_AUDIO_WMA		= 3,
		EST_ST_AUDIO_OGG		= 4,
		EST_ST_AUDIO_MP3        = 5,
		EST_ST_AUDIO_WMA9Voice  = 6,
		EST_ST_AUDIO_FLV        = 7
	};

	enum EVideoFormatType
	{
		EVF_None		= -1,
		EVF_MPEG		= 0,
		EVF_H264		= 1,
		EVF_WMV			= 2,
		EVF_MPEG43		= 3,
		EVF_MPEG4		= 4,
		EVF_MPEG4s		= 5,
		EVF_WMV9		= 6,
		EVF_H263		= 7,
		EVF_VP6			= 8
	};


	enum ESubtileType
	{
		EST_ST_SUBTITLE_UNKNOW				= 0,
		EST_ST_SUBTITLE_TELETEXT			= 1,
		EST_ST_SUBTITLE_BITMAP				= 2,		
		EST_ST_SUBTITLE_CLOSED_CAPTIONING	= 3
	};

	enum ERollOff {
	    ROLL_OFF_NOT_SET = -1,
	    ROLL_OFF_NOT_DEFINED = 0,
	    ROLL_OFF_20 = 1,         // .20 Roll Off (DVB-S2 Only)
	    ROLL_OFF_25,             // .25 Roll Off (DVB-S2 Only)
	    ROLL_OFF_35,             // .35 Roll Off (DVB-S2 Only)
	    ROLL_OFF_MAX,
	};

	enum EPilot {
	    PILOT_NOT_SET = -1,
	    PILOT_NOT_DEFINED = 0,
	    PILOT_OFF = 1,           // Pilot Off (DVB-S2 Only)
	    PILOT_ON,                // Pilot On  (DVB-S2 Only)
	    PILOT_MAX,
	};

	enum EFec
	{
	 FEC_AUTO=0,
 	 FEC_1_2,
	 FEC_2_3,
	 FEC_3_4,
	 FEC_3_5,
	 FEC_4_5,
	 FEC_5_6,
	 FEC_5_11,
	 FEC_7_8,
	 FEC_8_9,
	 FEC_9_10,	
	};

	struct E3DFormat
	{
		enum Values:  __int8
		{
			m2D		=0,
			m3D_LR	=1,
			m3D_RL	=2,
		};

	};
	
	struct EModulation
	{
		enum EType 
		{
			NotDefined		=-1,
			m16QAM			=0,
			m32QAM			=1,
			m64QAM			=2,
			m128QAM			=3,
			m256QAM			=4,
			
			mQPSK			= 20,
			mBPSK			= 21,
			mOQPSK			= 22,
			m8VSB		    = 23,
			m16VSB			= 24,
			m16APSK			=29,
			m32APSK			=30,
			mNBC_QPSK		=31,    
			mNBC_8PSK		=32,

			mDIRECTV		=33,          // DIRECTV DSS
			mISDB_T_TMCC	=34,      // Automatic demodulation by Transmission and Multiplexing Configuration Control signal for ISDB-T
			mISDB_S_TMCC	=35      // Automatic demodulation by Transmission and Multiplexing Configuration Control signal for ISDB-S
		};

		static bool inline IsDvbS2(EModulation::EType m){return (m==m16APSK)||(m==m32APSK)||(m==mNBC_QPSK)||(m==mNBC_8PSK);};
	};
	

	const __int32 MAX_LNG_STREAM_COUNT=40;

	struct TStorageFileHeader
	{
		unsigned __int32 m_ID;
		unsigned __int32 m_Version;
		unsigned __int32 m_HeaderSize;
		__int32 m_FileLength;
		__int32 m_ItemCount;
	};

	struct TLngStream{		
		char	m_StreamType;
		char	m_SubType;
		char	m_Language[4];
				
		__int16	m_composition_page_id_PageNumber;
		__int16	m_ancillary_page_id_MagazineNumber;
		__int16	m_Pid;
		
	};

	struct TDeviceID
	{
		unsigned __int32 			m_SubID;
		ETunerType					m_Type; 
		unsigned __int64		m_DllID;

		bool			IsEmpty(){return m_DllID==0;};
	};

	
	struct TChannelInfoStruct
	{
		__int16	m_StructSize;

		unsigned __int16	m_TID;
		unsigned __int16	m_SID;
		unsigned __int16	m_SatPosition;
		unsigned __int16	m_LNB;
		unsigned __int16	m_NID;
		unsigned __int16	m_PCR_unused;

		__int32		m_Frequency;

		wchar_t	m_Caption[96];
		wchar_t	m_ProviderName[32];
		wchar_t	m_NetworkName[32];
		
		unsigned __int16	m_VideoPID;
		unsigned __int16	m_TeletextPID;
		unsigned __int16	m_PCR_PID;
		unsigned __int16	m_PMT_PID;
		unsigned __int16	m_ECM_PID;
		
		union UFlags
		{
			unsigned char All;		//m_Flags.All 
			struct TFlags
			{
				unsigned char		Scrambled:1; //m_Flags.v.Scrambled
				unsigned char		CaptionFromEIT:1; //m_Flags.v.Scrambled
				unsigned char		ScrambledFromTS:1;
				unsigned char		AudioAndSubtitlesSelected:1;
				unsigned char		NotUsed:4;
			}v;
		}					m_Flags;
		
		TLngStream	m_LngStreams[ChListFormat::MAX_LNG_STREAM_COUNT];
		char		m_LngStreamCount;
		char		m_CurrentAudio;
		char		m_CurrentSubtitle;
		unsigned char	m_ChannelMask;
				
		__int32				m_SymbolRate;
		unsigned __int32	m_Modulation;	
		bool				m_IsVertialPolarization;
		E3DFormat::Values	m_3DFormat;
		char				m_UnUsed1;
		char				m_UnUsed2;
		
		char				m_Quality;
		char				m_Level;

		__int32				m_ChannelNumber;
		bool				m_IsCanUpdate;
		char				m_TeletextLng[3];

		char	 			m_Ratio;
	    unsigned __int16	m_Zoom;
		char				m_LetterBox;

		bool		 	m_AdultChannel;		
		unsigned char		m_VideoFormat;
		unsigned __int16 	m_ChCounter;
		TDeviceID		m_DeviceID;
		bool			m_bIsDVB_S2;
		char			m_FEC; // auto,1/2,2/3,3/4,3/5,4/5,5/6,5/11,7/8,8/9

		unsigned __int32	m_OldMulticastID;
		unsigned __int16	m_OldPort;
		char			m_Pilot;
		char			m_RollOff;

		char			m_Url[1024];
		unsigned __int64			m_TransponderIDLow;
        unsigned __int64			m_TransponderIDHi;

	};


	struct TChannelIdEx
	{
		unsigned __int16			m_SID;
		unsigned __int64			m_TransponderIDHi;
		unsigned __int64			m_TransponderIDLow;

		ChListFormat::TDeviceID			m_DeviceID;
		unsigned __int8				m_Unused; //for align to 32 bytes

		TChannelIdEx(){};
		TChannelIdEx(TChannelInfoStruct*ch)
		{
			m_SID=ch->m_SID;
			m_DeviceID=ch->m_DeviceID;
			m_TransponderIDHi=ch->m_TransponderIDHi;
			m_TransponderIDLow=ch->m_TransponderIDLow;
			m_Unused=0;
		}

		bool IsSame(TChannelIdEx *id)
		{
			return !memcmp(this,id,sizeof(this));
		}
	};

///////////////////////////////////////////////////////////////////////////////////////
////////////////////// Tree files format //////////////////////////////////////////////////
	const __int32 ChannelTreeHeaderID		=0x42DFBC3A;
	const __int32 ChannelTreeHeaderVer		=110;

	typedef enum LIST_TYPE 
	{	
		LT_NULL=-1,
		LT_UNIVERSAL=0,	
		LT_OLD_DYNAMIC=1,
		LT_OLD_FAVORITES=0
	} LIST_TYPE;

	typedef	enum GROUP_TYPE{
		GT_SAT_NAME=0,
		GT_NETWORK_NAME=1,
		GT_PROV_NAME=2,		
		GT_TRANSPONDER=3,
		GT_NONE=4
	}GROUP_TYPE;

	typedef enum SORT_TYPE{
		ST_UNSORT=-1,
		ST_CAPTION=0,
		ST_NUMBER=1,
		ST_TYPE=2
	};

	typedef enum SHOW_NUMBERS_STYLE{
		SNS_NONE=0,
		SNS_NUMBERS=1,
		SNS_SAT_POSITIONS=2,
		SNS_SAT_POSITIONS_AND_NUMBERS=3
	};


	struct TDynamicListFilterItem {
		__int16					m_Position;
		unsigned char				m_Lnb;
		ChListFormat::TDeviceID	m_DeviceID;
	};
	

	struct TChannelTreeFileHeader2
	{
		unsigned __int32 	m_ID;
		unsigned __int32 	m_Version;
		__int32 	m_HeaderSize;
		__int32 	m_FileLength;
		__int32 	m_ItemCount;
		bool			m_bRequestForDelete;
		char			m_Unused0;
		char			m_Unused1;
		char			m_Unused3;
		LIST_TYPE		m_Type;
	};

	struct TChannelTreeFileHeader:public TChannelTreeFileHeader2
	{
		__int32			m_ChannelTypes[3]; // tv,radio,other
		wchar_t			m_Caption[64];
		__int32				m_SatPosiotions[500]; // not used in >=106
		__int32				m_SatPosiotionCount;  // not used in >=106
		SORT_TYPE		m_SortType;
		GROUP_TYPE		m_GroupType;
		byte			m_ShowNumber;	//SHOW_NUMBERS_STYLE
		bool			m_bCompactStyle;
		char			m_Unused11;
		char			m_Unused13;
		bool			m_bLocalNumber;
		char			m_Unused20;
		char			m_Unused21;
		char			m_Unused33;
		__int16			m_FilterItemCount;	// 106
		__int32			m_MinBitrate;
		__int32			m_MaxBitrate;		//108

		//ChListFormat::TDynamicListFilterItem;	m_DynamicListFilterItems[m_FilterItemCount]
	} ;
	
	struct TChannelTreeFolder{
		unsigned __int32 	m_StructSize;
		wchar_t			m_Caption[64];
		unsigned __int32 	m_ChannelsCount;
			// after that TChannelIDStruct[m_ChannelsCount] 
	};

};
#pragma pack(pop)

#endif
