/* DMW_PsiAPI.h DST TV MW PSI Scan Module PSI Scan API implementation Copyright 2006~2010 Digital STREAM Technology, Inc. All Rights Reserved */ #ifndef __DMW_PSI_API_H__ #define __DMW_PSI_API_H__ #include "DHL_PSI.h" //#include "DMW_PsiTypes.h" #include "DMW_PsiConfig.h" #include "DLIB_PSI.h" #include "DLIB_PSIP.h" #if DMW_PSI_SUPPORT_ELAPSED_TIMER #include "DMW_Timer.h" #endif #ifdef __cplusplus extern "C" { #endif #if COMMENT ____Overview____(){} #endif /* =========================================================== DST TV Middleware: PSI Scan Module, Operation Overview =========================================================== ÀÌ PSI scan ¸ðµâÀº TV Viewing, TV recording ÀÛ¾÷¿¡ ÇÊ¿äÇÑ ¸ðµç Å×À̺íÀ» ´Ù¿î·Îµå ÇÏ¿© »ç¿ëÀÌ ¿ëÀÌÇÑ ÇüÅ·ΠÁ¦°øÇÏ´Â ±â´ÉÀ» ´ã´çÇÑ´Ù. ´Ù¿î·Îµå ´ë»óÀÌ µÇ´Â Å×À̺í Á¾·ù: PSI PAT, PMT PSIP MGT, VCT, STT, RRT, EIT, ETT ±âŸ EAS (emergency alert system) section °¢ Å×À̺íµéÀº ¼­·Î dependency °ü°è°¡ Á¸ÀçÇÑ´Ù. ¿¹¸¦ µé¾î PMT¸¦ ¼ö½ÅÇϱâ À§Çؼ­´Â PAT¸¦ ¸ÕÀú ¼ö½ÅÇÑ ÈÄ¿¡ PMT pid¸¦ ¾Ë¾Æ³½ ÈÄ¿¡¾ß PMT ¼ö½ÅÀÌ °¡´ÉÇÏ´Ù. PAT -> pid of PMT -> PMT ¼ö½Å VCT -> source_id ÃßÃâ -> EIT, ETT ¼ö½Å ¾î¶² Å×À̺íµéÀº ÇϳªÀÇ ÀνºÅϽº°¡ ¾Æ´Ï¶ó ¿©·¯°³ÀÇ ÀνºÅϽº°¡ Á¸ÀçÇÑ´Ù. PMTs: ÇÁ·Î±×·¥ °¹¼ö ¸¸Å­ Á¸ÀçÇÑ´Ù. EITs: ½Ã°£´ë º°·Î EIT[0]~EIT[127] ÀÌ Á¸ÀçÇϸç, ¶ÇÇÑ ÇÁ·Î±×·¥ (¼­ºêä³Î)º°·Î Çϳª ÀÌ»óÀÇ EIT[N] ÀÌ Á¸ÀçÇÑ´Ù. ETTs: ÇÁ·Î±×·¥ À̺¥Æ® Çϳª´ç Çϳª¾¿ Á¸ÀçÇÒ ¼ö ÀÖ´Ù. ¾î¶² Å×À̺íÀº ´Ù·ç±â ÆíÇÑ ÇüÅ·Πº¯ÇüµÈ ÈÄ¿¡ ¼ö½ÅµÈ´Ù. TVCT & CVCT -> µÎ Å×À̺íÀ» ÇϳªÀÇ Å¸ÀÔÀ¸·Î ´Ù·ç±â À§ÇØ ÅëÇÕ. -> xVCT ¶Ç´Â ±×³É VCT RRT -> Å×ÀÌºí ³»ºÎ¿¡ user optionÀ» ÀúÀå ÇÒ ¼ö ÀÖ´Â °ø°£ÀÌ È®º¸µÈ ÇüÅ·ΠȮÀåµÊ. ------------------------------------ Ç÷οì Â÷Æ® ------------------------------------ 1. DMW_PSI_Init: ½Ã½ºÅÛ ÃʱâÈ­ ½Ã¿¡ Çѹø È£Ãâ. º¸ÅëÀº Application init ´Ü°è¿¡¼­ callÇÏ´Â °ÍÀ¸·Î ¿Ï·áµÈ´Ù. 2. DMW_PSI_StartUpdate ä³Î Æ©´×, ·¹ÄÚµù, autoscan ÇÒ ¶§¿¡ È£Ãâ. ä³Î Æ©´×, autoscan ÇÒ ¶§¿¡´Â channel control moduleÀÌ caller°¡ µÇ¸ç, ·¹ÄÚµùÀÇ °æ¿ì¿¡´Â record scheduler¿Í meta data collector°¡ caller°¡ µÈ´Ù. 3. DMW_PSI_CancelUpdate µ¿ÀÛ ÁßÀÎ scan ÀÛ¾÷À» ÁßÁö. ä³Î º¯È¯ Á÷Àü, Air/Cable Àüȯ ½Ã¿¡ »ç¿ëµÈ´Ù. 4. DMW_PSI_LockDB, DMW_PSI_GetChInfo, DMW_PSI_GetSubChInfo ½ÇÁ¦·Î DB¿¡ access Çϱâ À§ÇÑ API¸¦ »ç¿ë. 5. DMW_PSI_DeleteTables DB¸¦ »èÁ¦ÇÒ °æ¿ì´Â º¸Åë Air/Cable º¯È¯À» ÇÏ´Â °æ¿ì »ÓÀÌ´Ù. ------------------------------------ Autoscan °Ë»ö ¿¹Á¦ (ÀÛ¼º Áß) ------------------------------------ 1. DMW_PSI_StartUpdate 2. ePSIM_EVENT_AllPmtsReceived .. ------------------------------------ ±âÁ¸ old EPG MW (1.5) ´ëºñ Ư¡ ------------------------------------ 1. µ¿ÀÛ ¹æ½Ä ±âÁ¸ EPG MW´Â ±âº»ÀûÀ¸·Î synchronous ¹æ½ÄÀ¸·Î µ¿ÀÛÇÑ´Ù. ¹Ý¸é »õ PSI scan MW´Â 100% asynchronous ¹æ½ÄÀ¸·Î µ¿ÀÛÇÑ´Ù. synchronous download Çϸ鼭 cancel check Çϰí, µ¿½Ã¿¡ multiple tableÀ» ¼ö½ÅÇÏ´Â º°µµÀÇ ¸ðµâ ÇÊ¿ä (ChannelDemux) Multi-tuner (TS input) Áö¿øÀÌ ºÒ°¡. asynchronous DHL PSI API ¸¸À¸·Î ¸ðµç µ¿ÀÛ ¼öÇà. Multi-tuner Áö¿øÀÌ ÀÚ¿¬½º·´°Ô µÊ. 2. Áö¿ø ¹üÀ§ ±âÁ¸ EPG MW´Â PSIP ¸¸À» ´ë»óÀ¸·Î ÇÑ´Ù. »õ PSI scan MW´Â PSIP ´Â ¹°·Ð PSI (PAT, PMT)µµ ´ë»óÀ¸·Î ÇÑ´Ù. ±âÁ¸ EPG MW´Â ä³Î °Ë»ö (autoscan) ¿ëµµ·Î´Â »ç¿ëÇÒ ¼ö ¾ø´Ù. ¿ÀÁ÷ TV viewing ½Ã¿¡¸¸ »ç¿ëµÈ´Ù. »õ PSI scan MW´Â ä³Î °Ë»öÀ» À§ÇÑ ¸ðµå, TV viewingÀ» À§ÇÑ ¸ðµå, TV recordingÀ» À§ÇÑ ¸ðµå µîÀÇ ´Ù¾çÇÑ ¸ðµå¸¦ Áö¿øÇÑ´Ù. ÀÚ¼¼ÇÑ ¼³¸íÀº PSI_FLAGS_MODE ÀÇ ÁÖ¼®À» Âü°íÇÑ´Ù. 3. ³»ºÎ ±¸Á¶ ±âÁ¸ EPG MW´Â »ç½Ç»ó EpgBase core Çϳª°¡ ¸ðµç °ÍÀ» ´ã´çÇÑ´Ù. ¹Ý¸é PSI scan MW´Â API, Database, Task, Engine µî ¿ªÇÒ¿¡ µû¶ó ¼¼ºÐÈ­ µÇ¾î ÀÖ´Ù. ±âÁ¸ EPG MW´Â ÀϺΠasynchronous µ¿ÀÛÀ» À§ÇÏ¿© µÎ°³ÀÇ task°¡ »ç¿ëµÈ´Ù. »õ PSI scan MW´Â ´Ü ÇϳªÀÇ task ¸¸À¸·Î ¸ðµç µ¿ÀÛÀ» Áö¿øÇÑ´Ù. 4. ¼º´É ±âÁ¸ EPG MW´Â EIT Çϳª¿¡ ¹Ýµå½Ã hardware section filter Çϳª°¡ ÇÊ¿äÇÏ¿´´Ù. ¹Ý¸é »õ PSI scan MW´Â ƯÁ¤ ¸ðµå¿¡¼­´Â ÇϳªÀÇ hardware filter·Î ¿¬°üµÈ ¸ðµç EIT¸¦ ¼ö½ÅÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù. (ÇÏÁö¸¸ »ç¿ë °¡´ÉÇÑ »óȲÀº Á¦ÇÑÀûÀÓ) ------------------------------------ ±âÁ¸ old EPG MW (1.5)¿ÍÀÇ API ȣȯ¼º ------------------------------------ ÀÌ PSI scan MW API´Â ±âÁ¸ EPG MW API¿Í ÀüÇô ȣȯµÇÁö ¾Ê´Â´Ù. ´Ù¸¸ µ¿ÀÛ ¹æ½Ä µîÀº ºñ½ÁÇϸç, Scan ¿Ï·á µÈ TableµéÀ» Query ÇÏ´Â ¹æ½Ä ¶ÇÇÑ ºñ½ÁÇÏ´Ù. EPG DBÀÇ ±¸Á¶µµ Å©°Ô ´Ù¸£Áö ¾Ê´Ù. old EPG MW new PSI scan MW --------------- ----------------- DmcChannelInfo -> S_PSIM_CHINFO DmcSubChannelInfo -> S_PSIM_SUBCHINFO Dmc_EpgUpdateStart DMW_PSI_StartUpdate Dmc_EpgUpdateCancel DMW_PSI_CancelUpdate Dmc_EpgDelete DMW_PSI_DeleteTables Dmc_EpgPrintAllTables PSIDB_PrintAllTables (no public API yet) Dmc_EpgLockCoreDB DMW_PSI_LockDB ------------------------------------ *** naming rule *** ------------------------------------ api prefix: DMW_PSI_ struct type: S_PSIM_STRUCTTYPE enum type: E_PSIM_ENUMTYPE enum constant: eENUMTYPE_ConstantName */ #if COMMENT ____PSI_Flags____(){} #endif /* DMW_PSI_StartUpdate ¿¡¼­ »ç¿ëµÇ´Â flag. PSI_FLAGS_MODE.. PSI_FLAGS_NORMAL °¡Àå ÀϹÝÀûÀÎ »ç¿ë ¸ðµå. TV Viewing ¿¡¼­ »ç¿ë. ¼ö½ÅÇÏ´Â Å×ÀÌºí ¹üÀ§: pat, pmt (ÁöÁ¤ÇÑ program number) mgt, vct, stt, rrt, eas ÇöÀç subchannelÀÇ ¸ðµç eits, ¸ðµç etts PSI_FLAGS_SIMPLE ³ìÈ­ ¸ðµå¿¡¼­ »ç¿ë. ¼ö½ÅÇÏ´Â Å×ÀÌºí ¹üÀ§: pat, pmt (ÁöÁ¤ÇÑ program number) mgt, vct, stt, rrt ÇöÀç subchannelÀÇ eit[0] PSI_FLAGS_AUTOSCAN ä³Î °Ë»ö ½Ã »ç¿ëÇÏ´Â ¸ðµå. pat, ¸ðµç pmt, mgt, vct, stt ÇöÀçÀÇ RF³»ÀÇ ¸ðµç subchannelÀÇ eit[0] pmt, mgt, vct, sttÀÇ °æ¿ì one shot ¸ðµå·Î ¼ö½Å. Áï Çϳª¸¸ ¹Þ°í ¹Ù·Î closeÇÑ´Ù. ÀÌ´Â pmt multi¼ö½ÅÀÇ ¼º´ÉÀ» ³ôÀ̱â À§ÇÑ trickÀÓ. eit[0]ÀÇ °æ¿ì coninuous ¸ðµå·Î ¸ðµç subchÀÇ eit[0]¸¦ ´Ù ¹Þ´Â´Ù. */ #define PSI_FLAGS_MODE_MASK 0x3 #define PSI_FLAGS_NORMAL 0x0 #define PSI_FLAGS_SIMPLE 0x1 #define PSI_FLAGS_AUTOSCAN 0x2 #define PSI_FLAGS_MODE(flag) ((flag) & PSI_FLAGS_MODE_MASK) #if COMMENT ____Events____(){} #endif // // Callback ÇÔ¼öÀÇ ÀÎÀÚ·Î Àü´ÞµÉ À̺¥Æ® ŸÀÔ°ú µ¿¹ÝµÇ´Â parameter Á¤ÀÇ. // // typedef enum //E_PSIM_EVENT_t { ePSIM_EVENT_Unknown, ePSIM_EVENT_PatReceived, // PAT°¡ »õ·Ó°Ô ¼ö½Å (º¯°æ) // param: MPEG_PAT *pat ePSIM_EVENT_PmtReceived, // ÇöÀç ÇÁ·Î±×·¥ÀÇ pmt°¡ ¼ö½Å (º¯°æ) // param: MPEG_PMT *pmt ePSIM_EVENT_AllPmtsReceived, // ¸ðµç pmt°¡ ¼ö½Å ¿Ï·á. // autoscan ¸ðµå¿¡¼­ »ç¿ëµÊ. // param: none ePSIM_EVENT_VctReceived, // vct°¡ »õ·Ó°Ô ¼ö½Å (º¯°æ) // param: xvctPtr_t vct ePSIM_EVENT_BasePsipReceived, // mgt, vct ¼ö½Å ¿Ï·á. // param: none ePSIM_EVENT_SttReceived, // »õ·Î¿î STT°¡ µµÂø, ¶Ç´Â STT °ªÀÇ Jump µî. // stt°¡ ¿Ã ¶§ ¸¶´Ù notify µÇÁö´Â ¾Ê°í, scan ÈÄ ÃÖÃÊ 1ȸ, // ±×¸®°í stt jump°¡ »ý±â¸é ¾Ë·ÁÁØ´Ù. // // param: sttSection_t pointer (flat stt) ePSIM_EVENT_ProgramChanged, // ÇöÀç Program Event°¡ º¯°æµÇ¾úÀ½À» ¾Ë¸². // // param: S_PSIM_PROGRAM_CHANGED_CB_PARAM * ePSIM_EVENT_RrtUpdated, // rrt°¡ update µÇ¾úÀ½À» ¾Ë¸². // // param: rrtSectionPtr_t rrt ePSIM_EVENT_EitReceived, // param: (S_PSIM_SCAN_STATUS_CB_PARAM *) current Epg scan status of this channel ePSIM_EVENT_EttReceived, // param: (S_PSIM_SCAN_STATUS_CB_PARAM *) current Epg scan status of this channel //------------------------------- // °¢Á¾ start notifications ePSIM_EVENT_ChannelStarted, // ÇØ´ç ä³ÎÀÇ Epg °Ë»öÀÌ ½ÃÀ۵ǾúÀ½À» ¾Ë¸°´Ù. // // param : S_PSIM_CH_START_CB_PARAM * ePSIM_EVENT_SubChannelStarted, // ÇØ´ç subchannelÀÇ epg °Ë»öÀÌ ½ÃÀ۵ǾúÀ½À» ¾Ë¸°´Ù. // // param : S_PSIM_SUBCH_START_CB_PARAM * //------------------------------- // °¢Á¾ complete notifications ePSIM_EVENT_EitsCompleted, // ÇØ´ç subchannelÀÇ ¸ðµç eit°¡ ¼ö½Å ¿Ï·á µÇ¾úÀ½. // // param : S_PSIM_COMPLETE_CB_PARAM * // id, source_id ePSIM_EVENT_SubChannelCompleted, // ÇØ´ç subchannelÀÇ ¸ðµç tableÀÌ ¼ö½Å ¿Ï·á µÇ¾úÀ½. // // param : S_PSIM_COMPLETE_CB_PARAM * // id, source_id ePSIM_EVENT_ChannelCompleted, // ÇØ´ç channelÀÇ ¸ðµç tableÀÌ ¼ö½Å ¿Ï·á µÇ¾úÀ½. // // param : S_PSIM_COMPLETE_CB_PARAM * // only 'id' is valid. //---------------- // belows are not ported yet. do not use! epgEventStarted = 101, // param 1 : reason: EpgUpdateStartxxxx °ª Áß Çϳª // param 2 : none epgEventStopped, // param : none #if 0 //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 #endif } E_PSIM_EVENT; #ifdef __DEFINE_PSIM_STRING__ #define PSIM_EVENT_STRING(e) ( \ (e) == ePSIM_EVENT_PatReceived ? "pat" : \ (e) == ePSIM_EVENT_PmtReceived ? "pmt" : \ (e) == ePSIM_EVENT_AllPmtsReceived ? "allpmts" : \ (e) == ePSIM_EVENT_VctReceived ? "vct" : \ (e) == ePSIM_EVENT_BasePsipReceived ? "basepsip" : \ (e) == ePSIM_EVENT_SttReceived ? "stt" : \ (e) == ePSIM_EVENT_ProgramChanged ? "pgm_change" : \ (e) == ePSIM_EVENT_RrtUpdated ? "rrt" : \ (e) == ePSIM_EVENT_ChannelStarted ? "ch_start" : \ (e) == ePSIM_EVENT_SubChannelStarted ? "subch_start" : \ (e) == ePSIM_EVENT_EitsCompleted ? "eits_end" : \ (e) == ePSIM_EVENT_SubChannelCompleted ? "subch_end" : \ (e) == ePSIM_EVENT_ChannelCompleted ? "ch_end" : \ (e) == epgEventStarted ? "psi_start" : \ (e) == epgEventStopped ? "psi_stop" : \ "??" ) #else const char *DMW_PSI_EventString(E_PSIM_EVENT e); #endif // __DEFINE_PSIM_EVENT_STRING__ /* PSI module ³»¿¡¼­ °¢Á¾ »óÅ º¯°æ½Ã È£ÃâµÇ´Â Äݹé ÇÔ¼ö ŸÀÔ. »ç¿ëÀÚ´Â StartUpdate api¸¦ È£ÃâÇϸ鼭 ÀÌ callback procÀ» ÁöÁ¤ÇØ¾ß ÇÑ´Ù. */ typedef void (*F_PSIM_EVENT_PROC) (tDHL_TSD tsd, E_PSIM_EVENT evt, UINT32 param); #if COMMENT ____Input____(){} #endif /* »ç¿ëÀÚ ÀÔ·Â Á¤º¸. S_PSIM_USER_PARAM ¿Í ºñ½ÁÇÏÁö¸¸, ±× ¿ëµµ°¡ ´Ù¸§. ÀÌ ±¸Á¶Ã¼´Â API¿¡¼­´Â »ç¿ëµÇÁö ¾Ê°í ³»ºÎ ¿ëÀ¸·Î¸¸ »ç¿ëÇÑ´Ù. API¿¡¼­´Â º°µµ·Î S_PSIM_USER_PARAM À̶ó´Â ±¸Á¶Ã¼°¡ »ç¿ëµÈ´Ù. */ typedef struct { int rf; int program_number; int source_id; UINT32 flags; F_PSIM_EVENT_PROC userproc; UINT32 userparam; } S_PSIM_USER_INPUT; #if COMMENT ____Status____(){} #endif /* Epg Status Enum ÇöÀç EpgDBÀÇ scan »óŸ¦ ³ªÅ¸³»´Â °ªµé.. Dmc_EpgCheckScanStatus ÇÔ¼öÀÇ °á°ú·Î »ç¿ëµÈ´Ù. */ typedef enum //E_PSIM_SCAN_STATUS_t { ePSIM_SCAN_STATUS_NOT_FOUND = 1, // ÁöÁ¤ÇÑ sub ä³Î Á¤º¸°¡ ¾øÀ½.. ePSIM_SCAN_STATUS_INCOMPLETE = 2, // ÇöÀç ÁøÇàÁßÀÓ.. ePSIM_SCAN_STATUS_EIT_COMPLETE = 3, // Eit ¸¸ ¿Ï·áµÇ¾úÀ½.. ePSIM_SCAN_STATUS_SUBCH_COMPLETE = 4, // subchannleÀÌ ´Ù ¿Ï·áµÇ¾úÀ½.. ePSIM_SCAN_STATUS_CH_COMPLETE = 5, // ÁöÁ¤ÇÑ sub ä³ÎÀ» Æ÷ÇÔÇÏ´Â PTC ä³ÎÀÌ ¸ðµÎ ¿Ï·áµÇ¾úÀ½.. //ePSIM_SCANSTATUS_SUBCH_SKIPPED = 6, } E_PSIM_SCAN_STATUS; #ifdef __DEFINE_PSIM_STRING__ #define PSIM_SCAN_STATUS_STRING(e) \ (e) == ePSIM_SCAN_STATUS_NOT_FOUND ? "NotFound" : \ (e) == ePSIM_SCAN_STATUS_INCOMPLETE ? "Incomplete" : \ (e) == ePSIM_SCAN_STATUS_EIT_COMPLETE ? "EitOnlyComplete" : \ (e) == ePSIM_SCAN_STATUS_SUBCH_COMPLETE ? "SubchannelComplete" : \ (e) == ePSIM_SCAN_STATUS_CH_COMPLETE ? "ChannelComplete" : \ "??" #else const char *DMW_PSI_ScanStatusString(E_PSIM_SCAN_STATUS e); #endif /* */ typedef struct { tDHL_TSD tsd; S_PSIM_USER_INPUT input; // »ç¿ëÀÚ°¡ StartUpdate¸¦ È£Ãâ ÇÒ ¶§ ÁöÁ¤ÇÑ ÀÎÀÚµé. } S_PSIM_STATUS; #if COMMENT ____CallbackParams____(){} #endif /* ePSIM_EVENT_ProgramChanged ÀÇ ÆÄ¶ó¹ÌÅÍ ±¸Á¶Ã¼ */ typedef struct //S_PSIM_PROGRAM_CHANGED_CB_PARAM_t { int channel_id; int source_id; int event_id; // new event_id int eit_index; // ÀÌ event°¡ ¹ß°ßµÈ ù Eit index.. probably 0.. UINT32 system_time; // ÇöÀç STT GPS time UINT32 start_time; UINT32 length_in_seconds; int descriptor_length; UINT8* descriptors; // ÁÖÀÇ!! // ÀÌ unparsed descriptor´Â Eit¿¡ ÀÖ´Â descriptor¸¦ ±×´ë·Î pointingÇÑ´Ù. // ÀÌ callbackÀÌ Á¾·áµÇ¸é ¾ðÁ¦ free µÉÁö ¸ð¸£¹Ç·Î // ÇÊ¿äÇÑ Á¤º¸°¡ ÀÖ´Ù¸é º°µµ·Î º¹»çÇÏ¿© ÀúÀåÀ» ÇØ µÑ Çʿ䰡 ÀÖ´Ù. } S_PSIM_PROGRAM_CHANGED_CB_PARAM; /* ePSIM_EVENT_ChannelStarted À̺¥Æ®ÀÇ ÆÄ¶ó¹ÌÅÍ ±¸Á¶Ã¼ */ typedef struct //S_PSIM_CH_START_CB_PARAM_t { int id; // id of this PTC.. º¸Åë rf ¹øÈ£¸¦ »ç¿ëÇÑ´Ù. tDHL_TSD *tsd; // stream source mgtSectionPtr_t mgt; xvctPtr_t vct; int n_subchannel; } S_PSIM_CH_START_CB_PARAM; /* ePSIM_EVENT_SubChannelStarted À̺¥Æ®ÀÇ ÆÄ¶ó¹ÌÅÍ ±¸Á¶Ã¼ */ typedef struct //S_PSIM_SUBCH_START_CB_PARAM_t { int index; // subchannel index.. 0 ~ n_subchannel-1 UINT16 source_id; UINT32 flags; // ¾î¶² ¸ðµå·Î ½ÃÀ۵Ǿú´ÂÁö ¾Ë·ÁÁÜ. // StartUpdate APIÀÇ flags ÀÎÀÚ·Î ÁöÁ¤µÈ °ªÀÌ´Ù. struct { UINT16 short_name[7]; UINT16 major_channel_number; UINT16 minor_channel_number; UINT16 program_number; } vct_info; // ¹Ýµå½Ã subchannel infoÀÇ vct_info ¿Í µ¿ÀÏÇØ¾ß ÇÑ´Ù. } S_PSIM_SUBCH_START_CB_PARAM; /* ePSIM_EVENT_XxxxxCompleted À̺¥Æ®ÀÇ ÆÄ¶ó¹ÌÅÍ ±¸Á¶Ã¼ */ typedef struct //S_PSIM_COMPLETE_CB_PARAM_t { // channel id int id; // subchannel id int index; // subchannel index. (0 ~ num_subchannel-1) UINT16 source_id; // ChannelCompleted ÀÎ °æ¿ì¿¡ subchannel id Á¤º¸´Â ¹«ÀǹÌÇÏ´Ù. } S_PSIM_COMPLETE_CB_PARAM; typedef struct //S_PSIM_SCAN_STATUS_CB_PARAM_t { int id; int source_id; E_PSIM_SCAN_STATUS cStatus; // EPG_STATUS_XXX °ª ÁßÀÇ Çϳª.. int nElapsedSec; // ÀÌ subchannelÀ» scanÇϴµ¥ »ç¿ëµÈ ÃÑ ´©Àû °Ë»ö ½Ã°£. // compile option¿¡ µû¶ó¼­ Áö¿øµÇÁö ¾ÊÀ» ¼öµµ ÀÖÀ½. int nEitReceived; int nEitTotal; // ¹Þ¾Æ¾ß ÇÒ Àüü Eit table int nEttReceived; int nEttTotal; // ¹Þ¾Æ¾ß ÇÒ Àüü Ett table (ÇöÀç±îÁö ¹àÇôÁø °Í±îÁö¸¸.. Eit¸¦ ¹ÞÀ¸¸é¼­ °è¼Ó ´Ã¾î³¯°ÍÀÓ) } S_PSIM_SCAN_STATUS_CB_PARAM; #if COMMENT ____Structures____(){} #endif /* mgt ÀÇ ¿ä¾à Á¤º¸. ¸ðµç pidÀÇ ÃʱⰪÀº 0 À̰í, ¸ðµç versionÀÇ ÃʱⰪÀº 0xff ÀÌ´Ù. mgt¿¡ ±â¼úµÇÁö ¾ÊÀº Å×À̺í Á¤º¸´Â ¸ðµÎ ÃʱⰪÀ» °¡Áö°í ÀÖ°Ô µÈ´Ù. */ typedef struct //S_PSIM_MGT_DIGEST_t { UINT16 eit_pids[128]; // if this eit not exist, it will be 0. UINT8 eit_ver[128]; // if this eit not exist, it will be 0xFF 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; UINT8 tvct_ver; UINT8 cvct_ver; } S_PSIM_MGT_DIGEST; struct S_PSIM_CHINFO_t; // forward declaration //----------------------------------------------------------------------- // S_PSIM_SUBCHINFO // // Sub channel ÀÇ ¸ðµç PSIP Á¤º¸¸¦ ÀúÀåÇÏ´Â ±¸Á¶Ã¼ // typedef struct //S_PSIM_SUBCHINFO_t { struct S_PSIM_CHINFO_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 »çº»À» µÐ´Ù. struct { UINT16 short_name[7]; UINT16 major_channel_number; UINT16 minor_channel_number; UINT16 program_number; BOOL analog; ETM_location_k etm_location; } vct_info; eitPtr_t eits[128]; 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 // ÀÌ Á¤º¸´Â ÇÊ¿äÇÒ ¶§ ¸¶´Ù Á÷Á¢ vct Á¤º¸¸¦ ã¾Æº¸´Â °ÍÀ¸·Î ÇÏ¿´À½. // µû¶ó¼­ º°µµ·Î Ç÷¡±× ÀúÀåÀº ºÒÇÊ¿äÇÔ. // °¢ complete event message°¡ ºÒ·È´ÂÁö ¾Æ´ÑÁö¸¦ ÀúÀåÇÏ´Â flag. // caller°¡ óÀ½ API¸¦ ºÎ¸£¸é ¸®¼ÂµÇ¾ú´Ù°¡ notifyµÇ¸é °¢°¢ setµÈ´Ù. // µ¿ÀÏ event procÀÌ ¿©·¯¹ø ºÒ¸®´Â °ÍÀ» ¸·±â À§Çؼ­ÀÓ. // BOOL eit_complete_notified; BOOL subchannel_complete_notified; BOOL subchannel_start_notified; #if DMW_PSI_SUPPORT_ELAPSED_TIMER // cafrii 060814 add DMW_Counter counter; #endif } S_PSIM_SUBCHINFO; // // to access EIT: // subchInfo->eits[eit_index] // to access ETT: // if (subchInfo->etts[eit_index]) // subchInfo->etts[eit_index][event_index_in_eit] #define CHANNEL_INFO_MAGIC 0x20040419 //----------------------------------------------------------------------- // S_PSIM_CHINFO // // Physical Channel ÀÇ ¸ðµç PSIP Á¤º¸¸¦ ÀúÀåÇÏ´Â ±¸Á¶Ã¼ // ³»ºÎ¿¡ Subchannel °¹¼ö ¸¸Å­ÀÇ SubchInfo ¸¦ Æ÷ÇÔÇÑ´Ù. // typedef struct S_PSIM_CHINFO_t { UINT32 magic; // CHANNEL_INFO_MAGIC °ªÀ» °¡Á®¾ß ÇÔ. struct S_PSIM_CHINFO_t *prev, *next; int id; // id of this PTC.. º¸Åë rf ¹øÈ£¸¦ »ç¿ëÇÑ´Ù. tDHL_TSD tsd; // stream source //----------------- // table pointers // PAT MPEG_PAT *pat; // PMT array. array size is pat->numPrograms. MPEG_PMT **pmts; // MGT // °¡Àå ¸¶Áö¸·À¸·Î ¼ö½ÅµÇ¾î ÇöÀç À¯È¿ÇÑ mgt¿Í // ±× ¹Ù·Î Á÷ÀüÀÇ À¯È¿Çß´ø mgt (mgt_old) µÎ°³¸¦ ÀúÀåÇÑ´Ù. mgtSectionPtr_t mgt, mgt_old; // VCT xvctPtr_t vct; // 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) À¸·Î Á¤ÀÇÇϵµ·Ï ÇÑ´Ù. S_PSIM_MGT_DIGEST smgt; // summarized mgt (mgt digest) //----------------- // ÁÖÀÇ!! PID Á¤º¸°¡ mgt¿¡ ÀÖ´Ù°í ÇØ¼­ ±× tableÀÌ Á¸ÀçÇÏ´Â °ÍÀ» ÀǹÌÇÏÁö´Â ¾Ê´Â´Ù. // subchannelÀÇ °¹¼ö´Â vct¿¡ ³ª¿Í Àִµ¥, ¾î´À vct°¡ »ç¿ëµÉÁö ¾Ë ¼ö ¾øÀ¸¹Ç·Î // // Rule: n_subchannel ÀÌ >0 À̸é subchannel ptrÀº ¹Ýµå½Ã non-NULLÀ̾î¾ß ÇÑ´Ù. int n_subchannel; S_PSIM_SUBCHINFO *subchannel; // cafrii 040726 add BOOL channel_complete_notified; #if DMW_PSI_SUPPORT_ELAPSED_TIMER // cafrii 060814 add DMW_Counter counter; #endif } S_PSIM_CHINFO; #if COMMENT ____APIs____(){} #endif /* For detail description, refer comments of function definition. */ /* Initializations */ STATUS DMW_PSI_Init(void); /* Start & Stop control */ STATUS DMW_PSI_StartUpdate(tDHL_TSD tsd, int rf, int program_number, int source_id, UINT32 flags, F_PSIM_EVENT_PROC userproc, UINT32 userparam); void DMW_PSI_CancelUpdate(tDHL_TSD tsd); /* PSI Database control & query */ void DMW_PSI_DeleteTables(int rf); void DMW_PSI_LockDB(BOOL bLock); S_PSIM_CHINFO *DMW_PSI_GetChInfo(int rf); S_PSIM_SUBCHINFO *DMW_PSI_GetSubChInfo(int rf, int source_id); #ifdef __cplusplus } /* extern "C" */ #endif #endif // __DMW_PSI_API_H__