/** @file DHL_PSI.h @brief MPEG section filter API for SI/PSI/PSIP reception Copyright 2006~2010 Digital STREAM Technology, Inc. All Rights Reserved */ #ifndef __DHL_PSI_H__ #define __DHL_PSI_H__ #include "DHL_Demux.h" #ifdef __cplusplus extern "C" { #endif #if COMMENT ____Overview____(){} #endif #if COMMENT ____Config____(){} #endif #define FILTER_MAX_BYTE 16 /* section filter¿¡¼­ ¼³Á¤ÇÒ ¼ö ÀÖ´Â ÃÖ´ë ¹ÙÀÌÆ® ¼ö */ // etm id ±îÁö¸¸ Æ÷ÇÔÇÏ¸é µÇ´Ï±î 13 byte ¸é µÈ´Ù. --> BK: 13-> FILTER_SIZE(=16)@bsettop_smessage_rave.c #if COMMENT ____Types____(){} #endif /** @brief PSI ¼ö½Å ¹× callbackÀÌ ºÒ¸®´Â ´ÜÀ§. DHL_PSI_StartMonitor() APIÀÇ ÀÎÀÚ·Î »ç¿ëµÈ´Ù. ¿©·¯ ¼½¼ÇÀÌ ÇϳªÀÇ Å×À̺íÀ» ÀÌ·ç´Â °æ¿ì (PAT, VCT µî) »ö¼Ç ´ÜÀ§ÀÇ ¼ö½ÅÀ» ÇÒÁö, Å×ÀÌºí ´ÜÀ§ÀÇ ¼ö½ÅÀ» ÇÒÁö ÁöÁ¤ÇÑ´Ù. ÇϳªÀÇ ¼½¼ÇÀ¸·Î¸¸ ±¸¼ºµÈ Å×À̺íÀÇ °æ¿ì (PMT, STT, ETT µî) ePSIMODE_TABLE Àº Àǹ̰¡ ¾ø´Ù. */ typedef enum { ePSIMODE_SECTION, ///< section ´ÜÀ§ ¼ö½Å ¹× callback. ePSIMODE_TABLE, ///< table ´ÜÀ§ÀÇ ¼ö½Å ¹× callback. } tDHL_PSI_Mode; /** @brief µ¿ÀÏÇÑ ¼½¼ÇÀÌ ¼ö½ÅµÇ´Â °æ¿ìÀÇ µ¿ÀÛ ÁöÁ¤. DHL_PSI_StartMonitor() APIÀÇ ÀÎÀÚ·Î »ç¿ëµÈ´Ù. */ typedef enum { ePSIUPDATE_ONESHOT=1, ///< 1ȸ¸¸ callback Çϰí Áß´Ü. ePSIUPDATE_VERCHANGE, ///< ¹öÀüÀÌ º¯°æµÉ ¶§ ¸¶´Ù callback. ePSIUPDATE_CRCCHANGE, ///< CRC°¡ º¯°æµÇ¸é (³»¿ëÀÌ ¹Ù²î¸é) callback. ePSIUPDATE_CONTINEOUS, ///< ¼ö½ÅµÇ´Â ¸ðµç ¼½¼Ç(Å×À̺í) ¸¶´Ù callback. } tDHL_PSI_Update; /** @brief ¼½¼Ç ÇÊÅÍ ¸¶½ºÅ© ÆÐÅÏ DHL_PSI_StartMonitor() APIÀÇ ÀÎÀÚ·Î »ç¿ëµÈ´Ù. SoC Çϵå¿þ¾î¿¡ µû¶ó µÎ¹øÂ° ¹× ¼¼¹øÂ° ¹ÙÀÌÆ® ÇÊÅ͸µÀº Áö¿øÇÏÁö ¾ÊÀ» ¼öµµ ÀÖ´Ù. °¡´ÉÇϸé ÀÌ ºÎºÐÀÇ ÇÊÅÍ´Â »ç¿ëÇÏÁö ¾Êµµ·Ï ÇÑ´Ù. DHL¿¡¼­ ¿ä±¸ÇÏ´Â ÇÊÅÍ ÆÐÅÏÀÇ ÃÖ´ë ±æÀÌ´Â FILTER_MAX_BYTE ÀÌ´Ù. (2,3¹øÂ° ¹ÙÀÌÆ® Æ÷ÇÔ) STT ¼ö½ÅÇÏ´Â °æ¿ìÀÇ ¿¹: - data = { cd, 00, 00, 00, 00, 00, ..} - mask = { ff, 00, 00, 00, 00, 00, ..} - mode = { ff, 00, 00, 00, 00, 00, ..} PMT program number 1 ¼ö½Å ¿¹: - data = { 02, 00, 00, 00, 01, 00, ..} - mask = { ff, 00, 00, ff, ff, 00, ..} - mode = { ff, 00, 00, ff, ff, 00, ..} PAT version 3À» Á¦¿ÜÇÑ ´Ù¸¥ ¹öÀü ¼ö½ÅÇÏ´Â °æ¿ìÀÇ ¿¹: - data = { 00, 00, 00, 00, 00, 06, ..} - mask = { ff, 00, 00, 00, 00, 3e, ..} - mode = { ff, 00, 00, 00, 00, 00, ..} */ typedef struct { #if 1//BRCM UINT8 mask[FILTER_MAX_BYTE]; // compare if mask bit is 0. if same, it is matched. UINT8 coef[FILTER_MAX_BYTE]; UINT8 excl[FILTER_MAX_BYTE]; // compare #else UINT8 data[FILTER_MAX_BYTE]; ///< ºñ±³s bit data UINT8 mask[FILTER_MAX_BYTE]; ///< mask bitÀÌ 1ÀÌ¸é ºñ±³¸¦ ¼öÇà, 0ÀÌ¸é ¹«½Ã(mode bit°ª ¹«½Ã) UINT8 mode[FILTER_MAX_BYTE]; #endif /**< mode bitÀÌ 1ÀÎ °÷Àº ºñ±³µÈ bits°¡ Çϳª¶óµµ ´Ù¸£¸é ¹«½Ã, ÇÑ ¹ÙÀÌÆ® ³»¿¡¼­ mode bitÀÌ 0ÀÌ °÷Àº ºñ±³µÈ bits°¡ ¸ðµÎ °°À¸¸é ¹«½Ã. @todo not equal filter°¡ ¹ÙÀÌÆ® ´ÜÀ§¸¦ ³Ñ¾î¼­´Â °æ¿ì (¿¹: 16bits ¿£Æ®¸®°¡ Àִµ¥ 16bits Àüü¿¡ not equal filter¸¦ °É°í ½ÍÀº °æ¿ì)´Â ÇöÀç Áö¿øÇÏÁö ¾Ê°í, »ç¿ëµÇ´Â °÷µµ ¾øÀ½. Çâ ÈÄ ÇÊ¿äÇÏ°Ô µÇ¸é º°µµÀÇ ´ëÀÀÀÌ ÇÊ¿äÇÔ. */ } tDHL_PSI_Filter; /** @brief Äݹé À̺¥Æ® ŸÀÔ tDHL_PSI_EventProc Äݹé°ú ÇÔ²² Àü´ÞµÇ´Â À̺¥Æ® Á¾·ù. */ typedef enum { ePSIEVENT_NOEVENT=0, ePSIEVENT_DATARECEIVED, ///< µ¥ÀÌÅͰ¡ ¼ö½ÅµÇ¾úÀ½. ePSIEVENT_DUP3PACKET=0x10, ePSIEVENT_LOSTPACKET, ePSIEVENT_DISCONTINUITY, ePSIEVENT_SPLICINGPOINT, ePSIEVENT_SYNCERR, ePSIEVENT_SCRAMBLEDERROR, ePSIEVENT_MEMORYERROR, ePSIEVENT_SECTIONTOOBIG, ePSIEVENT_CRCERROR, ePSIEVENT_VERSIONCHANGED, ePSIEVENT_CRCUNCHANGED, ePSIEVENT_MAXSECTIONOVERFLOW, ePSIEVENT_LASTSECTIONOVERFLOW, ePSIEVENT_FIFOFULLEVENT, ePSIEVENT_KILLUSRTASK, } tDHL_PSI_Event; /** @brief »ç¿ëÀÚ¿¡°Ô ¹ÝȯµÇ´Â PSI ÇÊÅÍ ÇÚµé. DHL_PSI_StartMonitor() API¿¡¼­ ¸¸µé¾îÁö°í, DHL_PSI_StopMonitor() API¿¡¼­ free µÈ´Ù. */ typedef UINT32 tDHL_PSI_ControlHandle; /** @brief °¢Á¾ À̺¥Æ®(µ¥ÀÌÅÍ ¼ö½Å ¶Ç´Â ¿¡·¯) °¡ ¹ß»ýµÉ ¶§ È£ÃâµÇ´Â Äݹé ÇÔ¼ö ÇÁ·ÎÅäŸÀÔ. DHL_PSI_StartMonitor() API È£Ãâ½Ã¿¡ caller°¡ ÁöÁ¤ÇÑ´Ù. */ typedef void (*tDHL_PSI_EventProc)(tDHL_PSI_Event event, tDHL_PSI_ControlHandle handle, UINT32 userParam); /** tDHL_PSI_DataArray ¾ÈÀÇ ¼½¼Ç Æ÷ÀÎÅÍ ¹è¿­ÀÇ Å©±â. ±Ô°Ý »ó sectionÀº ÃÖ´ë 256°³ ±îÁö ±¸¼ºµÉ ¼ö ÀÖÀ¸³ª, º¸ÅëÀº ¼ö °³ ³»¿ÜÀ̹ǷΠÀÌ Á¤µµ¸¸ ÀâÀ¸¸é µÈ´Ù. ÁÖÀÇ: DHL ³»ºÎ¿¡¼­´Â tDHL_PSI_DataArray array Å©±â¸¦ ÇÊ¿äÇÑ ¸¸Å­ µ¿ÀûÀ¸·Î ¾Ë¸Â°Ô ÇÒ´çÇÒ Çʿ䰡 ÀÖÀ½. */ #define DYNARRAY_SECTPTR 10 /* Debugger thinks there is this many anreies */ /** @brief ¼ö½ÅµÈ ¼½¼Ç µ¥ÀÌÅ͸¦ »ç¿ëÀÚ¿¡°Ô Àü´ÞÇϱâ À§ÇÑ µ¥ÀÌÅÍ ¹è¿­ ±¸Á¶. ¼½¼Ç ¸ðµå·Î ¼ö½ÅÇÑ °æ¿ì¶ó¸é ÇϳªÀÇ ¼½¼Ç¸¸ Àü´ÞµÇÁö¸¸, Å×ÀÌºí ¸ðµå·Î ¼ö½ÅÇÑ °æ¿ì¶ó¸é ¼½¼ÇµéÀÇ ÁýÇÕÀÌ array ÇüÅ·ΠÀü´ÞµÈ´Ù. */ typedef struct { tDHL_PSI_ControlHandle handle; /* request ID */ UINT16 pid; /* pid which this section came from */ INT32 numSections; /* number of section */ INT32 maxSections; /* max number of sections structure can hold */ UINT8 *sectPtr[DYNARRAY_SECTPTR]; /* dynamic array of 1 or more section pointers */ } tDHL_PSI_DataArray; #if COMMENT ____Defines____(){} #endif #if COMMENT ____API____(){} #endif /** @brief ¼ö½ÅµÈ psi µ¥ÀÌÅ͸¦ °¡Á®¿Â´Ù. */ DHL_RESULT DHL_PSI_ReadPSIData(tDHL_PSI_ControlHandle handle, tDHL_PSI_DataArray **ppData); /** @brief ó¸® (»ç¿ë)ÀÌ ³¡³­ psi data array¸¦ ¸Þ¸ð¸®¿¡¼­ ÇØÁ¦ÇÑ´Ù. */ void DHL_PSI_FreePSIData(tDHL_PSI_DataArray *pData); /** @name ÇÊÅÍ ¸¶½ºÅ© ÆÐÅÏ »ý¼º utility ÇÔ¼öµé. @{ */ /** @brief ¼½¼Ç ¼ö½Å¿¡ »ç¿ëµÉ ÇÊÅÍ ÆÐÅÏ µ¥ÀÌÅ͸¦ ÁغñÇÑ´Ù. ÇÊÅÍ µ¥ÀÌÅÍ´Â Heap¿¡ µ¿ÀûÀ¸·Î ÇÒ´çÇÑ´Ù. ÇÊÅÍ ÃʱⰪÀº all pass filter »óÅ·Π¸¸µé¾îÁø´Ù. ÇÏÁö¸¸ µðÅçÆ® »óÅ·Π¼öÁ¤¾øÀÌ »ç¿ëÇÏ´Â °æ¿ì´Â ¾øÀ» °ÍÀÓ. @param[out] ppFilter ¸¸µé¾îÁø ÇÊÅÍ µ¥ÀÌÅÍ Æ÷ÀÎÅÍÀÇ Æ÷ÀÎÅÍ. */ DHL_RESULT DHL_PSI_AllocGenericFilter(tDHL_PSI_Filter **ppFilter); /** @brief table id·Î ÇÊÅÍ ¸¶½ºÅ© ÆÐÅÏÀ» ±¸¼ºÇÑ´Ù. */ DHL_RESULT DHL_PSI_AllocFilterWithTid(tDHL_PSI_Filter **ppFilter, UINT8 tid, BOOL curnext_indicator); /** @brief table id¿Í tid extensionÀ¸·Î ÇÊÅÍ ¸¶½ºÅ© ÆÐÅÏÀ» ±¸¼ºÇÑ´Ù. */ DHL_RESULT DHL_PSI_AllocFilterWithTidEx(tDHL_PSI_Filter **ppFilter, UINT8 tid, UINT16 tidExtension, BOOL curnext_indicator); /** @brief ÇÊÅÍ ÆÐÅÏ µ¥ÀÌÅ͸¦ freeÇÑ´Ù. Alloc ÇÏ¿´À¸³ª ´õ ÀÌ»ó »ç¿ëÇÏÁö ¾Ê°Ô µÈ ÇÊÅÍ µ¥ÀÌÅ͸¦ ¸Þ¸ð¸®¿¡¼­ ÇØÁ¦ÇÑ´Ù. ÁÖÀÇ 1) DHL_PSI_StartMonitor °¡ ¼º°øÀûÀ¸·Î È£ÃâµÇ¾î tDHL_PSI_ControlHandle ¿¡ µî·ÏµÈ filter´Â DHL_PSI_StopMonitor ÀÌ ºÒ¸®¸é¼­ °°ÀÌ ÇØÁ¦ µÇ¹Ç·Î, º°µµ·Î DHL_PSI_FreeFilter ¸¦ ºÎ¸£Áö ¾Ê¾Æµµ µÈ´Ù. ÁÖÀÇ 2) DHL_OS_Free ó·³ Æ÷ÀÎÅÍÀÇ Æ÷ÀÎÅ͸¦ pass ÇÏ´Â°Ô ¾Æ´Ï¶ó, Æ÷ÀÎÅ͸¦ pass ÇÑ´Ù. »ç¿ë¿¡ ÁÖÀÇÇÒ °Í! @param[in] pFilter ÇØÁ¦ÇÒ ÇÊÅÍ µ¥ÀÌÅÍ Æ÷ÀÎÅÍ. */ void DHL_PSI_FreeFilter(tDHL_PSI_Filter *pFilter); /*@}*/ /** @brief PSI ¼ö½ÅÀ» ½ÃÀÛÇÑ´Ù. µ¥ÀÌÅͰ¡ ¼ö½ÅµÇ°í, callbackÀÌ È£ÃâµÉ Á¶°ÇÀÌ µÇ¸é eventProcÀÌ È£ÃâµÈ´Ù. caller´Â retPSIControlÀ» ±â¾ïÇØ µÎ¾î¾ß ÇÑ´Ù. ³ªÁß¿¡ stop ÇÒ ¶§ ÇÊ¿äÇÔ. @param[in] tsd TS ÀÔ·Â Æ÷Æ® ½Äº°ÀÚ @param[in] pid ¼½¼Ç/Å×À̺íÀÌ Æ÷ÇÔµÈ pid @param[in] psiMode ¼½¼Ç/Å×ÀÌºí µ¥ÀÌÅÍ ¼ö½Å ´ÜÀ§ @param[in] updateMode µ¿ÀÏÇÑ µ¥ÀÌÅÍ ¼ö½Å¿¡ ´ëÇÑ µ¿ÀÛ ¸ðµå @param[in] prefList ÇÊÅÍ ¸¶½ºÅ© ÆÐÅÏ @param[in] maxData @param[in] maxSections ¼½¼Ç ÃÖ´ë °¹¼ö @param[in] eventProc Äݹé ÇÔ¼ö @param[in] userParam »ç¿ëÀÚ ÆÄ¶ó¹ÌÅÍ @param[out] pHandle »õ·Ó°Ô ÇÒ´ç µÈ psi ÇÊÅÍ ÇÚµé. */ DHL_RESULT DHL_PSI_StartMonitor(tDHL_TSD tsd, UINT16 pid, tDHL_PSI_Mode psiMode, tDHL_PSI_Update updateMode, tDHL_PSI_Filter *prefList, UINT16 maxData, UINT16 maxSections, tDHL_PSI_EventProc eventProc, UINT32 userParam, tDHL_PSI_ControlHandle *pHandle); /** @brief PSI ¼ö½ÅÀ» Áß´ÜÇÑ´Ù. ³»ºÎ¿¡ µ¿ÀÛ ÁßÀÌ´ø ¸ðµç ÀÛ¾÷À» Áß´ÜÇÑ´Ù. ¾ÆÁ÷ ¸¶¹«¸® µÇÁö ¾ÊÀº ¼½¼Ç ¸Þ¸ð¸®µéÀº ¸ðµÎ free µÈ´Ù. ÀÌ ÈÄ¿¡ ´õÀÌ»ó psiCtlÀ» »ç¿ëÇÏ¸é ¾ÈµÈ´Ù. @param[in] handle Á¤Áö/ÇØÁ¦ ÇÒ psi ÇÚµé. */ void DHL_PSI_StopMonitor(tDHL_PSI_ControlHandle handle); DHL_RESULT DHL_PSI_Init(void); DHL_RESULT DHL_PSI_Uninit(void); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* __DHL_PSI_H__ */