/* DMW_EpgBase.h EPG Middleware baseline implementation Copyright 2004 Digital STREAM Technology, Inc. All Rights Reserved $Id: DMW_EpgBase.h v1.00 2004/07 cafrii Exp $ */ #ifndef __DMW_EPG_BASE_H__ #define __DMW_EPG_BASE_H__ #define DMW_EPG_SUPPORT_RRT 1 #define DMW_EPG_SUPPORT_ELAPSED_TIMER 1 /* cafrii 060814 add 1ÀÌ¸é °¢ ä³Î/¼­ºêä³Îº°·Î scan¿¡ ¼Ò¿äµÈ counter¸¦ °¡µ¿ÇÏ¿© ÃÑ ´©Àû °Ë»ö ½Ã°£ÀÌ ¾î´ÀÁ¤µµÀÎÁö Åë°è¸¦ ³½´Ù. */ #include "DMW_EpgBasePriv.h" /* EpgBase private header file.. these are not public function and structures.. do not use this.. */ /* UpdateStart reason value ¾î¶² ÀÌÀ¯·Î epg udpate°¡ ½ÃÀ۵Ǿú´ÂÁö ¾Ë·ÁÁÜ */ enum { EpgUpdateStartByUserCall = 1, EpgUpdateStartByMgtChange = 2, }; /* Callback ÇÔ¼öÀÇ ÀÎÀÚ·Î Àü´ÞµÉ À̺¥Æ® ŸÀÔ°ú µ¿¹ÝµÇ´Â parameter Á¤ÀÇ. cafrii 041102, ±âÁ¸ Epg 1.0 °úÀÇ event id °ªÀÌ Ãæµ¹³ªÁö ¾Êµµ·Ï ½ÃÀÛ °ªÀ» Á¶Á¤ÇÔ */ typedef enum { epgEventStarted = 101, /* param 1 : reason: EpgUpdateStartxxxx °ª Áß Çϳª */ /* param 2 : none */ epgEventChannelStarted, /* cafrii 041123 add */ /* ÇØ´ç ä³ÎÀÇ Epg °Ë»öÀÌ ½ÃÀ۵ǾúÀ½À» ¾Ë¸°´Ù. param 1 : DmcEpgChannelCbParam * param 2 : none */ epgEventSubChannelStarted, /* cafrii 041123 add */ /* ÇØ´ç subchannelÀÇ epg °Ë»öÀÌ ½ÃÀ۵ǾúÀ½À» ¾Ë¸°´Ù. param 1 : DmcEpgSubChannelCbParam * param 2 : none */ epgEventEitReceived, /* param 1 : (DmcEpgStatus *) current Epg scan status of this channel param 2 : index of Eit table just received valid only when param is not (-1)UL */ epgEventEttReceived, /* param 1 : (DmcEpgStatus *) current Epg scan status of this channel param 2 : LSB[16]: index of Ett table MSB[16]: index of event in Eit 0x0000ffff means that this is channel-ETT. 0xffffffff means that table is not identified. */ epgEventEitComplete, /* param 1 : channel id param 2 : subchannel index */ epgEventSubchannelComplete, /* param 1 : channel id param 2 : subchannel index */ epgEventChannelComplete, /* param 1 : id param 2 : none */ epgEventCompleteInfo, /* cafrii 041123 add */ /* Á» ´õ ÀÚ¼¼ÇÑ 'complete' Á¤º¸¸¦ Àü´ÞÇÑ´Ù. À§ÀÇ ¼¼°¡Áö complete event ¿¡ Ãß°¡ÇÏ¿© È£ÃâµÈ´Ù. param 1 : epgEventEitComplete/SubchannelComplete/ChannelComplete Áß Çϳª param 2 : DmcEpgCompleteCbParam * */ /* epgEventCancelled, <-- ÀÌ·± event´Â ´õÀÌ»ó Á¦°øÇÏÁö ¾ÊÀ½.. */ /* param 1 : id param 2 */ epgEventUpdateChannelEtt, /* cafrii 050203 add */ /* ¾î¶² ä³ÎÀÇ ett-v °¡ ¼ö½ÅµÇ¾úÀ½. epgEventEttReceived ¿Í´Â º°µµ·Î µû·Î ºÒ¸°´Ù. ÀÌ¹Ì ¼ö½ÅµÈ ett-v ¿¡ ´ëÇØ¼­µµ ¶Ç ´Ù½Ã ºÒ¸± ¼öµµ ÀÖ´Ù. (Áߺ¹ üũ ¾ÈÇÔ) µû¶ó¼­ application ¿¡¼­ Áߺ¹ üũ¸¦ ÇØ¾ß ÇÒ °ÍÀÌ´Ù. Application ¿¡¼­´Â ä³Î °ü·Ã Á¤º¸¸¦ UCM CSD¿¡ update ÇÒ ¼ö ÀÖ´Ù. param 1 : DmcEpgChannelEttCbParam * param 2 : none */ epgEventChannelEttUpdated, /* cafrii 041129 add */ /* ¾î¶² ä³ÎÀÇ ett-v °¡ update µÇ¾úÀ¸¸ç ÀÌ Á¤º¸°¡ UCM CSD¿¡ update µÇ¾úÀ½À» ¾Ë¸°´Ù. Application ¿¡¼­´Â ÇÊ¿äÇϸé UCMÀ» NvRam ¿¡ ÀúÀåÇØ¾ß ÇÑ´Ù. ÀÌ event´Â AutoCsdUpdate flag°¡ 1ÀÎ »óÅ·Πcompile ÇØ¾ß¸¸ »ç¿ëµÈ´Ù. param 1 : none param 2 : none */ epgEventError, /* EPG °Ë»ö µµÁß¿¡ ¿¡·¯°¡ ¹ß»ýÇßÀ»¶§ error description À» Àü¼Û ¿¡·¯°¡ ¹ß»ýÇÏ´õ¶óµµ Ä¡¸íÀûÀÎ ¿¡·¯°¡ ¾Æ´Ñ ÇÑ EPG scan ÀÛ¾÷Àº °è¼Ó ½ÃµµµÈ´Ù. param 1 : (int) error value param 2 : (const char *) error description */ /*----------------------------------------------------*/ epgEventNotifyStt, /* »õ·Î¿î STT°¡ µµÂø, ¶Ç´Â STT °ªÀÇ Jump µî. param 1 : sttSection_t pointer, not just system_time param 2 : age of system_time recpetion (in seconds) */ epgEventNotifyProgramChange, /* ÇöÀç Program Event°¡ º¯°æµÇ¾úÀ½À» ¾Ë¸². param 1 : new event_id param 2 : eitEvent_t Á¤º¸¸¦ Æ÷ÇÔÇÏ´Â ¾î¶² µ¥ÀÌÅÍ.. */ epgEventRrtUpdated, /* param1 : rrt param2 : */ /*----------------------------------------------------*/ epgEventSddsFound, /* sdds ¼­ºñ½º ä³ÎÀÌ ¹ß°ß µÇ¾úÀ½À» ¾Ë¸². param 1 : UINT32 num_list; number of sdds program info list (param 2) param 2 : DmcEpgSddsProgramInfo *list 'list' is array of struct sdds_program_info_t. 'num_list' is number of 'list' which is sdds service. this is usually 1, but A/97 allows multiple subchannel scenario. Note1 if list's pid value is zero, application should search matching PMT and should find out carousel PID. Spec mentions VCT also should have carousel PID in VCT's SLD, but Korean DTV SDDS test stream do not have PID info in VCT. Note2 'list' pointer points to temporary space. (stack) Please backup somewhere safe for use later after callback return. */ } DmcEpgEventType; #ifdef __DEFINE_EPG_EVENT_TYPE_STR__ char *DmcEpgEventTypeString(DmcEpgEventType t) { return ( (t) == epgEventStarted ? "EpgStarted" : (t) == epgEventChannelStarted ? "EpgChStart" : (t) == epgEventSubChannelStarted ? "EpgSubchStart" : (t) == epgEventEitReceived ? "EitReceived" : (t) == epgEventEttReceived ? "EttReceived" : (t) == epgEventEitComplete ? "EitComplete" : (t) == epgEventSubchannelComplete ? "SubchComplete" : (t) == epgEventChannelComplete ? "ChannelComplete" : (t) == epgEventCompleteInfo ? "CompleteInfo" : (t) == epgEventUpdateChannelEtt ? "UpdateEttV" : (t) == epgEventChannelEttUpdated ? "EttVUpdated" : (t) == epgEventNotifyStt ? "Stt" : (t) == epgEventNotifyProgramChange ? "ProgramChange" : (t) == epgEventRrtUpdated ? "RrtUpdated" : (t) == epgEventError ? "EpgError" : "??"); } #else char *DmcEpgEventTypeString(DmcEpgEventType t); #endif /* EpgScanFlag Epg Update¸¦ ½ÃÀÛÇÒ ¶§ ƯÁ¤ tableÀ» ¿ì¼±Çؼ­ ¹Þ°Å³ª scan µ¿ÀÛÀ» Á¦¾îÇÒ ¶§ »ç¿ëµÈ´Ù. ÇöÀç eit first flag¸¸ ±¸ÇöÀÌ µÇ¾î ÀÖÀ½.. */ enum { epgScanFlag_PartialTable = 0x0080, epgScanFlag_PartialTblMask = 0x007F, /* table: 0 ~ 128 --> 7bit */ epgScanFlag_EitFirst = 0x0100, /* ¸ÕÀú ¸ðµç subchannelÀÇ Eit¸¸ ¿ì¼±Çؼ­ ¹Þ´Â´Ù. Áï ÇöÀç PTC¿¡ 3°³ÀÇ subchannelÀÌ Á¸ÀçÇÑ´Ù¸é, ¸ðµç 3°³ sub channelÀÇ Eit¸¸ ¸ÕÀú ¼ö½ÅÀ» Çϰí, Eit°¡ ´Ù ¼ö½ÅµÇ¸é °è¼ÓÇØ¼­ ÀÚµ¿À¸·Î Ett ¼ö½Å¿¡ µé¾î°£´Ù. ¸¸¾à¿¡ ƯÁ¤ subchannelÀ» ÁöÁ¤ÇÏ¿´´Ù¸é ±× ä³ÎÀÇ Eit¸¦ ¸ÕÀú ¹Þ°í, ±× ´ÙÀ½¿¡ ±× ä³ÎÀÇ Ett¸¦ ´Ù ¹Þ°í, ±× ´ÙÀ½¿¡ ´Ù¸¥ subchannel ¼ö½Å.. */ epgScanFlag_SkipAnalog = 0x0200, /* cafrii 060320 add */ }; /* Epg Status Enum ÇöÀç EpgDBÀÇ scan »óŸ¦ ³ªÅ¸³»´Â °ªµé.. Dmc_EpgCheckScanStatus ÇÔ¼öÀÇ °á°ú·Î »ç¿ëµÈ´Ù. */ typedef enum { EPG_STATUS_NOT_FOUND = 1, /* ÁöÁ¤ÇÑ sub ä³Î Á¤º¸°¡ ¾øÀ½.. */ EPG_STATUS_INCOMPLETE = 2, /* ÇöÀç ÁøÇàÁßÀÓ.. */ EPG_STATUS_EIT_COMPLETE = 3, /* Eit ¸¸ ¿Ï·áµÇ¾úÀ½.. */ EPG_STATUS_SUBCH_COMPLETE = 4, /* subchannleÀÌ ´Ù ¿Ï·áµÇ¾úÀ½.. */ EPG_STATUS_CH_COMPLETE = 5, /* ÁöÁ¤ÇÑ sub ä³ÎÀ» Æ÷ÇÔÇÏ´Â PTC ä³ÎÀÌ ¸ðµÎ ¿Ï·áµÇ¾úÀ½.. */ /* EPG_STATUS_SUBCH_SKIPPED = 6, */ } EPG_STATUS; #define EpgStatusString(e) \ (e) == EPG_STATUS_NOT_FOUND ? "NotFound" : \ (e) == EPG_STATUS_INCOMPLETE ? "Incomplete" : \ (e) == EPG_STATUS_EIT_COMPLETE ? "EitOnlyComplete" : \ (e) == EPG_STATUS_SUBCH_COMPLETE ? "SubchannelComplete" : \ (e) == EPG_STATUS_CH_COMPLETE ? "ChannelComplete" : "??" /* DmcEpgStatus ÀϺΠEpgEventProc¿¡¼­ ³Ñ°ÜÁÖ´Â EpgStatus ±¸Á¶Ã¼ */ typedef struct DmcEpgStatus_t { int id; int source_id; EPG_STATUS cStatus; /* EPG_STATUS_XXX °ª ÁßÀÇ Çϳª.. */ int nElapsedSec; /* ÀÌ subchannelÀ» scanÇϴµ¥ »ç¿ëµÈ ÃÑ ´©Àû °Ë»ö ½Ã°£. compile option¿¡ µû¶ó¼­ Áö¿øµÇÁö ¾ÊÀ» ¼öµµ ÀÖÀ½. */ int nEitReceived; int nEitTotal; /* ¹Þ¾Æ¾ß ÇÒ Àüü Eit table */ int nEttReceived; int nEttTotal; /* ¹Þ¾Æ¾ß ÇÒ Àüü Ett table (ÇöÀç±îÁö ¹àÇôÁø °Í±îÁö¸¸.. Eit¸¦ ¹ÞÀ¸¸é¼­ °è¼Ó ´Ã¾î³¯°ÍÀÓ) */ } DmcEpgStatus; /* cafrii 041123 add epgEventChannelStarted À̺¥Æ®ÀÇ ÆÄ¶ó¹ÌÅÍ */ typedef struct DmcEpgChannelCbParam_t { int id; /* id of this PTC.. º¸Åë rf ¹øÈ£¸¦ »ç¿ëÇÑ´Ù. */ tDHL_TSD *tsd; /* stream source */ mgtSectionPtr_t mgt; tvctPtr_t tvct; cvctPtr_t cvct; /* ÀÌ µÑÁß¿¡ Çϳª´Â ¹Ýµå½Ã non-NULL ÀÌ´Ù. */ int n_subchannel; } DmcEpgChannelCbParam; /* cafrii 041123 add epgEventSubChannelStarted À̺¥Æ®ÀÇ ÆÄ¶ó¹ÌÅÍ */ typedef struct DmcEpgSubChannelCbParam_t { int index; /* subchannel index.. 0 ~ n_subchannel-1 */ UINT16 source_id; struct { UINT16 short_name[7]; UINT16 major_channel_number; UINT16 minor_channel_number; UINT16 program_number; } vct_info; /* ¹Ýµå½Ã subchannel infoÀÇ vct_info ¿Í µ¿ÀÏÇØ¾ß ÇÑ´Ù. */ } DmcEpgSubChannelCbParam; /* cafrii 041123 add epgEventCompleteInfo À̺¥Æ®ÀÇ parameter */ typedef struct DmcEpgCompleteCbParam_t { /* channel id */ int id; /* subchannel id */ int index; UINT16 source_id; } DmcEpgCompleteCbParam; /* cafrii 050203 add epgEventUpdateChannelEtt À̺¥Æ®ÀÇ parameter */ typedef struct DmcEpgChannelEttCbParam_t { /* channel id */ int id; /* subchannel id */ int index; UINT16 source_id; /* channel text */ UINT16 extended_text_message_length; UINT8 *extended_text_message; /* MSS format */ /* note! caller should not use this pointer and data after function returns. caller can use these data inside callback function only. */ } DmcEpgChannelEttCbParam; /* cafrii 050404 add epgEventNotifyProgramChange ÀÇ ÆÄ¶ó¹ÌÅÍ ±¸Á¶Ã¼ */ typedef struct DmcEpgProgramChangeCbParam_t { int channel_id; int source_id; int event_id; int eit_index; /* ÀÌ event°¡ ¹ß°ßµÈ ù Eit index.. probably 0.. */ UINT32 system_time; /* cafrii 050729 add */ /* ÇöÀç STT GPS time */ UINT32 start_time; UINT32 length_in_seconds; int descriptor_length; UINT8* descriptors; /* ÁÖÀÇ!! ÀÌ unparsed descriptor´Â Eit¿¡ ÀÖ´Â descriptor¸¦ ±×´ë·Î pointingÇÑ´Ù. ÀÌ callbackÀÌ Á¾·áµÇ¸é ¾ðÁ¦ free µÉÁö ¸ð¸£¹Ç·Î ÇÊ¿äÇÑ Á¤º¸°¡ ÀÖ´Ù¸é º°µµ·Î º¹»çÇÏ¿© ÀúÀåÀ» ÇØ µÑ Çʿ䰡 ÀÖ´Ù. */ } DmcEpgProgramChangeCbParam; /* cafrii 100727 add epgEventSddsFound À̺¥Æ®ÀÇ parameter */ typedef struct DmcEpgSddsProgramInfo_t { int id; /* ÀÌ RF ä³ÎÀ» ½Äº°ÇÏ´Â id ÀÌ´Ù. ÀÌ °ªÀÇ Á¤È®ÇÑ »ç¿ëÀº app ¸¶´Ù ´Ù¸£´Ù. º¸ÅëÀº rf ¹øÈ£¸¦ ±×´ë·Î »ç¿ëÇÏÁö¸¸, tuner°¡ ¿©·¯°³ÀÎ °æ¿ì, pvrÀÌ ÀÖ´Â °æ¿ì µîÀº Á» ´õ º¹ÀâÇÑ Ã¼°è¸¦ »ç¿ëÇÑ´Ù. */ UINT16 program_number; UINT16 pid; /* if pid is zero, it means that VCT does not have valid pid info. user should search PMT to find out pid. */ } DmcEpgSddsProgramInfo; typedef void (*DmcEpgEventProc) (DmcEpgEventType evt, UINT32 param1, UINT32 param2); /* EpgUpdate ¿¡¼­ »ç¿ëµÇ´Â event proc ÇÔ¼öÀÇ prototype. evt´Â Àü´ÞµÇ´Â À̺¥Æ® Á¾·ù param1/param2 ´Â À̺¥Æ® º°·Î Á¤ÀÇµÈ ÆÄ¶ó¹ÌÅÍ */ /* APIs.. */ STATUS Dmc_EpgInit(void); STATUS Dmc_EpgUpdateStart(int id, tDHL_TSD *tsd, DmcEpgEventProc eventproc, UINT32 source_id, UINT32 flag); /* cafrii 041019 add 'tsd' argument update¸¦ ½ÃÀÛ.. */ STATUS Dmc_EpgUpdateCancel(void); /* ÇöÀç ÁøÇàÁßÀÎ update¸¦ cancelÇÑ´Ù.. ä³Î º¯°æ, autoscan ÀÛ¾÷À» ½ÃÀÛÇÒ ¶§ »ç¿ë. */ STATUS Dmc_EpgDelete(int id); /* ÇØ´ç idÀÇ EpgDB¸¦ »èÁ¦ÇÑ´Ù. */ STATUS Dmc_EpgDeleteRange(int idStart, int idEnd); /* cafrii 041019 add idStart ºÎÅÍ idEnd »çÀÌÀÇ ¸ðµç EpgDB¸¦ »èÁ¦ÇÑ´Ù. */ STATUS Dmc_EpgDeleteAll(void); /* ¸ðµç EpgDB¸¦ »èÁ¦.. */ void Dmc_EpgPrintAllTables(int id, int source_id, BOOL bSimpleDisplay); /* EpgDB¸¦ debug consol¿¡ Ãâ·ÂÇÑ´Ù. */ STATUS Dmc_EpgNotifyMgtVersionChange(void); /* Mgt°¡ º¯°æµÇ¾úÀ½À» ¸í½ÃÀûÀ¸·Î ¾Ë·ÁÁÙ ¶§ »ç¿ëÇÏ´Â ÇÔ¼ö.. EPG MW ³»¿¡¼­ Mgt °ü¸®ÀÚ¸¦ »ç¿ëÇÏ¿© ÀÚµ¿ÀûÀ¸·Î ¾Ë¾Æ¼­ ó¸®ÇϹǷΠApplication¿¡¼­ Ưº°È÷ »ç¿ëÇÒ °æ¿ì´Â ¾øÀ» °ÍÀÌ´Ù. */ EPG_STATUS Dmc_EpgCheckScanStatus(int id, int source_id, DmcEpgStatus *pStat); /* ÁöÁ¤ÇÑ Ã¤³ÎÀÇ Epg download »óŸ¦ ¸®ÅÏÇÑ´Ù. */ STATUS Dmc_EpgGetEstimatedSttSection(int id, sttSection_t *pFlatStt, UINT32 *pAge); /* cafrii 050528 add */ STATUS Dmc_EpgGetEstimatedStt(int id, UINT32 *pSystemTime, UINT32 *pAge); /* obsoleted */ /* void Dmc_EpgSetMonitorSourceId(int source_id); */ /* cafrii 070801 delete */ int Dmc_EpgGetDescriptor(UINT8 *descriptors, UINT16 len, UINT8 tag, UINT16 instance, UINT8 **descriptor); #if DMW_EPG_SUPPORT_RRT /* cafrii 060822 add */ typedef enum { RRT_OPTION_UNBLOCK = 0, RRT_OPTION_BLOCK = 1, RRT_OPTION_TOGGLE = 100, } EPG_RRT_BLOCK_OPTION; rrtSectionPtr_t Dmc_EpgGetCurrentRrt(void); void Dmc_EpgSetCurrentRrt(rrtSectionPtr_t rrt); /* cafrii 060822, change prototype, support toggle function */ BOOL Dmc_EpgSetRrtOption(int dim, int value, EPG_RRT_BLOCK_OPTION action); void Dmc_EpgRrtForceUpdateMode(BOOL bForceUpdateMode); UINT32 Dmc_EpgCurrentRrtUpdateCount(void); #endif /* Utilities */ BOOL Dmc_IsEquivalentMgt(mgtSectionPtr_t mgt1, mgtSectionPtr_t mgt2); /* for debugging ÀÌ ÇÔ¼öµéÀº DMW_EpgDebug.c ¿¡ Á¤ÀǵǾî ÀÖ´Ù. */ char *Dmc_ChannelNumberString(int major, int minor, char *buf); /* cafrii 041126 add two conversion function */ UINT8 *Dmc_ConvertKs2Mss(char *str, UINT8 **pMssPtr, int *pMssLen); STATUS Dmc_ConvertMss2Ks(UINT8 *mssPtr, UINT16 mssLen, char *buf, int max_buflen, char *lang, int instance); void Dmc_PrintMultipleString(UINT8 *buffer, UINT16 len, int indent, int detailLevel); char *GpsTimeString2(UINT32 gps, char *buf, int level); char *GpsTimeString(UINT32 gps, char *buf); void Dmc_PrintEit(eitPtr_t eitPtr, int indent, ettSectionPtr_t *ettArray); void Dmc_PrintEtt(ettSectionPtr_t ettSectPtr, int indent); void Dmc_PrintRrt(rrtSectionPtr_t rrt, int indent, BOOL bDetail); void Dmc_SetGpsTimeSync(sttSection_t *stt); void Dmc_EpgRegisterEpgSymbols(void); #endif /* __DMW_EPG_BASE_H__ */ /****************************************************************************** $Log: DMW_EpgBase.h,v $ 1.03 2005/2/3 add epgEventUpdateChannelEtt event and the related 1.02 2004/11/29 epgEventChannelEttUpdated Ãß°¡ 1.01 2004/11/26 Dmc_ConvertKs2Mss / Dmc_ConvertMss2Ks ÇÔ¼ö Ãß°¡ 1.00 2004/?/? History °ü¸® ½ÃÀÛ ******************************************************************************/