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

DVD

开发平台:

C/C++

  1. {
  2. memcpy(l_pstCurrTotPara, l_pstPendingTotPara, sizeof(TOTINFO));
  3. l_pstCurrTotPara->nUsedFlag = 1;
  4. SISubTableStart(TOTSubTableID, 0, -1, l_pstCurrTotPara->handle);
  5. return 0;
  6. }
  7. static INT32 SIStopTOT()
  8. {
  9. SISubTableStop(TOTSubTableID);
  10. memset(l_pstCurrTotPara, 0, sizeof(TOTINFO));
  11. return 0;
  12. }
  13. INT32 SIGetCAT()
  14. {
  15. memcpy(l_pstCurrCatPara, l_pstPendingCatPara, sizeof(CATINFO));
  16. l_pstCurrCatPara->nCurrVersionNumber = -1;
  17. l_pstCurrCatPara->nUsedFlag = 1;
  18. SISubTableStart(CATSubTableID, 0, l_pstCurrCatPara->nVersionNumber, l_pstCurrCatPara->handle);
  19. return 0;
  20. }
  21. static INT32 SIStopCAT()
  22. {
  23. SISubTableStop(CATSubTableID);
  24. memset(l_pstCurrCatPara, 0, sizeof(CATINFO));
  25. return 0;
  26. }
  27. INT32 SIGetRst()
  28. {
  29. memcpy(l_pstCurrRstPara, l_pstPendingRstPara, sizeof(RSTINFO));
  30. l_pstCurrRstPara->nUsedFlag = 1;
  31. SISubTableStart(RSTSubTableID, 0, -1, l_pstCurrRstPara->handle);
  32. return 0;
  33. }
  34. static INT32 SIStopRst()
  35. {
  36. SISubTableStop(RSTSubTableID);
  37. memset(l_pstCurrRstPara, 0, sizeof(RSTINFO));
  38. return 0;
  39. }
  40. static void SIParsePAT(MepgData *section)
  41. {
  42. T_SubTableFilter *filter;
  43. UINT8 *pInData;
  44. INT32 dataLength;
  45. KB_SIPatStruct* pstPat;
  46. INT32 i;
  47. INT8 version_number;
  48. INT32 nOldNum;
  49. filter = &SISubTable[section->subTableID].filter[section->filterNumber];
  50. if(l_pstCurrPatPara->handle != filter->handle)
  51. {
  52. SIFreeSectionData(section);
  53. return;
  54. }
  55. pInData = section->data;
  56. dataLength = section->length;
  57. pstPat = l_pstCurrPatPara->pstPat;
  58. version_number = (UINT8)((pInData[5] & 0x3E) >> 1);
  59. if(l_pstCurrPatPara->nCurrVersionNumber == -1)
  60. {
  61. l_pstCurrPatPara->nCurrVersionNumber = version_number;
  62. memset(pstPat, 0, sizeof(KB_SIPatStruct));
  63. }
  64. else if(l_pstCurrPatPara->nCurrVersionNumber != version_number)
  65. {
  66. SIFreeSectionData(section);
  67. l_pstCurrPatPara->handle = l_nHandle++;
  68. l_pstCurrPatPara->nCurrVersionNumber = -1;
  69. SISubTableStart(PATSubTableID, 0, l_pstCurrPatPara->nVersionNumber, l_pstCurrPatPara->handle);
  70. return;
  71. }
  72. pstPat->transport_stream_id = (UINT16)(pInData[3] * 0x100 + pInData[4]);
  73. pstPat->version_number = (UINT8)((pInData[5] & 0x3E) >> 1);
  74. pInData += 8;
  75. dataLength -= 8;
  76. if( dataLength <= 0 )
  77. {
  78. SIFreeSectionData(section);
  79. return;
  80. }
  81. nOldNum = pstPat->num;
  82. pstPat->num += (UINT16)(dataLength / 4);
  83. if(pstPat->num > KB_SI_MAX_PAT_PROGRAM_NUM)
  84. {
  85. pstPat->num = KB_SI_MAX_PAT_PROGRAM_NUM;
  86. }
  87. for(i = 0; i < pstPat->num - nOldNum; i++)
  88. {
  89. pstPat->program[i + nOldNum].program_number = (UINT16)(pInData[i * 4] * 0x100 + pInData[i * 4 + 1]);
  90. pstPat->program[i + nOldNum].program_map_PID = (UINT16)((pInData[i * 4 + 2] * 0x100 + pInData[i * 4 + 3]) & 0x1FFF);
  91. }
  92. pInData += dataLength;
  93. pstPat->CRC_32 = (UINT32)pInData[0] * 0x1000000 + (UINT32)pInData[1] * 0x10000 + (UINT32)pInData[2] * 0x100 + (UINT32)pInData[3];
  94. SIFreeSectionData(section);
  95. }
  96. static void SIParseNIT(MepgData *section)
  97. {
  98. T_SubTableFilter *filter;
  99. UINT8 *pInData;
  100. UINT8 *endPtr;
  101. INT32 dataLength;
  102. KB_SINitStruct* pstNit;
  103. INT32 network_descriptors_length;
  104. INT32 transport_stream_loop_length;
  105. INT8 version_number;
  106. filter = &SISubTable[section->subTableID].filter[section->filterNumber];
  107. if(l_pstCurrNitPara->handle != filter->handle)
  108. {
  109. SIFreeSectionData(section);
  110. return;
  111. }
  112. pInData = section->data;
  113. dataLength = section->length;
  114. pstNit = l_pstCurrNitPara->pstNit;
  115. version_number = (UINT8)((pInData[5] & 0x3E) >> 1);
  116. if(l_pstCurrNitPara->nCurrVersionNumber == -1)
  117. {
  118. l_pstCurrNitPara->nCurrVersionNumber = version_number;
  119. memset(pstNit, 0, sizeof(KB_SINitStruct));
  120. }
  121. else if(l_pstCurrNitPara->nCurrVersionNumber != version_number)
  122. {
  123. SIFreeSectionData(section);
  124. l_pstCurrNitPara->handle = l_nHandle++;
  125. l_pstCurrNitPara->nCurrVersionNumber = -1;
  126. /* Start the NIT filtering. */
  127. SISubTableStart(NITSubTableID, 0, l_pstCurrNitPara->nVersionNumber, l_pstCurrNitPara->handle);
  128. return;
  129. }
  130. pstNit->network_id = (UINT16)(pInData[3] * 0x100 + pInData[4]);
  131. pstNit->version_number = (UINT8)((pInData[5] & 0x3E) >> 1);
  132. /*
  133. ** Skip past the standard SI Table header (contains tableID, section Length, etc)
  134. */
  135. pInData += 8;
  136. dataLength -= 8;
  137. if( dataLength <= 0 )
  138. {
  139. SIFreeSectionData(section);
  140. return;
  141. }
  142. network_descriptors_length = ((INT32)pInData[0] * 0x100 + (INT32)pInData[1]) & 0x0FFF;
  143. pInData += 2;
  144. SINITDescs(pInData, network_descriptors_length, pstNit);
  145. pInData += network_descriptors_length;
  146. transport_stream_loop_length = ((INT32)pInData[0] * 0x100 + (INT32)pInData[1]) & 0x0FFF;
  147. pInData += 2;
  148. endPtr = pInData + transport_stream_loop_length;
  149. while( pInData < endPtr && pstNit->num < KB_SI_MAX_NIT_CHANNEL_NUM)
  150. {
  151. int transport_descriptors_length;
  152. pstNit->network[pstNit->num].transport_stream_id = (UINT16)(pInData[0] * 0x100 + pInData[1]);
  153. pInData += 2;
  154. pstNit->network[pstNit->num].original_network_id = (UINT16)(pInData[0] * 0x100 + pInData[1]);
  155. pInData += 2;
  156. transport_descriptors_length = (pInData[0] * 0x100 + pInData[1]) & 0x0FFF;
  157. pInData += 2;
  158. SINITDescs(pInData, transport_descriptors_length, pstNit);
  159. pInData += transport_descriptors_length;
  160. pstNit->num++;
  161. }
  162. pInData = endPtr;
  163. pstNit->CRC_32 = (UINT32)pInData[0] * 0x1000000 + (UINT32)pInData[1] * 0x10000 + (UINT32)pInData[2] * 0x100 + (UINT32)pInData[3];
  164. SIFreeSectionData(section);
  165. }
  166. static void SIParsePMT(MepgData *section)
  167. {
  168. T_SubTableFilter *filter;
  169. UINT8 *pInData;
  170. INT32 dataLength;
  171. KB_SIPmtStruct* pstPmt = NULL;
  172. UINT32 program_info_length;
  173. UINT32 ES_info_length;
  174. INT32 i;
  175. INT8 version_number;
  176.     
  177. filter = &SISubTable[section->subTableID].filter[section->filterNumber];
  178. pInData = section->data;
  179. dataLength = section->length;
  180.      //cCopyFlag = FALSE;
  181. for(i = 0; i < SI_NO_PMT_TABLES; i++)
  182. {
  183. if(l_pstCurrPmtPara[i]->handle == filter->handle &&
  184.    l_pstCurrPmtPara[i]->nUsedFlag == 1 &&
  185.    l_pstCurrPmtPara[i]->nSvcNO == filter->tableIDExt)
  186. {
  187. pstPmt = l_pstCurrPmtPara[i]->pstPmt;
  188. version_number = (UINT8)((pInData[5] & 0x3E) >> 1);
  189. if(l_pstCurrPmtPara[i]->nCurrVersionNumber == -1)
  190. {
  191. l_pstCurrPmtPara[i]->nCurrVersionNumber = version_number;
  192. memset(pstPmt, 0, sizeof(KB_SIPmtStruct));
  193. }
  194. else if(l_pstCurrPmtPara[i]->nCurrVersionNumber != version_number)
  195. {
  196. INT32 subTableID;
  197. subTableID = section->subTableID;
  198. SIFreeSectionData(section);
  199. l_pstCurrPmtPara[i]->handle = l_nHandle++;
  200. l_pstCurrPmtPara[i]->nCurrVersionNumber = -1;
  201. SISubTable[subTableID].details.tableIDExt = l_pstCurrPmtPara[i]->nSvcNO;
  202. SISubTable[subTableID].details.PID = l_pstCurrPmtPara[i]->nProgramMapPid;
  203. SISubTableStart(subTableID, 0, l_pstCurrPmtPara[i]->nVersionNumber, l_pstCurrPmtPara[i]->handle);
  204. return;
  205. }            
  206. break;
  207. }
  208. }
  209. if(pstPmt == NULL)
  210. {
  211. SIFreeSectionData(section);
  212. return;
  213. }
  214. pstPmt->program_number = (UINT16)(pInData[3] * 0x100 + pInData[4]);
  215. pstPmt->version_number = (UINT8)((pInData[5] & 0x3E) >> 1);
  216. pInData += 8;
  217. dataLength -= 8;
  218. if( dataLength <= 0 )
  219. {
  220. SIFreeSectionData(section);
  221. return;
  222. }
  223. pstPmt->PCR_PID = (UINT16)((pInData[0] * 0x100 + pInData[1]) & 0x1FFF);
  224. program_info_length = ((UINT32)pInData[2] * 0x100 + (UINT32)pInData[3]) & 0x0FFF;
  225. pInData += 4;
  226. dataLength -= 4;
  227. SIPMTDescs(pInData, program_info_length, pstPmt, 0);
  228. pInData += program_info_length;
  229. dataLength -= program_info_length;
  230. while((dataLength > 0) && (pstPmt->num < KB_SI_MAX_PMT_STREAM_NUM)) //Modified by dts 2005-8-8
  231. {
  232. pstPmt->stream[pstPmt->num].stream_type = pInData[0];
  233. pstPmt->stream[pstPmt->num].elementary_PID = (UINT16)((pInData[1] * 0x100 + pInData[2]) & 0x1FFF);
  234. ES_info_length = ((UINT32)pInData[3] * 0x100 + (UINT32)pInData[4]) & 0x0FFF;
  235. pInData += 5;
  236. dataLength -= 5;
  237. SIPMTDescs(pInData, ES_info_length, pstPmt, 1);
  238. pInData += ES_info_length;
  239. dataLength -= ES_info_length;
  240. pstPmt->num++;
  241. }
  242. SIFreeSectionData(section);
  243. }
  244. static INT32 SIParseDuration(UINT8* pInData, UINT32* pOutDuration)
  245. {
  246. INT32 nHour, nMin, nSec;
  247. nHour = ((INT32)pInData[0] >> 4) * 10 + ((INT32)pInData[0] & 0x0F);
  248. nMin = ((INT32)pInData[1] >> 4) * 10 + ((INT32)pInData[1] & 0x0F);
  249. nSec = ((INT32)pInData[2] >> 4) * 10 + ((INT32)pInData[2] & 0x0F);
  250. *pOutDuration = nHour * 3600 + nMin * 60 + nSec;
  251. return 0;
  252. }
  253. static INT32 SIParseTime(UINT8* pInData, time_t* pOutTime)
  254. {
  255. UINT16 MJD;
  256. INT32 nYear, nYear1, nMon, nMon1, nDay, nHour, nMin, nSec, nAdjust;
  257. struct tm tm;
  258. memset(&tm, 0, sizeof(struct tm));
  259. MJD = (UINT16)(pInData[0] << 8) | (pInData[1]);
  260. nYear1 = (INT32)((MJD - 15078.2) / 365.25);
  261. nMon1 = (INT32)((MJD - 14956.1 - (INT32)(nYear1 * 365.25)) / 30.6001);
  262. nDay = (INT32)MJD - 14956 - (INT32)(nYear1 * 365.25) - (INT32)(nMon1 * 30.6001);
  263. nAdjust = 0;
  264. if(nMon1 == 14 || nMon1 == 15)
  265. {
  266. nAdjust = 1;
  267. }
  268. nYear = nYear1 + nAdjust + 1900;
  269. nMon = nMon1 - 1 - nAdjust * 12;
  270. nHour = ((INT32)pInData[2] >> 4) * 10 + ((INT32)pInData[2] & 0x0F);
  271. nMin  = ((INT32)pInData[3] >> 4) * 10 + ((INT32)pInData[3] & 0x0F);
  272. nSec  = ((INT32)pInData[4] >> 4) * 10 + ((INT32)pInData[4] & 0x0F);
  273. tm.tm_isdst = 0;
  274. tm.tm_year = (UINT16)(nYear - 1900);
  275. tm.tm_mon = (UINT16)(nMon - 1);
  276. tm.tm_mday = (UINT16)nDay;
  277. tm.tm_hour = (UINT16)nHour;
  278. tm.tm_min = (UINT16)nMin;
  279. tm.tm_sec = (UINT16)nSec;
  280. *(pOutTime) = mktime(&tm);
  281. return 0;
  282. }
  283. static void SIParseTDT(MepgData *section)
  284. {
  285. T_SubTableFilter *filter;
  286. UINT8 *pInData;
  287. INT32 dataLength;
  288. KB_OSPMsgNode message;
  289. filter = &SISubTable[section->subTableID].filter[section->filterNumber];
  290. if(l_pstCurrTdtPara->handle != filter->handle)
  291. {
  292. SIFreeSectionData(section);
  293. return;
  294. }
  295. pInData = section->data;
  296. dataLength = section->length;
  297. pInData += 3;
  298. dataLength -= 3;
  299. if(dataLength <= 0)
  300. {
  301. SIFreeSectionData(section);
  302. return;
  303. }
  304. if(l_pstCurrTdtPara->ptCurrentTime == NULL)
  305. {
  306. SIFreeSectionData(section);
  307. return;
  308. }
  309. SIParseTime(pInData, l_pstCurrTdtPara->ptCurrentTime);
  310. SIFreeSectionData(section);
  311. memset(&message, 0, sizeof(KB_OSPMsgNode));
  312. message.Word1 = MOD_SIPSI;
  313. message.Word2 = KB_SI_MSG_TDT_DONE;
  314. message.Word3 = (UINT32)l_pstCurrTdtPara->ptCurrentTime;
  315. KD_DTVSendMsg(&message);
  316. memset(l_pstCurrTdtPara, 0, sizeof(TDTINFO));
  317. }
  318. static void SIParseTOT(MepgData *section)
  319. {
  320. T_SubTableFilter *filter;
  321. UINT8 *pInData, *ptr;
  322. INT32 dataLength;
  323. KB_OSPMsgNode message;
  324. INT16 total_descriptor_length;
  325. UINT8 descriptor_length;
  326. UINT8 descriptor_tag;
  327. INT16 i;
  328. KB_SITot *pTot;
  329. UINT8 tmp;
  330. UINT8 count=0;
  331. filter = &SISubTable[section->subTableID].filter[section->filterNumber];
  332. if(l_pstCurrTotPara->handle != filter->handle)
  333. {
  334. J_SI_Print("nerr1");
  335. SIFreeSectionData(section);
  336. return;
  337. }
  338. pInData = section->data;
  339. if(*pInData != 0x73)
  340. {
  341. J_SI_Print("nid %d",*pInData);
  342. return;
  343. }
  344. dataLength = section->length;
  345. pInData += 8;
  346. dataLength -= 8;
  347. if(dataLength <= 0)
  348. {
  349. J_SI_Print("nlen=%d",(int)dataLength);
  350. SIFreeSectionData(section);
  351. return;
  352. }
  353. if(l_pstCurrTotPara->pTot == NULL)
  354. {
  355. J_SI_Print("ntot null");
  356. SIFreeSectionData(section);
  357. return;
  358. }
  359. pTot = l_pstCurrTotPara->pTot;
  360. total_descriptor_length = (INT16)(*((INT16 *)pInData) & 0x0fff);
  361. pInData += 2;
  362. ptr = pInData;
  363. J_SI_Print("n");
  364. for(i=0;i<total_descriptor_length;i++)
  365. {
  366. J_SI_Print("%02x ",*pInData);
  367. pInData++;
  368. }
  369. pInData = ptr;
  370. while(total_descriptor_length >= 15)
  371. {
  372. descriptor_tag = *pInData;
  373. pInData++;
  374. descriptor_length = *pInData;
  375. pInData++;
  376. total_descriptor_length -= 2;
  377. if(descriptor_tag != KB_FILTER_SI_LOCAL_TIME_OFFSET)
  378. {
  379. total_descriptor_length -= descriptor_length;
  380. pInData += descriptor_length;
  381. continue;
  382. }
  383. if(descriptor_length != 13)
  384. {
  385. total_descriptor_length -= descriptor_length;
  386. pInData += descriptor_length;
  387. continue;
  388. }
  389. pTot->country_code[0] = *pInData;
  390. pInData++;
  391. pTot->country_code[1] = *pInData;
  392. pInData++;
  393. pTot->country_code[2] = *pInData;
  394. pInData++;
  395. tmp = *pInData;
  396. pInData++;
  397. pTot->country_region_id = (UINT8)((tmp >> 2) & 0x3f);
  398. pTot->polarity = (UINT8)(tmp & 1);
  399. pTot->local_time_offset = *((UINT16 *)pInData);
  400. pInData+=2;
  401. pInData+=7;
  402. total_descriptor_length -= 13;
  403. count++;
  404. if(count >= KB_SI_MAX_TOT_SECTION)
  405. break;
  406. }
  407. SIFreeSectionData(section);
  408. memset(&message, 0, sizeof(KB_OSPMsgNode));
  409. message.Word1 = MOD_SIPSI;
  410. message.Word2 = KB_SI_MSG_TOT_DONE;
  411. message.Word3 = (UINT32)l_pstCurrTotPara->pTot;
  412. message.Word4 = count;
  413. KD_DTVSendMsg(&message);
  414. memset(l_pstCurrTotPara, 0, sizeof(TOTINFO));
  415. }
  416. static void SIParseCAT(MepgData *section)
  417. {
  418. T_SubTableFilter *filter;
  419. UINT8 *pInData;
  420. INT32 dataLength;
  421. KB_SICatStruct* pstCat;
  422. UINT8 version_number;
  423. filter = &SISubTable[section->subTableID].filter[section->filterNumber];
  424. if(l_pstCurrCatPara->handle != filter->handle)
  425. {
  426. SIFreeSectionData(section);
  427. return;
  428. }
  429. pInData = section->data;
  430. dataLength = section->length;
  431. pstCat = l_pstCurrCatPara->pstCat;
  432. version_number = (UINT8)((pInData[5] & 0x3E) >> 1);
  433. if(l_pstCurrCatPara->nCurrVersionNumber == -1)
  434. {
  435. l_pstCurrCatPara->nCurrVersionNumber = version_number;
  436. memset(pstCat, 0, sizeof(KB_SICatStruct));
  437. }
  438. else if(l_pstCurrCatPara->nCurrVersionNumber != version_number)
  439. {
  440. SIFreeSectionData(section);
  441. l_pstCurrCatPara->handle = l_nHandle++;
  442. l_pstCurrCatPara->nCurrVersionNumber = -1;
  443. SISubTableStart(CATSubTableID, 0, l_pstCurrCatPara->nVersionNumber, l_pstCurrCatPara->handle);
  444. return;
  445. }
  446. pstCat->version_number = (UINT8)((pInData[5] & 0x3E) >> 1);
  447. pInData += 8;
  448. dataLength -= 8;
  449. if( dataLength <= 0 )
  450. {
  451. SIFreeSectionData(section);
  452. return;
  453. }
  454. SICATDescs(pInData, dataLength, pstCat);
  455. SIFreeSectionData(section);
  456. }
  457. static void SIParseRST(MepgData *section)
  458. {
  459. T_SubTableFilter *filter;
  460. UINT8 *pInData;
  461. INT32 dataLength;
  462. KB_OSPMsgNode message;
  463. KB_SIRstStruct* pstRst;
  464. filter = &SISubTable[section->subTableID].filter[section->filterNumber];
  465. if(l_pstCurrRstPara->handle != filter->handle)
  466. {
  467. SIFreeSectionData(section);
  468. return;
  469. }
  470. pInData = section->data;
  471. dataLength = section->length;
  472. pInData += 3;
  473. dataLength -= 3;
  474. if(dataLength <= 0)
  475. {
  476. SIFreeSectionData(section);
  477. return;
  478. }
  479. if(l_pstCurrRstPara->pstRst == NULL)
  480. {
  481. SIFreeSectionData(section);
  482. return;
  483. }
  484. l_pstCurrRstPara->nEventStatusNum = 0;
  485. while(dataLength > 0 &&
  486.       l_pstCurrRstPara->nEventStatusNum < l_pstCurrRstPara->nMaxEventStatusNum)
  487. {
  488. pstRst = &l_pstCurrRstPara->pstRst[l_pstCurrRstPara->nEventStatusNum];
  489. memset(pstRst, 0, sizeof(KB_SIRstStruct));
  490. pstRst->transport_stream_id = (UINT16)(pInData[0] * 0x100 + pInData[1]);
  491. pInData += 2;
  492. dataLength -= 2;
  493. pstRst->original_network_id = (UINT16)(pInData[0] * 0x100 + pInData[1]);
  494. pInData += 2;
  495. dataLength -= 2;
  496. pstRst->service_id = (UINT16)(pInData[0] * 0x100 + pInData[1]);
  497. pInData += 2;
  498. dataLength -= 2;
  499. pstRst->event_id = (UINT16)(pInData[0] * 0x100 + pInData[1]);
  500. pInData += 2;
  501. dataLength -= 2;
  502. pstRst->running_status = (UINT8)(pInData[0] & 0x7);
  503. pInData++;
  504. dataLength--;
  505. l_pstCurrRstPara->nEventStatusNum++;
  506. }
  507. SIFreeSectionData(section);
  508. memset(&message, 0, sizeof(KB_OSPMsgNode));
  509. message.Word1 = MOD_SIPSI;
  510. message.Word2 = KB_SI_MSG_RST_DONE;
  511. message.Word3 = (UINT32)l_pstCurrRstPara->pstRst;
  512. message.Word4 = (UINT32)l_pstCurrRstPara->nEventStatusNum;
  513. KD_DTVSendMsg(&message);
  514. SISubTableStart(RSTSubTableID, 0, -1, l_pstCurrRstPara->handle);
  515. }
  516. static void SINITDescs( UINT8* pInData, INT32 dataLen, KB_SINitStruct* pstNit)
  517. {
  518. UINT8 *data;
  519. UINT8 tag;
  520. UINT8 length;
  521. UINT16 transport_stream_id;
  522. UINT16 original_network_id;
  523. UINT16 service_id;
  524. UINT8 linkage_type;
  525.     UINT8 service_num;
  526.     
  527. while( dataLen > 0 )
  528. {
  529. tag = *pInData++;
  530. length = *pInData++;
  531. data = pInData;
  532. pInData += length;
  533. dataLen -= ((INT32)length + 2);
  534. if(length == 0)
  535. continue;
  536. switch(tag)
  537. {
  538. case KB_FILTER_SI_NETWORK_NAME:
  539. SIStoreText(pstNit->network_name, data, ((length > KB_SI_MAX_NETWORK_NAME_LEN)
  540. ? KB_SI_MAX_NETWORK_NAME_LEN : length) );
  541. break;
  542. case KB_FILTER_SI_LINKAGE:
  543. transport_stream_id = (UINT16)(data[0] * 0x100 + data[1]);
  544. original_network_id = (UINT16)(data[2] * 0x100 + data[3]);
  545. service_id          = (UINT16)(data[4] * 0x100 + data[5]);
  546. data += 6;
  547. linkage_type = data[0];
  548. data++;
  549. if(linkage_type == 0x84 && length >= 12) // 确保足够的长度
  550. {
  551. UINT8 descriptor_tag;
  552. UINT8 stbVersion;
  553. UINT8 Flags;
  554. UINT8 descriptor_length;
  555. descriptor_tag = data[0];
  556. data++;
  557. if(descriptor_tag == 0x81)
  558. {
  559. stbVersion = (UINT8)(data[0]>>2);
  560. Flags = (UINT8)(data[0] & 0x3);
  561. data++;
  562. if(Flags == 3)
  563. {
  564. INT32 i;
  565. UINT16 bouquet_id;
  566. descriptor_length = data[0];
  567. data++;
  568. for(i = 0; i < descriptor_length; i += 2)
  569. {
  570. bouquet_id = (UINT16)(data[i] * 0x100 + data[i+1]);
  571. if(bouquet_id == 0x0A)
  572. {
  573. pstNit->loader_flag = 1;
  574. pstNit->loader.transport_stream_id = transport_stream_id;
  575. pstNit->loader.original_network_id = original_network_id;
  576. pstNit->loader.service_id = service_id;
  577. pstNit->loader.stbVersion = stbVersion;
  578. break;
  579. }
  580. }
  581. }
  582. }
  583. }
  584. break;
  585. case KB_FILTER_SI_CABLE_DELIVERY:            
  586. pstNit->network[pstNit->num].frequency = ((UINT32)data[0] >> 4)   * 10000000 +
  587.                                  ((UINT32)data[0] & 0x0F) *  1000000 +
  588.                                  ((UINT32)data[1] >> 4)   *   100000 +
  589.                                  ((UINT32)data[1] & 0x0F) *    10000 +
  590.                                  ((UINT32)data[2] >> 4)   *     1000 +
  591.                                   ((UINT32)data[2] & 0x0F) *      100 +
  592.                                   ((UINT32)data[3] >> 4)   *       10 +
  593.                                   ((UINT32)data[3] & 0x0F) *        1;
  594. data += 4 + 1;
  595. pstNit->network[pstNit->num].FEC_outer = data[0] & 0x0F;
  596. data++;
  597. pstNit->network[pstNit->num].modulation = data[0];
  598. data++;
  599. pstNit->network[pstNit->num].symbol_rate = ((UINT32)data[0] >> 4)   * 1000000 +
  600.    ((UINT32)data[0] & 0x0F) *  100000 +
  601.    ((UINT32)data[1] >> 4)   *   10000 +
  602.    ((UINT32)data[1] & 0x0F) *    1000 +
  603.    ((UINT32)data[2] >> 4)   *     100 +
  604.    ((UINT32)data[2] & 0x0F) *      10 +
  605.    ((UINT32)data[3] >> 4)   *       1;
  606. data += 3;
  607. pstNit->network[pstNit->num].FEC_inner = data[0] & 0x0F;
  608. break;
  609. case KB_FILTER_SI_SERVICE_LIST:
  610.             service_num = 0;
  611.          
  612.             while( data < pInData && service_num < KB_SI_MAX_CHANNEL_SERVIC_NUM)
  613.             {
  614.                pstNit->network[pstNit->num].service_list[service_num].service_id = (UINT16)(data[0] * 0x100 + data[1]);
  615.      pstNit->network[pstNit->num].service_list[service_num].service_type = data[2];
  616.                 data +=3;
  617.                 
  618.                 service_num ++;
  619.             }
  620.             pstNit->network[pstNit->num].service_num = service_num;
  621.             break;
  622. case KB_FILTER_SI_STUFFING:
  623. case KB_FILTER_SI_SATELLITE_DELIVERY:
  624. case KB_FILTER_SI_TERRESTRIAL_DELIVERY:
  625. case KB_FILTER_SI_MULTILINGUAL_NETWORK_NAME:
  626. case KB_FILTER_SI_PRIVATE_DATA_SPECIFIER:
  627. break;
  628. default:
  629. break;
  630. }
  631. }
  632. }
  633. static void SIPMTDescs(UINT8* pInData, INT32 dataLen, KB_SIPmtStruct* pstPmt, INT32 inLoop)
  634. {
  635. UINT8 *data;
  636. UINT32 tag;
  637. UINT8 length;
  638. UINT16 oldLength;
  639. while(dataLen >= 2)
  640. {
  641. tag = *pInData++;
  642. length = *pInData++;
  643. data = pInData;
  644. pInData += length;
  645. dataLen -= ((INT32)length + 2);
  646. if(length == 0)
  647. continue;
  648. switch(tag)
  649. {
  650. case KB_FILTER_SI_CA:
  651. if(!inLoop)
  652. {
  653. oldLength = pstPmt->CA_descriptor_buffer_len;
  654. pstPmt->CA_descriptor_buffer_len += (UINT16)(2 + length);
  655. if(pstPmt->CA_descriptor_buffer_len > KB_SI_MAX_CA_BUFFER_LEN)
  656. {
  657. pstPmt->CA_descriptor_buffer_len = KB_SI_MAX_CA_BUFFER_LEN;
  658. }
  659. memcpy(pstPmt->CA_descriptor + oldLength, data - 2, pstPmt->CA_descriptor_buffer_len - oldLength);
  660. }
  661. else
  662. {
  663. INT32 nCurrNo;
  664. nCurrNo = pstPmt->num;
  665. oldLength = pstPmt->stream[nCurrNo].CA_descriptor_buffer_len;
  666. pstPmt->stream[nCurrNo].CA_descriptor_buffer_len += (UINT16)(2 + length);
  667. if(pstPmt->stream[nCurrNo].CA_descriptor_buffer_len > KB_SI_MAX_CA_BUFFER_LEN)
  668. {
  669. pstPmt->stream[nCurrNo].CA_descriptor_buffer_len = KB_SI_MAX_CA_BUFFER_LEN;
  670. }
  671. memcpy(pstPmt->stream[nCurrNo].CA_descriptor + oldLength, data - 2, pstPmt->stream[nCurrNo].CA_descriptor_buffer_len - oldLength);
  672. }
  673. break;
  674. case KB_FILTER_SI_STREAM_IDENTIFIER:
  675. if(inLoop)
  676. {
  677. pstPmt->stream[pstPmt->num].component_tag = *data;
  678. }
  679. break;
  680. case KB_FILTER_SI_TELETEXT:
  681. case KB_FILTER_SI_SUBTITLING:
  682. case KB_FILTER_SI_LANGUAGE:
  683. case KB_FILTER_SI_COPYRIGHT:
  684. case KB_FILTER_SI_MOSAIC:
  685. case KB_FILTER_SI_PRIVATE_DATA_SPECIFIER:
  686. case KB_FILTER_SI_SERVICE_MOVE:
  687. case KB_FILTER_SI_CA_SYSTEM:
  688. case KB_FILTER_SI_DATA_BROADCAST_ID:
  689. break;
  690. default:
  691. break;
  692. }
  693. }
  694. }
  695. static void SIParseSDT(MepgData *section)
  696. {
  697. T_SubTableFilter *filter;
  698. UINT8 *pInData;
  699. INT32 dataLength;
  700. KB_SISdtStruct stTempSdt;
  701. KB_SISdtStruct* pstSdt = NULL;
  702. KB_SIBatStruct* pstBat = NULL;
  703. UINT16 table_id_extension;
  704. UINT8 version_number;
  705. filter = &SISubTable[section->subTableID].filter[section->filterNumber];
  706. if(filter->filterNumber == 0)
  707. {
  708. if(l_pstCurrSdtPara->handle != filter->handle)
  709. {
  710. SIFreeSectionData(section);
  711. return;
  712. }
  713. pstSdt = &stTempSdt;
  714. }
  715. else
  716. {
  717. if(l_pstCurrBatPara->handle != filter->handle)
  718. {
  719. SIFreeSectionData(section);
  720. return;
  721. }
  722. pstBat = &l_pstCurrBatPara->pstBat[l_pstCurrBatPara->nBatNumber];
  723. }
  724. pInData = section->data;
  725. dataLength = section->length;
  726. table_id_extension = (UINT16)(pInData[3] * 0x100 + pInData[4]);
  727. version_number = (UINT8)((pInData[5] & 0x3E) >> 1);
  728. if(filter->filterNumber == 0)
  729. {
  730. if(l_pstCurrSdtPara->nCurrVersionNumber == -1)
  731. {
  732. l_pstCurrSdtPara->nCurrVersionNumber = version_number;
  733. }
  734. else if(l_pstCurrSdtPara->nCurrVersionNumber != version_number)
  735. {
  736. SIFreeSectionData(section);
  737. l_pstCurrSdtPara->handle = l_nHandle++;
  738. l_pstCurrSdtPara->nServiceNum = 0;
  739. l_pstCurrSdtPara->nCurrVersionNumber = -1;
  740. /* Start the SDT filtering. */
  741. SISubTable[SDTSubTableID].details.tableID = 0x42;
  742. SISubTable[SDTSubTableID].details.tableIDExt = -1;
  743. SISubTableStart(SDTSubTableID, 0, l_pstCurrSdtPara->nVersionNumber, l_pstCurrSdtPara->handle);
  744. return;
  745. }
  746. }
  747. else
  748. {
  749. if(l_pstCurrBatPara->nCurrVersionNumber == -1)
  750. {
  751. l_pstCurrBatPara->nCurrVersionNumber = version_number;
  752. memset(pstBat, 0, sizeof(KB_SIBatStruct));
  753. }
  754. else if(l_pstCurrBatPara->nCurrVersionNumber != version_number)
  755. {
  756. SIFreeSectionData(section);
  757. l_pstCurrBatPara->handle = l_nHandle++;
  758. l_pstCurrBatPara->nCurrVersionNumber = -1;
  759. SISubTable[SDTSubTableID].details.tableID = 0x4A;
  760. SISubTable[SDTSubTableID].details.tableIDExt = l_pstCurrBatPara->nBouquetId;
  761. SISubTableStart(SDTSubTableID, 1, l_pstCurrBatPara->nVersionNumber, l_pstCurrBatPara->handle);
  762. return;
  763. }
  764. }
  765. pInData += 8;
  766. dataLength -= 8;
  767. if( dataLength <= 0 )
  768. {
  769. SIFreeSectionData(section);
  770. return;
  771. }
  772. if(filter->filterNumber == 0)
  773. {
  774. pInData += 3;
  775. dataLength -= 3;
  776. while(dataLength > 0 && l_pstCurrSdtPara->nServiceNum < l_pstCurrSdtPara->nMaxServiceNum)
  777. {
  778. INT32 descriptors_loop_length;
  779. memset(pstSdt, 0, sizeof(KB_SISdtStruct));
  780. pstSdt->TSID = table_id_extension;
  781. pstSdt->version_number = version_number;
  782. pstSdt->service_id = (UINT16)(pInData[0] * 0x100 + pInData[1]);
  783. pInData += 2;
  784. dataLength -= 2;
  785. pstSdt->EIT_schedule_flag = (UINT8)((pInData[0] & 0x2) >> 1);
  786. pstSdt->EIT_present_following_flag = pInData[0] & 0x1;
  787. pInData++;
  788. dataLength--;
  789. pstSdt->running_status = (UINT8)(pInData[0] >> 5);
  790. pstSdt->free_CA_mode = (UINT8)((pInData[0] & 0x10) >> 4);
  791. descriptors_loop_length = ((INT32)pInData[0] & 0x0F) * 0x100  + (INT32)pInData[1];
  792. pInData += 2;
  793. dataLength -= 2;
  794. SISDTDescs(pInData, descriptors_loop_length, pstSdt);
  795. pInData += descriptors_loop_length;
  796. dataLength -= descriptors_loop_length;
  797. if(l_pstCurrSdtPara->nSvcID == pstSdt->service_id)
  798. {
  799. memcpy(l_pstCurrSdtPara->pstSdt, pstSdt, sizeof(KB_SISdtStruct));
  800. l_pstCurrSdtPara->nServiceNum++;
  801. break;
  802. }
  803. else if(l_pstCurrSdtPara->nSvcID == -1)
  804. {
  805. if((l_pstCurrSdtPara->nType & KB_SI_RECEIVE_DTV) == 0 ||
  806. pstSdt->service_type == SI_SERVICE_TYPE_DTV)
  807. {
  808. memcpy(&(l_pstCurrSdtPara->pstSdt[l_pstCurrSdtPara->nServiceNum]),
  809. pstSdt, sizeof(KB_SISdtStruct));
  810. l_pstCurrSdtPara->nServiceNum++;
  811. }
  812. }
  813. }
  814. }
  815. else
  816. {
  817. INT32 bouquet_descriptors_length;
  818. INT32 transport_stream_loop_length;
  819. bouquet_descriptors_length = ((INT32)pInData[0] * 0x100 + (INT32)pInData[1]) & 0x0FFF;
  820. pInData += 2;
  821. pstBat->bouquet_id = table_id_extension;
  822. pstBat->version_number = version_number;
  823. SIBATDescs(pInData, bouquet_descriptors_length, pstBat, 0);
  824. pInData += bouquet_descriptors_length;
  825. transport_stream_loop_length = ((INT32)pInData[0] * 0x100 + (INT32)pInData[1]) & 0x0FFF;
  826. pInData += 2;
  827. while(transport_stream_loop_length > 0 && pstBat->num < KB_SI_MAX_NIT_CHANNEL_NUM)
  828. {
  829. INT32 transport_descriptors_length;
  830. pstBat->transport_stream[pstBat->num].transport_stream_id = (UINT16)(pInData[0] * 0x100 + pInData[1]);
  831. pInData += 2;
  832. transport_stream_loop_length -= 2;
  833. pstBat->transport_stream[pstBat->num].original_network_id = (UINT16)(pInData[0] * 0x100 + pInData[1]);
  834. pInData += 2;
  835. transport_stream_loop_length -= 2;
  836. transport_descriptors_length = ((INT32)pInData[0] * 0x100 + (INT32)pInData[1]) & 0x0FFF;
  837. pInData += 2;
  838. transport_stream_loop_length -= 2;
  839. SIBATDescs(pInData, transport_descriptors_length, pstBat, 1);
  840. pInData += transport_descriptors_length;
  841. transport_stream_loop_length -= transport_descriptors_length;
  842. pstBat->num++;
  843. }
  844. l_pstCurrBatPara->nBatNumber ++;
  845. }
  846. SIFreeSectionData(section);
  847. }
  848. static void SISDTDescs( UINT8* pInData, INT32 dataLen, KB_SISdtStruct* pstSdt)
  849. {
  850. UINT8 *data;
  851. UINT32 tag;
  852. UINT8 length;
  853. int i;
  854. int service_provider_name_length;
  855. int service_name_length;
  856. char ISO_639_language_code[4];
  857. while( dataLen > 0 )
  858. {
  859. tag = *pInData++;
  860. length = *pInData++;
  861. data = pInData;
  862. pInData += length;
  863. dataLen -= ((INT32)length + 2);
  864. if(length == 0)
  865. continue;
  866. switch(tag)
  867. {
  868. case KB_FILTER_SI_SERVICE:
  869. pstSdt->service_type = *data++;
  870. service_provider_name_length = *data++;
  871. SIStoreText(pstSdt->chinese.service_provider_name, data, ((service_provider_name_length > KB_SI_MAX_SERVICE_PROVIDER_NAME_LEN)
  872. ? KB_SI_MAX_SERVICE_PROVIDER_NAME_LEN : service_provider_name_length) );
  873. data += service_provider_name_length;
  874. service_name_length = *data++;
  875. SIStoreText(pstSdt->chinese.service_name, data, ((service_name_length > KB_SI_MAX_SERVICE_NAME_LEN)
  876. ? KB_SI_MAX_SERVICE_NAME_LEN : service_name_length) );
  877. break;
  878. case KB_FILTER_SI_MULTILINGUAL_SERVICE_NAME:
  879. memcpy(ISO_639_language_code, data, 3);
  880. ISO_639_language_code[3] = '';
  881. SIToLower(ISO_639_language_code);
  882. data += 3;
  883. service_provider_name_length = *data++;
  884. if(!strcmp(ISO_639_language_code, "chi") ||
  885.    !strcmp(ISO_639_language_code, "chn") ||
  886.    !strcmp(ISO_639_language_code, "zho"))
  887. {
  888. SIStoreText(pstSdt->chinese.service_provider_name, data, ((service_provider_name_length > KB_SI_MAX_SERVICE_PROVIDER_NAME_LEN)
  889. ? KB_SI_MAX_SERVICE_PROVIDER_NAME_LEN : service_provider_name_length) );
  890. }
  891. else if(!strcmp(ISO_639_language_code, "eng"))
  892. {
  893. SIStoreText(pstSdt->english.service_provider_name, data, ((service_provider_name_length > KB_SI_MAX_SERVICE_PROVIDER_NAME_LEN)
  894. ? KB_SI_MAX_SERVICE_PROVIDER_NAME_LEN : service_provider_name_length) );
  895. }
  896. data += service_provider_name_length;
  897. service_name_length = *data++;
  898. if(!strcmp(ISO_639_language_code, "chi") ||
  899.    !strcmp(ISO_639_language_code, "chn") ||
  900.    !strcmp(ISO_639_language_code, "zho"))
  901. {
  902. SIStoreText(pstSdt->chinese.service_name, data, ((service_name_length > KB_SI_MAX_SERVICE_NAME_LEN)
  903. ? KB_SI_MAX_SERVICE_NAME_LEN : service_name_length) );
  904. }
  905. else if(!strcmp(ISO_639_language_code, "eng"))
  906. {
  907. SIStoreText(pstSdt->english.service_name, data, ((service_name_length > KB_SI_MAX_SERVICE_NAME_LEN)
  908. ? KB_SI_MAX_SERVICE_NAME_LEN : service_name_length) );
  909. }
  910. break;
  911. case KB_FILTER_SI_DATA_BROADCAST:
  912. data += 2;
  913. pstSdt->component_tag = *data;
  914. break;
  915. case KB_FILTER_SI_COUNTRY_AVAILABILITY:
  916. case KB_FILTER_SI_LINKAGE:
  917. case KB_FILTER_SI_NVOD_REFERENCE:
  918. case KB_FILTER_SI_TIME_SHIFTED_SERVICE:
  919. case KB_FILTER_SI_MOSAIC:
  920. case KB_FILTER_SI_CA_IDENTIFIER:
  921. case KB_FILTER_SI_TELEPHONE:
  922. case KB_FILTER_SI_PRIVATE_DATA_SPECIFIER:
  923. case KB_FILTER_SI_STUFFING:
  924. case KB_FILTER_SI_BOUQUET_NAME:
  925. switch(tag)
  926. {
  927. case 0x4B:
  928. pstSdt->TimeShiftedNum = (UINT8)(length / 6);
  929. for(i = 0; i < pstSdt->TimeShiftedNum; i ++)
  930. {
  931. pstSdt->TimeShift[i].TS_ID = (data[0] << 8) | (data[1]);
  932. data += 2;
  933. pstSdt->TimeShift[i].OrgnetID = (data[0] << 8) | (data[1]);
  934. data += 2;
  935. pstSdt->TimeShift[i].ServiceID = (data[0] << 8) | (data[1]);
  936. data += 2;
  937. }
  938. break;
  939. case 0x4C:
  940.                 pstSdt->reference_service_id = (data[0] << 8) | (data[1]);
  941.                 
  942. break;
  943. }
  944. break;
  945. default:
  946. break;
  947. }
  948. }
  949. }
  950. static void SIBATDescs(UINT8* pInData, INT32 dataLen, KB_SIBatStruct* pstBat, INT32 inLoop)
  951. {
  952. UINT8 *data;
  953. UINT32 tag;
  954. UINT8 length;
  955. char ISO_639_language_code[4];
  956. while(dataLen > 0)
  957. {
  958. tag = *pInData++;
  959. length = *pInData++;
  960. data = pInData;
  961. pInData += length;
  962. dataLen -= ((INT32)length + 2);
  963. if(length == 0)
  964. continue;
  965. switch(tag)
  966. {
  967. case KB_FILTER_SI_BOUQUET_NAME:
  968. if(!inLoop)
  969. {
  970. SIStoreText(pstBat->bouquet_name, data, ((length > KB_SI_MAX_BOUQUET_NAME_LEN)
  971. ? KB_SI_MAX_BOUQUET_NAME_LEN : length) );
  972. }
  973. break;
  974. case KB_FILTER_SI_MULTILINGUAL_BOUQUET_NAME:
  975. if(!inLoop)
  976. {
  977. INT32 bouquet_name_length;
  978. memcpy(ISO_639_language_code, data, 3);
  979. ISO_639_language_code[3] = '';
  980. SIToLower(ISO_639_language_code);
  981. data += 3;
  982. bouquet_name_length = *data++;
  983. if(!strcmp(ISO_639_language_code, "chi") ||
  984.    !strcmp(ISO_639_language_code, "chn") ||
  985.    !strcmp(ISO_639_language_code, "zho"))
  986. {
  987. SIStoreText(pstBat->bouquet_name, data, ((bouquet_name_length > KB_SI_MAX_BOUQUET_NAME_LEN)
  988. ? KB_SI_MAX_BOUQUET_NAME_LEN : bouquet_name_length) );
  989. }
  990. else if(!strcmp(ISO_639_language_code, "eng"))
  991. {
  992. SIStoreText(pstBat->english_bouquet_name, data, ((bouquet_name_length > KB_SI_MAX_BOUQUET_NAME_LEN)
  993. ? KB_SI_MAX_BOUQUET_NAME_LEN : bouquet_name_length) );
  994. }
  995. }
  996. break;
  997. case KB_FILTER_SI_SERVICE_LIST:
  998. if(inLoop)
  999. {
  1000. while(length > 0 && pstBat->transport_stream[pstBat->num].num < KB_SI_MAX_BAT_SERVICE_NUM_PER_TS)
  1001. {
  1002. if((l_pstCurrBatPara->nType & KB_SI_RECEIVE_DTV) == 0 ||
  1003. data[2] == SI_SERVICE_TYPE_DTV)
  1004. {
  1005. INT32 service_num;
  1006. service_num = pstBat->transport_stream[pstBat->num].num;
  1007. pstBat->transport_stream[pstBat->num].service[service_num].service_id =
  1008. (UINT16)(data[0] * 0x100 + data[1]);
  1009. pstBat->transport_stream[pstBat->num].service[service_num].service_type = data[2];
  1010. pstBat->transport_stream[pstBat->num].num++;
  1011. }
  1012. data += 3;
  1013. length -= 3;
  1014. }
  1015. }
  1016. break;
  1017. case KB_FILTER_SI_COUNTRY_AVAILABILITY:
  1018. case KB_FILTER_SI_LINKAGE:
  1019. case KB_FILTER_SI_CA_IDENTIFIER:
  1020. case KB_FILTER_SI_PRIVATE_DATA_SPECIFIER:
  1021. case KB_FILTER_SI_STUFFING:
  1022. break;
  1023. default:
  1024. break;
  1025. }
  1026. }
  1027. }
  1028. static void SIEitPFDescs(UINT8* pInData, INT32 dataLen, KB_SIEitPF* pstEitPF)
  1029. {
  1030. UINT8 *data;
  1031. UINT32 tag;
  1032. UINT8 length;
  1033. UINT8 event_name_length;
  1034. UINT8 text_length;
  1035. char ISO_639_language_code[4];
  1036. while(dataLen > 0)
  1037. {
  1038. tag = *pInData++;
  1039. length = *pInData++;
  1040. data = pInData;
  1041. pInData += length;
  1042. dataLen -= ((INT32)length + 2);
  1043. if(length == 0)
  1044. continue;
  1045. switch(tag)
  1046. {
  1047. case KB_FILTER_SI_SHORT_EVENT:
  1048. memcpy(ISO_639_language_code, data, 3);
  1049. ISO_639_language_code[3] = '';
  1050. SIToLower(ISO_639_language_code);
  1051. data += 3;
  1052. event_name_length = *data++;
  1053. if(!strcmp(ISO_639_language_code, "chi") ||
  1054.    !strcmp(ISO_639_language_code, "chn") ||
  1055.    !strcmp(ISO_639_language_code, "zho") ||
  1056.    !strcmp(ISO_639_language_code, "eng"))
  1057. {
  1058. SIStoreText(pstEitPF->chinese.event_name, data, ((event_name_length > KB_SI_MAX_EVENT_NAME_LEN)
  1059. ? KB_SI_MAX_EVENT_NAME_LEN : event_name_length));
  1060. }
  1061. data += event_name_length;
  1062. text_length = *data++;
  1063. if(!strcmp(ISO_639_language_code, "chi") ||
  1064.    !strcmp(ISO_639_language_code, "chn") ||
  1065.    !strcmp(ISO_639_language_code, "zho") ||
  1066.    !strcmp(ISO_639_language_code, "eng"))
  1067. {
  1068. SIStoreText(pstEitPF->chinese.text, data, ((text_length > KB_SI_MAX_EVENT_TEXT_LEN)
  1069. ? KB_SI_MAX_EVENT_TEXT_LEN: text_length));
  1070. }
  1071. break;
  1072. case KB_FILTER_SI_EXTENDED_EVENT:
  1073. data ++;
  1074.             
  1075.             memcpy(ISO_639_language_code, data, 3);
  1076. ISO_639_language_code[3] = '';
  1077. SIToLower(ISO_639_language_code);
  1078. data += 4;
  1079. text_length = *data++;
  1080. if(!strcmp(ISO_639_language_code, "chi") ||
  1081.    !strcmp(ISO_639_language_code, "chn") ||
  1082.    !strcmp(ISO_639_language_code, "zho") ||
  1083.    !strcmp(ISO_639_language_code, "eng"))
  1084. SIStoreText(pstEitPF->extended_event.text_char, data, ((text_length > KB_SI_MAX_TEXT_CHAR_LEN)
  1085. ? KB_SI_MAX_TEXT_CHAR_LEN : text_length));
  1086. }
  1087. break;
  1088. case KB_FILTER_SI_STUFFING:
  1089. case KB_FILTER_SI_LINKAGE:
  1090. case KB_FILTER_SI_TIME_SHIFTED_EVENT:
  1091. case KB_FILTER_SI_COMPONENT:
  1092. case KB_FILTER_SI_CA_IDENTIFIER:
  1093. case KB_FILTER_SI_CONTENT:
  1094. case KB_FILTER_SI_PARENTAL_RATING:
  1095. case KB_FILTER_SI_TELEPHONE:
  1096. case KB_FILTER_SI_MULTILINGUAL_COMPONENT:
  1097. case KB_FILTER_SI_PRIVATE_DATA_SPECIFIER:
  1098. case KB_FILTER_SI_SHORT_SMOOTHING_BUFFER:
  1099. case KB_FILTER_SI_DATA_BROADCAST:
  1100. break;
  1101. default:
  1102. break;
  1103. }
  1104. }
  1105. }
  1106. static void SIEitSCHDescs(UINT8* pInData, INT32 dataLen, KB_SIEitSchEvent* pstEvent)
  1107. {
  1108. UINT8 *data;
  1109. UINT32 tag;
  1110. UINT8 length;
  1111. UINT8 event_name_length;
  1112. UINT8 text_length;
  1113. char ISO_639_language_code[4];
  1114. while(dataLen > 0)
  1115. {
  1116. tag = *pInData++;
  1117. length = *pInData++;
  1118. data = pInData;
  1119. pInData += length;
  1120. dataLen -= ((INT32)length + 2);
  1121. if(length == 0)
  1122. continue;
  1123. switch(tag)
  1124. {
  1125. case KB_FILTER_SI_SHORT_EVENT:
  1126. memcpy(ISO_639_language_code, data, 3);
  1127. ISO_639_language_code[3] = '';
  1128. SIToLower(ISO_639_language_code);
  1129. data += 3;
  1130. event_name_length = *data++;
  1131. if(!strcmp(ISO_639_language_code, "chi") ||
  1132.    !strcmp(ISO_639_language_code, "chn") ||
  1133.    !strcmp(ISO_639_language_code, "zho"))
  1134. {
  1135. SIStoreText(pstEvent->chinese.event_name, data, ((event_name_length > KB_SI_MAX_EVENT_NAME_LEN)
  1136. ? KB_SI_MAX_EVENT_NAME_LEN : event_name_length));
  1137. }
  1138. else if(!strcmp(ISO_639_language_code, "eng"))
  1139. {
  1140. SIStoreText(pstEvent->chinese.event_name, data, ((event_name_length > KB_SI_MAX_EVENT_NAME_LEN)
  1141. ? KB_SI_MAX_EVENT_NAME_LEN : event_name_length));
  1142. }
  1143. data += event_name_length;
  1144. text_length = *data++;
  1145. if(!strcmp(ISO_639_language_code, "chi") ||
  1146.    !strcmp(ISO_639_language_code, "chn") ||
  1147.    !strcmp(ISO_639_language_code, "zho"))
  1148. {
  1149.     if (NULL != pstEvent->chinese.text)
  1150.         {
  1151. SIStoreText(pstEvent->chinese.text, data, ((text_length > KB_SI_MAX_EVENT_TEXT_LEN)
  1152. ? KB_SI_MAX_EVENT_TEXT_LEN: text_length));
  1153. }
  1154.                 else
  1155.                 {
  1156.                     printf("nSIEitSCHDescs::serious error! pointer text is NULL!");
  1157.                 }
  1158. }
  1159. else if(!strcmp(ISO_639_language_code, "eng"))
  1160. {
  1161.     if (NULL != pstEvent->chinese.text)
  1162.         {
  1163.          SIStoreText(pstEvent->chinese.text, data, ((text_length > KB_SI_MAX_EVENT_TEXT_LEN)
  1164. ? KB_SI_MAX_EVENT_TEXT_LEN: text_length));
  1165. }
  1166.                 else
  1167.                 {
  1168.                     printf("nSIEitSCHDescs::serious error! pointer text is NULL!");
  1169.                 }
  1170. }
  1171. break;
  1172. case KB_FILTER_SI_STUFFING:
  1173. case KB_FILTER_SI_LINKAGE:
  1174. case KB_FILTER_SI_EXTENDED_EVENT:
  1175. case KB_FILTER_SI_COMPONENT:
  1176. case KB_FILTER_SI_CA_IDENTIFIER:
  1177. case KB_FILTER_SI_CONTENT:
  1178. case KB_FILTER_SI_PARENTAL_RATING:
  1179. case KB_FILTER_SI_TELEPHONE:
  1180. case KB_FILTER_SI_MULTILINGUAL_COMPONENT:
  1181. case KB_FILTER_SI_PRIVATE_DATA_SPECIFIER:
  1182. case KB_FILTER_SI_SHORT_SMOOTHING_BUFFER:
  1183. case KB_FILTER_SI_DATA_BROADCAST:
  1184. break;
  1185. case KB_FILTER_SI_TIME_SHIFTED_EVENT:
  1186. pstEvent->reference_service_id = (data[0] << 8) | (data[1]);
  1187.             data += 2;
  1188. pstEvent->reference_event_id = (data[0] << 8) | (data[1]);
  1189. break;
  1190. default:
  1191. break;
  1192. }
  1193. }
  1194. }
  1195. static void SICATDescs(UINT8* pInData, INT32 dataLen, KB_SICatStruct* pstCat)
  1196. {
  1197. UINT8 *data;
  1198. UINT32 tag;
  1199. UINT8 length;
  1200. UINT16 oldLength;
  1201. while( dataLen > 0 )
  1202. {
  1203. tag = *pInData++;
  1204. length = *pInData++;
  1205. data = pInData;
  1206. pInData += length;
  1207. dataLen -= ((INT32)length + 2);
  1208. if(length == 0)
  1209. continue;
  1210. switch(tag)
  1211. {
  1212. case KB_FILTER_SI_CA:
  1213. oldLength = pstCat->CA_descriptor_buffer_len;
  1214. pstCat->CA_descriptor_buffer_len += (UINT16)(2 + length);
  1215. if(pstCat->CA_descriptor_buffer_len > KB_SI_MAX_CA_BUFFER_LEN)
  1216. {
  1217. pstCat->CA_descriptor_buffer_len = KB_SI_MAX_CA_BUFFER_LEN;
  1218. }
  1219. memcpy(pstCat->CA_descriptor + oldLength, data - 2, pstCat->CA_descriptor_buffer_len - oldLength);
  1220. break;
  1221. default:
  1222. break;
  1223. }
  1224. }
  1225. }
  1226. static void SIHandlePat(T_SubTableID subTableID, UINT32 filterNumber, UINT32 handle)
  1227. {
  1228. KB_OSPMsgNode message;
  1229. T_SubTableFilter *filter;
  1230. filter = &SISubTable[subTableID].filter[filterNumber];
  1231. filter->tableIDExt = filter->data.tableIDExt;
  1232. memset(&message, 0, sizeof(KB_OSPMsgNode));
  1233. message.Word1 = MOD_SIPSI;
  1234. if(l_pstCurrPatPara->nType & KB_SI_RECEIVE_CHANGE)
  1235. {
  1236. message.Word2 = KB_SI_MSG_PAT_CHANGE;
  1237. }
  1238. else
  1239. {
  1240. message.Word2 = KB_SI_MSG_PAT_DONE;
  1241. }
  1242. message.Word3 = (UINT32)l_pstCurrPatPara->pstPat;
  1243. KD_DTVSendMsg(&message);
  1244. if(l_pstCurrPatPara->nType & KB_SI_RECEIVE_CHANGE)
  1245. {
  1246. l_pstCurrPatPara->nCurrVersionNumber = -1;
  1247. SISubTableStart(subTableID, filterNumber, filter->data.version, handle);
  1248. }
  1249. else
  1250. {
  1251. memset(l_pstCurrPatPara, 0, sizeof(PATINFO));
  1252. }
  1253. }
  1254. static void SIHandleNit(T_SubTableID subTableID, UINT32 filterNumber, UINT32 handle)
  1255. {
  1256. KB_OSPMsgNode message;
  1257. T_SubTableFilter *filter;
  1258. filter = &SISubTable[subTableID].filter[filterNumber];
  1259. filter->tableIDExt = filter->data.tableIDExt;
  1260. memset(&message, 0, sizeof(KB_OSPMsgNode));
  1261. message.Word1 = MOD_SIPSI;
  1262. if(l_pstCurrNitPara->nType & KB_SI_RECEIVE_CHANGE)
  1263. {
  1264. message.Word2 = KB_SI_MSG_NIT_CHANGE;
  1265. }
  1266. else
  1267. {
  1268. message.Word2 = KB_SI_MSG_NIT_DONE;
  1269. }
  1270. message.Word3 = (UINT32)l_pstCurrNitPara->pstNit;
  1271. KD_DTVSendMsg(&message);
  1272. if(l_pstCurrNitPara->nType & KB_SI_RECEIVE_CHANGE)
  1273. {
  1274. l_pstCurrNitPara->nCurrVersionNumber = -1;
  1275. SISubTableStart(subTableID, filterNumber, filter->data.version, handle);
  1276. }
  1277. else
  1278. {
  1279. memset(l_pstCurrNitPara, 0, sizeof(NITINFO));
  1280. }
  1281. }
  1282. static void SIHandlePmt(T_SubTableID subTableID, UINT32 filterNumber, UINT32 handle)
  1283. {
  1284. KB_OSPMsgNode message;
  1285. T_SubTableFilter *filter;
  1286. INT32 i;
  1287. filter = &SISubTable[subTableID].filter[filterNumber];
  1288. filter->tableIDExt = filter->data.tableIDExt;
  1289. for(i = 0; i < SI_NO_PMT_TABLES; i++)
  1290. {
  1291. if(l_pstCurrPmtPara[i]->nUsedFlag == 1 &&
  1292.    l_pstCurrPmtPara[i]->nSvcNO == filter->tableIDExt)
  1293. {
  1294. memset(&message, 0, sizeof(KB_OSPMsgNode));
  1295. message.Word1 = MOD_SIPSI;
  1296. if(l_pstCurrPmtPara[i]->nType & KB_SI_RECEIVE_CHANGE)
  1297. {
  1298. message.Word2 = KB_SI_MSG_PMT_CHANGE;
  1299. }
  1300. else
  1301. {
  1302. message.Word2 = KB_SI_MSG_PMT_DONE;
  1303. }
  1304. message.Word3 = (UINT32)l_pstCurrPmtPara[i]->pstPmt;
  1305. KD_DTVSendMsg(&message);
  1306. if(l_pstCurrPmtPara[i]->nType & KB_SI_RECEIVE_CHANGE)
  1307. {
  1308. l_pstCurrPmtPara[i]->nCurrVersionNumber = -1;
  1309. SISubTable[subTableID].details.tableIDExt = l_pstCurrPmtPara[i]->nSvcNO;
  1310. SISubTable[subTableID].details.PID = l_pstCurrPmtPara[i]->nProgramMapPid;
  1311. SISubTableStart(subTableID, filterNumber, filter->data.version, handle);
  1312. }
  1313. else
  1314. {
  1315. memset(l_pstCurrPmtPara[i], 0, sizeof(PMTINFO));
  1316. }
  1317. break;
  1318. }
  1319. }
  1320. }
  1321. static void SIHandleSdt(T_SubTableID subTableID, UINT32 filterNumber, UINT32 handle)
  1322. {
  1323. KB_OSPMsgNode message;
  1324. T_SubTableFilter *filter;
  1325. filter = &SISubTable[subTableID].filter[filterNumber];
  1326. filter->tableIDExt = filter->data.tableIDExt;
  1327. memset(&message, 0, sizeof(KB_OSPMsgNode));
  1328. message.Word1 = MOD_SIPSI;
  1329. if(filter->tableID == 0x42)
  1330. {
  1331. if(l_pstCurrSdtPara->nType & KB_SI_RECEIVE_CHANGE)
  1332. {
  1333. message.Word2 = KB_SI_MSG_SDT_CHANGE;
  1334. }
  1335. else
  1336. {
  1337. message.Word2 = KB_SI_MSG_SDT_DONE;
  1338. }
  1339. message.Word3 = (UINT32)l_pstCurrSdtPara->pstSdt;
  1340. message.Word4 = l_pstCurrSdtPara->nServiceNum;
  1341. }
  1342. else
  1343. {
  1344. if(l_pstCurrBatPara->nType & KB_SI_RECEIVE_CHANGE)
  1345. {
  1346. message.Word2 = KB_SI_MSG_BAT_CHANGE;
  1347. }
  1348. else
  1349. {
  1350. message.Word2 = KB_SI_MSG_BAT_DONE;
  1351. }
  1352. message.Word3 = (UINT32)l_pstCurrBatPara->pstBat;
  1353. message.Word4 = l_pstCurrBatPara->nBatNumber;
  1354. }
  1355. KD_DTVSendMsg(&message);
  1356. if(filter->tableID == 0x42)
  1357. {
  1358. if(l_pstCurrSdtPara->nType & KB_SI_RECEIVE_CHANGE)
  1359. {
  1360. l_pstCurrSdtPara->nServiceNum = 0;
  1361. l_pstCurrSdtPara->nCurrVersionNumber = -1;
  1362. SISubTable[SDTSubTableID].details.tableID = 0x42;
  1363. SISubTable[SDTSubTableID].details.tableIDExt = -1;
  1364. SISubTableStart(subTableID, filterNumber, filter->data.version, handle);
  1365. }
  1366. else
  1367. {
  1368. memset(l_pstCurrSdtPara, 0, sizeof(SDTINFO));
  1369. }
  1370. }
  1371. else
  1372. {
  1373. if(l_pstCurrBatPara->nType & KB_SI_RECEIVE_CHANGE)
  1374. {
  1375. l_pstCurrBatPara->nCurrVersionNumber = -1;
  1376. l_pstCurrBatPara->nBatNumber = 0;
  1377. SISubTable[SDTSubTableID].details.tableID = 0x4A;
  1378. //J_SI_Print("sipsi rec bat:::[%d]n",l_pstCurrBatPara->nBouquetId);
  1379. SISubTable[SDTSubTableID].details.tableIDExt = l_pstCurrBatPara->nBouquetId;
  1380. SISubTableStart(subTableID, filterNumber, filter->data.version, handle);
  1381. }
  1382. else
  1383. {
  1384. memset(l_pstCurrBatPara, 0, sizeof(BATINFO));
  1385. }
  1386. }
  1387. }
  1388. static void SIHandleEit(T_SubTableID subTableID, UINT32 filterNumber, UINT32 handle)
  1389. {
  1390. KB_OSPMsgNode message;
  1391. T_SubTableFilter *filter;
  1392. int nIsMulti = 0;
  1393.     int i, nCurrentNo;
  1394. filter = &SISubTable[subTableID].filter[filterNumber];        
  1395. if(filter->subTableID == 0x50 && filter->tableIDExt == -1)
  1396. nIsMulti = 1;
  1397. if(filterNumber < KB_SI_EIT_SCHEDULE_SOFT_FILTER_COUNT)
  1398. {
  1399.         for (i = 0; i < KB_SI_EIT_SCHEDULE_SERVICE_COUNT; i++)
  1400.      {        
  1401.      if(l_pstCurrEinSchInfoPara[i]->handle == filter->handle)
  1402.      {
  1403.                 nCurrentNo = i;
  1404.      break;
  1405.      }
  1406.      }
  1407.         
  1408.         if (i >= KB_SI_EIT_SCHEDULE_SERVICE_COUNT)
  1409.         {
  1410.          return;
  1411.         }
  1412.     
  1413. filter->tableIDExt = filter->data.tableIDExt;
  1414. memset(&message, 0, sizeof(KB_OSPMsgNode));
  1415. message.Word1 = MOD_SIPSI;
  1416. if(nIsMulti)
  1417. {
  1418. message.Word2 = KB_SI_MSG_EIT_SCHEDULE_DONE;
  1419. message.Word3 = (UINT32)l_pstCurrMultiEinSchInfoPara->pstEinSchInfo;
  1420. KD_DTVSendMsg(&message);
  1421. memset(l_pstCurrMultiEinSchInfoPara, 0, sizeof(MULTEITSCHINFO));
  1422. }
  1423. else
  1424. {
  1425. message.Word2 = KB_SI_MSG_EIT_SCHEDULE_DONE;
  1426. message.Word3 = (UINT32)l_pstCurrEinSchInfoPara[nCurrentNo]->pstEinSchInfo;
  1427.              message.Word4 = l_pstCurrEinSchInfoPara[nCurrentNo]->nSvcID;
  1428. KD_DTVSendMsg(&message);
  1429. memset(l_pstCurrEinSchInfoPara[nCurrentNo], 0, sizeof(EITSCHINFO));
  1430. }
  1431. }
  1432. else
  1433. {                 
  1434.         if (filterNumber >= SI_EIT_SCHEDULE_SHIFT_FILTER_START_NUMBER
  1435.             && filterNumber < SI_EIT_SCHEDULE_SHIFT_FILTER_END_NUMBER)
  1436.         {
  1437.             for (i = 0; i < SI_NO_EIT_SCHEDULE_TIME_SHIFT_FILTERS; i++)
  1438.          {        
  1439.          if(gptCurrSchShiftPara[i]->handle == filter->handle)
  1440.          {
  1441.                     nCurrentNo = i;
  1442.          break;
  1443.          }
  1444.          }
  1445.             
  1446.             if (i >= SI_NO_EIT_SCHEDULE_TIME_SHIFT_FILTERS)
  1447.             {
  1448.              return;
  1449.             }
  1450.         
  1451.             memset(&message, 0, sizeof(KB_OSPMsgNode));
  1452.      message.Word1 = MOD_SIPSI;
  1453. message.Word2 = KB_SI_MSG_EIT_SCHEDULE_DONE;
  1454. message.Word3 = (UINT32)gptCurrSchShiftPara[nCurrentNo]->ptTimeShift;
  1455.             
  1456.             KD_DTVSendMsg(&message);
  1457.         }
  1458.         else
  1459.         {
  1460.      for(i = 0; i < SI_NO_EIT_PF_FILTERS; i++)
  1461.      {
  1462.      if(l_pstCurrEitPFPara[i]->nUsedFlag == 1 &&
  1463.         l_pstCurrEitPFPara[i]->nSvcID == filter->data.tableIDExt
  1464.         && l_pstCurrEitPFPara[i]->nTableId == filter->tableID)
  1465.      {
  1466.      filter->tableIDExt = filter->data.tableIDExt;
  1467.     
  1468.      memset(&message, 0, sizeof(KB_OSPMsgNode));
  1469.      message.Word1 = MOD_SIPSI;
  1470.      if(l_pstCurrEitPFPara[i]->nType & KB_SI_RECEIVE_CHANGE)
  1471.      {
  1472.      message.Word2 = KB_SI_MSG_EIT_PF_CHANGE;
  1473.      }
  1474.      else
  1475.      {
  1476.      message.Word2 = KB_SI_MSG_EIT_PF_DONE;
  1477.      }
  1478.      message.Word3 = (UINT32)l_pstCurrEitPFPara[i]->pstEitPresent;
  1479.      message.Word4 = (UINT32)l_pstCurrEitPFPara[i]->pstEitFollow;
  1480.      KD_DTVSendMsg(&message);
  1481.      if(l_pstCurrEitPFPara[i]->nType & KB_SI_RECEIVE_CHANGE)
  1482.      {
  1483.      l_pstCurrEitPFPara[i]->nCurrVersionNumber = -1;
  1484.      SISubTable[EITSubTableID].details.tableID = l_pstCurrEitPFPara[i]->nTableId;
  1485.      SISubTable[EITSubTableID].details.tableIDExt = l_pstCurrEitPFPara[i]->nSvcID;
  1486.      SISubTableStart(subTableID, filterNumber, filter->data.version, handle);
  1487.      }
  1488.      else
  1489.      {
  1490.      memset(l_pstCurrEitPFPara[i], 0, sizeof(EITPFINFO));
  1491.      }
  1492.      break;
  1493.      }
  1494.      }
  1495.         }
  1496. }
  1497. }
  1498. static void SIHandleCat(T_SubTableID subTableID, UINT32 filterNumber, UINT32 handle)
  1499. {
  1500. KB_OSPMsgNode message;
  1501. T_SubTableFilter *filter;
  1502. filter = &SISubTable[subTableID].filter[filterNumber];
  1503. filter->tableIDExt = filter->data.tableIDExt;
  1504. memset(&message, 0, sizeof(KB_OSPMsgNode));
  1505. message.Word1 = MOD_SIPSI;
  1506. if(l_pstCurrCatPara->nType & KB_SI_RECEIVE_CHANGE)
  1507. {
  1508. message.Word2 = KB_SI_MSG_CAT_CHANGE;
  1509. }
  1510. else
  1511. {
  1512. message.Word2 = KB_SI_MSG_CAT_DONE;
  1513. }
  1514. message.Word3 = (UINT32)l_pstCurrCatPara->pstCat;
  1515. KD_DTVSendMsg(&message);
  1516. if(l_pstCurrCatPara->nType & KB_SI_RECEIVE_CHANGE)
  1517. {
  1518. l_pstCurrCatPara->nCurrVersionNumber = -1;
  1519. SISubTableStart(subTableID, filterNumber, filter->data.version, handle);
  1520. }
  1521. else
  1522. {
  1523. memset(l_pstCurrCatPara, 0, sizeof(CATINFO));
  1524. }
  1525. }
  1526. static INT32 SIHandlePatTimeout(UINT32 filterID)
  1527. {
  1528. KB_OSPMsgNode message;
  1529. SISubTableStop(PATSubTableID);
  1530. memset(&message, 0, sizeof(KB_OSPMsgNode));
  1531. message.Word1 = MOD_SIPSI;
  1532. message.Word2 = KB_SI_MSG_PAT_TIMEOUT;
  1533. KD_DTVSendMsg(&message);
  1534. memset(l_pstCurrPatPara, 0, sizeof(PATINFO));
  1535. return -1;
  1536. }
  1537. static INT32 SIHandleNitTimeout(UINT32 filterID)
  1538. {
  1539. KB_OSPMsgNode message;
  1540. SISubTableStop(NITSubTableID);
  1541. memset(&message, 0, sizeof(KB_OSPMsgNode));
  1542. message.Word1 = MOD_SIPSI;
  1543. message.Word2 = KB_SI_MSG_NIT_TIMEOUT;
  1544. KD_DTVSendMsg(&message);
  1545. memset(l_pstCurrNitPara, 0, sizeof(NITINFO));
  1546. return -1;
  1547. }
  1548. static INT32 SIHandlePmtTimeout(UINT32 filterID)
  1549. {
  1550. KB_OSPMsgNode message;
  1551. INT32 i;
  1552. SIFilterStop(SISubTable[SIFilters[filterID].subTableID].details.channelID, &SIFilters[filterID]);
  1553. memset(&message, 0, sizeof(KB_OSPMsgNode));
  1554. message.Word1 = MOD_SIPSI;
  1555. message.Word2 = KB_SI_MSG_PMT_TIMEOUT;
  1556. message.Word3 = SIFilters[filterID].tableIDExt;
  1557. KD_DTVSendMsg(&message);
  1558. for(i = 0; i < SI_NO_PMT_TABLES; i++)
  1559. {
  1560. if(l_pstCurrPmtPara[i]->nUsedFlag == 1 &&
  1561.    l_pstCurrPmtPara[i]->nSvcNO == SIFilters[filterID].tableIDExt)
  1562. {
  1563. memset(l_pstCurrPmtPara[i], 0, sizeof(PMTINFO));
  1564. break;
  1565. }
  1566. }
  1567. return -1;
  1568. }
  1569. static INT32 SIHandleSdtTimeout(UINT32 filterID)
  1570. {
  1571. KB_OSPMsgNode message;
  1572. SIFilterStop(SISubTable[SDTSubTableID].details.channelID, &SIFilters[filterID]);
  1573. memset(&message, 0, sizeof(KB_OSPMsgNode));
  1574. message.Word1 = MOD_SIPSI;
  1575. if(SIFilters[filterID].tableID == 0x42 /* SDT */)
  1576. {
  1577. message.Word2 = KB_SI_MSG_SDT_TIMEOUT;
  1578. }
  1579. else
  1580. {
  1581. message.Word2 = KB_SI_MSG_BAT_TIMEOUT;
  1582. message.Word3 = SIFilters[filterID].tableIDExt;
  1583. }
  1584. KD_DTVSendMsg(&message);
  1585. if(SIFilters[filterID].tableID == 0x42 /* SDT */)
  1586. {
  1587. memset(l_pstCurrSdtPara, 0, sizeof(SDTINFO));
  1588. }
  1589. else
  1590. {
  1591. memset(l_pstCurrBatPara, 0, sizeof(BATINFO));
  1592. }
  1593. return -1;
  1594. }
  1595. static INT32 SIHandleEitTimeout(UINT32 filterID)
  1596. {
  1597. KB_OSPMsgNode message;
  1598. INT32 i, nCurrentNo, filterNumber;
  1599.     T_SubTableFilter *filter;
  1600.     filter = &SIFilters[filterID];      
  1601.     
  1602. if(SIFilters[filterID].tableID == 0x4E || SIFilters[filterID].tableID == 0x4F)
  1603. {
  1604. SIFilterStop(SISubTable[EITSubTableID].details.channelID, &SIFilters[filterID]);       
  1605.         SIFilters[filterID].used = FALSE;
  1606. }
  1607. else
  1608. {        
  1609.         if (filterNumber >= SI_EIT_SCHEDULE_SHIFT_FILTER_START_NUMBER
  1610.             && filterNumber < SI_EIT_SCHEDULE_SHIFT_FILTER_END_NUMBER)
  1611.         {
  1612.             for (i = 0; i < SI_NO_EIT_SCHEDULE_TIME_SHIFT_FILTERS; i++)
  1613.          {        
  1614.          if(gptCurrSchShiftPara[i]->handle == filter->handle)
  1615.          {
  1616.                     nCurrentNo = i;
  1617.          break;
  1618.          }
  1619.          }
  1620.             
  1621.             if (i >= SI_NO_EIT_SCHEDULE_TIME_SHIFT_FILTERS)
  1622.             {
  1623.              return -1;
  1624.             }
  1625.             memset(gptCurrSchShiftPara[i], 0, sizeof(T_EIT_SCHEDULE_TIME_SHIFT_PARA));
  1626.         
  1627.             SIFilterStop(SISubTable[EITSubTableID].details.channelID, &SIFilters[filterID]);
  1628.             SISubTable[EITSubTableID].filter[filterNumber].used = FALSE;
  1629.         }
  1630.         else
  1631.         {    
  1632.             if (filter->tableID == 0x50)
  1633.             {
  1634.                 SIFilterStop(SISubTable[EITSubTableID].details.channelID, filter);
  1635.                 SIFilters[filterID].used = FALSE;
  1636.                 filterNumber = SIGetFilterNum(EITSubTableID, 0x51, filter->tableIDExt);
  1637.                 if (filterNumber != 0xFFFFFFFF)
  1638.                 {
  1639.                     SIFilterStop(SISubTable[EITSubTableID].details.channelID, 
  1640.                                  &SISubTable[EITSubTableID].filter[filterNumber]);
  1641.                     SISubTable[EITSubTableID].filter[filterNumber].used = FALSE;
  1642.                 }
  1643.             }
  1644.             else
  1645.             {
  1646.                 if (filter->tableID == 0x51)
  1647.                 {
  1648.                     SIFilterStop(SISubTable[EITSubTableID].details.channelID, filter);
  1649.                     SIFilters[filterID].used = FALSE;
  1650.                     filterNumber = SIGetFilterNum(EITSubTableID, 0x50, filter->tableIDExt);
  1651.                     if (filterNumber != 0xFFFFFFFF)
  1652.                     {
  1653.                         SIFilterStop(SISubTable[EITSubTableID].details.channelID, 
  1654.                                      &SISubTable[EITSubTableID].filter[filterNumber]);
  1655.                         SISubTable[EITSubTableID].filter[filterNumber].used = FALSE;
  1656.                     }
  1657.                 }
  1658.             }
  1659.         }
  1660. }
  1661. memset(&message, 0, sizeof(KB_OSPMsgNode));
  1662. message.Word1 = MOD_SIPSI;
  1663. if(SIFilters[filterID].tableID == 0x4E || SIFilters[filterID].tableID == 0x4F)
  1664. {
  1665. message.Word2 = KB_SI_MSG_EIT_PF_TIMEOUT;
  1666. }
  1667. else
  1668. {
  1669. message.Word2 = KB_SI_MSG_EIT_SCHEDULE_TIMEOUT;
  1670. }
  1671. message.Word4 = SIFilters[filterID].tableIDExt;
  1672.     
  1673. KD_DTVSendMsg(&message);
  1674. if(SIFilters[filterID].tableID == 0x4E || SIFilters[filterID].tableID == 0x4F)
  1675. {
  1676. for(i = 0; i < SI_NO_EIT_PF_FILTERS; i++)
  1677. {
  1678. if(l_pstCurrEitPFPara[i]->nUsedFlag == 1 &&
  1679.    l_pstCurrEitPFPara[i]->nSvcID == SIFilters[filterID].tableIDExt
  1680.    && l_pstCurrEitPFPara[i]->nTableId == SIFilters[filterID].tableID)
  1681. {
  1682. memset(l_pstCurrEitPFPara[i], 0, sizeof(EITPFINFO));
  1683. }
  1684. }
  1685. }
  1686. else
  1687. {
  1688.         for (i = 0; i < KB_SI_EIT_SCHEDULE_SERVICE_COUNT; i++)
  1689.      {        
  1690.      if(l_pstCurrEinSchInfoPara[i]->handle == filter->handle)
  1691.      {
  1692.                 nCurrentNo = i;
  1693.      break;
  1694.      }
  1695.      }
  1696.         if (i >= KB_SI_EIT_SCHEDULE_SERVICE_COUNT)
  1697.         {
  1698.             return -1;
  1699.         }
  1700. memset(l_pstCurrEinSchInfoPara[nCurrentNo], 0, sizeof(EITSCHINFO));
  1701. }
  1702. return -1;
  1703. }
  1704. static INT32 SIHandleTdtTimeout(UINT32 filterID)
  1705. {
  1706. KB_OSPMsgNode message;
  1707. SIFilterStop(SISubTable[TDTSubTableID].details.channelID, &SIFilters[filterID]);
  1708. memset(&message, 0, sizeof(KB_OSPMsgNode));
  1709. message.Word1 = MOD_SIPSI;
  1710. message.Word2 = KB_SI_MSG_TDT_TIMEOUT;
  1711. KD_DTVSendMsg(&message);
  1712. memset(l_pstCurrTdtPara, 0, sizeof(TDTINFO));
  1713. return -1;
  1714. }
  1715. static INT32 SIHandleTotTimeout(UINT32 filterID)
  1716. {
  1717. KB_OSPMsgNode message;
  1718. SIFilterStop(SISubTable[TOTSubTableID].details.channelID, &SIFilters[filterID]);
  1719. memset(&message, 0, sizeof(KB_OSPMsgNode));
  1720. message.Word1 = MOD_SIPSI;
  1721. message.Word2 = KB_SI_MSG_TOT_TIMEOUT;
  1722. KD_DTVSendMsg(&message);
  1723. memset(l_pstCurrTotPara, 0, sizeof(TOTINFO));
  1724. return -1;
  1725. }
  1726. static INT32 SIHandleCatTimeout(UINT32 filterID)
  1727. {
  1728. KB_OSPMsgNode message;
  1729. SISubTableStop(CATSubTableID);
  1730. memset(&message, 0, sizeof(KB_OSPMsgNode));
  1731. message.Word1 = MOD_SIPSI;
  1732. message.Word2 = KB_SI_MSG_CAT_TIMEOUT;
  1733. KD_DTVSendMsg(&message);
  1734. memset(l_pstCurrCatPara, 0, sizeof(CATINFO));
  1735. return -1;
  1736. }
  1737. static INT32 SIStopMultEitSCH()
  1738. {
  1739. SIFilterStop(SISubTable[EITSubTableID].details.channelID, &(SISubTable[EITSubTableID].filter[0]));
  1740. memset(l_pstCurrMultiEinSchInfoPara, 0, sizeof(MULTEITSCHINFO));
  1741. return 0;
  1742. }
  1743. static INT32 SIGetMultEitSCH()
  1744. {
  1745. memcpy(l_pstCurrMultiEinSchInfoPara, l_pstPendingMultiEinSchInfoPara, sizeof(MULTEITSCHINFO));
  1746. l_pstCurrMultiEinSchInfoPara->nCurrVersionNumber = -1;
  1747. l_pstCurrMultiEinSchInfoPara->nUsedFlag = 1;
  1748. memset(l_pstCurrMultiEinSchInfoPara->pstEinSchInfo, 0, 
  1749. l_pstCurrMultiEinSchInfoPara->nServiceNum * sizeof(KB_SIMultiEitSchedule));
  1750. //SISubTable[EITSubTableID].details.noFilters = 1;
  1751. SISubTable[EITSubTableID].details.tableID = 0x50;
  1752. SISubTable[EITSubTableID].details.timeout = 20;
  1753. SISubTable[EITSubTableID].details.tableIDExt = -1;//l_pstCurrMultiEinSchInfoPara->nSvcID[0];//-1;//l_pstCurrMultiEinSchInfoPara->nSvcID;
  1754. SISubTableStart(EITSubTableID, 0, -1, l_pstCurrMultiEinSchInfoPara->handle);
  1755. return 0;
  1756. }
  1757. static void SIParseEit(MepgData *section)
  1758. {
  1759. T_SubTableFilter *filter;
  1760. UINT8 *pInData;
  1761. INT32 dataLength;
  1762. KB_SIEitPF* pstEitPF;
  1763.     KB_SINVODEitPF *ptEitNvod;
  1764.     
  1765. UINT16 table_id;
  1766. UINT16 table_id_extension;
  1767. UINT8 version_number;
  1768. UINT8 section_number;
  1769. UINT8 last_section_number;
  1770. UINT16 serID;
  1771. UINT16 transport_stream_id;
  1772. UINT8 segment_last_section_number;
  1773. int i;
  1774. INT32 nCurrNo = 0;
  1775. time_t start_time; 
  1776. KB_SIEitPF siEitPF;
  1777. UINT32 duration;
  1778. int nvod=0;
  1779. int   circle;
  1780.     INT32 filterNumber;
  1781. //INT16 section_length = 0;
  1782. //KB_OSPMsgNode message;
  1783.         
  1784. memset(&siEitPF,0,sizeof(KB_SIEitPF));
  1785. filter = &SISubTable[section->subTableID].filter[section->filterNumber];
  1786. pInData = section->data;
  1787. dataLength = section->length;
  1788. table_id = pInData[0];
  1789. table_id_extension = (UINT16)(pInData[3] * 0x100 + pInData[4]); //ServiceID
  1790. serID = pInData[3] << 8 | pInData[4];
  1791.     if (table_id == 0x50 || table_id == 0x51 || table_id == 0x60 || table_id == 0x61)
  1792.     {
  1793.         SISectionEinSchInfo(section);
  1794.         SIFreeSectionData(section);
  1795.         return;
  1796.     }
  1797. version_number = (UINT8)((pInData[5] & 0x3E) >> 1);
  1798. section_number = pInData[6];
  1799. last_section_number = pInData[7];
  1800. transport_stream_id = pInData[8] << 8 | pInData[9];
  1801. pInData += 8;
  1802. dataLength -= 8;
  1803. if( dataLength <= 0 )
  1804. {
  1805. SIFreeSectionData(section);
  1806. return;
  1807. }
  1808. segment_last_section_number = pInData[4];
  1809. pInData += 6;
  1810. dataLength -= 6;
  1811. if(table_id == 0x4E || table_id == 0x4f)
  1812. {
  1813.     int descriptors_loop_length;
  1814.         
  1815. for(i = 0; i < SI_NO_EIT_PF_FILTERS; i++)
  1816. {
  1817. if(l_pstCurrEitPFPara[i]->handle == filter->handle &&
  1818.    l_pstCurrEitPFPara[i]->nUsedFlag == 1 &&
  1819.    l_pstCurrEitPFPara[i]->nSvcID == table_id_extension
  1820.    && l_pstCurrEitPFPara[i]->nTableId == table_id)
  1821. {
  1822. nCurrNo = i;
  1823. break;
  1824. }
  1825. }
  1826. if(i == SI_NO_EIT_PF_FILTERS)
  1827. {
  1828. SIFreeSectionData(section);
  1829. return;
  1830. }
  1831. if(section_number == 0)
  1832. {
  1833. pstEitPF = l_pstCurrEitPFPara[nCurrNo]->pstEitPresent;
  1834. }
  1835. else if(section_number == 1)
  1836. {
  1837. pstEitPF = l_pstCurrEitPFPara[nCurrNo]->pstEitFollow;
  1838. }
  1839. else
  1840. {
  1841. pstEitPF = NULL;
  1842. }
  1843. if(pstEitPF == NULL)
  1844. {
  1845. SIFreeSectionData(section);
  1846. return;
  1847. }
  1848.         
  1849.         pstEitPF->NVODEventNum = 0;
  1850. pstEitPF->service_id = table_id_extension;
  1851. if(l_pstCurrEitPFPara[nCurrNo]->nCurrVersionNumber == -1)
  1852. {
  1853. l_pstCurrEitPFPara[nCurrNo]->nCurrVersionNumber = version_number;
  1854. }
  1855. else if(l_pstCurrEitPFPara[nCurrNo]->nCurrVersionNumber != version_number)
  1856. {
  1857. filterNumber = section->filterNumber;
  1858. SIFreeSectionData(section);
  1859. l_pstCurrEitPFPara[nCurrNo]->handle = l_nHandle++;
  1860. l_pstCurrEitPFPara[nCurrNo]->nCurrVersionNumber = -1;
  1861. SISubTable[EITSubTableID].details.tableID = l_pstCurrEitPFPara[nCurrNo]->nTableId;
  1862. SISubTable[EITSubTableID].details.tableIDExt = l_pstCurrEitPFPara[nCurrNo]->nSvcID;
  1863.             SISubTable[EITSubTableID].details.timeout = J_SI_EIT_PF_TIMEOUT;
  1864.             
  1865. SISubTableStart(EITSubTableID, filterNumber, l_pstCurrEitPFPara[nCurrNo]->nVersionNumber, l_pstCurrEitPFPara[nCurrNo]->handle);
  1866. return;
  1867. }
  1868. pstEitPF->version_number = version_number;
  1869. circle = 0;
  1870. while(dataLength > 0)
  1871. {
  1872. siEitPF.event_id = (UINT16)(pInData[0] * 0x100 + pInData[1]);
  1873. siEitPF.service_id = serID;
  1874. pInData += 2;
  1875. dataLength -= 2;
  1876. if(pInData[0] != 0xFF || pInData[1] != 0xFF || pInData[2] != 0xFF
  1877. || pInData[3] != 0xFF || pInData[4] != 0xFF)
  1878. {
  1879. SIParseTime(pInData, &start_time);
  1880. }
  1881. else
  1882. {
  1883. nvod = 1;
  1884. start_time = 0;
  1885. }
  1886. pInData += 5;
  1887. dataLength -= 5;
  1888. siEitPF.start_time = start_time;
  1889. SIParseDuration(pInData, &duration);
  1890. siEitPF.duration = duration;
  1891. pInData += 3;
  1892. dataLength -= 3;
  1893. if(circle == 0)
  1894. {
  1895. pstEitPF->running_status = (UINT8)(pInData[0] >> 5);
  1896. pstEitPF->free_CA_mode = (UINT8)((pInData[0] & 0x10) >> 4);
  1897. }
  1898. descriptors_loop_length = (pInData[0] & 0x0F) * 0x100  + pInData[1];
  1899. pInData += 2;
  1900. dataLength -= 2;
  1901. SIEitPFDescs(pInData, descriptors_loop_length, &siEitPF);
  1902. if(circle == 0)
  1903. {
  1904.                 siEitPF.NVODEvent = pstEitPF->NVODEvent;
  1905.                 siEitPF.NVODEventNum = pstEitPF->NVODEventNum;
  1906. memcpy(pstEitPF,&siEitPF,sizeof(KB_SIEitPF));
  1907. }
  1908. if (nvod == 1 
  1909.                 && pstEitPF->NVODEvent != NULL 
  1910.                 && pstEitPF->NVODEventNum < KB_SI_EIT_PF_MAX_NVOD_EVENT_NUMBER)
  1911. {
  1912.                 ptEitNvod = pstEitPF->NVODEvent + pstEitPF->NVODEventNum;
  1913.                 ptEitNvod->service_id = siEitPF.service_id;
  1914.                 ptEitNvod->event_id = siEitPF.event_id;
  1915.                 ptEitNvod->duration = siEitPF.duration;
  1916.                 strcpy((char*)ptEitNvod->chinese.event_name, (char*)siEitPF.chinese.event_name);
  1917.                 strcpy((char*)ptEitNvod->chinese.text, (char*)siEitPF.chinese.text);
  1918.                 pstEitPF->NVODEventNum++;
  1919. }
  1920. pInData += descriptors_loop_length;
  1921. dataLength -= (INT32)descriptors_loop_length;
  1922. circle ++;
  1923. }
  1924. }
  1925.     
  1926.     SIFreeSectionData(section);
  1927.     return;
  1928. }
  1929. void SIToLower(char* str)
  1930. {
  1931. short len;
  1932. short i;
  1933. #ifdef _DBG_
  1934. if (str == NULL)
  1935. {
  1936. J_SI_Print("[SIPSI] The string is emptyn");
  1937. return;
  1938. }
  1939. #endif
  1940. len = strlen(str);
  1941. for (i = 0; i < len; i++)
  1942. {
  1943. str[i] = tolower(str[i]);
  1944. }
  1945. }
  1946. static void SIGetSection(UINT32 nChannelID, UINT8 *pData, UINT32 nDataLength)
  1947. {
  1948. T_DMX_Notify notify;
  1949.     if (pData == NULL)
  1950.     {
  1951.         return;
  1952.     }
  1953.     
  1954. /* Parpare the notify header */
  1955. memset(&notify, 0, sizeof(notify));
  1956. notify.whichChannel = nChannelID;
  1957. /* Call SIHandleNewSection first */
  1958. if(!SIHandleNewSection(pData, &notify))
  1959. {
  1960.         KB_DmxUnlock(nChannelID, pData);
  1961.         
  1962. return;
  1963. }
  1964. /* Check length */
  1965. if((notify.copyLength + notify.skipLength) > nDataLength)
  1966. {
  1967. J_SI_Print("nSI: Copy section length too large");
  1968. }
  1969. /*
  1970. ** When parameters ara illegal, call the SISectionCopied so to
  1971. ** release buffers.
  1972. */
  1973. if(!notify.outputBuffer || !notify.copyLength || ((notify.copyLength + notify.skipLength) > nDataLength))
  1974. {        
  1975. SISectionCopied(DMX_ERROR, pData, nDataLength, notify.tag);
  1976. return;
  1977. }
  1978.     notify.outputBuffer = pData + notify.skipLength;
  1979. SISectionCopied(DMX_AVAILABLE, notify.outputBuffer, notify.copyLength, notify.tag);
  1980. }
  1981. static int KD_DTVSendMsg(KB_OSPMsgNode * pMsg)
  1982. {
  1983.     if (pMsg->Word2 >= KB_SI_MSG_EIT_PF_DONE 
  1984.         && pMsg->Word2 <= KB_SI_MSG_EIT_SCHEDULE_TIMEOUT)
  1985.     {
  1986.         if (gptSiEitCallbackFunction && pMsg->Word2 != KB_SI_MSG_EIT_SCHEDULE_EVENT_DONE)
  1987.         {
  1988.             gptSiEitCallbackFunction(pMsg);
  1989.         }
  1990.     }
  1991.     else
  1992.     {
  1993.         if (gptSiCallbackFunction)
  1994.         {
  1995.             gptSiCallbackFunction(pMsg);
  1996.         }
  1997.     }
  1998.     return 0;
  1999. }
  2000. KB_SICallbackFunc KB_SICallback(KB_SICallbackFunc callback)
  2001. {
  2002.     KB_SICallbackFunc ptPrvCallback;
  2003.     ptPrvCallback = gptSiCallbackFunction;
  2004. gptSiCallbackFunction = callback;
  2005.     return ptPrvCallback;
  2006. }
  2007. KB_SICallbackFunc KB_SIRegisterEitCallBack(KB_SICallbackFunc callback)
  2008. {
  2009.     KB_SICallbackFunc ptPrvCallback;
  2010.     ptPrvCallback = gptSiEitCallbackFunction;
  2011.     gptSiEitCallbackFunction = callback;
  2012.     return ptPrvCallback;
  2013. }
  2014. static void SiEitSetup(T_SubTableID subTableID, UINT32 filterNumber, 
  2015.                           INT32 version, UINT32 handle)
  2016. {
  2017.     UINT32 i;
  2018. T_SubTableFilter *filterDetails;
  2019. UINT32 channelID;
  2020. UINT32 filterID;
  2021. UINT8 filterMask[16];
  2022. UINT8 filterMatch[16];
  2023. UINT32 filterNegate;
  2024.     memset(filterMatch, 0, sizeof(filterMatch));
  2025.     memset(filterMask, 0, sizeof(filterMask));
  2026.     
  2027. filterDetails = &SISubTable[subTableID].filter[filterNumber];
  2028.     filterID = filterDetails->filterID;
  2029. channelID = SISubTable[subTableID].details.channelID;
  2030.     
  2031. filterDetails->data.total = -1;
  2032. filterDetails->data.received = 0;
  2033. for(i = 0; i < SI_MAX_SECTION_PER_TABLE; i++)
  2034. {
  2035. if( (filterDetails->data.sectionData[i] != SI_SECTION_NOT_RECEIVED) &&
  2036. (filterDetails->data.sectionData[i] != SI_SECTION_RECEIVED) )
  2037. {
  2038. SIFreeSectionData(filterDetails->data.sectionData[i]);
  2039. }
  2040. filterDetails->data.sectionData[i] = SI_SECTION_NOT_RECEIVED;
  2041. }
  2042. filterDetails->tableID = SISubTable[subTableID].details.tableID;
  2043. filterDetails->tableIDExt = SISubTable[subTableID].details.tableIDExt;
  2044. filterDetails->version = version;
  2045. filterDetails->timeout = SISubTable[subTableID].details.timeout;
  2046. filterDetails->handle = handle;
  2047. filterDetails->enabled = TRUE;     
  2048.        filterDetails->used    = TRUE;
  2049.     if (SISubTable[subTableID].details.channelStarted != TRUE)
  2050.     {
  2051.         KB_DmxAssociateFilter(channelID, filterID);        
  2052.     KB_DmxSetFilter(filterID, filterMatch, filterMask, filterNegate);
  2053.     }
  2054. }
  2055. static UINT32 SIGetFilterNum(T_SubTableID subTableID, INT32 tableId,
  2056.                                      INT32 tableIDExt)
  2057. {
  2058.     UINT32 i, nNumber;
  2059.     nNumber = 0XFFFFFFFF;
  2060.     for (i = 0; i < SISubTable[subTableID].details.noFilters; i++)
  2061.     {
  2062.         if (SISubTable[subTableID].filter[i].tableID == tableId
  2063.             && SISubTable[subTableID].filter[i].tableIDExt == tableIDExt)
  2064.         {
  2065.             nNumber = i;
  2066.             break;
  2067.         }
  2068.     }
  2069.     return nNumber;
  2070. }
  2071. INT32 KB_SIGetEITSCHShift(INT32 nSvcID, 
  2072.                                    KB_SIEitTs eTs,
  2073.                                    KB_SIEitSchTimeShift *ptSchShift)
  2074. {
  2075.     int i;
  2076.     KB_OSPMsgNode message;
  2077.     INT16 nTableId;
  2078.     
  2079.     nTableId = 0;
  2080.     switch (eTs)
  2081.     {
  2082.     case KB_SI_EIT_CURRENT_TS:
  2083.         nTableId = 0x50;
  2084.         break;
  2085.         case KB_SI_EIT_CURRENT_TS_FOR_0x51_table:
  2086.             nTableId = 0x51;
  2087.             break;
  2088.     case KB_SI_EIT_OTHER_TS:
  2089.         nTableId = 0x60;
  2090.         break;
  2091.         
  2092.     case KB_SI_EIT_OTHER_TS_FOR_0x61_table:
  2093.         nTableId = 0x61;
  2094.         break;
  2095.         
  2096.     default:
  2097.         break;
  2098.     }
  2099.     for (i = 0; i < SI_NO_EIT_SCHEDULE_TIME_SHIFT_FILTERS; i++)
  2100.     {
  2101.         if (gptPendingSchShiftPara[i]->nUsedFlag == 0)
  2102.         {
  2103.             memset(gptPendingSchShiftPara[i], 0, sizeof(T_EIT_SCHEDULE_TIME_SHIFT_PARA));
  2104.             gptPendingSchShiftPara[i]->nUsedFlag = 1;
  2105.          gptPendingSchShiftPara[i]->handle = l_nHandle++;
  2106.          gptPendingSchShiftPara[i]->nSvcID = nSvcID;
  2107.             gptPendingSchShiftPara[i]->nTableId[0] = nTableId;
  2108.         gptPendingSchShiftPara[i]->ptTimeShift = ptSchShift;
  2109.             memset(&message, 0, sizeof(KB_OSPMsgNode));
  2110.         message.Word1 = MSG_SI_EIT_SCHEDULE_SHIFT_RECEIVE;
  2111.             message.Word2 = i;
  2112.             break;
  2113.         }
  2114.     }
  2115.     
  2116.     if(i >= SI_NO_EIT_SCHEDULE_TIME_SHIFT_FILTERS)
  2117. {
  2118. return KB_SI_ERR_TOO_MANY_PROGRAMS;
  2119. }
  2120. if(KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&message) != Ret_OK)
  2121. {
  2122. return KB_SI_ERR_SEND_MESSAGE;
  2123. }
  2124. return 0;
  2125. }
  2126. INT32 KB_SIStopEitSCHShift(INT32 nSvcID, KB_SIEitTs eTs)
  2127. {
  2128.     //KB_OSPMsgNode message;
  2129.     INT32 nTableId;
  2130.     
  2131.     nTableId = 0;
  2132.     //对于nSvcID为KB_SI_STOP_ALL的情况,ets类型对后面的处理无影响
  2133.     switch (eTs)
  2134.     {
  2135.     case KB_SI_EIT_CURRENT_TS:
  2136.         nTableId = 0x50;
  2137.         break;
  2138.         case KB_SI_EIT_CURRENT_TS_FOR_0x51_table:
  2139.             nTableId = 0x51;
  2140.             break;
  2141.     case KB_SI_EIT_OTHER_TS:
  2142.         nTableId = 0x60;
  2143.         break;
  2144.         
  2145.         case KB_SI_EIT_OTHER_TS_FOR_0x61_table:
  2146.             nTableId = 0x61;
  2147.             break; 
  2148.             
  2149.     default:
  2150.         break;
  2151.     }
  2152.     SIStopEitSCHShiftEX(nSvcID, nTableId);
  2153. return 0;
  2154. }
  2155. static void SIGetEitSCHShift(UINT32 nPendingNo, UINT32 nSvcID)
  2156. {
  2157.     int i, nCurrentParaNum;
  2158.     KB_OSPMsgNode msgNode;
  2159.     
  2160.     for (i = 0; i < SI_NO_EIT_SCHEDULE_TIME_SHIFT_FILTERS; i++)
  2161. {        
  2162. if(gptCurrSchShiftPara[i]->nUsedFlag == 0)
  2163. {
  2164. memcpy(gptCurrSchShiftPara[i], gptPendingSchShiftPara[nPendingNo], sizeof(T_EIT_SCHEDULE_TIME_SHIFT_PARA));
  2165. gptCurrSchShiftPara[i]->nCurrVersionNumber = -1;
  2166. gptCurrSchShiftPara[i]->nUsedFlag = 1;
  2167.   
  2168.             gptCurrSchShiftPara[i]->ptTimeShift->num = 0;
  2169.             gptCurrSchShiftPara[i]->ptTimeShift->service_id = (UINT16)gptCurrSchShiftPara[i]->nSvcID;
  2170.             nCurrentParaNum = i;           
  2171. break;
  2172. }
  2173. }
  2174.     if (i >= SI_NO_EIT_SCHEDULE_TIME_SHIFT_FILTERS)
  2175.     {
  2176.         memset(&msgNode, 0, sizeof(KB_OSPMsgNode));
  2177. msgNode.Word1 = MSG_SI_EIT_SCHEDULE_SHIFT_RECEIVE;
  2178. msgNode.Word2 = nPendingNo;
  2179. KB_OSPMsgSend(l_nQueueId, (KB_OSPMsgNode *)&msgNode);
  2180.         return;
  2181.     }
  2182.     /* 把当前pending结构清零 */
  2183.     memset(gptPendingSchShiftPara[nPendingNo], 0, sizeof(T_EIT_SCHEDULE_TIME_SHIFT_PARA));   
  2184.    
  2185.     for (i = SI_EIT_SCHEDULE_SHIFT_FILTER_START_NUMBER; i < SI_EIT_SCHEDULE_SHIFT_FILTER_END_NUMBER; i++)
  2186.     {
  2187.         if (SISubTable[EITSubTableID].filter[i].used == FALSE)
  2188.         {            
  2189.             SISubTable[EITSubTableID].details.tableID = gptCurrSchShiftPara[nCurrentParaNum]->nTableId[0];
  2190.             SISubTable[EITSubTableID].details.timeout = J_SI_EIT_SCHEDULE_TIMEOUT;
  2191.             SISubTable[EITSubTableID].details.tableIDExt = gptCurrSchShiftPara[nCurrentParaNum]->nSvcID;
  2192.             //DBGPrint("SIGetEitSCHShift i = %d nSvcID = 0x%xn", i, gptCurrSchShiftPara[nCurrentParaNum]->nSvcID);
  2193.         SISubTableStart(EITSubTableID, i, -1, gptCurrSchShiftPara[nCurrentParaNum]->handle);
  2194.             break;
  2195.         }
  2196.     }
  2197.     return;
  2198. }
  2199. static INT32 SIStopEitSCHShift(INT32 nSvcID, INT32 nTableId)
  2200. {
  2201. INT32 i;
  2202. if(nSvcID == -1)
  2203. {
  2204. for(i = 0; i < SI_NO_EIT_SCHEDULE_TIME_SHIFT_FILTERS; i++)
  2205. {
  2206. SIFilterStop(SISubTable[EITSubTableID].details.channelID, &(SISubTable[EITSubTableID].filter[SI_EIT_SCHEDULE_SHIFT_FILTER_START_NUMBER + i]));
  2207. memset(gptCurrSchShiftPara[i], 0, sizeof(T_EIT_SCHEDULE_TIME_SHIFT_PARA));
  2208. }
  2209. }
  2210. else
  2211. {
  2212. for(i = 0; i < SI_NO_EIT_SCHEDULE_TIME_SHIFT_FILTERS; i++)
  2213. {
  2214. if(gptCurrSchShiftPara[i]->nUsedFlag == 1 &&
  2215.    gptCurrSchShiftPara[i]->nSvcID == nSvcID
  2216.    && gptCurrSchShiftPara[i]->nTableId[0] == nTableId)
  2217. memset(gptCurrSchShiftPara[i], 0, sizeof(T_EIT_SCHEDULE_TIME_SHIFT_PARA));
  2218. break;
  2219. }
  2220. }
  2221. for(i = 0; i < SI_NO_EIT_SCHEDULE_TIME_SHIFT_FILTERS; i++)
  2222. {
  2223. if(SISubTable[EITSubTableID].filter[SI_EIT_SCHEDULE_SHIFT_FILTER_START_NUMBER + i].enabled == TRUE &&
  2224.    SISubTable[EITSubTableID].filter[SI_EIT_SCHEDULE_SHIFT_FILTER_START_NUMBER + i].tableIDExt == nSvcID)
  2225. {
  2226. SIFilterStop(SISubTable[EITSubTableID].details.channelID, &(SISubTable[EITSubTableID].filter[SI_EIT_SCHEDULE_SHIFT_FILTER_START_NUMBER + i]));
  2227. break;
  2228. }
  2229. }
  2230. }
  2231. return 0;
  2232. }
  2233. static INT32 SIStopEitSCHShiftEX(INT32 nSvcID, INT32 nTableId)
  2234. {
  2235. INT32 i;
  2236. if(nSvcID == -1)
  2237. {
  2238. for(i = 0; i < SI_NO_EIT_SCHEDULE_TIME_SHIFT_FILTERS; i++)
  2239. {
  2240. SIFilterStop(SISubTable[EITSubTableID].details.channelID, &(SISubTable[EITSubTableID].filter[SI_EIT_SCHEDULE_SHIFT_FILTER_START_NUMBER + i]));
  2241.             SISubTable[EITSubTableID].filter[SI_EIT_SCHEDULE_SHIFT_FILTER_START_NUMBER + i].used = FALSE;
  2242. memset(gptCurrSchShiftPara[i], 0, sizeof(T_EIT_SCHEDULE_TIME_SHIFT_PARA));
  2243. }
  2244. }
  2245. else
  2246. {
  2247. for(i = 0; i < SI_NO_EIT_SCHEDULE_TIME_SHIFT_FILTERS; i++)
  2248. {
  2249. if(gptCurrSchShiftPara[i]->nUsedFlag == 1 &&
  2250.    gptCurrSchShiftPara[i]->nSvcID == nSvcID
  2251.    && gptCurrSchShiftPara[i]->nTableId[0] == nTableId)
  2252. memset(gptCurrSchShiftPara[i], 0, sizeof(T_EIT_SCHEDULE_TIME_SHIFT_PARA));
  2253. break;
  2254. }
  2255. }
  2256. for(i = 0; i < SI_NO_EIT_SCHEDULE_TIME_SHIFT_FILTERS; i++)
  2257. {
  2258. if(SISubTable[EITSubTableID].filter[SI_EIT_SCHEDULE_SHIFT_FILTER_START_NUMBER + i].enabled == TRUE &&
  2259.    SISubTable[EITSubTableID].filter[SI_EIT_SCHEDULE_SHIFT_FILTER_START_NUMBER + i].tableIDExt == nSvcID)
  2260. {
  2261. SIFilterStop(SISubTable[EITSubTableID].details.channelID, &(SISubTable[EITSubTableID].filter[SI_EIT_SCHEDULE_SHIFT_FILTER_START_NUMBER + i]));
  2262.                 SISubTable[EITSubTableID].filter[SI_EIT_SCHEDULE_SHIFT_FILTER_START_NUMBER + i].used = FALSE;
  2263. break;
  2264. }
  2265. }
  2266. }
  2267. return 0;
  2268. }
  2269. static void SISectionEinSchInfo(MepgData *section)
  2270. {
  2271.     T_SubTableFilter *filter;
  2272. UINT8 *pInData;
  2273. INT32 dataLength;
  2274.     KB_SIEitSchEvent stEvent;
  2275. KB_SIEitSchEvent* pstEvent;
  2276.     UINT8 text[KB_SI_MAX_EVENT_TEXT_LEN + 1]; 
  2277. KB_SIEitSch* pstEinSchInfo;
  2278. UINT16 table_id;
  2279. UINT16 table_id_extension;
  2280. UINT8 version_number;
  2281. UINT8 section_number;
  2282. UINT8 last_section_number;
  2283. UINT16 serID;
  2284. UINT16 transport_stream_id;
  2285. UINT8 segment_last_section_number;
  2286.     
  2287. int i;
  2288. INT32 nWday;
  2289. INT32 nOneDayFinishedFlag = 0;
  2290. int   nCurrentNo, nStartPos;
  2291. int nIsMulti = 0;
  2292. int nServicePos = 0;
  2293.     INT32 filterNumber;    
  2294.     KB_OSPMsgNode message;
  2295.     
  2296.     if (section->filterNumber >= KB_SI_EIT_SCHEDULE_SOFT_FILTER_COUNT && section->filterNumber < KB_SI_EIT_SCHEDULE_SOFT_FILTER_COUNT + SI_NO_EIT_PF_FILTERS)
  2297.     {
  2298.         J_SI_Print("SISectionEinSchInfo filter not match!n");
  2299.         return;
  2300.     }
  2301.     else
  2302.     {
  2303.         if (section->filterNumber >= SI_EIT_SCHEDULE_SHIFT_FILTER_START_NUMBER && section->filterNumber < SI_EIT_SCHEDULE_SHIFT_FILTER_END_NUMBER)
  2304.         {
  2305.             SISectionEinSchInfoShift(section);
  2306.             return;
  2307.         }
  2308.     }
  2309.     stEvent.chinese.text = text;
  2310.     
  2311.     pstEvent = &stEvent;
  2312.         
  2313.     pInData = section->data;
  2314. dataLength = section->length;
  2315. table_id = pInData[0];
  2316. table_id_extension = (UINT16)(pInData[3] * 0x100 + pInData[4]); //ServiceID
  2317. serID = pInData[3] << 8 | pInData[4];
  2318.     
  2319. version_number = (UINT8)((pInData[5] & 0x3E) >> 1);
  2320. section_number = pInData[6];
  2321. last_section_number = pInData[7];
  2322. transport_stream_id = pInData[8] << 8 | pInData[9];
  2323.     filter = &SISubTable[section->subTableID].filter[section->filterNumber];
  2324.     for (i = 0; i < KB_SI_EIT_SCHEDULE_SERVICE_COUNT; i++)
  2325. {        
  2326. //是否需要匹配tableid、servid,校验usedflag?
  2327. if(l_pstCurrEinSchInfoPara[i]->handle == filter->handle)
  2328. {
  2329.             nCurrentNo = i;
  2330. break;
  2331. }
  2332. }
  2333.     /* 无法找到匹配的指针,直接返回错误。 */
  2334.     if (i >= KB_SI_EIT_SCHEDULE_SERVICE_COUNT)
  2335.     {
  2336.         return;
  2337.     }
  2338.   l_pstCurrEinSchInfoPara[nCurrentNo]->nReceivedFlag[section_number + (table_id - 0x50) * 256] = 1;
  2339. /*
  2340. ** Skip past the standard SI Table header (contains tableID, section Length, etc)
  2341. */
  2342. pInData += 8;
  2343. dataLength -= 8;
  2344. if( dataLength <= 0 || (table_id == 0x51 && section_number >= 192)/* 不存储第八天 */)
  2345. {
  2346. return;
  2347. }
  2348. segment_last_section_number = pInData[4];
  2349.     if(section_number == segment_last_section_number)
  2350. {
  2351. for(i = (int)section_number + 1; i < ((int)segment_last_section_number / 8 + 1)* 8; i++)
  2352. {
  2353. if(nIsMulti)
  2354. l_pstCurrMultiEinSchInfoPara->nReceivedFlag[nServicePos][i + (table_id - 0x50) * 256] = 1;
  2355. else
  2356. l_pstCurrEinSchInfoPara[nCurrentNo]->nReceivedFlag[i + (table_id - 0x50) * 256] = 1;
  2357. }
  2358. }
  2359. nStartPos = (int)section_number / 64 * 64 + ((int)table_id - 0x50) * 256;
  2360. nOneDayFinishedFlag = 1;
  2361. for(i = nStartPos; i < nStartPos + 64 && i <= (int)last_section_number + (table_id - 0x50) * 256; i++)
  2362. {
  2363. if(l_pstCurrEinSchInfoPara[nCurrentNo]->nReceivedFlag[i] != 1)
  2364. {
  2365. break;
  2366. }
  2367. }
  2368. pInData += 6;
  2369. dataLength -= 6;
  2370.    
  2371. if(l_pstCurrEinSchInfoPara[nCurrentNo]->handle != filter->handle)
  2372. {
  2373. return;
  2374. }
  2375. if(l_pstCurrEinSchInfoPara[nCurrentNo]->nCurrVersionNumber == -1)
  2376. {
  2377. l_pstCurrEinSchInfoPara[nCurrentNo]->nCurrVersionNumber = version_number;
  2378. l_pstCurrEinSchInfoPara[nCurrentNo]->pstEinSchInfo->num = 0;
  2379. }
  2380. else if(l_pstCurrEinSchInfoPara[nCurrentNo]->nCurrVersionNumber != version_number)
  2381. {
  2382. l_pstCurrEinSchInfoPara[nCurrentNo]->handle = l_nHandle++;
  2383. l_pstCurrEinSchInfoPara[nCurrentNo]->nCurrVersionNumber = -1;
  2384. l_pstCurrEinSchInfoPara[nCurrentNo]->nTableDone[0] = 0;
  2385. l_pstCurrEinSchInfoPara[nCurrentNo]->nTableDone[1] = 0;
  2386.         SISubTable[EITSubTableID].details.timeout = J_SI_EIT_SCHEDULE_TIMEOUT;
  2387.         if (filter->tableID == 0x50)
  2388.         {                    
  2389.             SISubTable[EITSubTableID].details.tableID = 0x50;
  2390.             SISubTable[EITSubTableID].details.tableIDExt = l_pstCurrEinSchInfoPara[nCurrentNo]->nSvcID;
  2391.             SISubTableStart(EITSubTableID, filter->filterNumber, -1, 
  2392.                             l_pstCurrEinSchInfoPara[nCurrentNo]->handle);
  2393.             
  2394.             filterNumber = SIGetFilterNum(EITSubTableID, 0x51, filter->tableIDExt);
  2395.             if (filterNumber != 0xFFFFFFFF)
  2396.             {
  2397.                 SISubTable[EITSubTableID].details.tableID = 0x51;
  2398.                 SISubTable[EITSubTableID].details.tableIDExt = l_pstCurrEinSchInfoPara[nCurrentNo]->nSvcID;
  2399.                 SISubTableStart(EITSubTableID, filterNumber, -1, 
  2400.                                 l_pstCurrEinSchInfoPara[nCurrentNo]->handle);
  2401.             }
  2402.         }
  2403.         else
  2404.         {
  2405.             SISubTable[EITSubTableID].details.tableID = 0x51;
  2406.             SISubTable[EITSubTableID].details.tableIDExt = l_pstCurrEinSchInfoPara[nCurrentNo]->nSvcID;
  2407.             SISubTableStart(EITSubTableID, filter->filterNumber, -1, 
  2408.                             l_pstCurrEinSchInfoPara[nCurrentNo]->handle);
  2409.             
  2410.             filterNumber = SIGetFilterNum(EITSubTableID, 0x50, filter->tableIDExt);
  2411.             if (filterNumber != 0xFFFFFFFF)
  2412.             {
  2413.                 SISubTable[EITSubTableID].details.tableID = 0x50;
  2414.                 SISubTable[EITSubTableID].details.tableIDExt = l_pstCurrEinSchInfoPara[nCurrentNo]->nSvcID;
  2415.                 SISubTableStart(EITSubTableID, filterNumber, -1, 
  2416.                                 l_pstCurrEinSchInfoPara[nCurrentNo]->handle);
  2417.             }
  2418.         }
  2419. return ;
  2420.     }
  2421. pstEinSchInfo = l_pstCurrEinSchInfoPara[nCurrentNo]->pstEinSchInfo;
  2422. if(pstEinSchInfo == NULL)
  2423. {
  2424. return;
  2425. }
  2426. pstEinSchInfo->service_id = table_id_extension;
  2427. nWday = -1;
  2428. while(dataLength > 0)
  2429. {
  2430. int descriptors_loop_length;
  2431. memset(pstEvent, 0, sizeof(KB_SIEitSchEvent));
  2432.         memset(text, 0, sizeof(text));
  2433.         pstEvent->chinese.text = text;
  2434. pstEvent->event_id = (UINT16)(pInData[0] * 0x100 + pInData[1]);
  2435. pInData += 2;
  2436. dataLength -= 2;
  2437. if(pInData[0] != 0xFF || pInData[1] != 0xFF || pInData[2] != 0xFF
  2438. || pInData[3] != 0xFF || pInData[4] != 0xFF)
  2439. {
  2440.             SIParseTime(pInData, &(pstEvent->start_time));
  2441. }
  2442. else
  2443. {
  2444. pstEvent->start_time = 0;
  2445. }
  2446. pInData += 5;
  2447. dataLength -= 5;
  2448. SIParseDuration(pInData, &(pstEvent->duration));
  2449. pInData += 3;
  2450. dataLength -= 3;
  2451. pstEvent->running_status = (UINT8)(pInData[0] >> 5);
  2452. pstEvent->free_CA_mode = (UINT8)((pInData[0] & 0x10) >> 4);
  2453. descriptors_loop_length = (pInData[0] & 0x0F) * 0x100  + pInData[1];
  2454. pInData += 2;
  2455. dataLength -= 2;
  2456. SIEitSCHDescs(pInData, descriptors_loop_length, pstEvent);
  2457. pInData += descriptors_loop_length;
  2458. dataLength -= descriptors_loop_length;
  2459. if(pstEinSchInfo->num < KB_SI_MAX_EVENT_NUM_PER_SERVICE)
  2460. {
  2461.     KB_SIEitSchEvent *pTmp = pstEinSchInfo->ptEvent + pstEinSchInfo->num;
  2462.     pTmp->chinese.text = (UINT8 *)KB_OSPMalloc(KB_SI_MAX_EVENT_TEXT_LEN + 1);
  2463.             
  2464.             if (NULL != pTmp->chinese.text)
  2465.             {
  2466.                 pTmp->event_id       = pstEvent->event_id;
  2467.                 pTmp->start_time     = pstEvent->start_time;
  2468.                 pTmp->duration       = pstEvent->duration;
  2469.                 pTmp->running_status = pstEvent->running_status;
  2470.                 pTmp->free_CA_mode   = pstEvent->free_CA_mode;
  2471.                 pTmp->content_level1 = pstEvent->content_level1;
  2472.                 pTmp->reference_service_id  = pstEvent->reference_service_id;
  2473.                 pTmp->reference_event_id    = pstEvent->reference_event_id;
  2474.                 memcpy(pTmp->chinese.event_name, 
  2475.                         pstEvent->chinese.event_name, 
  2476.                         KB_SI_MAX_EVENT_NAME_LEN + 1);
  2477.         memcpy(pTmp->chinese.text, 
  2478.                         pstEvent->chinese.text, 
  2479.                         KB_SI_MAX_EVENT_TEXT_LEN + 1);
  2480.             }
  2481.             else
  2482.             {
  2483.                 printf("nSISectionEinSchInfo::KB_OSPMalloc text fail!n");
  2484.             }
  2485. pstEinSchInfo->num++;
  2486. }
  2487. }
  2488.     memset(&message, 0, sizeof(KB_OSPMsgNode));
  2489. message.Word1 = MOD_SIPSI;
  2490. message.Word2 = (UINT32)(KB_SI_MSG_EIT_SCHEDULE_EVENT_DONE);
  2491.     message.Word3 = (UINT32)pstEinSchInfo;
  2492. message.Word4 = (UINT32)pstEinSchInfo->num;
  2493. //KD_DTVSendMsg(&message);            
  2494.     return;
  2495. }
  2496. static void SISectionEinSchInfoShift(MepgData *section)
  2497. {
  2498. UINT8 *pInData;
  2499. INT32 dataLength;
  2500.     KB_SIEitSchTimeShiftNode tShiftEvent;
  2501. KB_SIEitSchTimeShift      *ptShift;
  2502.     KB_SIEitSchTimeShiftNode *ptShiftEvent;
  2503. UINT16 table_id;
  2504. UINT16 table_id_extension;
  2505. UINT8 version_number;
  2506. UINT8 section_number;
  2507. UINT8 last_section_number;
  2508. UINT16 serID;
  2509. UINT16 transport_stream_id;
  2510. UINT8 segment_last_section_number;
  2511.     
  2512. int i;
  2513.     
  2514.     INT32 nCurrParaNum;    
  2515.     KB_OSPMsgNode message;
  2516.     ptShiftEvent = &tShiftEvent;
  2517.     
  2518.     pInData = section->data;
  2519. dataLength = section->length;
  2520. table_id = pInData[0];
  2521. table_id_extension = (UINT16)(pInData[3] * 0x100 + pInData[4]); //ServiceID
  2522. serID = pInData[3] << 8 | pInData[4];
  2523.     for(i = 0; i < SI_NO_EIT_SCHEDULE_TIME_SHIFT_FILTERS; i ++)
  2524. {
  2525. if(gptCurrSchShiftPara[i]->nSvcID == table_id_extension)
  2526. {
  2527.             nCurrParaNum = i;   
  2528.             ptShift = gptCurrSchShiftPara[i]->ptTimeShift;            
  2529. break;
  2530. }
  2531.         if (i >= SI_NO_EIT_SCHEDULE_TIME_SHIFT_FILTERS)
  2532.         {
  2533.             return;
  2534.         }
  2535. }
  2536.     
  2537. version_number = (UINT8)((pInData[5] & 0x3E) >> 1);
  2538. section_number = pInData[6];
  2539. last_section_number = pInData[7];
  2540. transport_stream_id = pInData[8] << 8 | pInData[9];
  2541.     
  2542.     if (gptCurrSchShiftPara[nCurrParaNum]->nReceivedFlag[section_number] == 1)
  2543.     {
  2544.         return;
  2545.     }
  2546.     else
  2547.     {
  2548.         gptCurrSchShiftPara[nCurrParaNum]->nReceivedFlag[section_number] = 1;
  2549.     }
  2550. pInData += 8;
  2551. dataLength -= 8;
  2552. if( dataLength <= 0)
  2553. {
  2554. return;
  2555. }
  2556. segment_last_section_number = pInData[4];
  2557. if(section_number == segment_last_section_number)
  2558. {
  2559. for(i = (int)section_number + 1; i < ((int)segment_last_section_number / 8 + 1)* 8; i++)
  2560. {
  2561. gptCurrSchShiftPara[nCurrParaNum]->nReceivedFlag[i] = 1;
  2562. }
  2563. }
  2564.     
  2565. pInData += 6;
  2566. dataLength -= 6;
  2567.    
  2568. {
  2569. while(dataLength > 0)
  2570. {
  2571. int descriptors_loop_length;
  2572. memset(ptShiftEvent, 0, sizeof(KB_SIEitSchTimeShiftNode));
  2573. ptShiftEvent->event_id = (UINT16)(pInData[0] * 0x100 + pInData[1]);
  2574. pInData += 2;
  2575. dataLength -= 2;
  2576. if(pInData[0] != 0xFF || pInData[1] != 0xFF || pInData[2] != 0xFF
  2577. || pInData[3] != 0xFF || pInData[4] != 0xFF)
  2578. {
  2579.     SIParseTime(pInData, &(ptShiftEvent->start_time));
  2580. }
  2581. else
  2582. {
  2583.                 ptShiftEvent->start_time = 0;
  2584. }
  2585. pInData += 5;
  2586. dataLength -= 5;
  2587.             
  2588. pInData += 3;
  2589. dataLength -= 3;
  2590. descriptors_loop_length = (pInData[0] & 0x0F) * 0x100  + pInData[1];
  2591. pInData += 2;
  2592. dataLength -= 2;
  2593.             SISectionEITScheduleShiftDescriptors(pInData, descriptors_loop_length, ptShiftEvent);
  2594. pInData += descriptors_loop_length;
  2595. dataLength -= descriptors_loop_length;
  2596. {
  2597.                 if(ptShift->num < KB_SI_MAX_SHIFT_EVENT_NUM_PER_SERVICE)
  2598. {
  2599. memcpy(ptShift->ptTimeShift+ ptShift->num, ptShiftEvent, sizeof(KB_SIEitSchTimeShiftNode));
  2600. ptShift->num++;
  2601. }
  2602. }
  2603. }
  2604.         
  2605.         memset(&message, 0, sizeof(KB_OSPMsgNode));
  2606. message.Word1 = MOD_SIPSI;
  2607. message.Word2 = (UINT32)(KB_SI_MSG_EIT_SCHEDULE_EVENT_DONE);
  2608.         message.Word3 = (UINT32)ptShift;
  2609. message.Word4 = (UINT32)ptShift->num;
  2610. //KD_DTVSendMsg(&message);            
  2611. }
  2612.     
  2613. }
  2614. static void SISectionEITScheduleShiftDescriptors(UINT8* pInData, 
  2615.                                                  INT32 dataLen, 
  2616.                                                  KB_SIEitSchTimeShiftNode* pstEvent)
  2617. {
  2618. UINT8 *data;
  2619. UINT32 tag;
  2620. UINT8 length;
  2621. UINT8 event_name_length;
  2622. UINT8 text_length;
  2623. while(dataLen > 0)
  2624. {
  2625. tag = *pInData++;
  2626. length = *pInData++;
  2627. data = pInData;
  2628. pInData += length;
  2629. dataLen -= ((INT32)length + 2);
  2630. if(length == 0)
  2631. continue;
  2632. switch(tag)
  2633. {
  2634. case KB_FILTER_SI_SHORT_EVENT:
  2635. data += 3;
  2636. event_name_length = *data++;
  2637. data += event_name_length;
  2638. text_length = *data++;
  2639. //data += text_length;
  2640. break;
  2641. case KB_FILTER_SI_STUFFING:
  2642. case KB_FILTER_SI_LINKAGE:
  2643. case KB_FILTER_SI_EXTENDED_EVENT:
  2644. case KB_FILTER_SI_COMPONENT:
  2645. case KB_FILTER_SI_CA_IDENTIFIER:
  2646. case KB_FILTER_SI_CONTENT:
  2647. case KB_FILTER_SI_PARENTAL_RATING:
  2648. case KB_FILTER_SI_TELEPHONE:
  2649. case KB_FILTER_SI_MULTILINGUAL_COMPONENT:
  2650. case KB_FILTER_SI_PRIVATE_DATA_SPECIFIER:
  2651. case KB_FILTER_SI_SHORT_SMOOTHING_BUFFER:
  2652. case KB_FILTER_SI_DATA_BROADCAST:
  2653. break;
  2654. case KB_FILTER_SI_TIME_SHIFTED_EVENT:
  2655. pstEvent->reference_service_id = (data[0] << 8) | (data[1]);
  2656.             data += 2;
  2657. pstEvent->reference_event_id = (data[0] << 8) | (data[1]);
  2658.             
  2659. break;
  2660. default:
  2661. break;
  2662. }
  2663. }
  2664. }
  2665. /* EOF */