/* dmw_epgbasepriv.h EPG Middleware baseline implementation Copyright 2004 Digital STREAM Technology, Inc. All Rights Reserved $Id: dmw_epgbasepriv.h v1.00 2004/07 cafrii Exp $ */ #ifndef __DMW_EPG_BASE_PRIV_H__ #define __DMW_EPG_BASE_PRIV_H__ //#include "DHL_PsiAPI.h" #include "DLIB_PSIP_Monitor.h" #include "DLIB_PSIP_Parser.h" #include "DLIB_PSI_Monitor.h" #include "DLIB_PSI_Parser.h" #if DMW_EPG_SUPPORT_ELAPSED_TIMER #include "DMW_Timer.h" #endif #ifndef abs #define abs(a) ((a)>=0?(a):-(a)) #endif #if 0 ____Structures____() #endif struct DmcChannelInfo_t; /* forward declaration */ /*----------------------------------------------------------------------- DmcSubChannelInfo Sub channel ÀÇ ¸ðµç PSIP Á¤º¸¸¦ ÀúÀåÇÏ´Â ±¸Á¶Ã¼ */ typedef struct { struct DmcChannelInfo_t *parent; /* back pointer to parent chInfo */ int index; /* subchannel index.. 0 ~ chInfo->n_subchannel-1 */ BOOL active; /* TRUE if this structure field data is valid */ UINT16 source_id; /* ÀÌ ¿ª½Ã vct¿¡ ³ª¿Í ÀÖÁö¸¸ ¿©±â¿¡ copy¸¦ µÐ´Ù. */ /* ´õ ½±°Ô Á¢±ÙÇϱâ ÁÁ°Ô À̰÷¿¡ vctInfo »çº»À» µÎ´Â °ÍÀº ¾î¶³±î? union { tvctChannelPtr_t tvct_info; cvctChannelPtr_t cvct_info; } vct; */ struct { UINT16 short_name[7]; UINT16 major_channel_number; UINT16 minor_channel_number; UINT16 program_number; BOOL analog; } vct_info; eitPtr_t eits[128]; /* UINT8 eit_exist[16]; */ /* ÇØ´ç eit°¡ TS»ó¿¡ Á¸ÀçÇÏ´ÂÁö¸¦ ³ªÅ¸³»´Â flag. MGT»óÀÇ Á¤º¸¿¡ ±âÃÊÇÑ´Ù. */ /* todo --> ±×³É chInfo->eit_pid Á¤º¸¸¦ º¸´Â°Ô ³´´Ù. */ BOOL eit_complete; /* ¸ðµç eit°¡ ´Ù ¼ö½ÅµÇ¸é TRUE */ int n_ett[128]; /* ettÀÇ °¹¼ö°¡ ¾Æ´Ï¶ó ¾Æ·¡ etts[k]ÀÇ element °¹¼ö (arrayÅ©±â) */ ettSectionPtr_t *etts[128]; /* ÇØ´ç eit-k¿¡ ¿¬°áµÇ¾î ÀÖ´Â ettµéÀÇ array pointerµé. */ BOOL ett_complete; /* ¸ðµç ett°¡ ´Ù ¼ö½ÅµÇ¸é TRUE */ /* todo.. ÇØ´ç ett°¡ Á¸ÀçÇÏ´ÂÁö ¾ÈÇÏ´ÂÁö¸¦ »¡¸® ¾Ë¾Æº¼¼ö ÀÖ´Â ¹æ¹ýÀ» ã¾Æº¸ÀÚ. ÇöÀç ±¸Á¶·Î´Â chInfo->ett_pid°¡ ÀÖ´ÂÁö È®ÀÎÇØº¸°í, subchInfo->eits[]¿¡¼­ °¢ eventº°·Î ETM_locationÀ» È®ÀÎÇØºÁ¾ß ÇÑ´Ù. */ ettSectionPtr_t channel_ett; BOOL channel_ett_exist; /* channel ett°¡ ¼ö½ÅµÇ¾îÁ®¾ß ÇÏ´Â °æ¿ì¿¡´Â TRUE */ /* cafrii 040726 add °¢ complete event message°¡ ºÒ·È´ÂÁö ¾Æ´ÑÁö¸¦ ÀúÀåÇÏ´Â flag. caller°¡ óÀ½ API¸¦ ºÎ¸£¸é ¸®¼ÂµÇ¾ú´Ù°¡ notifyµÇ¸é °¢°¢ setµÈ´Ù. µ¿ÀÏ event procÀÌ ¿©·¯¹ø ºÒ¸®´Â °ÍÀ» ¸·±â À§Çؼ­ÀÓ. */ BOOL eit_complete_notified; BOOL subchannel_complete_notified; BOOL subchannel_start_notified; /* cafrii 041123 add, À§¿Í µ¿ÀÏÇÑ ¸ñÀûÀÓ. */ #if DMW_EPG_SUPPORT_ELAPSED_TIMER /* cafrii 060814 add */ DMW_Counter counter; #endif } DmcSubChannelInfo; /* to access EIT: subchInfo->eits[eit_index] to access ETT: if (subchInfo->etts[eit_index]) subchInfo->etts[eit_index][event_index_in_eit] */ #define MAX_RRT_IN_PTC 5 #define CHANNEL_INFO_MAGIC 0x20040419 /*----------------------------------------------------------------------- DmcChannelInfo Physical Channel ÀÇ ¸ðµç PSIP Á¤º¸¸¦ ÀúÀåÇÏ´Â ±¸Á¶Ã¼ ³»ºÎ¿¡ Subchannel °¹¼ö ¸¸Å­ÀÇ SubchInfo ¸¦ Æ÷ÇÔÇÑ´Ù. */ typedef struct DmcChannelInfo_t { UINT32 magic; /* CHANNEL_INFO_MAGIC °ªÀ» °¡Á®¾ß ÇÔ. */ struct DmcChannelInfo_t *prev, *next; int id; /* id of this PTC.. º¸Åë rf ¹øÈ£¸¦ »ç¿ëÇÑ´Ù. */ tDHL_TSD *tsd; /* stream source */ /*----------------- table pointers -----------------*/ #if USE_EPG_MW_PSI_DOWNLOAD MPEG_PAT *pat; MPEG_PMT **pmtlist; #define MAX_STATIC_PMT_LIST_SIZE 20 MPEG_PMT *pmtlist_static[MAX_STATIC_PMT_LIST_SIZE]; #endif /* MGT °¡Àå ¸¶Áö¸·À¸·Î ¼ö½ÅµÇ¾î ÇöÀç À¯È¿ÇÑ mgt¿Í ±× ¹Ù·Î Á÷ÀüÀÇ À¯È¿Çß´ø mgt (mgt_old) µÎ°³¸¦ ÀúÀåÇÑ´Ù. */ mgtSectionPtr_t mgt, mgt_old; /* VCT */ tvctPtr_t tvct; cvctPtr_t cvct; #if DMW_EPG_SUPPORT_RRT /* RRT rrtSectionPtr_t rrts[MAX_RRT_IN_PTC]; RRT´Â Àü ä³ÎÀ» ÅëÆ²¾î¼­ 1°³¸¸ Á¸ÀçÇØ¾ß ÇÑ´Ù. µû¶ó¼­ º°µµÀÇ global º¯¼ö·Î °ü¸®ÇÑ´Ù. */ #endif /* STT */ BOOL stt_valid; /* cafrii 050721 add, flat_stt °ªÀÌ ÇѹøÀÌ¶óµµ set µÇ¸é TRUE */ sttSection_t flat_stt; /* cafrii 050330 change to flat_stt */ /* sttÀÇ descriptor´Â ÇöÀç·Î¼­´Â »ç¿ëÇÒ ÀÏÀÌ ¾ø´Ù. */ /* µû¶ó¼­ descriptor°¡ NULLÀÎ flat stt¸¦ ±â¾ïÇϵµ·Ï ÇÑ´Ù. */ UINT32 tick_stt_get; /* ÀÌ stt¸¦ ¼ö½ÅÇÏ¿´À» ¶§ÀÇ System Time Tick */ /*----------------- from mgt, various pids info.. ¹Ì¸® ÃßÃâÇØ ³õ´Â°Ô ÆíÇÏ´Ù. version ÀÇ ÃʱⰪÀº -1 (all bit 1) À¸·Î Á¤ÀÇÇϵµ·Ï ÇÑ´Ù. */ UINT16 eit_pids[128]; UINT8 eit_ver[128]; UINT16 ett_pids[128]; /* event_ett */ UINT8 ett_ver[128]; UINT16 channel_ett_pid; UINT8 channel_ett_ver; BOOLEAN tvct_exist_in_mgt, cvct_exist_in_mgt; /* cafrii 041123 À̸§ º¯°æ */ UINT8 tvct_ver; UINT8 cvct_ver; /*----------------- ÁÖÀÇ!! PID Á¤º¸°¡ mgt¿¡ ÀÖ´Ù°í ÇØ¼­ ±× tableÀÌ Á¸ÀçÇÏ´Â °ÍÀ» ÀǹÌÇÏÁö´Â ¾Ê´Â´Ù. subchannelÀÇ °¹¼ö´Â vct¿¡ ³ª¿Í Àִµ¥, ¾î´À vct°¡ »ç¿ëµÉÁö ¾Ë ¼ö ¾øÀ¸¹Ç·Î */ int n_subchannel; DmcSubChannelInfo *subchannel; /* cafrii 040726 add */ BOOL channel_complete_notified; #if DMW_EPG_SUPPORT_ELAPSED_TIMER /* cafrii 060814 add */ DMW_Counter counter; #endif } DmcChannelInfo; extern DmcChannelInfo *g_EpgDB; void Dmc_EpgLockCoreDB(BOOL bLock); BOOL Dmc_EpgLockRrtDB(BOOL bLock, BOOL bWait); /* cafrii 060714 add rrt db¸¦ À§ÇÑ º°µµÀÇ mutex ¿î¿ë. bWait°¡ FALSEÀ̸é ÇöÀç mutex »óŰ¡ lockÀÌ ºÒ°¡´ÉÇÒ °æ¿ì ±×³É return FALSEÇÑ´Ù. */ DmcChannelInfo *Dmc_GetChannelInfo(DmcChannelInfo *start, int rf); int DmwEpgBasePrint(int nLevel, char *fmt, ...); /* cafrii 041028 distinguish event etm and channel etm.. */ #define MakeEventETMID(srcid, evtid) \ ( (((srcid) & 0xffff) << 16) | ((((evtid) & 0x3fff) << 2) | 0x2) ) #define MakeChannelETMID(srcid) \ ( (((srcid) & 0xffff) << 16) ) /* cafrii 050203 add */ #define EPG_ONE_PART_CHANNEL_INDICATOR 1024 /* minor ¹øÈ£ ÀÚ¸®¿¡ ÀÌ °ªÀÌ µé¾î ÀÖÀ¸¸é majorÀÇ °ªÀ» OnePartChannel ¹øÈ£·Î ÇØ¼®ÇÏ¿© Æ©´×À» ÇÑ´Ù. DmcSubChannelInfo::vct_info ¿¡ ÀÖ´Â minor ¹øÈ£¿¡ ÀÌ °ªÀÌ »ç¿ëµÉ ¼ö ÀÖÀ½. */ /* major minor +-----------------+ +-----------------+ 0000 0011 1111 xxxx 0000 00xx xxxx xxxx (low 10 bits) nnnn nn nnnn nnnn (total 14 bits, 16383 max) */ #define EpgIsOnePartChannelNumber(major) ((major) >= 0x3f0) #define EpgConvertToOnePartChannelNumber(major,minor) \ ((((major) & 0x00F)<<10) + ((minor) & 1023)) #define EpgMajorNumberInCVCT(ch) (EpgIsOnePartChannelNumber((ch)->major_channel_number) ? \ EpgConvertToOnePartChannelNumber((ch)->major_channel_number, (ch)->minor_channel_number) : \ (ch)->major_channel_number) #define EpgMinorNumberInCVCT(ch) (EpgIsOnePartChannelNumber((ch)->major_channel_number) ? \ EPG_ONE_PART_CHANNEL_INDICATOR : (ch)->minor_channel_number) void RegisterEpgDebugSymbols(void); #endif /* __DMW_EPG_BASE_PRIV_H__ */