#ifndef __ProgDVBChannelsListFormat
#define __ProgDVBChannelsListFormat

#pragma pack(push,1)

#define OLD_BOOL	__int32

namespace ChListFormat{
// Channels.dat file
///////////////////////////////////////////////////////////////////////////////////////
	const char TUNER_TYPE_ERROR		= 0;
	const char TUNER_TYPE_UNKNOW		= 1;
	const char TUNER_TYPE_DVB_S		= 2;
	const char TUNER_TYPE_DVB_C		= 3;
	const char TUNER_TYPE_DVB_T		= 4;
	const char TUNER_TYPE_IPTV		= 5;
	const char TUNER_TYPE_MPEG2		= 6;
	const char TUNER_TYPE_ATSC		= 7;	                                            	
	const char TUNER_TYPE_AnalogTV	= 8;
    
	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 int StorageFileHeaderID		=0x22DFBC3B;
	const int StorageFileHeaderVer		=114;

	enum EAudioType
	{
		EST_ST_AUDIO_UNKNOW		= -1,
		EST_ST_AUDIO_MPEG		= 0,
		EST_ST_AUDIO_AC3		= 1,
		EST_ST_AUDIO_AAC		= 2
	};

	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,	
	};

	enum EModulation
	{
		M_NotDefined	=-1,
		M_16QAM			=0,
		M_32QAM			=1,
		M_64QAM			=2,
		M_128QAM			=3,
		M_256QAM			=4,
		
		M_QPSK			= 20,
		M_BPSK			= 21,
		M_OQPSK			= 22,
		M_8VSB		    = 23,
		M_16VSB			= 24,
		M_NBC_QPSK		=31,    
		M_NBC_8PSK      =32

	};

	const int MAX_LNG_STREAM_COUNT=40;

	struct TStorageFileHeader{
		unsigned int m_ID;
		unsigned int m_Version;
		unsigned int m_HeaderSize;
		unsigned int m_FileLength;
		unsigned int m_ItemCount;
	};


	struct TChannelIDStruct{
		unsigned __int16	m_TID;
		unsigned __int16	m_SID;
		unsigned __int16	m_SatPosition;
		unsigned __int16	m_LNB;
		unsigned __int16	m_NID;
		unsigned __int16	m_PCR;

		int		m_Frequency;
	};

	
	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 int 			m_SubID;
		char				m_Type; 
		unsigned __int64		m_DllID;
	};

	struct TChannelIdEx2{
		ChListFormat::TChannelIDStruct	m_ID;
		ChListFormat::TDeviceID			m_DeviceID;
		DWORD				m_MulticastGroup;
	};

	struct TChannelInfoStruct{
		__int16	m_StructSize;

		ChListFormat::TChannelIDStruct	m_ID;

		wchar_t	m_Caption[64];
		wchar_t	m_ServiceLabel[32];
		wchar_t	m_ProviderLabel[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;
		
		char m_ServiceStatus;		// EIT_schedule_flag (1Bit) + EIT_present_following_flag (1Bit)
										// + Running status (3Bit) + free_CA_mode (1Bit)
		TLngStream	m_LngStreams[ChListFormat::MAX_LNG_STREAM_COUNT];
		char		m_LngStreamCount;
		char		m_CurrentAudio;
		char		m_CurrentSubtitle;
		unsigned char	m_ChannelMask;
				
		int				m_SymbolRate;
		unsigned int	m_Modulation;	
		OLD_BOOL		m_Pol;
		
		char		m_Quality;
		char		m_Level;

		int				m_ChannelNumber;
		OLD_BOOL		m_IsCanUpdate;
		unsigned int 	m_Ratio;
		bool		 	m_AdultChannel;		
		bool		 		m_bIsAvcVideo;
		unsigned __int16 	m_UnusedFlags1;
		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 char		m_MulticastGroup[4];
		unsigned __int16	m_Port;
		char			m_Pilot;
		char			m_RollOff;
	};

///////////////////////////////////////////////////////////////////////////////////////
////////////////////// Tree files format //////////////////////////////////////////////////
	const int ChannelTreeHeaderID		=0x42DFBC3A;
	const int ChannelTreeHeaderVer		=107;

	typedef enum LIST_TYPE {	
		LT_NULL=-1,
		LT_FAVORITES=0,
		LT_DYNAMIC=1		
	} 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
	};


	struct TDynamicListFilterItem {
		__int16					m_Position;
		unsigned char				m_Lnb;
		ChListFormat::TDeviceID	m_DeviceID;
	};
	

	struct TChannelTreeFileHeader2{
		unsigned int 	m_ID;
		unsigned int 	m_Version;
		unsigned int 	m_HeaderSize;
		unsigned int 	m_FileLength;
		unsigned int 	m_ItemCount;
		OLD_BOOL		m_bRequestForDelete;
		LIST_TYPE		m_Type;
	};
	struct TChannelTreeFileHeader:public TChannelTreeFileHeader2{
		OLD_BOOL		m_ChannelTypes[3]; // tv,radio,other
		wchar_t			m_Caption[64];
		int				m_SatPosiotions[500]; // not used in >=106
		int				m_SatPosiotionCount;  // not used in >=106
		SORT_TYPE		m_SortType;
		GROUP_TYPE		m_GroupType;
		OLD_BOOL		m_bShowNumber;
		OLD_BOOL		m_bLocalNumber;
		__int16			m_FilterItemCount;	// 106
		//ChListFormat::TDynamicListFilterItem;	m_DynamicListFilterItems[m_FilterItemCount]
	} ;
	
	struct TChannelTreeFolder{
		unsigned int 	m_StructSize;
		wchar_t			m_Caption[64];
		unsigned int 	m_ChannelsCount;
			// after that TChannelIDStruct[m_ChannelsCount] 
	};

};
#pragma pack(pop)

#endif
