sipsi.c
上传用户:fy98168
上传日期:2015-06-26
资源大小:13771k
文件大小:168k
源码类别:

DVD

开发平台:

C/C++

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <string.h>
  4. #include "gendef.h"
  5. #include "osp.h"
  6. #include "dmx.h"
  7. #include "timer.h"
  8. #include "sipsi.h"
  9. #include "sipsiprv.h"
  10. #include "unicode.h"
  11. #include "appltype.h"
  12. #include "db.h"
  13. #include "Ca_user.h"
  14. #include "task.h"
  15. #define J_SI_Print    DBGPrint
  16. #define J_SI_Malloc   KB_OSPMalloc
  17. #define J_SI_Free     KB_OSPFree
  18. #define SI_TIMER_TICK_PERIOD (500)
  19. #define SI_HEADER_LENGTH     (13)
  20. #define SI_FILTER_DEPTH      (8)
  21. #define SI_SECTION_NOT_RECEIVED  ((MepgData*)0x00000000)
  22. #define SI_SECTION_RECEIVED      ((MepgData*)0xFFFFFFFF)
  23. #define J_SI_EIT_PF_TIMEOUT       20 
  24. #define J_SI_EIT_SCHEDULE_TIMEOUT 50
  25. extern BOOL TFReceiveNitFlag;
  26. static T_SubTableID PATSubTableID;
  27. static T_SubTableID NITSubTableID;
  28. static T_SubTableID SDTSubTableID;
  29. static T_SubTableID PMTSubTableID[SI_NO_PMT_TABLES];
  30. static T_SubTableID EITSubTableID;
  31. static T_SubTableID CATSubTableID;
  32. static T_SubTableID TDTSubTableID;
  33. static T_SubTableID RSTSubTableID;
  34. static T_SubTableID TOTSubTableID;
  35. static T_SubTable SISubTable[SI_MAX_SUB_TABLES];
  36. static UINT32 l_nQueueId;
  37. static UINT32 l_nTaskId;
  38. static UINT32 SITimer = KB_TIMER_INVALID_ID;
  39. static INT8 l_nInitFlag = 0;
  40. static UINT32 l_nHandle = 1;
  41. static PATINFO* l_pstCurrPatPara;
  42. static PATINFO* l_pstPendingPatPara;
  43. static NITINFO* l_pstCurrNitPara;
  44. static NITINFO* l_pstPendingNitPara;
  45. static PMTINFO* l_pstCurrPmtPara[SI_NO_PMT_TABLES];
  46. static PMTINFO* l_pstPendingPmtPara[SI_NO_PMT_TABLES_QUEUE];
  47. static SDTINFO* l_pstCurrSdtPara;
  48. static SDTINFO* l_pstPendingSdtPara;
  49. static BATINFO* l_pstCurrBatPara;
  50. static BATINFO* l_pstPendingBatPara;
  51. static EITPFINFO* l_pstCurrEitPFPara[SI_NO_EIT_PF_FILTERS];
  52. static EITPFINFO* l_pstPendingEitPFPara[SI_NO_EIT_PF_TABLES_QUEUE];
  53. static EITSCHINFO* l_pstCurrEinSchInfoPara[KB_SI_EIT_SCHEDULE_SERVICE_COUNT];
  54. static EITSCHINFO* l_pstPendingEinSchInfoPara[KB_SI_EIT_SCHEDULE_SERVICE_COUNT];
  55. static MULTEITSCHINFO* l_pstCurrMultiEinSchInfoPara;
  56. static MULTEITSCHINFO* l_pstPendingMultiEinSchInfoPara;
  57. static TDTINFO* l_pstCurrTdtPara;
  58. static TDTINFO* l_pstPendingTdtPara;
  59. static TOTINFO* l_pstCurrTotPara;
  60. static TOTINFO* l_pstPendingTotPara;
  61. static CATINFO* l_pstCurrCatPara;
  62. static CATINFO* l_pstPendingCatPara;
  63. static RSTINFO* l_pstCurrRstPara;
  64. static RSTINFO* l_pstPendingRstPara;
  65. static T_EIT_SCHEDULE_TIME_SHIFT_PARA *gptCurrSchShiftPara[SI_NO_EIT_SCHEDULE_TIME_SHIFT_FILTERS];
  66. static T_EIT_SCHEDULE_TIME_SHIFT_PARA *gptPendingSchShiftPara[SI_NO_EIT_SCHEDULE_TIME_SHIFT_FILTERS];
  67. static MepgData SISectionSmallData[SI_MAX_SECTION_SMALL_DATA];
  68. static MepgData SISectionLargeData[SI_MAX_SECTION_LARGE_DATA];
  69. static T_ChannelToSubtable        SIChannelToSubTableMap[SI_DMX_NO_CHANNELS];
  70. static T_SubTableFilter SIFilters[SI_DMX_NO_FILTERS];
  71. static UINT32           SICurrentFilter;
  72. static UINT32        SISubTableListData[SI_MAX_SUB_TABLES];
  73. static UINT32        SISectionLargeDataListBuffer[SI_MAX_SECTION_LARGE_DATA];
  74. static UINT32        SISectionSmallDataListBuffer[SI_MAX_SECTION_SMALL_DATA];
  75. static SIFIFO SISubTableList = {SI_MAX_SUB_TABLES, SISubTableListData};
  76. static SIFIFO SISectionLargeDataList = {SI_MAX_SECTION_LARGE_DATA, SISectionLargeDataListBuffer};
  77. static SIFIFO SISectionSmallDataList = {SI_MAX_SECTION_SMALL_DATA, SISectionSmallDataListBuffer};
  78. static T_SubTableDetails PATDetails = { 0x0000, 33, TRUE,  0x00, -1, 10,  1,                 FALSE };
  79. static T_SubTableDetails CATDetails = { 0x0001, 33, TRUE,  0x01, -1, 10,  1,                 FALSE };
  80. static T_SubTableDetails PMTDetails = { -1,     33, TRUE,  0x02, -1, 10,  1,                 FALSE };
  81. static T_SubTableDetails NITDetails = { 0x0010, 33, TRUE,  0x40, -1, 40,  1,                 FALSE };
  82. static T_SubTableDetails SDTDetails = { 0x0011, 33, TRUE,  0x42, -1, 40,  2,                 FALSE };
  83. static T_SubTableDetails EITDetails = { 0x0012, 33, TRUE,  0x4E, -1, 25,  SI_NO_EIT_FILTERS, FALSE };
  84. static T_SubTableDetails TDTDetails = { 0x0014, 33, FALSE, 0x70, -1, 120, 1,                 FALSE };
  85. static T_SubTableDetails RSTDetails = { 0x0013, 33, FALSE, 0x71, -1, -1,  1,                 FALSE };
  86. static T_SubTableDetails TOTDetails = { 0x0014, 33, FALSE, 0x73, -1, 120, 1,                 FALSE };
  87. static UINT32 semCritical;    /* 保护LIFO的资源共享的信号量 */
  88. static KB_SICallbackFunc gptSiCallbackFunction = NULL;
  89. static KB_SICallbackFunc gptSiEitCallbackFunction = NULL;
  90. /*******************************************************************************
  91. **                            Local Function Prototype
  92. *******************************************************************************/
  93. static void SIToLower(char* str);
  94. static void SIGetSection(UINT32 nChannelID, UINT8 *pData, UINT32 nDataLength);
  95. static int KD_DTVSendMsg(KB_OSPMsgNode * pMsg);
  96. static void SiEitSetup(T_SubTableID subTableID, UINT32 filterNumber, 
  97.                           INT32 version, UINT32 handle);
  98. static UINT32 SIGetFilterNum(T_SubTableID subTableID, INT32 tableId,
  99.                                       INT32 tableIDExt);
  100. static INT32 SIStopEitPF(INT32 nSvcID, INT32 nTableId);
  101. INT32 KB_SIInit()
  102. {
  103.     int i;
  104. if(l_nInitFlag == 1)
  105. {
  106. return RETOK;
  107. }
  108. l_nInitFlag = 1;
  109. if(KB_OSPSemInit("SI-S", 1, J_OSP_WAIT_FIFO, &semCritical) != Ret_OK)
  110. {
  111. return RETFIAL1;
  112. }    
  113.     
  114.     for(i=0; i<SI_DMX_NO_CHANNELS; i++)
  115. {
  116. SIChannelToSubTableMap[i].valid = 0;
  117. }
  118.     
  119.     if (SIAlloc() != SI_OK)
  120.     {
  121.         return RETFIAL1;
  122.     }
  123.     
  124. if (SISubTableInitialize() != SI_OK)
  125.     {
  126.         return RETFIAL1;
  127.     }
  128. return RETOK;
  129. }
  130.     
  131. INT32 KB_SIDestroy()
  132. {
  133. if(l_nInitFlag == 0)
  134. {
  135. return 0;
  136. }
  137. l_nInitFlag = 0;
  138. KB_SIStopAllSection();
  139. SISubTableDestroy();
  140. SIFree();
  141.     KB_OSPSemDel(semCritical);
  142. return 0;
  143. }
  144. static INT32 SIAlloc(void)
  145. {
  146. int i;
  147. if( (l_pstCurrPatPara = J_SI_Malloc( sizeof(PATINFO) )) == NULL )
  148. {
  149. return SI_MEMORY_FULL;
  150. }
  151. memset(l_pstCurrPatPara, 0, sizeof(PATINFO));
  152. if( (l_pstPendingPatPara = J_SI_Malloc( sizeof(PATINFO) )) == NULL )
  153. {
  154. return SI_MEMORY_FULL;
  155. }
  156. memset(l_pstPendingPatPara, 0, sizeof(PATINFO));
  157. if( (l_pstCurrNitPara = J_SI_Malloc( sizeof(NITINFO) )) == NULL )
  158. {
  159. return SI_MEMORY_FULL;
  160. }
  161. memset(l_pstCurrNitPara, 0, sizeof(NITINFO));
  162. if( (l_pstPendingNitPara = J_SI_Malloc( sizeof(NITINFO) )) == NULL )
  163. {
  164. return SI_MEMORY_FULL;
  165. }
  166. memset(l_pstPendingNitPara, 0, sizeof(NITINFO));
  167. for(i = 0; i < SI_NO_PMT_TABLES; i++)
  168. {
  169. if( (l_pstCurrPmtPara[i] = J_SI_Malloc( sizeof(PMTINFO) )) == NULL )
  170. {
  171. return SI_MEMORY_FULL;
  172. }
  173. memset(l_pstCurrPmtPara[i], 0, sizeof(PMTINFO));
  174. }
  175. for(i = 0; i < SI_NO_PMT_TABLES_QUEUE; i++)
  176. {
  177. if( (l_pstPendingPmtPara[i] = J_SI_Malloc( sizeof(PMTINFO) )) == NULL )
  178. {
  179. return SI_MEMORY_FULL;
  180. }
  181. memset(l_pstPendingPmtPara[i], 0, sizeof(PMTINFO));
  182. }
  183. if( (l_pstCurrSdtPara = J_SI_Malloc( sizeof(SDTINFO) )) == NULL )
  184. {
  185. return SI_MEMORY_FULL;
  186. }
  187. memset(l_pstCurrSdtPara, 0, sizeof(SDTINFO));
  188. if( (l_pstPendingSdtPara = J_SI_Malloc( sizeof(SDTINFO) )) == NULL )
  189. {
  190. return SI_MEMORY_FULL;
  191. }
  192. memset(l_pstPendingSdtPara, 0, sizeof(SDTINFO));
  193. if( (l_pstCurrBatPara = J_SI_Malloc( sizeof(BATINFO) )) == NULL )
  194. {
  195. return SI_MEMORY_FULL;
  196. }
  197. memset(l_pstCurrBatPara, 0, sizeof(BATINFO));
  198. if( (l_pstPendingBatPara = J_SI_Malloc( sizeof(BATINFO) )) == NULL )
  199. {
  200. return SI_MEMORY_FULL;
  201. }
  202. memset(l_pstPendingBatPara, 0, sizeof(BATINFO));
  203. for(i = 0; i < SI_NO_EIT_PF_FILTERS; i++)
  204. {
  205. if( (l_pstCurrEitPFPara[i] = J_SI_Malloc( sizeof(EITPFINFO) )) == NULL )
  206. {
  207. return SI_MEMORY_FULL;
  208. }
  209. memset(l_pstCurrEitPFPara[i], 0, sizeof(EITPFINFO));
  210. }
  211. for(i = 0; i < SI_NO_EIT_PF_TABLES_QUEUE; i++)
  212. {
  213. if( (l_pstPendingEitPFPara[i] = J_SI_Malloc( sizeof(EITPFINFO) )) == NULL )
  214. {
  215. return SI_MEMORY_FULL;
  216. }
  217. memset(l_pstPendingEitPFPara[i], 0, sizeof(EITPFINFO));
  218. }
  219.     
  220.     for (i = 0; i < KB_SI_EIT_SCHEDULE_SERVICE_COUNT; i++)
  221.     {
  222.         if( (l_pstCurrEinSchInfoPara[i] = J_SI_Malloc( sizeof(EITSCHINFO) )) == NULL )
  223.     {
  224.     return SI_MEMORY_FULL;
  225.     }
  226.     memset(l_pstCurrEinSchInfoPara[i], 0, sizeof(EITSCHINFO));
  227.         if( (l_pstPendingEinSchInfoPara[i] = J_SI_Malloc( sizeof(EITSCHINFO) )) == NULL )
  228.     {
  229.     return SI_MEMORY_FULL;
  230.     }
  231.     memset(l_pstPendingEinSchInfoPara[i], 0, sizeof(EITSCHINFO));
  232.     }
  233. if( (l_pstCurrMultiEinSchInfoPara = J_SI_Malloc( sizeof(MULTEITSCHINFO) )) == NULL )
  234. {
  235. return SI_MEMORY_FULL;
  236. }
  237. memset(l_pstCurrMultiEinSchInfoPara, 0, sizeof(MULTEITSCHINFO));
  238. if( (l_pstPendingMultiEinSchInfoPara = J_SI_Malloc( sizeof(MULTEITSCHINFO) )) == NULL )
  239. {
  240. return SI_MEMORY_FULL;
  241. }
  242. memset(l_pstPendingMultiEinSchInfoPara, 0, sizeof(MULTEITSCHINFO));
  243. if( (l_pstCurrTdtPara = J_SI_Malloc( sizeof(TDTINFO) )) == NULL )
  244. {
  245. return SI_MEMORY_FULL;
  246. }
  247. memset(l_pstCurrTdtPara, 0, sizeof(TDTINFO));
  248. if( (l_pstPendingTdtPara = J_SI_Malloc( sizeof(TDTINFO) )) == NULL )
  249. {
  250. return SI_MEMORY_FULL;
  251. }
  252. memset(l_pstPendingTdtPara, 0, sizeof(TDTINFO));
  253. if( (l_pstCurrCatPara = J_SI_Malloc( sizeof(CATINFO) )) == NULL )
  254. {
  255. return SI_MEMORY_FULL;
  256. }
  257. memset(l_pstCurrCatPara, 0, sizeof(CATINFO));
  258. if( (l_pstPendingCatPara = J_SI_Malloc( sizeof(CATINFO) )) == NULL )
  259. {
  260. return SI_MEMORY_FULL;
  261. }
  262. memset(l_pstPendingCatPara, 0, sizeof(CATINFO));
  263. if( (l_pstCurrRstPara = J_SI_Malloc( sizeof(RSTINFO) )) == NULL )
  264. {
  265. return SI_MEMORY_FULL;
  266. }
  267. memset(l_pstCurrRstPara, 0, sizeof(RSTINFO));
  268. if( (l_pstPendingRstPara = J_SI_Malloc( sizeof(RSTINFO) )) == NULL )
  269. {
  270. return SI_MEMORY_FULL;
  271. }
  272. memset(l_pstPendingRstPara, 0, sizeof(RSTINFO));
  273. if( (l_pstCurrTotPara = J_SI_Malloc( sizeof(TOTINFO) )) == NULL )
  274. {
  275. return SI_MEMORY_FULL;
  276. }
  277. memset(l_pstCurrTotPara, 0, sizeof(TOTINFO));
  278. if( (l_pstPendingTotPara = J_SI_Malloc( sizeof(TOTINFO) )) == NULL )
  279. {
  280. return SI_MEMORY_FULL;
  281. }
  282. memset(l_pstPendingTotPara, 0, sizeof(TOTINFO));
  283.     for (i = 0;i < SI_NO_EIT_SCHEDULE_TIME_SHIFT_FILTERS; i++)
  284.     {        
  285.         gptCurrSchShiftPara[i] = J_SI_Malloc(sizeof(T_EIT_SCHEDULE_TIME_SHIFT_PARA));
  286.         if (gptCurrSchShiftPara[i] == NULL)
  287.         {
  288.             return SI_MEMORY_FULL;
  289.         }
  290.         memset(gptCurrSchShiftPara[i], 0, sizeof(T_EIT_SCHEDULE_TIME_SHIFT_PARA));
  291.         gptPendingSchShiftPara[i] = J_SI_Malloc(sizeof(T_EIT_SCHEDULE_TIME_SHIFT_PARA));
  292.         if (gptPendingSchShiftPara[i] == NULL)
  293.         {
  294.             return SI_MEMORY_FULL;
  295.         }
  296.         memset(gptPendingSchShiftPara[i], 0, sizeof(T_EIT_SCHEDULE_TIME_SHIFT_PARA));
  297.     }
  298.     
  299. return SI_OK;
  300. }
  301. void SIFree(void)
  302. {
  303. int i;
  304. J_SI_Free(l_pstCurrPatPara);
  305. J_SI_Free(l_pstPendingPatPara);
  306. J_SI_Free(l_pstCurrNitPara);
  307. J_SI_Free(l_pstPendingNitPara);
  308. for(i = 0; i < SI_NO_PMT_TABLES; i++)
  309. {
  310. J_SI_Free(l_pstCurrPmtPara[i]);
  311. }
  312. for(i = 0; i < SI_NO_PMT_TABLES_QUEUE; i++)
  313. {
  314. J_SI_Free(l_pstPendingPmtPara[i]);
  315. }
  316. J_SI_Free(l_pstCurrSdtPara);
  317. J_SI_Free(l_pstPendingSdtPara);
  318. J_SI_Free(l_pstCurrBatPara);
  319. J_SI_Free(l_pstPendingBatPara);
  320. for(i = 0; i < SI_NO_EIT_PF_FILTERS; i++)
  321. {
  322. J_SI_Free(l_pstCurrEitPFPara[i]);
  323. }
  324. for(i = 0; i < SI_NO_EIT_PF_TABLES_QUEUE; i++)
  325. {
  326. J_SI_Free(l_pstPendingEitPFPara[i]);
  327. }
  328.     for (i = 0; i < KB_SI_EIT_SCHEDULE_SERVICE_COUNT; i++)
  329.     {
  330.         if (l_pstCurrEinSchInfoPara[i])
  331.         {
  332.             J_SI_Free(l_pstCurrEinSchInfoPara[i]);
  333.         }
  334.         if (l_pstPendingEinSchInfoPara[i])
  335.         {
  336.             J_SI_Free(l_pstPendingEinSchInfoPara[i]);
  337.         }
  338.     }
  339. J_SI_Free(l_pstCurrMultiEinSchInfoPara);
  340. J_SI_Free(l_pstPendingMultiEinSchInfoPara);
  341. J_SI_Free(l_pstCurrTdtPara);
  342. J_SI_Free(l_pstPendingTdtPara);
  343. J_SI_Free(l_pstCurrCatPara);
  344. J_SI_Free(l_pstPendingCatPara);
  345. J_SI_Free(l_pstCurrRstPara);
  346. J_SI_Free(l_pstPendingRstPara);
  347. J_SI_Free(l_pstCurrTotPara);
  348. J_SI_Free(l_pstPendingTotPara);
  349.     for (i = 0;i < SI_NO_EIT_SCHEDULE_TIME_SHIFT_FILTERS; i++)
  350.     {
  351.         if (gptCurrSchShiftPara[i])
  352.         {
  353.             J_SI_Free(gptCurrSchShiftPara[i]);
  354.         }
  355.         
  356.         if (gptPendingSchShiftPara[i])
  357.         {
  358.             J_SI_Free(gptPendingSchShiftPara[i]);
  359.         }
  360.     }
  361. }
  362. INT32 KB_SIStopAllSection()
  363. {
  364. UINT32 i;
  365.     
  366. SISubTableStop(PATSubTableID);
  367. SISubTableStop(NITSubTableID);
  368. SISubTableStop(SDTSubTableID); 
  369. SISubTableStop(EITSubTableID);
  370. SISubTableStop(CATSubTableID);
  371. SISubTableStop(TDTSubTableID);
  372. SISubTableStop(RSTSubTableID);
  373. SISubTableStop(TOTSubTableID);
  374. for(i = 0; i < SI_NO_PMT_TABLES; i++)
  375. SISubTableStop(PMTSubTableID[i]);
  376. memset(l_pstCurrPatPara, 0, sizeof(PATINFO));
  377. memset(l_pstPendingPatPara, 0, sizeof(PATINFO));
  378. memset(l_pstCurrNitPara, 0, sizeof(NITINFO));
  379. memset(l_pstPendingNitPara, 0, sizeof(NITINFO));
  380. memset(l_pstCurrSdtPara, 0, sizeof(SDTINFO));
  381. memset(l_pstPendingSdtPara, 0, sizeof(SDTINFO));
  382. memset(l_pstCurrBatPara, 0, sizeof(BATINFO));
  383. memset(l_pstPendingBatPara, 0, sizeof(BATINFO));
  384. for(i = 0; i < SI_NO_PMT_TABLES; i++)
  385. {
  386. memset(l_pstCurrPmtPara[i], 0, sizeof(PMTINFO));
  387. memset(l_pstPendingPmtPara[i], 0, sizeof(PMTINFO));
  388. }
  389. for(i = 0; i < SI_NO_EIT_PF_FILTERS; i++)
  390. {
  391. memset(l_pstCurrEitPFPara[i], 0, sizeof(EITPFINFO));
  392. memset(l_pstPendingEitPFPara[i], 0, sizeof(EITPFINFO));
  393. }
  394.     for (i = 0; i < KB_SI_EIT_SCHEDULE_SERVICE_COUNT; i++)
  395.     {
  396.     memset(l_pstCurrEinSchInfoPara[i], 0, sizeof(EITSCHINFO));
  397.     memset(l_pstPendingEinSchInfoPara[i], 0, sizeof(EITSCHINFO));
  398.     }
  399. memset(l_pstCurrMultiEinSchInfoPara, 0, sizeof(MULTEITSCHINFO));
  400. memset(l_pstPendingMultiEinSchInfoPara, 0, sizeof(MULTEITSCHINFO));
  401. memset(l_pstCurrTdtPara, 0, sizeof(TDTINFO));
  402. memset(l_pstPendingTdtPara, 0, sizeof(TDTINFO));
  403. memset(l_pstCurrCatPara, 0, sizeof(CATINFO));
  404. memset(l_pstPendingCatPara, 0, sizeof(CATINFO));
  405. memset(l_pstCurrRstPara, 0, sizeof(RSTINFO));
  406. memset(l_pstPendingRstPara, 0, sizeof(RSTINFO));
  407. memset(l_pstCurrTotPara, 0, sizeof(TOTINFO));
  408. memset(l_pstPendingTotPara, 0, sizeof(TOTINFO));
  409.     for (i = 0; i < SI_NO_EIT_SCHEDULE_TIME_SHIFT_FILTERS; i++)
  410.     {
  411.  memset(gptCurrSchShiftPara[i], 0, sizeof(T_EIT_SCHEDULE_TIME_SHIFT_PARA));
  412.         memset(gptPendingSchShiftPara[i], 0, sizeof(T_EIT_SCHEDULE_TIME_SHIFT_PARA));
  413.     }
  414. return 0;
  415. }
  416. static INT32 SISubTableInitialize(void)
  417. {
  418. INT32 status;
  419. INT32 i;
  420. LIFOInitialize(&SISubTableList);   
  421. LIFOInitialize(&SISectionSmallDataList);
  422. LIFOInitialize(&SISectionLargeDataList);
  423. for(i = 0; i < SI_MAX_SUB_TABLES; i++)
  424. {
  425. LIFOPush(&SISubTableList, i);
  426. }
  427.     
  428. for(i = 0; i < SI_MAX_SECTION_SMALL_DATA; i++)
  429. {
  430.     SISectionSmallData[i].data = NULL;
  431.         
  432. LIFOPush(&SISectionSmallDataList, (UINT32)&SISectionSmallData[i]);
  433. }
  434.     
  435. for(i = 0; i < SI_MAX_SECTION_LARGE_DATA; i++)
  436. {
  437.         SISectionLargeData[i].data = NULL;
  438.         
  439. LIFOPush(&SISectionLargeDataList, (UINT32)&SISectionLargeData[i]);
  440. }
  441. status = KB_OSPQueInit("SI_Q", 128, &l_nQueueId);
  442. if (status != Ret_OK)
  443. {
  444.         return SI_OSP_ERROR;
  445. }
  446. status = KB_OSPTaskInit ("SI_T", 8 * 1024, (void (*)(void*))SITask, SIPSI_PRIORITY, NULL, (UINT32*)&l_nTaskId);
  447. if (status != Ret_OK)
  448. {
  449.         return SI_OSP_ERROR;
  450. }
  451. /*
  452. ** Initialize the number of filters
  453. */
  454. SICurrentFilter = 0;
  455. /* Create the various sub tables: */
  456. PATSubTableID = SISubTableCreate(&PATDetails, SIParsePAT, SIHandlePat, SIHandlePatTimeout, NULL);
  457.     if (PATSubTableID < 0)
  458.     {
  459.         return SI_NO_FREE_SUBTABLES;
  460.     }
  461.     
  462. NITSubTableID = SISubTableCreate(&NITDetails, SIParseNIT, SIHandleNit, SIHandleNitTimeout, NULL);
  463.     if (NITSubTableID < 0)
  464.     {
  465.         return SI_NO_FREE_SUBTABLES;
  466.     }
  467.     
  468. SDTSubTableID = SISubTableCreate(&SDTDetails, SIParseSDT, SIHandleSdt, SIHandleSdtTimeout, NULL);
  469.     if (SDTSubTableID < 0)
  470.     {
  471.         return SI_NO_FREE_SUBTABLES;
  472.     }
  473.     
  474. EITSubTableID = SISubTableCreate(&EITDetails, SIParseEit, SIHandleEit, SIHandleEitTimeout, SiEitSetup);
  475.     if (EITSubTableID < 0)
  476.     {
  477.         return SI_NO_FREE_SUBTABLES;
  478.     }
  479.     
  480. CATSubTableID = SISubTableCreate(&CATDetails, SIParseCAT, SIHandleCat, SIHandleCatTimeout, NULL);
  481.     if (CATSubTableID < 0)
  482.     {
  483.         return SI_NO_FREE_SUBTABLES;
  484.     }
  485.     
  486. TDTSubTableID = SISubTableCreate(&TDTDetails, SIParseTDT, NULL,       SIHandleTdtTimeout, NULL);
  487.     if (TDTSubTableID < 0)
  488.     {
  489.         return SI_NO_FREE_SUBTABLES;
  490.     }
  491.     
  492. RSTSubTableID = SISubTableCreate(&RSTDetails, SIParseRST, NULL,       NULL,              NULL);
  493.     if (RSTSubTableID < 0)
  494.     {
  495.         return SI_NO_FREE_SUBTABLES;
  496.     }
  497.     
  498. TOTSubTableID = SISubTableCreate(&TOTDetails, SIParseTOT, NULL,       SIHandleTotTimeout, NULL);
  499.     if (TOTSubTableID < 0)
  500.     {
  501.         return SI_NO_FREE_SUBTABLES;
  502.     }
  503.     PMTDetails.noFilters = SI_NO_PMT_FILTERS;
  504. PMTSubTableID[0] = SISubTableCreate(&PMTDetails, SIParsePMT, SIHandlePmt, SIHandlePmtTimeout, NULL);
  505.     if (PMTSubTableID[0] < 0)
  506.     {
  507.         return SI_NO_FREE_SUBTABLES;
  508.     }
  509.     
  510. PMTDetails.noFilters = 1;
  511. for(i = 1; i < SI_NO_PMT_TABLES; i++)
  512. {
  513. PMTSubTableID[i] = SISubTableCreate(&PMTDetails, SIParsePMT, SIHandlePmt, SIHandlePmtTimeout, NULL);
  514.         if (PMTSubTableID[i] < 0)
  515.         {
  516.             return SI_NO_FREE_SUBTABLES;
  517.         }
  518. }
  519. SITimer = KB_TimerCreate(KB_TIMER_REPEAT , (KB_TIMER_FUNC_POINTER)SISendTimerMessage,NULL);
  520. if(SITimer == KB_TIMER_INVALID_ID )
  521. {
  522.         
  523. return SI_UNKNOWN_ERROR;
  524. }
  525.     
  526. status = KB_TimerEnable(SITimer, SI_TIMER_TICK_PERIOD);
  527. if(status != RETOK)
  528. {
  529.         
  530. return SI_UNKNOWN_ERROR;
  531. }
  532. return SI_OK;
  533. }
  534. static INT32 SISubTableDestroy(void)
  535. {
  536. INT32 status;
  537. INT32 i, j;
  538. /*
  539. ** Stop the SI Timer tick.
  540. */
  541. KB_TimerDisable(SITimer);
  542. status = KB_TimerDel(SITimer);
  543. for(i = 0; i < SI_MAX_SUB_TABLES; i++)
  544. {
  545. INT32 nFilterNumber;
  546. nFilterNumber = SISubTable[i].details.noFilters;
  547. for(j = 0; j < nFilterNumber; j++)
  548. {
  549. KB_DmxFreeFilter( SISubTable[i].filter[j].filterID);
  550. }
  551. KB_DmxFreeChnnl(SISubTable[i].details.channelID);
  552. }
  553. KB_OSPTaskDel(l_nTaskId);
  554. KB_OSPQueDel(l_nQueueId);
  555. return SI_OK;
  556. }
  557. static T_SubTableID SISubTableCreate(T_SubTableDetails* details,
  558.                                      T_SectionCallback sectionCallback,
  559.                                      T_SubTableCallback tableCallback,
  560.                                      T_TimeoutCallback timeoutCallback,
  561.                                      T_SetupCallback setupCallback)
  562. {
  563. UINT32 i;
  564. UINT32 subTableID, channelID;
  565. INT32  nReturn;
  566.     UINT32 filterID;
  567. UINT32 j;
  568. T_SubTableFilter *filterDetails;
  569.         
  570. /*
  571. ** Get a free sub-table. Return an error if no free storage is available.
  572. */
  573. if(LIFOPop(&SISubTableList, &subTableID) != LIFO_OK)
  574. {
  575. return SI_NO_FREE_SUBTABLES;
  576. }
  577. /*
  578. ** Allocate the Demux resources
  579. */
  580. if (details == &EITDetails)
  581. {
  582.         nReturn = KB_DmxAllocateChnnl(DMX_CHANNEL_SECTION, 256 * 1024, FALSE, &channelID);
  583. }
  584.     else
  585. {
  586.     nReturn = KB_DmxAllocateChnnl(DMX_CHANNEL_SECTION, SI_DMX_BUFFER_SIZE, FALSE, &channelID);
  587. }
  588. if(nReturn != RETOK)
  589. {
  590.     channelID = 0xFFFFFFFF;
  591. return SI_NO_AVAILABLE_CHANNELS;
  592. }
  593.     
  594. KB_DmxRegNotice(channelID, SIGetSection);
  595. SISubTable[subTableID].filter = &SIFilters[SICurrentFilter];
  596. SICurrentFilter += details->noFilters;
  597. if(SICurrentFilter > SI_DMX_NO_FILTERS)
  598. {
  599. SICurrentFilter -= details->noFilters;
  600. LIFOPush(&SISubTableList, subTableID);
  601. return SI_NO_AVAILABLE_FILTERS;
  602. }
  603. /*
  604. ** Store the sub-table details
  605. */
  606. SISubTable[subTableID].sectionCallback = sectionCallback;
  607. SISubTable[subTableID].tableCallback = tableCallback;
  608. SISubTable[subTableID].setupCallback = setupCallback;
  609. SISubTable[subTableID].details.PID = details->PID;
  610. SISubTable[subTableID].details.channelID = channelID;
  611. SISubTable[subTableID].details.multipleSections = details->multipleSections;
  612. SISubTable[subTableID].details.tableID = details->tableID;
  613. SISubTable[subTableID].details.tableIDExt = details->tableIDExt;
  614. SISubTable[subTableID].details.timeout = details->timeout;
  615. SISubTable[subTableID].details.noFilters = details->noFilters;
  616. SISubTable[subTableID].details.channelStarted = FALSE;
  617. /*
  618. ** Store which sub table is using the channel
  619. */
  620. /* SIChannelToSubTableMap[channelID] = subTableID; */
  621.     for(i=0; i<SI_DMX_NO_CHANNELS; i++)
  622. {
  623. if(!SIChannelToSubTableMap[i].valid)
  624. {
  625. SIChannelToSubTableMap[i].channelId = channelID;
  626. SIChannelToSubTableMap[i].subTableId = subTableID;
  627. SIChannelToSubTableMap[i].valid = 1;
  628. break;
  629. }
  630. }
  631. /*
  632. ** Allocate the filters
  633. */
  634. /* EIT只使用一个硬件filter */
  635. if (details == &EITDetails)
  636. {
  637.         nReturn = KB_DmxAllocateFilter(DMX_SECTION_FILTER, SI_FILTER_DEPTH, &filterID);
  638. if(nReturn != RETOK)
  639. {
  640. return SI_NO_AVAILABLE_FILTERS;
  641. }
  642.         for(i = 0; i < details->noFilters; i++)
  643.         {
  644.             filterDetails = &SISubTable[subTableID].filter[i];
  645.      /* Store the initial values for the filter */
  646.      filterDetails->tableID = details->tableID;
  647.      filterDetails->tableIDExt = details->tableIDExt;
  648.      filterDetails->version = -1;
  649.      filterDetails->timeout = -1; //details->timeout
  650.      filterDetails->filterID = filterID;
  651.      filterDetails->filterNumber = i;
  652.      filterDetails->timeoutCallback = timeoutCallback;
  653.      filterDetails->subTableID = subTableID;
  654.      filterDetails->enabled = FALSE;
  655.             filterDetails->used    = FALSE;
  656.             
  657.      for( j = 0; j < SI_MAX_SECTION_PER_TABLE; j++ )
  658.      {
  659.      filterDetails->data.sectionData[j] = SI_SECTION_NOT_RECEIVED;
  660.      }
  661.         }
  662. }
  663.     else
  664.     {
  665.      for(i = 0; i < details->noFilters; i++)
  666.      {
  667.      /*
  668.      ** Setup the static parts of the H/W
  669.      */
  670.      nReturn = KB_DmxAllocateFilter(DMX_SECTION_FILTER, SI_FILTER_DEPTH, &filterID);
  671.      if(nReturn != RETOK)
  672.      {
  673.      return SI_NO_AVAILABLE_FILTERS;
  674.      }        
  675.             
  676.      filterDetails = &SISubTable[subTableID].filter[i];
  677.      /* Store the initial values for the filter */
  678.      filterDetails->tableID = details->tableID;
  679.      filterDetails->tableIDExt = details->tableIDExt;
  680.      filterDetails->version = -1;
  681.      filterDetails->timeout = -1; //details->timeout
  682.      filterDetails->filterID = filterID;
  683.      filterDetails->filterNumber = i;
  684.      filterDetails->timeoutCallback = timeoutCallback;
  685.      filterDetails->subTableID = subTableID;
  686.      filterDetails->enabled = FALSE;
  687.             filterDetails->used    = FALSE;
  688.             
  689.      for( j = 0; j < SI_MAX_SECTION_PER_TABLE; j++ )
  690.      {
  691.      filterDetails->data.sectionData[j] = SI_SECTION_NOT_RECEIVED;
  692.      }
  693.             
  694.      }
  695.     }
  696.     
  697. return subTableID;
  698. }
  699. INT32 SIFreeSectionData(MepgData *section)
  700. {
  701. INT32 status = SI_INVALID_SECTION_DATA_ID;
  702. /* Validate the sectionData before adding it to the free list */
  703. if(section != NULL)
  704. {
  705. if(section >= &SISectionSmallData[0] && section <= &SISectionSmallData[SI_MAX_SECTION_SMALL_DATA])
  706. {
  707.             KB_DmxUnlock(SISubTable[section->subTableID].details.channelID,
  708.                              section->data);
  709.             section->data = NULL;
  710.             
  711. LIFOPush(&SISectionSmallDataList, (UINT32)section);
  712. status = SI_OK;
  713. }
  714. else if(section >= &SISectionLargeData[0] && section <= &SISectionLargeData[SI_MAX_SECTION_LARGE_DATA])
  715. {
  716.             KB_DmxUnlock(SISubTable[section->subTableID].details.channelID,
  717.                              section->data);
  718.             section->data = NULL;
  719.             
  720. LIFOPush(&SISectionLargeDataList, (UINT32)section);
  721. status = SI_OK;
  722. }
  723.         
  724. }
  725.     
  726. return status;
  727. }
  728. /*
  729. ** Private Functions
  730. */
  731. static void SIFilterStopHelper(UINT32 channelID, T_SubTableFilter *filter)
  732. {
  733.     int i;
  734. T_SubTableID  subTableID = 0;
  735. for(i=0; i<SI_DMX_NO_CHANNELS; i++)
  736. {
  737. if(SIChannelToSubTableMap[i].valid &&
  738. (SIChannelToSubTableMap[i].channelId == channelID))
  739. {
  740. subTableID = SIChannelToSubTableMap[i].subTableId;
  741. break;
  742. }
  743. }
  744. if(i >= SI_DMX_NO_CHANNELS)
  745. {
  746. return;
  747. }
  748.     
  749. /* Reset the timer */
  750. filter->timeout = -1;
  751.     /* 把sub table filter设为不可用状态 */
  752.     filter->enabled = FALSE;
  753.     //filter->used    = FALSE;
  754.     
  755.     if (subTableID == EITSubTableID)
  756.     {
  757.         for (i = 0; i < SI_NO_EIT_FILTERS; i++)
  758.         {
  759.             if (SISubTable[subTableID].filter[i].enabled == TRUE)
  760.             {
  761.                 break;
  762.             }            
  763.         }
  764.         /* 当所有过滤器都停止时才停止通道和过滤器 */
  765.         if(i >= SI_NO_EIT_FILTERS)
  766. {
  767.             if (SISubTable[subTableID].details.channelStarted == TRUE)
  768.             {                
  769.     SISubTable[subTableID].details.channelStarted = FALSE;  
  770.                 DBGPrint("Stop helper eitn");
  771.                 KB_DmxControlChnnl(channelID, KB_DMX_STOP);
  772.                 KB_DmxDisassociateFilter(channelID, filter->filterID);
  773.             }
  774. }         
  775.     }
  776.     else
  777.     {
  778.         SISubTable[subTableID].details.channelStarted = FALSE;
  779.      KB_DmxControlChnnl(channelID, KB_DMX_STOP);
  780.      KB_DmxDisassociateFilter(channelID, filter->filterID);
  781.     }
  782. //KB_DmxControlChnnl(channelID, KB_DMX_START);
  783. }
  784. static void SIFilterStop(UINT32 channelID, T_SubTableFilter *filter)
  785. {
  786. SIFilterStopHelper(channelID, filter);
  787. }
  788. static void SIFilterDetach(UINT32 channelID, T_SubTableFilter *filter)
  789. {
  790. /* Reset the timer */
  791. filter->timeout = -1;
  792. KB_DmxDisassociateFilter(channelID, filter->filterID);
  793. filter->enabled = FALSE;
  794.     filter->used    = FALSE;
  795. }
  796. static void SISubTableStop(T_SubTableID subTableID)
  797. {
  798. UINT32 i;
  799.     KB_DmxControlChnnl(SISubTable[subTableID].details.channelID, KB_DMX_STOP);
  800. SISubTable[subTableID].details.channelStarted = FALSE;
  801. for(i = 0; i < SISubTable[subTableID].details.noFilters; i++)
  802. {
  803. SIFilterDetach(SISubTable[subTableID].details.channelID, &SISubTable[subTableID].filter[i]);
  804. }
  805. }
  806. static void SISubTableStart(T_SubTableID subTableID, UINT32 filterNumber, INT32 version, UINT32 handle)
  807. {
  808. UINT32 i;
  809. T_SubTableFilter *filterDetails;
  810. UINT32 channelID;
  811. UINT32 filterID;
  812. UINT8 filterMask[16];
  813. UINT8 filterMatch[16];
  814. UINT32 filterNegate;
  815.     memset(filterMatch, 0, sizeof(filterMatch));
  816.     memset(filterMask, 0, sizeof(filterMask));
  817. /*
  818. ** Update the filter values
  819. */
  820. filterDetails = &SISubTable[subTableID].filter[filterNumber];
  821. filterID = filterDetails->filterID;
  822. channelID = SISubTable[subTableID].details.channelID;
  823. /*
  824. ** First of all stop the demux channel to prevent any more data from being received.
  825. */
  826. if (subTableID == EITSubTableID)
  827. {
  828.         if (SISubTable[subTableID].details.channelStarted != TRUE)
  829.         {
  830.       KB_DmxControlChnnl(channelID, KB_DMX_STOP);
  831.             SISubTable[subTableID].details.channelStarted = FALSE;
  832.         }
  833. }
  834.     else
  835.     {
  836.         KB_DmxControlChnnl(channelID, KB_DMX_STOP);
  837.         SISubTable[subTableID].details.channelStarted = FALSE;
  838.     }
  839.     task_lock();
  840. if( SISubTable[subTableID].setupCallback != NULL )
  841. {
  842. SISubTable[subTableID].setupCallback(subTableID, filterNumber, version, handle);
  843. }
  844. else
  845. {
  846. /*
  847. ** Update the filter values
  848. */
  849. filterDetails = &SISubTable[subTableID].filter[filterNumber];
  850. filterDetails->data.total = -1;
  851. filterDetails->data.received = 0;
  852. for(i = 0; i < SI_MAX_SECTION_PER_TABLE; i++)
  853. {
  854. /* Before resetting the section data list check to make sure no section data buffers are still waiting for data */
  855. //防止内存泄漏
  856. if( (filterDetails->data.sectionData[i] != SI_SECTION_NOT_RECEIVED) &&
  857. (filterDetails->data.sectionData[i] != SI_SECTION_RECEIVED) )
  858. {
  859. SIFreeSectionData(filterDetails->data.sectionData[i]);
  860. }
  861. filterDetails->data.sectionData[i] = SI_SECTION_NOT_RECEIVED;
  862. }
  863. filterDetails->tableID = SISubTable[subTableID].details.tableID;
  864. filterDetails->tableIDExt = SISubTable[subTableID].details.tableIDExt;
  865. filterDetails->version = version;
  866. filterDetails->timeout = SISubTable[subTableID].details.timeout;
  867. filterDetails->handle = handle;
  868. if( filterDetails->tableID != -1 )
  869. {
  870. filterMask[0] = 0xFF;
  871. filterMatch[0] = (UINT8) (filterDetails->tableID & 0xFF);
  872. }
  873. else
  874. {
  875. filterMask[0] = 0x00;
  876. filterMatch[0] = 0x00;
  877. }
  878. if( filterDetails->tableIDExt != -1 )
  879. {
  880. filterMask[3] = 0xFF;
  881. filterMask[4] = 0xFF;
  882. filterMatch[3] = (UINT8)((filterDetails->tableIDExt >> 8) & 0xFF);
  883. filterMatch[4] = (UINT8) (filterDetails->tableIDExt & 0xFF);
  884. }
  885. else
  886. {
  887. filterMask[3] = 0x00;
  888. filterMask[4] = 0x00;
  889. filterMatch[3] = 0x00;
  890. filterMatch[4] = 0x00;
  891. }
  892. if( filterDetails->version != -1 )
  893. {
  894. filterMask[5] = 0x3E;
  895. filterMatch[5] = (UINT8)((filterDetails->version & 0x1F) << 1);
  896. filterNegate = (1 << 5);
  897. }
  898. else
  899. {
  900. filterMask[5] = 0x00;
  901. filterMatch[5] = 0x00;
  902. filterNegate = 0;
  903. }      
  904. filterDetails->enabled = TRUE;   
  905.          filterDetails->used    = TRUE;
  906.         KB_DmxAssociateFilter(channelID, filterID);        
  907. KB_DmxSetFilter(filterID, filterMatch, filterMask, filterNegate);
  908. }
  909.     task_unlock();
  910.     
  911.     if (subTableID == EITSubTableID)
  912. {
  913.         if (SISubTable[subTableID].details.channelStarted != TRUE)
  914.         {
  915.         KB_DmxSetChnnlPID(channelID, (UINT16)SISubTable[subTableID].details.PID);
  916.          SISubTable[subTableID].details.channelStarted = TRUE;
  917.         }
  918. }
  919.     else
  920.     {
  921.         KB_DmxSetChnnlPID(channelID, (UINT16)SISubTable[subTableID].details.PID);
  922.      SISubTable[subTableID].details.channelStarted = TRUE;
  923.     }
  924.     
  925. }
  926. static BOOL SIHandleNewSection(UINT8* headerMPEGSection, T_DMX_Notify* notifyData)
  927. {
  928. T_SubTableID subTableID = 0;
  929. T_SubTableFilter *filter;
  930. UINT32 filterNumber;
  931. UINT32 sectionNumber;
  932. UINT32 sectionLength;
  933. UINT32 i;
  934. UINT16 tableIDExt;
  935. UINT8 *data;
  936. UINT8 version;
  937. UINT8 tableID;
  938. MepgData *sectionData;
  939. SIFIFO *sectionDataList;
  940. int nIsMulti = 0;
  941. /* Assume we do not want the section. */
  942. notifyData->copyLength = 0;
  943.     if(notifyData->whichChannel == 0xFFFFFFFF)
  944. {
  945. return (FALSE);
  946. }
  947. /*
  948. ** Get the subTable ID associated with this section.
  949. */
  950. /* subTableID = SIChannelToSubTableMap[notifyData->whichChannel]; */
  951.     for(i=0; i<SI_DMX_NO_CHANNELS; i++)
  952. {
  953. if (SIChannelToSubTableMap[i].valid 
  954.             && (SIChannelToSubTableMap[i].channelId == notifyData->whichChannel))
  955. {
  956. subTableID = SIChannelToSubTableMap[i].subTableId;
  957. break;
  958. }
  959. }
  960.     if(i >= SI_DMX_NO_CHANNELS)
  961. {
  962. return FALSE;
  963. }
  964.     
  965. if(subTableID > SI_MAX_SUB_TABLES || subTableID < 0)
  966. {
  967. return (FALSE);
  968. }
  969. data = headerMPEGSection;
  970. /*
  971. ** Store the section information
  972. */
  973. tableID = data[0];
  974. sectionLength = ((((UINT32)data[1] & 0x0F) << 8) + (UINT32)data[2]) + 3;
  975. tableIDExt = (UINT16)(data[3] << 8) | data[4];
  976. version = (UINT8)((data[5] & 0x3E) >> 1);
  977.     
  978. /*
  979. ** If the section syntax is set then remove the CRC from the data to be
  980. ** copied
  981. */
  982. if( data[1] & 0x80 )
  983. {
  984. sectionLength -= 4;
  985. }
  986. /*
  987. ** Ensure there is enough space to perform the copy. Note. The only DVB
  988. ** section allowed to be longer than 1024 bytes are EIT scheduling
  989. ** information.
  990. */
  991. if(sectionLength > 4096)
  992. {
  993. return (FALSE);
  994. }
  995. else 
  996.     {
  997.         if(sectionLength > 1024)
  998.         {
  999.          sectionDataList = &SISectionLargeDataList;
  1000.         }
  1001.         else
  1002.         {
  1003.          sectionDataList = &SISectionSmallDataList;
  1004.         }
  1005. }
  1006. /*
  1007. ** Locate which filter this section passed. Initially assume it was the
  1008. ** first.
  1009. */
  1010. filter = &SISubTable[subTableID].filter[0];
  1011. filterNumber = 0;
  1012. /*
  1013. ** Check to ensure that the section we have just received is one we currently want.
  1014. */
  1015. for(i = 0; i < SISubTable[subTableID].details.noFilters; i++)
  1016. {
  1017. filter = &SISubTable[subTableID].filter[i];
  1018. if((filter->enabled == TRUE) &&
  1019.    (filter->tableID == tableID || filter->tableID == -1 ) &&
  1020.    (filter->tableIDExt == tableIDExt || filter->tableIDExt == -1 ) &&
  1021.    (filter->version == version || filter->version == -1 ) )
  1022. {
  1023. filterNumber = i;
  1024. break;
  1025. }
  1026. }
  1027.     
  1028. if( i == SISubTable[subTableID].details.noFilters )
  1029. {
  1030. return (FALSE);
  1031. }
  1032. if(SISubTable[subTableID].details.multipleSections == TRUE)
  1033. {        
  1034. if(filter->tableID == 0x50 && filter->tableIDExt == -1)
  1035. {
  1036. nIsMulti = 1;
  1037. }
  1038. /*
  1039. ** Is this section needed.
  1040. */
  1041. sectionNumber = data[6];
  1042.         
  1043. if( nIsMulti ? 1 :(filter->data.sectionData[sectionNumber] == SI_SECTION_NOT_RECEIVED))
  1044. {
  1045. /*
  1046. ** Get the next free section data area. If there are none available,
  1047. ** then do nothing and wait for the section to be repeated.
  1048. */
  1049. if( LIFOPop(sectionDataList, (UINT32*)&sectionData) == LIFO_OK)
  1050. {
  1051. //J_SI_Print("Success....n");
  1052. /*
  1053. ** Update the sub table details
  1054. */
  1055. filter->data.sectionData[sectionNumber] = sectionData;
  1056. /*
  1057. ** Check to see if this is the first section received.
  1058. */
  1059. if( filter->data.total == -1 )
  1060. {
  1061. filter->data.total = data[7];
  1062. }
  1063. if(tableID == 0x50 
  1064.                                    || tableID == 0x51 
  1065.                                    || tableID == 0x60 
  1066.                                    || tableID == 0x61
  1067.                                    || tableID == 0x4F) /* EIT Specific */
  1068. {
  1069. /* data[6] :section_number, data[7]:last_section_number, 
  1070. ** data[12]: segment_last_section_number 
  1071. ** 每一个segment可以包含8个section,同时包含三个小时内开始的事件信息。
  1072. */
  1073. if( (sectionNumber == data[12]) && (data[7] != data[12]) )
  1074. {
  1075. filter->data.received += (0x7 - (sectionNumber & 0x7));
  1076. }
  1077. }
  1078. filter->data.version = version;
  1079. filter->data.tableIDExt = tableIDExt;
  1080. /*
  1081. ** Update the section data details.
  1082. */
  1083. sectionData->length = sectionLength;
  1084. sectionData->subTableID = subTableID;
  1085. sectionData->filterNumber = filterNumber;
  1086. /*
  1087. ** Is there any data to copy. If not call SISectionCopied directly,
  1088. ** which will in turn call the high level.
  1089. */
  1090. if( sectionData->length != 0 )
  1091. {
  1092.                      sectionData->data = headerMPEGSection;
  1093. notifyData->skipLength = 0;
  1094. notifyData->copyLength = sectionData->length + 4; // 包含了CRC_32
  1095. notifyData->tag = (void*)sectionData;
  1096. notifyData->outputBuffer = (UINT8*)sectionData->data;
  1097. }
  1098. else
  1099. {
  1100. SISectionCopied( DMX_AVAILABLE,
  1101. (UINT8*)sectionData->data,
  1102.  0, (void*)sectionData );
  1103.                     return FALSE;
  1104. }
  1105. }
  1106. else
  1107. {                
  1108.                 return FALSE;
  1109. }
  1110. }
  1111.         else
  1112.         {
  1113.             return FALSE;
  1114.         }
  1115. }
  1116. else /* multipleSections == FALSE */
  1117. {
  1118. if(LIFOPop(sectionDataList, (UINT32*)&sectionData) == LIFO_OK)
  1119. {
  1120. sectionData->length = sectionLength;
  1121. sectionData->subTableID = subTableID;
  1122. sectionData->filterNumber = filterNumber;
  1123.             sectionData->data = headerMPEGSection;
  1124.             
  1125. /*
  1126. ** Setup the information for the copy.
  1127. */
  1128. notifyData->skipLength  = 0;
  1129. notifyData->copyLength  = sectionData->length;
  1130. notifyData->tag  = (void*)sectionData;
  1131. notifyData->outputBuffer = (UINT8*)sectionData->data;
  1132. }
  1133. else
  1134. {
  1135.             return FALSE;
  1136. }
  1137. }
  1138. return( TRUE );
  1139. }
  1140. /****************************************************************************
  1141. ** Function     SISectionCopied()
  1142. **
  1143. ** Description  Called by the Demux driver when a section has been copied.
  1144. **              Performs the following:
  1145. **               o Inform the SI Task of the new section
  1146. **               o If all the section of the sub table have been received then:
  1147. **                  Inform the SI task that the table is complete
  1148. **                  Stop the reception of the table.
  1149. **
  1150. ** Input        INT32 condition
  1151. **                Whether the section was copied successfully or not.
  1152. **              UINT8* buffer
  1153. **                The buffer containing the data. NOT USED
  1154. **              UINT32 length
  1155. **                The total number of bytes copied. NOT USED
  1156. **              void *tag
  1157. **                The section data identifier passed to the section copy
  1158. **                routine by the header notify callback. Indicates which
  1159. **                section the data belongs to.
  1160. **
  1161. ** Modified     None
  1162. **
  1163. ** Return       Nothing
  1164. **
  1165. *****************************************************************************/
  1166. static void SISectionCopied( INT32 condition, UINT8 *buffer, UINT32 length, void *tag)
  1167. {
  1168. KB_OSPMsgNode message;
  1169. T_SubTableFilter *filter;
  1170. T_SubTableID subTableID;
  1171. UINT32      filterNumber;
  1172. MepgData *sectionData;
  1173. UINT32     channelID;
  1174. UINT32     sectionNumber;
  1175. UINT8 nitbuffer[300];
  1176. UINT32 i;
  1177. int nIsMulti = 0;
  1178.     int nCurrentNo;
  1179. sectionData = (MepgData*)tag;
  1180. /* Validate the tag */
  1181. if( (sectionData < &SISectionSmallData[0] ||
  1182.      sectionData > &SISectionSmallData[SI_MAX_SECTION_SMALL_DATA]) &&
  1183.     (sectionData < &SISectionLargeData[0] ||
  1184.      sectionData > &SISectionLargeData[SI_MAX_SECTION_LARGE_DATA]) )
  1185. {
  1186. J_SI_Print("[SI] Near Fatal Error: Tag invalid: %x (%d %x %d)n",
  1187. (int)tag, (int)condition, (int)buffer, (int)length );
  1188. return;
  1189. }
  1190. subTableID = sectionData->subTableID;
  1191. if(subTableID==NITSubTableID)
  1192. {
  1193. if (TFReceiveNitFlag == TRUE)
  1194. {
  1195. KB_CASetNIT(buffer,length); 
  1196. TFReceiveNitFlag = FALSE;
  1197. }
  1198. else
  1199. {
  1200. for(i=0;i<length;i++)
  1201. {
  1202. if (buffer[i] == 0xa1 && buffer[i+1] == 0x2B && buffer[i+2] ==0x00 && buffer[i+3] ==0xDF )
  1203. {
  1204.        break;
  1205. }
  1206. }
  1207. if (i<length-43)
  1208. {
  1209.     memcpy(nitbuffer,&buffer[i],43);
  1210.      CA_CheckNit(nitbuffer, 43);
  1211. }
  1212. }
  1213. }
  1214.     
  1215. filterNumber = sectionData->filterNumber;
  1216. filter = &SISubTable[subTableID].filter[filterNumber];
  1217. channelID = SISubTable[subTableID].details.channelID;
  1218.     
  1219. if(filter->tableIDExt == -1 && buffer[0] == 0x50)
  1220. {
  1221. nIsMulti = 1;
  1222. }
  1223.     
  1224.     //End addition
  1225. if(condition != DMX_AVAILABLE)
  1226. {
  1227. //if(!nIsMulti)
  1228. J_SI_Print("[SI] Lost section %xn", (int)sectionData);
  1229. if( SISubTable[subTableID].details.multipleSections == TRUE )
  1230. {
  1231. sectionNumber = buffer[6];
  1232. if(filter->data.sectionData[sectionNumber] == sectionData)
  1233. {
  1234. filter->data.sectionData[sectionNumber] = SI_SECTION_NOT_RECEIVED;
  1235. }
  1236. }
  1237. SIFreeSectionData(sectionData);
  1238. return;
  1239. }
  1240. message.Word1 = SI_MSG_COPY;
  1241. message.Word2/*sectionData*/ = (UINT32)sectionData;
  1242. message.Word3/*handle*/ = filter->handle;
  1243. message.Word4/*filterNumber*/ = filterNumber;
  1244. if( KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&message) != Ret_OK )
  1245. {
  1246. /* Error sending message so clean up section */
  1247. SIFreeSectionData(sectionData);
  1248. /*
  1249. ** Since the section wasn't sent correctly, remove it from the received
  1250. ** list. The total value has yet to be incremented, so we do not need to
  1251. ** decrement it.
  1252. */
  1253. if(SISubTable[subTableID].details.multipleSections == TRUE)
  1254. {
  1255. sectionNumber = buffer[6];
  1256. if(filter->data.sectionData[sectionNumber] == sectionData)
  1257. {
  1258. filter->data.sectionData[sectionNumber] = SI_SECTION_NOT_RECEIVED;
  1259. }
  1260. }
  1261. }
  1262. else
  1263. {
  1264. /*
  1265. ** Check to see whether this sub-table is completed.
  1266. */
  1267. if(nIsMulti)
  1268. {
  1269. static int nMsgSent = 0; //SI_MSG_COMPLETED的消息已发出
  1270. INT16 nServiceNum;
  1271. int i, nDone = 1;
  1272. nServiceNum = l_pstCurrMultiEinSchInfoPara->nServiceNum;
  1273. for(i = 0; i < nServiceNum; i ++)
  1274. {
  1275. if(l_pstCurrMultiEinSchInfoPara->nTableDone[i][0] != 1)
  1276. {
  1277. nDone = 0;
  1278. break;
  1279. }
  1280. }
  1281. if(nDone)
  1282. {
  1283. if(!nMsgSent)
  1284. {
  1285. //所有的EIT schedule表接收完
  1286. nMsgSent = 1;
  1287. message.Word1 = SI_MSG_COMPLETED;
  1288. /*
  1289. ** Completed the sub-table, so reset the current filter to block
  1290. ** all data and then inform the user.
  1291. */
  1292. SIFilterStopHelper(channelID, filter);
  1293. KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&message);
  1294. }
  1295. else
  1296. { nMsgSent = 0;} //保证下一次接收完的正确判断
  1297. }
  1298. else
  1299. nMsgSent = 0;
  1300. return;
  1301. }
  1302. if( SISubTable[subTableID].details.multipleSections == TRUE )
  1303. {
  1304. /*
  1305. ** The message has been successfully sent to the SI task, so we can now
  1306. ** updated the section state to say it has been received.
  1307. */
  1308. sectionNumber = buffer[6];
  1309. if( filter->data.sectionData[sectionNumber] == sectionData )
  1310. {
  1311. filter->data.sectionData[sectionNumber] = SI_SECTION_RECEIVED;
  1312. }
  1313. }
  1314.         /* 以下一段代码应该考虑去掉,因为在这里判断影响了程序的处理流程,不易修改 */
  1315. if( SISubTable[subTableID].details.multipleSections == TRUE )
  1316. {
  1317. if(filter->data.received == filter->data.total)
  1318. {                                    
  1319. if(subTableID == EITSubTableID && filterNumber < KB_SI_EIT_SCHEDULE_SOFT_FILTER_COUNT)
  1320. {
  1321.                     int i;
  1322.                 
  1323.                     for (i = 0; i < KB_SI_EIT_SCHEDULE_SERVICE_COUNT; i++)
  1324.                     {
  1325.                         if(l_pstCurrEinSchInfoPara[i]->handle == filter->handle)
  1326.                      {
  1327.                             nCurrentNo = i;
  1328.                      break;
  1329.                      }
  1330.                     }  
  1331.                 
  1332. if(l_pstCurrEinSchInfoPara[nCurrentNo]->nTableDone[1] == 0)
  1333. {
  1334. // 兼容前端系统只发table_id=50的情形
  1335. if(buffer[13]/* last_table_id */ == 0x50)
  1336. {
  1337. l_pstCurrEinSchInfoPara[nCurrentNo]->nTableDone[1] = 1;
  1338. }
  1339. }
  1340.                     if (filter->tableID == 0x50)
  1341.                     {
  1342.     l_pstCurrEinSchInfoPara[nCurrentNo]->nTableDone[0] = 1;
  1343.                     }
  1344.                     else
  1345.                     {
  1346.                         if (filter->tableID == 0x51)
  1347.                         {
  1348.                             l_pstCurrEinSchInfoPara[nCurrentNo]->nTableDone[1] = 1;
  1349.                         }
  1350.                     }
  1351. if(l_pstCurrEinSchInfoPara[nCurrentNo]->nTableDone[0] == 1 &&
  1352.    l_pstCurrEinSchInfoPara[nCurrentNo]->nTableDone[1] == 1)
  1353. {
  1354. message.Word1 = SI_MSG_COMPLETED;
  1355. /*
  1356. ** Completed the sub-table, so reset the current filter to block
  1357. ** all data and then inform the user.
  1358. */        
  1359.                         
  1360.                         if (filter->tableID == 0x50)
  1361.                         {
  1362.                             SIFilterStopHelper(channelID, &SISubTable[EITSubTableID].filter[filterNumber]);
  1363.                             filterNumber = SIGetFilterNum(EITSubTableID, 0x51, filter->tableIDExt);
  1364.                             if (filterNumber != 0xFFFFFFFF)
  1365.                             {
  1366.                                 SIFilterStopHelper(channelID, &SISubTable[EITSubTableID].filter[filterNumber]);
  1367.                             }
  1368.                         }
  1369.                         else
  1370.                         {
  1371.                             if (filter->tableID == 0x51)
  1372.                             {
  1373.                                 SIFilterStopHelper(channelID, &SISubTable[EITSubTableID].filter[filterNumber]);
  1374.                                 filterNumber = SIGetFilterNum(EITSubTableID, 0x50, filter->tableIDExt);
  1375.                                 if (filterNumber != 0xFFFFFFFF)
  1376.                                 {
  1377.                                     SIFilterStopHelper(channelID, &SISubTable[EITSubTableID].filter[filterNumber]);
  1378.                                 }
  1379.                             }
  1380.                         }
  1381. KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&message) ;
  1382. }
  1383. }
  1384. else
  1385. {
  1386. message.Word1 = SI_MSG_COMPLETED;
  1387. /*
  1388. ** Completed the sub-table, so reset the current filter to block
  1389. ** all data and then inform the user.
  1390. */
  1391. SIFilterStopHelper(channelID, filter);
  1392. KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&message) ;
  1393. }
  1394. }
  1395. else
  1396. {
  1397. filter->data.received++;
  1398. }
  1399. }
  1400. else
  1401. {
  1402. SIFilterStopHelper(channelID, filter);
  1403. }
  1404. }
  1405. }
  1406. static void SITask(void)
  1407. {
  1408. KB_OSPMsgNode message;
  1409. MepgData *sectionData;
  1410. T_SubTableID subTableID;
  1411. INT32 status;
  1412. while(TRUE)
  1413. {
  1414. status = KB_OSPMsgGet(l_nQueueId, KB_Wait, 0, (KB_OSPMsgNode *)&message);
  1415. if(status != Ret_OK)
  1416. {
  1417. continue;
  1418. }
  1419. switch (message.Word1)
  1420. {
  1421. case SI_MSG_TIMER_TICK:
  1422. SIHandleTimerTick();
  1423. break;
  1424. case SI_MSG_COPY:
  1425. sectionData = (MepgData*)message.Word2/*sectionData*/;
  1426. subTableID = sectionData->subTableID;
  1427. /*
  1428. ** Has the application made a new request.
  1429. */
  1430. #if 1
  1431. if(message.Word3/*handle*/ != SISubTable[subTableID].filter[message.Word4/*filterNumber*/].handle)
  1432. {
  1433. J_SI_Print("message.Word3=%d, message.Word4/*filterNumber*/].handle=%dn", 
  1434. (int)message.Word3, (int)SISubTable[subTableID].filter[message.Word4/*filterNumber*/].handle);
  1435. /* Check to ensure no buffers are left if the message is discarded */
  1436. SIFreeSectionData(sectionData);
  1437. if(subTableID == TDTSubTableID || subTableID == RSTSubTableID)
  1438. {
  1439. SISubTable[subTableID].filter[message.Word4/*filterNumber*/].enabled = FALSE;
  1440.                     SISubTable[subTableID].filter[message.Word4/*filterNumber*/].used    = FALSE;
  1441. }
  1442. break;
  1443. }
  1444. #endif
  1445. /*
  1446. ** Inform the user the section copy has completed
  1447. */
  1448. if( SISubTable[subTableID].sectionCallback != NULL )
  1449. {
  1450. SISubTable[subTableID].sectionCallback(sectionData);
  1451. }
  1452. if(subTableID == TDTSubTableID || subTableID == RSTSubTableID || subTableID == TOTSubTableID)
  1453. {
  1454. SISubTable[subTableID].filter[message.Word4/*filterNumber*/].enabled = FALSE;
  1455.                 SISubTable[subTableID].filter[message.Word4/*filterNumber*/].used    = FALSE;
  1456. }
  1457. break;
  1458. case SI_MSG_COMPLETED:
  1459. sectionData = (MepgData*)message.Word2/*sectionData*/;
  1460. subTableID = sectionData->subTableID;
  1461. /*
  1462. ** Has the application made a new request.
  1463. */
  1464. if(message.Word3/*handle*/ != SISubTable[subTableID].filter[message.Word4/*filterNumber*/].handle)
  1465. {
  1466. J_SI_Print("[SI] handle difference message.Word3 = %ld message.Word4 = %ld handle = %ldn", 
  1467.                            message.Word3, message.Word4, 
  1468.                            SISubTable[subTableID].filter[message.Word4/*filterNumber*/].handle);
  1469. break;
  1470. }
  1471. /*
  1472. ** Inform the user the table has been completed.
  1473. */
  1474. if( SISubTable[subTableID].tableCallback != NULL )
  1475. {
  1476. SISubTable[subTableID].tableCallback(subTableID, message.Word4/*filterNumber*/, message.Word3/*handle*/);
  1477. }
  1478. break;
  1479. case MSG_SI_PAT_RECEIVE:
  1480. SIGetPAT();
  1481. break;
  1482. case MSG_SI_PAT_STOP_RECEIVE:
  1483. SIStopPAT();
  1484. break;
  1485. case MSG_SI_NIT_RECEIVE:
  1486. SIGetNIT();
  1487. break;
  1488. case MSG_SI_NIT_STOP_RECEIVE:
  1489. SIStopNIT();
  1490. break;
  1491. case MSG_SI_PMT_RECEIVE:
  1492. SIGetPmt(message.Word2);
  1493. break;
  1494. case MSG_SI_PMT_STOP_RECEIVE:
  1495. SIStopPmt(message.Word2);
  1496. break;
  1497. case MSG_SI_SDT_RECEIVE:
  1498. SIGetSDT();
  1499. break;
  1500. case MSG_SI_SDT_STOP_RECEIVE:
  1501. SIStopSdt();
  1502. break;
  1503. case MSG_SI_BAT_RECEIVE:
  1504. SIGetBat();
  1505. break;
  1506. case MSG_SI_BAT_STOP_RECEIVE:
  1507. SIStopBat();
  1508. break;
  1509. case MSG_SI_EIT_PF_RECEIVE:
  1510. SIGetEitPF(message.Word2);
  1511. break;
  1512. case MSG_SI_EIT_PF_STOP_RECEIVE:
  1513. SIStopEitPF(message.Word2, message.Word3);
  1514. break;
  1515. case MSG_SI_EIT_SCHEDULE_RECEIVE:
  1516. SIGetEitSCH(message.Word2);
  1517. break;
  1518. case MSG_SI_MULTI_EIT_SCHEDULE_RECEIVE:
  1519. SIGetMultEitSCH();
  1520. break;
  1521. case MSG_SI_EIT_SCHEDULE_STOP_RECEIVE:
  1522. SIStopEitSCH(message.Word2);
  1523. break;
  1524. case MSG_SI_MULTI_EIT_SCHEDULE_STOP_RECEIVE:
  1525. SIStopMultEitSCH();
  1526. break;
  1527. case MSG_SI_TDT_RECEIVE:
  1528. SIGetTDT();
  1529. break;
  1530. case MSG_SI_TDT_STOP_RECEIVE:
  1531. SIStopTDT();
  1532. break;
  1533. case MSG_SI_CAT_RECEIVE:
  1534. SIGetCAT();
  1535. break;
  1536. case MSG_SI_CAT_STOP_RECEIVE:
  1537. SIStopCAT();
  1538. break;
  1539. case MSG_SI_RST_RECEIVE:
  1540. SIGetRst();
  1541. break;
  1542. case MSG_SI_RST_STOP_RECEIVE:
  1543. SIStopRst();
  1544. break;
  1545. case MSG_SI_TOT_RECEIVE:
  1546. SIGetTOT();
  1547. break;
  1548. case MSG_SI_TOT_STOP_RECEIVE:
  1549. SIStopTOT();
  1550. break;
  1551.         case MSG_SI_EIT_SCHEDULE_SHIFT_RECEIVE:
  1552.             SIGetEitSCHShift(message.Word2, message.Word3);
  1553.             break;
  1554.         case MSG_SI_EIT_SCHEDULE_SHIFT_STOP_RECEIVE:
  1555.             SIStopEitSCHShift(message.Word2, message.Word3);
  1556.             break;
  1557.             
  1558. default:
  1559. J_SI_Print( "SI: Internal case state error. Line %dn", __LINE__ );
  1560. break;
  1561. }
  1562. }
  1563. }
  1564. /*****************************************************************************
  1565.  **
  1566.  ** Part 2 - SubTable Parsing
  1567.  **
  1568.  *****************************************************************************/
  1569. /****************************************************************************
  1570. ** Function     SISendTimerMessage
  1571. **
  1572. ** Description  Timer callback. Called periodically as a timer tick. Generates
  1573. **              messages to the SI Task informing it of the tick.
  1574. **
  1575. ** Input        None
  1576. **
  1577. ** Modified     None
  1578. **
  1579. ** Return       Nothing
  1580. **
  1581. *****************************************************************************/
  1582. static void SISendTimerMessage(void)
  1583. {
  1584. KB_OSPMsgNode message;
  1585. message.Word1 = SI_MSG_TIMER_TICK;
  1586. KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode*)&message);
  1587. }
  1588. extern void LED_ShowNum(int i);
  1589. /****************************************************************************
  1590. ** Function     SIHandleTimerTick
  1591. **
  1592. ** Description  Called by SI Task whenever an SI Tick occurs. Performs the
  1593. **              following:
  1594. **               o For each filter decrement the timer (if enabled)
  1595. **               o If the timer expires:
  1596. **                  Generate the timeout callback (if present)
  1597. **                  Reset the timer (if requested by the callback)
  1598. **
  1599. ** Input        None
  1600. **
  1601. ** Modified     None
  1602. **
  1603. ** Return       Nothing
  1604. **
  1605. *****************************************************************************/
  1606. static void SIHandleTimerTick(void)
  1607. {
  1608. UINT32 i;
  1609. /*
  1610. ** Check each of the filters for a timeout.
  1611. */
  1612. for(i = 0; i < SICurrentFilter; i++)
  1613. {
  1614. if(SIFilters[i].version == -1 && SIFilters[i].timeout != -1)
  1615. {
  1616.             #if 0
  1617.             DBGPrint("i = %d, o = %dn", i, SIFilters[i].timeout);
  1618.             #endif
  1619. //LED_ShowNum((int)SIFilters[i].timeout);
  1620. SIFilters[i].timeout--;
  1621. if(SIFilters[i].timeout == 0)
  1622. {
  1623. /* Timer expired so call the associated callback if present */
  1624. if(SIFilters[i].timeoutCallback != NULL)
  1625. {
  1626. SIFilters[i].timeout = SIFilters[i].timeoutCallback(i);
  1627. }
  1628. else
  1629. {
  1630. /*
  1631. ** Since there is no timer callback associated disable the
  1632. ** timeout
  1633. */
  1634. SIFilters[i].timeout = -1;
  1635. }
  1636. }
  1637. }
  1638. }
  1639. }
  1640. /****************************************************************************
  1641. ** Function     SIStoreText
  1642. **
  1643. ** Description  Helper function for SI parsing which will take any DVB
  1644. **              encoded text streams and store them, taking into account any
  1645. **              control codes. This may be better performed by the applets or
  1646. **              font engine.
  1647. **
  1648. ** Input        UINT8* dst
  1649. **                Pointer to the destination.
  1650. **              UINT8* src
  1651. **                Pointer to the source of the data
  1652. **              UINT32 length
  1653. **                Amount of data (in bytes) to copy.
  1654. **
  1655. ** Modified     none
  1656. **
  1657. ** Return       nothing
  1658. **
  1659. *****************************************************************************/
  1660. static void SIStoreText(UINT8 *dst, UINT8 *src, UINT32 length)
  1661. {
  1662. INT32 nCharSet = 0x13; // 0x13 gb2312 0x11 unicode
  1663. UINT16 gb2312_code;
  1664. if(length == 0)
  1665. {
  1666. *dst = 0;
  1667. return;
  1668. }
  1669. if(*src < 0x20)
  1670. {
  1671. nCharSet = *src;
  1672. length--;
  1673. src++;
  1674. }
  1675. while(length-- > 0)
  1676. {
  1677. if(nCharSet == 0x11)
  1678. {
  1679. if(length == 0)
  1680. break;
  1681. if(*src != 0)
  1682. {
  1683. gb2312_code = UnicodeToGB2312((UINT16)(*src * 0x100 + *(src+1)));
  1684. length--;
  1685. src += 2;
  1686. if(gb2312_code)
  1687. {
  1688. *dst++ = (UINT8)(gb2312_code>>8);
  1689. *dst++ = (UINT8)(gb2312_code & 0xFF);
  1690. }
  1691. else
  1692. {
  1693. *dst++ = ' ';
  1694. *dst++ = ' ';
  1695. }
  1696. }
  1697. else
  1698. {
  1699. length--;
  1700. src++;
  1701. if(*src >= 0x20 && *src < 0x7F)
  1702. {
  1703. *dst++ = *src++;
  1704. }
  1705. else
  1706. {
  1707. src++;
  1708. }
  1709. }
  1710. continue;
  1711. }
  1712. if(*src < 0x20)
  1713. {
  1714. src++;
  1715. continue;
  1716. }
  1717. if(*src > 0x7F)
  1718. {
  1719. if(length == 0)
  1720. break;
  1721. length--;
  1722. *dst++ = *src++;
  1723. *dst++ = *src++;
  1724. continue;
  1725. }
  1726. *dst++ = *src++;
  1727. }
  1728. *dst = '';
  1729. }
  1730. /****************************************************************************
  1731.  **
  1732.  ** LIFO (Last-In First-Out)
  1733.  **
  1734.  ** The following set of functions implement a generic LIFO. The current
  1735.  ** implementation isn't very space efficient, however it is reasonably quick
  1736.  **
  1737.  ***************************************************************************/
  1738. /****************************************************************************
  1739. ** Function     LIFOInitialize()
  1740. **
  1741. ** Description
  1742. **
  1743. ** Input        none
  1744. **
  1745. ** Modified     none
  1746. **
  1747. ** Return       INT32 - Always LIFO_OK
  1748. **
  1749. *****************************************************************************/
  1750. static INT32 LIFOInitialize(SIFIFO* lifo)
  1751. {
  1752. lifo->end      = lifo->buffer + lifo->size;
  1753. lifo->position = lifo->buffer;
  1754. return LIFO_OK;
  1755. }
  1756. /****************************************************************************
  1757. ** Function     LIFOPush()
  1758. **
  1759. ** Description  Place a new entry on the list
  1760. **
  1761. ** Input        T_FIFODetails* - the list to use
  1762. **              UINT32         - item to add
  1763. **
  1764. ** Modified     none
  1765. **
  1766. ** Return       INT32 -
  1767. **                LIFO_OK - item added
  1768. **                LIFO_FULL - no space left on the list
  1769. **
  1770. *****************************************************************************/
  1771. static INT32 LIFOPush(SIFIFO* lifo, UINT32 newItem)
  1772. {
  1773. INT32 status = LIFO_OK;
  1774.     KB_OSPSemGet(semCritical, KB_Wait, 0);
  1775.     
  1776. /* Check size */
  1777. if(lifo->position == lifo->end)
  1778. {
  1779. status = LIFO_FULL;
  1780. }
  1781. else
  1782. {
  1783. /* Add item to list */
  1784. *(lifo->position++) = newItem;
  1785. }
  1786. KB_OSPSemSet(semCritical);
  1787. return status;
  1788. }
  1789. /****************************************************************************
  1790. ** Function     LIFOPop()
  1791. **
  1792. ** Description  Get the next item from the list
  1793. **
  1794. ** Input        T_FIFODetails* - the list to use
  1795. **
  1796. ** Modified     UINT32         - item removed from list
  1797. **
  1798. ** Return       INT32 -
  1799. **                LIFO_OK    - item removed
  1800. **                LIFO_EMPTY - no items available
  1801. **
  1802. *****************************************************************************/
  1803. static INT32 LIFOPop(SIFIFO* lifo, UINT32* item)
  1804. {
  1805. INT32 status = LIFO_OK;
  1806. KB_OSPSemGet(semCritical, KB_Wait, 0);
  1807. /* Check size */
  1808. if(lifo->position == lifo->buffer)
  1809. {
  1810. status = LIFO_EMPTY;
  1811. }
  1812. else
  1813. {
  1814. /* Update pointers */
  1815. lifo->position--;
  1816. /* Get item from list */
  1817. *item = *(lifo->position);
  1818. }
  1819. KB_OSPSemSet(semCritical);
  1820. return status;
  1821. }
  1822. INT32 KB_SIGetPat(const KB_SIPatStruct* i_pstPat, INT32 nType, INT32 i_nVersionNumber)
  1823. {
  1824. KB_OSPMsgNode message;
  1825.     
  1826. memset(l_pstPendingPatPara, 0, sizeof(PATINFO));
  1827. l_pstPendingPatPara->handle = l_nHandle++;
  1828. l_pstPendingPatPara->pstPat = (KB_SIPatStruct*)i_pstPat;
  1829. l_pstPendingPatPara->nType = (UINT8)nType;
  1830. if(nType == KB_SI_RECEIVE_CHANGE)
  1831. l_pstPendingPatPara->nVersionNumber = (INT8)i_nVersionNumber;
  1832. else
  1833. l_pstPendingPatPara->nVersionNumber = -1;
  1834. memset(&message, 0, sizeof(KB_OSPMsgNode));
  1835. message.Word1 = MSG_SI_PAT_RECEIVE;
  1836. if(KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&message) != Ret_OK)
  1837. {
  1838. return KB_SI_ERR_SEND_MESSAGE;
  1839. }
  1840. return 0;
  1841. }
  1842. INT32 KB_SIStopPat()
  1843. {
  1844. //KB_OSPMsgNode message;
  1845.     SIStopPAT();
  1846.     
  1847. return 0;
  1848. }
  1849. INT32 KB_SIGetNit(UINT32 i_nNitPid, const KB_SINitStruct* i_pstNit, INT32 nType, INT32 i_nVersionNumber)
  1850. {
  1851. KB_OSPMsgNode message;
  1852. memset(l_pstPendingNitPara, 0, sizeof(NITINFO));
  1853. l_pstPendingNitPara->handle = l_nHandle++;
  1854. l_pstPendingNitPara->nNitPid = (UINT16)i_nNitPid;
  1855. l_pstPendingNitPara->pstNit = (KB_SINitStruct*)i_pstNit;
  1856. l_pstPendingNitPara->nType = (UINT8)nType;
  1857. if(nType == KB_SI_RECEIVE_CHANGE)
  1858. l_pstPendingNitPara->nVersionNumber = (INT8)i_nVersionNumber;
  1859. else
  1860. l_pstPendingNitPara->nVersionNumber = -1;
  1861. memset(&message, 0, sizeof(KB_OSPMsgNode));
  1862. message.Word1 = MSG_SI_NIT_RECEIVE;
  1863. if(KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&message) != Ret_OK)
  1864. {
  1865. return KB_SI_ERR_SEND_MESSAGE;
  1866. }
  1867. return 0;
  1868. }
  1869. INT32 KB_SIStopNit()
  1870. {
  1871. KB_OSPMsgNode message;
  1872. memset(&message, 0, sizeof(KB_OSPMsgNode));
  1873. message.Word1 = MSG_SI_NIT_STOP_RECEIVE;
  1874. if(KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&message) != Ret_OK)
  1875. {
  1876. return KB_SI_ERR_SEND_MESSAGE;
  1877. }
  1878. return 0;
  1879. }
  1880. INT32 KB_SIGetPmt(INT32 i_nProgramMapPid, INT32 nSvcID, const KB_SIPmtStruct* i_pstPmt, INT32 nType, INT32 i_nVersionNumber)
  1881. {
  1882. KB_OSPMsgNode message;
  1883. int i;
  1884. for(i = 0; i < SI_NO_PMT_TABLES_QUEUE; i++)
  1885. {
  1886. if(l_pstPendingPmtPara[i]->nUsedFlag == 0)
  1887. {
  1888. memset(l_pstPendingPmtPara[i], 0, sizeof(PMTINFO));
  1889. l_pstPendingPmtPara[i]->nUsedFlag = 1;
  1890. l_pstPendingPmtPara[i]->handle = l_nHandle++;
  1891. l_pstPendingPmtPara[i]->nProgramMapPid = (UINT16)i_nProgramMapPid;
  1892. l_pstPendingPmtPara[i]->nSvcNO = (UINT16)nSvcID;
  1893. l_pstPendingPmtPara[i]->pstPmt = (KB_SIPmtStruct*)i_pstPmt;
  1894. l_pstPendingPmtPara[i]->nType = (UINT8)nType;
  1895. if(nType == KB_SI_RECEIVE_CHANGE)
  1896. l_pstPendingPmtPara[i]->nVersionNumber = (INT8)i_nVersionNumber;
  1897. else
  1898. l_pstPendingPmtPara[i]->nVersionNumber = -1;
  1899. memset(&message, 0, sizeof(KB_OSPMsgNode));
  1900. message.Word1 = MSG_SI_PMT_RECEIVE;
  1901. message.Word2 = i;
  1902. if(KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&message) != Ret_OK)
  1903. {
  1904. memset(l_pstPendingPmtPara[i], 0, sizeof(PMTINFO));
  1905. return KB_SI_ERR_SEND_MESSAGE;
  1906. }
  1907. break;
  1908. }
  1909. }
  1910. if(i == SI_NO_PMT_TABLES_QUEUE)
  1911. {
  1912. return KB_SI_ERR_TOO_MANY_PROGRAMS;
  1913. }
  1914. return 0;
  1915. }
  1916. INT32 KB_SIStopPmt(INT32 nSvcID)
  1917. {
  1918. //KB_OSPMsgNode message;
  1919.     SIStopPmt(nSvcID);
  1920. return 0;
  1921. }
  1922. INT32 KB_SIGetSdt(INT32 nSvcID, INT32 i_nMaxServiceNum, const KB_SISdtStruct* i_pstSdt, INT32 nType, INT32 i_nVersionNumber)
  1923. {
  1924. KB_OSPMsgNode message;
  1925. memset(l_pstPendingSdtPara, 0, sizeof(SDTINFO));
  1926. l_pstPendingSdtPara->handle = l_nHandle++;
  1927. l_pstPendingSdtPara->nSvcID = nSvcID;
  1928. l_pstPendingSdtPara->nMaxServiceNum = (INT16)i_nMaxServiceNum;
  1929. l_pstPendingSdtPara->pstSdt = (KB_SISdtStruct*)i_pstSdt;
  1930. l_pstPendingSdtPara->nType = (UINT8)nType;
  1931. if(nType & KB_SI_RECEIVE_CHANGE)
  1932. l_pstPendingSdtPara->nVersionNumber = (INT8)i_nVersionNumber;
  1933. else
  1934. l_pstPendingSdtPara->nVersionNumber = -1;
  1935. memset(&message, 0, sizeof(KB_OSPMsgNode));
  1936. message.Word1 = MSG_SI_SDT_RECEIVE;
  1937. if(KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&message) != Ret_OK)
  1938. {
  1939. return KB_SI_ERR_SEND_MESSAGE;
  1940. }
  1941. return 0;
  1942. }
  1943. INT32 KB_SIStopSdt()
  1944. {
  1945. KB_OSPMsgNode message;
  1946. memset(&message, 0, sizeof(KB_OSPMsgNode));
  1947. message.Word1 = MSG_SI_SDT_STOP_RECEIVE;
  1948. if(KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&message) != Ret_OK)
  1949. {
  1950. return KB_SI_ERR_SEND_MESSAGE;
  1951. }
  1952. return 0;
  1953. }
  1954. INT32 KB_SIGetBat(INT32 nbatID, const KB_SIBatStruct* i_pstBat, INT32 nType, INT32 i_nVersionNumber)
  1955. {
  1956. KB_OSPMsgNode message;
  1957. memset(l_pstPendingBatPara, 0, sizeof(BATINFO));
  1958. l_pstPendingBatPara->handle = l_nHandle++;
  1959. l_pstPendingBatPara->nBouquetId = nbatID;
  1960. l_pstPendingBatPara->pstBat = (KB_SIBatStruct*)i_pstBat;
  1961. l_pstPendingBatPara->nType = (UINT8)nType;
  1962. if(nType & KB_SI_RECEIVE_CHANGE)
  1963. l_pstPendingBatPara->nVersionNumber = (INT8)i_nVersionNumber;
  1964. else
  1965. l_pstPendingBatPara->nVersionNumber = -1;
  1966. memset(&message, 0, sizeof(KB_OSPMsgNode));
  1967. message.Word1 = MSG_SI_BAT_RECEIVE;
  1968. if(KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&message) != Ret_OK)
  1969. {
  1970. return KB_SI_ERR_SEND_MESSAGE;
  1971. }
  1972. return 0;
  1973. }
  1974. INT32 KB_SIStopBat()
  1975. {
  1976. KB_OSPMsgNode message;
  1977. memset(&message, 0, sizeof(KB_OSPMsgNode));
  1978. message.Word1 = MSG_SI_BAT_STOP_RECEIVE;
  1979. if(KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&message) != Ret_OK)
  1980. {
  1981. return KB_SI_ERR_SEND_MESSAGE;
  1982. }
  1983. return 0;
  1984. }
  1985. INT32 KB_SIGetEitPF(INT32 nSvcID, KB_SIEitTs eTs, const KB_SIEitPF* i_pstEitPresent, const KB_SIEitPF* i_pstEitFollow, INT32 nType, INT32 i_nVersionNumber)
  1986. {
  1987. KB_OSPMsgNode message;
  1988. int i;
  1989.     INT32 nTableId;
  1990.     nTableId = 0;
  1991.     switch (eTs)
  1992.     {
  1993.     case KB_SI_EIT_CURRENT_TS:
  1994.         nTableId = 0x4e;
  1995.         break;
  1996.     case KB_SI_EIT_OTHER_TS:
  1997.         nTableId = 0x4f;
  1998.         break;
  1999.         
  2000.     default:
  2001.         break;
  2002.     }
  2003. for(i = 0; i < SI_NO_EIT_PF_TABLES_QUEUE; i++)
  2004. {
  2005. if(l_pstPendingEitPFPara[i]->nUsedFlag == 0)
  2006. {
  2007. memset(l_pstPendingEitPFPara[i], 0, sizeof(EITPFINFO));
  2008. l_pstPendingEitPFPara[i]->nUsedFlag = 1;
  2009. l_pstPendingEitPFPara[i]->handle = l_nHandle++;
  2010. l_pstPendingEitPFPara[i]->nSvcID = (UINT16)nSvcID;
  2011. l_pstPendingEitPFPara[i]->pstEitPresent = (KB_SIEitPF*)i_pstEitPresent;
  2012. l_pstPendingEitPFPara[i]->pstEitFollow = (KB_SIEitPF*)i_pstEitFollow;
  2013. l_pstPendingEitPFPara[i]->nType = (UINT8)nType;
  2014.             l_pstPendingEitPFPara[i]->nTableId = (INT16)nTableId;
  2015. if(nType == KB_SI_RECEIVE_CHANGE)
  2016. l_pstPendingEitPFPara[i]->nVersionNumber = (INT8)i_nVersionNumber;
  2017. else
  2018. l_pstPendingEitPFPara[i]->nVersionNumber = -1;
  2019. memset(&message, 0, sizeof(KB_OSPMsgNode));
  2020. message.Word1 = MSG_SI_EIT_PF_RECEIVE;
  2021. message.Word2 = i;
  2022. if(KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&message) != Ret_OK)
  2023. {
  2024. memset(l_pstPendingEitPFPara[i], 0, sizeof(EITPFINFO));
  2025. return KB_SI_ERR_SEND_MESSAGE;
  2026. }
  2027. break;
  2028. }
  2029. }
  2030. if(i == SI_NO_EIT_PF_TABLES_QUEUE)
  2031. {
  2032. return KB_SI_ERR_TOO_MANY_PROGRAMS;
  2033. }
  2034. return 0;
  2035. }
  2036. INT32 KB_SIStopEitPF(INT32 nSvcID, KB_SIEitTs eTs)
  2037. {
  2038. INT32 i, nTableId = 0;
  2039.     
  2040.     switch (eTs)
  2041.     {
  2042.     case KB_SI_EIT_CURRENT_TS:
  2043.         nTableId = 0x4e;
  2044.         break;
  2045.     case KB_SI_EIT_OTHER_TS:
  2046.         nTableId = 0x4f;
  2047.         break;
  2048.         
  2049.     default:
  2050.         break;
  2051.     }
  2052. if(nSvcID == -1)
  2053. {
  2054. for(i = 0; i < SI_NO_EIT_PF_FILTERS; i++)
  2055. {
  2056. SIFilterStop(SISubTable[EITSubTableID].details.channelID, &(SISubTable[EITSubTableID].filter[KB_SI_EIT_SCHEDULE_SOFT_FILTER_COUNT + i]));
  2057.             SISubTable[EITSubTableID].filter[KB_SI_EIT_SCHEDULE_SOFT_FILTER_COUNT + i].used = FALSE;
  2058. memset(l_pstCurrEitPFPara[i], 0, sizeof(EITPFINFO));
  2059. }
  2060. }
  2061. else
  2062. {
  2063. for(i = 0; i < SI_NO_EIT_PF_FILTERS; i++)
  2064. {
  2065. if(l_pstCurrEitPFPara[i]->nUsedFlag == 1 &&
  2066.    l_pstCurrEitPFPara[i]->nSvcID == nSvcID
  2067.    && l_pstCurrEitPFPara[i]->nTableId == nTableId)
  2068. memset(l_pstCurrEitPFPara[i], 0, sizeof(EITPFINFO));
  2069. break;
  2070. }
  2071. }
  2072. for(i = 0; i < SI_NO_EIT_PF_FILTERS; i++)
  2073. {
  2074. if(SISubTable[EITSubTableID].filter[KB_SI_EIT_SCHEDULE_SOFT_FILTER_COUNT + i].enabled == TRUE &&
  2075.    SISubTable[EITSubTableID].filter[KB_SI_EIT_SCHEDULE_SOFT_FILTER_COUNT + i].tableIDExt == nSvcID)
  2076. {
  2077. SIFilterStop(SISubTable[EITSubTableID].details.channelID, &(SISubTable[EITSubTableID].filter[KB_SI_EIT_SCHEDULE_SOFT_FILTER_COUNT + i]));
  2078.                 SISubTable[EITSubTableID].filter[KB_SI_EIT_SCHEDULE_SOFT_FILTER_COUNT + i].used = FALSE;
  2079. break;
  2080. }
  2081. }
  2082. }
  2083. return 0;
  2084. }
  2085. INT32 KB_SIGetEitSCH(INT32 nSvcID, const KB_SIEitSch* i_pstEinSchInfo)
  2086. {
  2087. KB_OSPMsgNode message;
  2088.     int i;
  2089.     for (i = 0; i < KB_SI_EIT_SCHEDULE_SERVICE_COUNT; i++)
  2090.     {
  2091.         if (l_pstPendingEinSchInfoPara[i]->nUsedFlag == 0)
  2092.         {
  2093.             memset(l_pstPendingEinSchInfoPara[i], 0, sizeof(EITSCHINFO));
  2094.             l_pstPendingEinSchInfoPara[i]->nUsedFlag = 1;
  2095.          l_pstPendingEinSchInfoPara[i]->handle = l_nHandle++;
  2096.          l_pstPendingEinSchInfoPara[i]->nSvcID = nSvcID;
  2097.         l_pstPendingEinSchInfoPara[i]->pstEinSchInfo = (KB_SIEitSch*)i_pstEinSchInfo;
  2098.             memset(&message, 0, sizeof(KB_OSPMsgNode));
  2099.         message.Word1 = MSG_SI_EIT_SCHEDULE_RECEIVE;
  2100.             message.Word2 = i;
  2101.             break;
  2102.         }
  2103.     }
  2104.     
  2105.     if(i >= KB_SI_EIT_SCHEDULE_SERVICE_COUNT)
  2106. {
  2107. return KB_SI_ERR_TOO_MANY_PROGRAMS;
  2108. }
  2109. if(KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&message) != Ret_OK)
  2110. {
  2111. return KB_SI_ERR_SEND_MESSAGE;
  2112. }
  2113. return 0;
  2114. }
  2115. INT32 KB_SIStopEitSCH(INT32 nSvcID)
  2116. {
  2117.     int i;
  2118.     
  2119.     if (nSvcID == KB_SI_STOP_ALL)
  2120.     {                
  2121.         for (i = 0; i < KB_SI_EIT_SCHEDULE_SOFT_FILTER_COUNT; i++)
  2122.         {            
  2123.             SIFilterStop(SISubTable[EITSubTableID].details.channelID, &(SISubTable[EITSubTableID].filter[i]));        
  2124.             SISubTable[EITSubTableID].filter[i].used = FALSE;
  2125.         }
  2126.         for (i = 0; i < KB_SI_EIT_SCHEDULE_SERVICE_COUNT; i++)
  2127.         {
  2128.             memset(l_pstCurrEinSchInfoPara[i], 0, sizeof(EITSCHINFO));
  2129.         }
  2130.     }
  2131.     else
  2132.     {
  2133.         for (i = 0; i < KB_SI_EIT_SCHEDULE_SOFT_FILTER_COUNT; i++)
  2134.         {            
  2135.             if (SISubTable[EITSubTableID].filter[i].tableIDExt == nSvcID)
  2136.             {
  2137.                 /* 注意:schedule中可能用到两个fileter,所以不能用break */
  2138.                 SIFilterStop(SISubTable[EITSubTableID].details.channelID, &(SISubTable[EITSubTableID].filter[i]));         
  2139.                 SISubTable[EITSubTableID].filter[i].used = FALSE;
  2140.             }
  2141.         }
  2142.         
  2143.         for (i = 0; i < KB_SI_EIT_SCHEDULE_SERVICE_COUNT; i++)
  2144.         {
  2145.             if (l_pstCurrEinSchInfoPara[i]->nUsedFlag == 1
  2146.                 && l_pstCurrEinSchInfoPara[i]->nSvcID == nSvcID)
  2147.             {
  2148.                 memset(l_pstCurrEinSchInfoPara[i], 0, sizeof(EITSCHINFO));
  2149.                 break;
  2150.             }
  2151.         }
  2152.     }
  2153.     
  2154. return 0;
  2155. }
  2156. INT32 KB_SIGetTime(time_t* pTimeNode)
  2157. {
  2158. KB_OSPMsgNode message;
  2159. SIStopTOT();
  2160. memset(l_pstPendingTdtPara, 0, sizeof(TDTINFO));
  2161. l_pstPendingTdtPara->handle = l_nHandle++;
  2162. l_pstPendingTdtPara->ptCurrentTime = (time_t*)pTimeNode;
  2163. memset(&message, 0, sizeof(KB_OSPMsgNode));
  2164. message.Word1 = MSG_SI_TDT_RECEIVE;
  2165. if(KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&message) != Ret_OK)
  2166. {
  2167. return KB_SI_ERR_SEND_MESSAGE;
  2168. }
  2169. return 0;
  2170. }
  2171. INT32 KB_SIStopTDT()
  2172. {
  2173. KB_OSPMsgNode message;
  2174. memset(&message, 0, sizeof(KB_OSPMsgNode));
  2175. message.Word1 = MSG_SI_TDT_STOP_RECEIVE;
  2176. if(KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&message) != Ret_OK)
  2177. {
  2178. return KB_SI_ERR_SEND_MESSAGE;
  2179. }
  2180. return 0;
  2181. }
  2182. INT32 KB_SIStopTOT()
  2183. {
  2184. KB_OSPMsgNode message;
  2185. memset(&message, 0, sizeof(KB_OSPMsgNode));
  2186. message.Word1 = MSG_SI_TOT_STOP_RECEIVE;
  2187. if(KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&message) != Ret_OK)
  2188. {
  2189. return KB_SI_ERR_SEND_MESSAGE;
  2190. }
  2191. return 0;
  2192. }
  2193. INT32 KB_SIGetTOT(KB_SITot* pTot)
  2194. {
  2195. return 0;
  2196. }
  2197. INT32 KB_SIGetCat(const KB_SICatStruct* pCatNode, INT32 nType, INT32 i_nVersionNumber)
  2198. {
  2199. KB_OSPMsgNode message;
  2200. memset(l_pstPendingCatPara, 0, sizeof(CATINFO));
  2201. l_pstPendingCatPara->handle = l_nHandle++;
  2202. l_pstPendingCatPara->pstCat = (KB_SICatStruct*)pCatNode;
  2203. l_pstPendingCatPara->nType = (UINT8)nType;
  2204. if(nType & KB_SI_RECEIVE_CHANGE)
  2205. l_pstPendingCatPara->nVersionNumber = (INT8)i_nVersionNumber;
  2206. else
  2207. l_pstPendingCatPara->nVersionNumber = -1;
  2208. memset(&message, 0, sizeof(KB_OSPMsgNode));
  2209. message.Word1 = MSG_SI_CAT_RECEIVE;
  2210. if(KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&message) != Ret_OK)
  2211. {
  2212. return KB_SI_ERR_SEND_MESSAGE;
  2213. }
  2214. return 0;
  2215. }
  2216. INT32 KB_SIStopCat()
  2217. {
  2218. //KB_OSPMsgNode message;
  2219.     SIStopCAT();
  2220.     
  2221. return 0;
  2222. }
  2223. INT32 KB_SIGetRst(INT32 nMaxEvent, const KB_SIRstStruct* i_pstRst)
  2224. {
  2225. KB_OSPMsgNode message;
  2226. memset(l_pstPendingRstPara, 0, sizeof(RSTINFO));
  2227. l_pstPendingRstPara->handle = l_nHandle++;
  2228. l_pstPendingRstPara->nMaxEventStatusNum = (INT16)nMaxEvent;
  2229. l_pstPendingRstPara->pstRst = (KB_SIRstStruct*)i_pstRst;
  2230. memset(&message, 0, sizeof(KB_OSPMsgNode));
  2231. message.Word1 = MSG_SI_RST_RECEIVE;
  2232. if(KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&message) != Ret_OK)
  2233. {
  2234. return KB_SI_ERR_SEND_MESSAGE;
  2235. }
  2236. return 0;
  2237. }
  2238. INT32 KB_SIStopRst()
  2239. {
  2240. KB_OSPMsgNode message;
  2241. memset(&message, 0, sizeof(KB_OSPMsgNode));
  2242. message.Word1 = MSG_SI_RST_STOP_RECEIVE;
  2243. if(KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&message) != Ret_OK)
  2244. {
  2245. return KB_SI_ERR_SEND_MESSAGE;
  2246. }
  2247. return 0;
  2248. }
  2249. static INT32 SIGetPAT()
  2250. {
  2251. memcpy(l_pstCurrPatPara, l_pstPendingPatPara, sizeof(PATINFO));
  2252. l_pstCurrPatPara->nCurrVersionNumber = -1;
  2253. l_pstCurrPatPara->nUsedFlag = 1;
  2254. SISubTableStart(PATSubTableID, 0, l_pstCurrPatPara->nVersionNumber, l_pstCurrPatPara->handle);
  2255. return 0;
  2256. }
  2257. static INT32 SIStopPAT()
  2258. {
  2259. SISubTableStop(PATSubTableID);
  2260. memset(l_pstCurrPatPara, 0, sizeof(PATINFO));
  2261. return 0;
  2262. }
  2263. INT32 SIGetNIT()
  2264. {
  2265. memcpy(l_pstCurrNitPara, l_pstPendingNitPara, sizeof(NITINFO));
  2266. l_pstCurrNitPara->nCurrVersionNumber = -1;
  2267. l_pstCurrNitPara->nUsedFlag = 1;
  2268. SISubTableStart(NITSubTableID, 0, l_pstCurrNitPara->nVersionNumber, l_pstCurrNitPara->handle);
  2269. return 0;
  2270. }
  2271. static INT32 SIStopNIT()
  2272. {
  2273. SISubTableStop(NITSubTableID);
  2274. memset(l_pstCurrNitPara, 0, sizeof(NITINFO));
  2275. return 0;
  2276. }
  2277. static INT32 SIGetPmt(INT32 nPendingNo)
  2278. {
  2279. KB_OSPMsgNode message;
  2280. UINT32 i, j;
  2281. INT8 done;
  2282. INT32 nTempProgramNumber;
  2283. INT32 nCurrNo = 0;
  2284. INT32 nTempEnabled;
  2285. if(l_pstPendingPmtPara[nPendingNo]->nType == KB_SI_RECEIVE_CHANGE)
  2286. {
  2287. nTempProgramNumber = -1;
  2288. for(i = 0; i < SI_NO_PMT_TABLES; i++)
  2289. {
  2290. if(l_pstCurrPmtPara[i]->nUsedFlag == 1 &&
  2291.    l_pstCurrPmtPara[i]->nType == KB_SI_RECEIVE_CHANGE)
  2292. {
  2293. nTempProgramNumber = l_pstCurrPmtPara[i]->nSvcNO;
  2294. memset(l_pstCurrPmtPara[i], 0, sizeof(PMTINFO));
  2295. break;
  2296. }
  2297. }
  2298. if(i < SI_NO_PMT_TABLES)
  2299. {
  2300. done = 0;
  2301. for(i = 0; i < SI_NO_PMT_TABLES; i++)
  2302. {
  2303. for(j = 0; j < SISubTable[PMTSubTableID[i]].details.noFilters; j++)
  2304. {
  2305. if(SISubTable[PMTSubTableID[i]].filter[j].enabled == TRUE &&
  2306.    SISubTable[PMTSubTableID[i]].filter[j].tableIDExt == nTempProgramNumber)
  2307. {
  2308. SIFilterStop(SISubTable[PMTSubTableID[i]].details.channelID, &(SISubTable[PMTSubTableID[i]].filter[j]));
  2309. done = 1;
  2310. break;
  2311. }
  2312. }
  2313. if(done)
  2314. break;
  2315. }
  2316. }
  2317. }
  2318. done = 0;
  2319. nTempProgramNumber = l_pstPendingPmtPara[nPendingNo]->nSvcNO;
  2320. for(i = 0; i < SI_NO_PMT_TABLES; i++)
  2321. {
  2322. if(l_pstCurrPmtPara[i]->nUsedFlag == 1 &&
  2323.    l_pstCurrPmtPara[i]->nSvcNO == nTempProgramNumber)
  2324. {
  2325. memset(l_pstCurrPmtPara[i], 0, sizeof(PMTINFO));
  2326. break;
  2327. }
  2328. }
  2329. if(i < SI_NO_PMT_TABLES)
  2330. {
  2331. for(i = 0; i < SI_NO_PMT_TABLES; i++)
  2332. {
  2333. for(j = 0; j < SISubTable[PMTSubTableID[i]].details.noFilters; j++)
  2334. {
  2335. if(SISubTable[PMTSubTableID[i]].filter[j].enabled == TRUE &&
  2336.    SISubTable[PMTSubTableID[i]].filter[j].tableIDExt == nTempProgramNumber)
  2337. {
  2338. SIFilterStop(SISubTable[PMTSubTableID[i]].details.channelID, &(SISubTable[PMTSubTableID[i]].filter[j]));
  2339. done = 1;
  2340. break;
  2341. }
  2342. }
  2343. if(done)
  2344. break;
  2345. }
  2346. }
  2347. for(i = 0; i < SI_NO_PMT_TABLES; i++)
  2348. {
  2349. if(l_pstCurrPmtPara[i]->nUsedFlag == 0)
  2350. {
  2351. break;
  2352. }
  2353. }
  2354. if(i == SI_NO_PMT_TABLES)
  2355. {
  2356. memset(&message, 0, sizeof(KB_OSPMsgNode));
  2357. message.Word1 = MSG_SI_PMT_RECEIVE;
  2358. message.Word2 = nPendingNo;
  2359. if(KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&message) != Ret_OK)
  2360. {
  2361. memset(l_pstPendingPmtPara[nPendingNo], 0, sizeof(PMTINFO));
  2362. return KB_SI_ERR_SEND_MESSAGE;
  2363. }
  2364. return 0;
  2365. }
  2366. done = 0;
  2367. for(i = 0; i < SI_NO_PMT_TABLES; i++)
  2368. {
  2369. for(j = 0; j < SISubTable[PMTSubTableID[i]].details.noFilters; j++)
  2370. {
  2371. if(SISubTable[PMTSubTableID[i]].filter[j].enabled == TRUE &&
  2372.    SISubTable[PMTSubTableID[i]].details.PID == l_pstPendingPmtPara[nPendingNo]->nProgramMapPid)
  2373. {
  2374. if(i > 0)
  2375. {
  2376. memset(&message, 0, sizeof(KB_OSPMsgNode));
  2377. message.Word1 = MSG_SI_PMT_RECEIVE;
  2378. message.Word2 = nPendingNo;
  2379. if(KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&message) != Ret_OK)
  2380. {
  2381. memset(l_pstPendingPmtPara[nPendingNo], 0, sizeof(PMTINFO));
  2382. return KB_SI_ERR_SEND_MESSAGE;
  2383. }
  2384. return 0;
  2385. }
  2386. done = 1;
  2387. break;
  2388. }
  2389. }
  2390. if(done == 1)
  2391. break;
  2392. }
  2393. for(i = 0; i < SI_NO_PMT_TABLES; i++)
  2394. {
  2395. if(l_pstCurrPmtPara[i]->nUsedFlag == 0)
  2396. {
  2397. memcpy(l_pstCurrPmtPara[i], l_pstPendingPmtPara[nPendingNo], sizeof(PMTINFO));
  2398. memset(l_pstPendingPmtPara[nPendingNo], 0, sizeof(PMTINFO));
  2399. l_pstCurrPmtPara[i]->nCurrVersionNumber = -1;
  2400. l_pstCurrPmtPara[i]->nUsedFlag = 1;
  2401. nCurrNo = i;
  2402. break;
  2403. }
  2404. }
  2405. nTempEnabled = FALSE;
  2406. for(j = 0; j < SISubTable[PMTSubTableID[0]].details.noFilters; j++)
  2407. {
  2408. if(SISubTable[PMTSubTableID[0]].filter[j].enabled == TRUE)
  2409. {
  2410. nTempEnabled = TRUE;
  2411. break;
  2412. }
  2413. }
  2414. if(nTempEnabled == TRUE &&
  2415.    SISubTable[PMTSubTableID[0]].details.PID == l_pstCurrPmtPara[nCurrNo]->nProgramMapPid)
  2416. {
  2417. for(j = 0; j < SISubTable[PMTSubTableID[0]].details.noFilters; j++)
  2418. {
  2419. if(SISubTable[PMTSubTableID[0]].filter[j].enabled == FALSE)
  2420. {
  2421. SISubTable[PMTSubTableID[0]].details.tableIDExt = l_pstCurrPmtPara[nCurrNo]->nSvcNO;
  2422. SISubTable[PMTSubTableID[0]].details.PID = l_pstCurrPmtPara[nCurrNo]->nProgramMapPid;
  2423. SISubTableStart(PMTSubTableID[0], j, l_pstCurrPmtPara[nCurrNo]->nVersionNumber, l_pstCurrPmtPara[nCurrNo]->handle);
  2424. break;
  2425. }
  2426. }
  2427. }
  2428. else
  2429. {
  2430. INT32 nStart = 0;
  2431. if(nTempEnabled == TRUE)
  2432. {
  2433. nStart = 1;
  2434. }
  2435. for(i = nStart; i < SI_NO_PMT_TABLES; i++)
  2436. {
  2437. if(SISubTable[PMTSubTableID[i]].filter[0].enabled == FALSE)
  2438. {
  2439. /* Start the PMT filtering. */
  2440. SISubTable[PMTSubTableID[i]].details.tableIDExt = l_pstCurrPmtPara[nCurrNo]->nSvcNO;
  2441. SISubTable[PMTSubTableID[i]].details.PID = l_pstCurrPmtPara[nCurrNo]->nProgramMapPid;
  2442. SISubTableStart(PMTSubTableID[i], 0, l_pstCurrPmtPara[nCurrNo]->nVersionNumber, l_pstCurrPmtPara[nCurrNo]->handle);
  2443. break;
  2444. }
  2445. }
  2446. }
  2447. return 0;
  2448. }
  2449. static INT32 SIStopPmt(INT32 nSvcID)
  2450. {
  2451. UINT32 i, j;
  2452. INT8 done = 0;
  2453. if(nSvcID == -1)
  2454. {
  2455. for(i = 0; i < SI_NO_PMT_TABLES; i++)
  2456. {
  2457. SISubTableStop(PMTSubTableID[i]);
  2458. memset(l_pstCurrPmtPara[i], 0, sizeof(PMTINFO));
  2459. }
  2460. }
  2461. else
  2462. {
  2463. for(i = 0; i < SI_NO_PMT_TABLES; i++)
  2464. {
  2465. if(l_pstCurrPmtPara[i]->nUsedFlag == 1 &&
  2466.    l_pstCurrPmtPara[i]->nSvcNO == nSvcID)
  2467. memset(l_pstCurrPmtPara[i], 0, sizeof(PMTINFO));
  2468. break;
  2469. }
  2470. }
  2471. for(i = 0; i < SI_NO_PMT_TABLES; i++)
  2472. {
  2473. for(j = 0; j < SISubTable[PMTSubTableID[i]].details.noFilters; j++)
  2474. {
  2475. if(SISubTable[PMTSubTableID[i]].filter[j].enabled == TRUE &&
  2476.    SISubTable[PMTSubTableID[i]].filter[j].tableIDExt == nSvcID)
  2477. {
  2478. SIFilterStop(SISubTable[PMTSubTableID[i]].details.channelID, &(SISubTable[PMTSubTableID[i]].filter[j]));
  2479. done = 1;
  2480. break;
  2481. }
  2482. }
  2483. if(done)
  2484. break;
  2485. }
  2486. }
  2487. return 0;
  2488. }
  2489. static INT32 SIGetSDT()
  2490. {
  2491. memcpy(l_pstCurrSdtPara, l_pstPendingSdtPara, sizeof(SDTINFO));
  2492. l_pstCurrSdtPara->nCurrVersionNumber = -1;
  2493. l_pstCurrSdtPara->nUsedFlag = 1;
  2494. SISubTable[SDTSubTableID].details.tableID = 0x42;
  2495. SISubTable[SDTSubTableID].details.tableIDExt = -1;
  2496. SISubTableStart(SDTSubTableID, 0, l_pstCurrSdtPara->nVersionNumber, l_pstCurrSdtPara->handle);
  2497. return 0;
  2498. }
  2499. static INT32 SIStopSdt()
  2500. {
  2501. SIFilterStop(SISubTable[SDTSubTableID].details.channelID, &(SISubTable[SDTSubTableID].filter[0]));
  2502. memset(l_pstCurrSdtPara, 0, sizeof(SDTINFO));
  2503. return 0;
  2504. }
  2505. static INT32 SIGetBat()
  2506. {
  2507. memcpy(l_pstCurrBatPara, l_pstPendingBatPara, sizeof(BATINFO));
  2508. l_pstCurrBatPara->nCurrVersionNumber = -1;
  2509. l_pstCurrBatPara->nUsedFlag = 1;
  2510. SISubTable[SDTSubTableID].details.tableID = 0x4A;
  2511. SISubTable[SDTSubTableID].details.tableIDExt = l_pstCurrBatPara->nBouquetId;
  2512. SISubTableStart(SDTSubTableID, 1, l_pstCurrBatPara->nVersionNumber, l_pstCurrBatPara->handle);
  2513. return 0;
  2514. }
  2515. static INT32 SIStopBat()
  2516. {
  2517. SIFilterStop(SISubTable[SDTSubTableID].details.channelID, &(SISubTable[SDTSubTableID].filter[1]));
  2518. memset(l_pstCurrBatPara, 0, sizeof(BATINFO));
  2519. return 0;
  2520. }
  2521. static INT32 SIGetEitPF(INT32 nPendingNo)
  2522. {
  2523. KB_OSPMsgNode message;
  2524. INT32 i;
  2525. INT32 nTempServiceId = 0;
  2526. INT32 nCurrNo = 0;
  2527. if(l_pstPendingEitPFPara[nPendingNo]->nType == KB_SI_RECEIVE_CHANGE)
  2528. {
  2529. for(i = 0; i < SI_NO_EIT_PF_FILTERS; i++)
  2530. {
  2531. if(l_pstCurrEitPFPara[i]->nUsedFlag == 1 &&
  2532.    l_pstCurrEitPFPara[i]->nType == KB_SI_RECEIVE_CHANGE)
  2533. {
  2534. nTempServiceId = l_pstCurrEitPFPara[i]->nSvcID;
  2535. memset(l_pstCurrEitPFPara[i], 0, sizeof(EITPFINFO));
  2536. break;
  2537. }
  2538. }
  2539. if(i < SI_NO_EIT_PF_FILTERS)
  2540. {
  2541. for(i = KB_SI_EIT_SCHEDULE_SOFT_FILTER_COUNT; i < SI_NO_EIT_PF_FILTERS + KB_SI_EIT_SCHEDULE_SOFT_FILTER_COUNT; i++)
  2542. {
  2543. if(SISubTable[EITSubTableID].filter[i].enabled == TRUE &&
  2544.                    SISubTable[EITSubTableID].filter[i].tableIDExt == nTempServiceId
  2545.                    && SISubTable[EITSubTableID].filter[i].tableID == l_pstPendingEitPFPara[nPendingNo]->nTableId)
  2546. {
  2547. SIFilterStop(SISubTable[EITSubTableID].details.channelID, &(SISubTable[EITSubTableID].filter[i]));
  2548. break;
  2549. }
  2550. }
  2551. }
  2552. }
  2553. nTempServiceId = l_pstPendingEitPFPara[nPendingNo]->nSvcID;
  2554. for(i = 0; i < SI_NO_EIT_PF_FILTERS; i++)
  2555. {
  2556. if(l_pstCurrEitPFPara[i]->nUsedFlag == 1 &&
  2557.    l_pstCurrEitPFPara[i]->nSvcID == nTempServiceId)
  2558. {
  2559. memset(l_pstCurrEitPFPara[i], 0, sizeof(EITPFINFO));
  2560. break;
  2561. }
  2562. }
  2563. for(i = 0; i < SI_NO_EIT_PF_FILTERS; i++)
  2564. {
  2565. if(l_pstCurrEitPFPara[i]->nUsedFlag == 0)
  2566. {
  2567. memcpy(l_pstCurrEitPFPara[i], l_pstPendingEitPFPara[nPendingNo], sizeof(EITPFINFO));
  2568. memset(l_pstPendingEitPFPara[nPendingNo], 0, sizeof(EITPFINFO));
  2569. l_pstCurrEitPFPara[i]->nCurrVersionNumber = -1;
  2570. l_pstCurrEitPFPara[i]->nUsedFlag = 1;
  2571. nCurrNo = i;
  2572. break;
  2573. }
  2574. }
  2575. if(i == SI_NO_EIT_PF_FILTERS)//无可用空间
  2576. {
  2577. memset(&message, 0, sizeof(KB_OSPMsgNode));
  2578. message.Word1 = MSG_SI_EIT_PF_RECEIVE;
  2579. message.Word2 = nPendingNo;
  2580. if(KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&message) != Ret_OK)
  2581. {
  2582. memset(l_pstPendingEitPFPara[nPendingNo], 0, sizeof(EITPFINFO));
  2583. return KB_SI_ERR_SEND_MESSAGE;
  2584. }
  2585. return 0;
  2586. }
  2587. for(i = KB_SI_EIT_SCHEDULE_SOFT_FILTER_COUNT; i < SI_NO_EIT_PF_FILTERS + KB_SI_EIT_SCHEDULE_SOFT_FILTER_COUNT; i++)
  2588. {        
  2589. if(SISubTable[EITSubTableID].filter[i].used == FALSE)
  2590. {
  2591. SISubTable[EITSubTableID].details.tableID = l_pstCurrEitPFPara[nCurrNo]->nTableId;
  2592. SISubTable[EITSubTableID].details.timeout = J_SI_EIT_PF_TIMEOUT;
  2593. SISubTable[EITSubTableID].details.tableIDExt = l_pstCurrEitPFPara[nCurrNo]->nSvcID;     
  2594. SISubTableStart(EITSubTableID, i, l_pstCurrEitPFPara[nCurrNo]->nVersionNumber, l_pstCurrEitPFPara[nCurrNo]->handle);
  2595. break;
  2596. }
  2597. }
  2598. return 0;
  2599. }
  2600. static INT32 SIStopEitPF(INT32 nSvcID, INT32 nTableId)
  2601. {
  2602. INT32 i;
  2603. if(nSvcID == -1)
  2604. {
  2605. for(i = 0; i < SI_NO_EIT_PF_FILTERS; i++)
  2606. {
  2607. SIFilterStop(SISubTable[EITSubTableID].details.channelID, &(SISubTable[EITSubTableID].filter[KB_SI_EIT_SCHEDULE_SOFT_FILTER_COUNT + i]));
  2608. memset(l_pstCurrEitPFPara[i], 0, sizeof(EITPFINFO));
  2609. }
  2610. }
  2611. else
  2612. {
  2613. for(i = 0; i < SI_NO_EIT_PF_FILTERS; i++)
  2614. {
  2615. if(l_pstCurrEitPFPara[i]->nUsedFlag == 1 &&
  2616.    l_pstCurrEitPFPara[i]->nSvcID == nSvcID
  2617.    && l_pstCurrEitPFPara[i]->nTableId == nTableId)
  2618. memset(l_pstCurrEitPFPara[i], 0, sizeof(EITPFINFO));
  2619. break;
  2620. }
  2621. }
  2622. for(i = 0; i < SI_NO_EIT_PF_FILTERS; i++)
  2623. {
  2624. if(SISubTable[EITSubTableID].filter[KB_SI_EIT_SCHEDULE_SOFT_FILTER_COUNT + i].enabled == TRUE &&
  2625.    SISubTable[EITSubTableID].filter[KB_SI_EIT_SCHEDULE_SOFT_FILTER_COUNT + i].tableIDExt == nSvcID)
  2626. {
  2627. SIFilterStop(SISubTable[EITSubTableID].details.channelID, &(SISubTable[EITSubTableID].filter[KB_SI_EIT_SCHEDULE_SOFT_FILTER_COUNT + i]));
  2628. break;
  2629. }
  2630. }
  2631. }
  2632. return 0;
  2633. }
  2634. static INT32 SIGetEitSCH(UINT32 nPendingNo)
  2635. {
  2636.     int i, nCurrentParaNum;
  2637.     KB_OSPMsgNode msgNode;
  2638.     
  2639.     for (i = 0; i < KB_SI_EIT_SCHEDULE_SERVICE_COUNT; i++)
  2640. {        
  2641. if(l_pstCurrEinSchInfoPara[i]->nUsedFlag == 0)
  2642. {
  2643. memcpy(l_pstCurrEinSchInfoPara[i], l_pstPendingEinSchInfoPara[nPendingNo], sizeof(EITSCHINFO));
  2644. l_pstCurrEinSchInfoPara[i]->nCurrVersionNumber = -1;
  2645. l_pstCurrEinSchInfoPara[i]->nUsedFlag = 1;
  2646.             //memset(l_pstCurrEinSchInfoPara[i]->pstEinSchInfo, 0, sizeof(KB_SIEitSch));            
  2647.             l_pstCurrEinSchInfoPara[i]->pstEinSchInfo->num = 0;
  2648.             nCurrentParaNum = i;
  2649.             #if 0
  2650.             DBGPrint("[j_sipsi.c] i = %d ServiceId = %dn", i, l_pstCurrEinSchInfoPara[i]->nSvcID);
  2651.             #endif
  2652. break;
  2653. }
  2654. }
  2655.     if (i >= KB_SI_EIT_SCHEDULE_SERVICE_COUNT)
  2656.     {
  2657.         memset(&msgNode, 0, sizeof(KB_OSPMsgNode));
  2658. msgNode.Word1 = MSG_SI_EIT_SCHEDULE_RECEIVE;
  2659. msgNode.Word2 = nPendingNo;
  2660. KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&msgNode);
  2661.     }
  2662.     /* 把当前pending结构清零 */
  2663.     memset(l_pstPendingEinSchInfoPara[nPendingNo], 0, sizeof(EITSCHINFO));
  2664.     
  2665.    
  2666.     for (i = 0; i < KB_SI_EIT_SCHEDULE_SOFT_FILTER_COUNT; i++)
  2667.     {
  2668.         if (SISubTable[EITSubTableID].filter[i].used == FALSE)
  2669.         {            
  2670.             SISubTable[EITSubTableID].details.tableID = 0x50;
  2671.             SISubTable[EITSubTableID].details.timeout = J_SI_EIT_SCHEDULE_TIMEOUT;
  2672.             SISubTable[EITSubTableID].details.tableIDExt = l_pstCurrEinSchInfoPara[nCurrentParaNum]->nSvcID;
  2673.         SISubTableStart(EITSubTableID, i, -1, l_pstCurrEinSchInfoPara[nCurrentParaNum]->handle);
  2674.             break;
  2675.         }
  2676.     }
  2677.     for (i = 0; i < KB_SI_EIT_SCHEDULE_SOFT_FILTER_COUNT; i++)
  2678.     {
  2679.         if (SISubTable[EITSubTableID].filter[i].used == FALSE)
  2680.         {            
  2681.             SISubTable[EITSubTableID].details.tableID = 0x51;
  2682.             SISubTable[EITSubTableID].details.timeout = J_SI_EIT_SCHEDULE_TIMEOUT;
  2683.             SISubTable[EITSubTableID].details.tableIDExt = l_pstCurrEinSchInfoPara[nCurrentParaNum]->nSvcID;
  2684.         SISubTableStart(EITSubTableID, i, -1, l_pstCurrEinSchInfoPara[nCurrentParaNum]->handle);
  2685.             break;
  2686.         }
  2687.     }
  2688. return 0;
  2689. }
  2690. static INT32 SIStopEitSCH(INT32 nSvcID)
  2691. {
  2692.     int i;
  2693.     
  2694.     if (nSvcID == KB_SI_STOP_ALL)
  2695.     {                
  2696.         for (i = 0; i < KB_SI_EIT_SCHEDULE_SOFT_FILTER_COUNT; i++)
  2697.         {
  2698.             SIFilterStop(SISubTable[EITSubTableID].details.channelID, &(SISubTable[EITSubTableID].filter[i]));        
  2699.         }
  2700.         for (i = 0; i < KB_SI_EIT_SCHEDULE_SERVICE_COUNT; i++)
  2701.         {
  2702.             memset(l_pstCurrEinSchInfoPara[i], 0, sizeof(EITSCHINFO));
  2703.         }
  2704.     }
  2705.     else
  2706.     {
  2707.         for (i = 0; i < KB_SI_EIT_SCHEDULE_SOFT_FILTER_COUNT; i++)
  2708.         {            
  2709.             if (SISubTable[EITSubTableID].filter[i].tableIDExt == nSvcID)
  2710.             {
  2711.                 SIFilterStop(SISubTable[EITSubTableID].details.channelID, &(SISubTable[EITSubTableID].filter[i]));         
  2712.             }
  2713.         }
  2714.         
  2715.         for (i = 0; i < KB_SI_EIT_SCHEDULE_SERVICE_COUNT; i++)
  2716.         {
  2717.             if (l_pstCurrEinSchInfoPara[i]->nUsedFlag == 1
  2718.                 && l_pstCurrEinSchInfoPara[i]->nSvcID == nSvcID)
  2719.             {
  2720.                 memset(l_pstCurrEinSchInfoPara[i], 0, sizeof(EITSCHINFO));
  2721.                 break;
  2722.             }
  2723.         }
  2724.     }
  2725.     
  2726. return 0;
  2727. }
  2728. INT32 SIGetTDT()
  2729. {
  2730. memcpy(l_pstCurrTdtPara, l_pstPendingTdtPara, sizeof(TDTINFO));
  2731. l_pstCurrTdtPara->nUsedFlag = 1;
  2732. SISubTableStart(TDTSubTableID, 0, -1, l_pstCurrTdtPara->handle);
  2733. return 0;
  2734. }
  2735. static INT32 SIStopTDT()
  2736. {
  2737. SISubTableStop(TDTSubTableID);
  2738. memset(l_pstCurrTdtPara, 0, sizeof(TDTINFO));
  2739. return 0;
  2740. }
  2741. INT32 SIGetTOT()