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

DVD

开发平台:

C/C++

  1. #include <string.h>
  2. #include "nvod.h"
  3. #include "appltype.h"
  4. #include "epg.h"
  5. #include "sipsi.h"
  6. #include "db.h"
  7. #include "avplay.h"
  8. #include "av.h"
  9. #include "Search.h"
  10. #include "kb_machblue_client_task.h"
  11. #include "Timer.h"
  12. #include "Timeclk.h"
  13. typedef enum
  14. {
  15.     NVOD_Connect,
  16.     NVOD_Play,
  17.     NVOD_Stop
  18. }NVOD_Mode;
  19. KB_SINitStruct  g_novdNit;
  20. static KB_SIRefSvcCell gNvodSvcInfo[KB_NVOD_MAX_REF];
  21. static UINT8 gNvodRefSvcNum; 
  22. static INT32 gSvcNum;
  23. static int gArriveNum;
  24. static int gTimeOutNum;
  25. //目前仅支持EIT时间表0x50、0x51
  26. static UINT8 gNvodEitSchTableSwitchFlag = KB_EIT_SCHEDULE_CURRENT_TS_TABLE_DEFAULT;  
  27. //当前正在执行搜索任务的gatNvod数组索引号
  28. static UINT32  CurrentSearchTsNum = KB_NVOD_MAX_TS_NUM;
  29. //用来标识搜索当前Ts中的参考事件是否已经完成
  30. static UINT32  CurrentPFCompleteFlag = 0;
  31. static KB_NVOD_Info gatNvod[KB_NVOD_MAX_TS_NUM];   
  32. //static KB_DMDTunerParameters NvodCurrentTs;
  33. static KB_DMDTunerParameters gNvodRefFre[KB_NVOD_MAX_REF];
  34. static KB_NVODReceive gRecieveState[KB_NVOD_MAX_REF];
  35. static UINT8 gNvodRefSvcEachFre[KB_NVOD_MAX_REF];
  36. static UINT8 gFreqInd = 0;
  37. static UINT8 gFreqNum =0 ;
  38. static time_t gNvodTime;
  39. //static struct tm  gNvodtmTime;
  40. //static time_t gSchTime;
  41. static time_t gPrgEndTime;
  42. static BOOL gNewFlag = FALSE;
  43. static INT32 gCurTsID;
  44. static INT32 gCurSvcID;
  45. static NVOD_Mode gPrgPlayStatus;
  46. static KB_NVODPfInfo gNvodPFInfo[KB_SI_MAX_REF_SVC_NUMS];
  47. static KB_SIEitPF *gNvodPF;
  48. static KB_SINVODEitPF *gNvodPFEvent;
  49.     
  50. static KB_NVODSch      gNvodSch[KB_NVOD_MAX_ShiftSrv_One_Ts];
  51. static KB_SIEitSchTimeShiftNode *gNvodSchEvent;
  52. static UINT32 EitSrhTimer;
  53. //static void KD_NVODHandleMsg3(KB_OSPMsgNode *pInMsg);
  54. static BOOL KD_NVODRefSvcReceiveStatus(UINT16 refScvId, BOOL bTimeout);
  55. static void KD_NVODHandleEitSch(KB_OSPMsgNode *pInMsg);
  56. static INT32 KD_NVODGetFreePF(void);
  57. static INT32 KD_NVODGetFreeSch(void);
  58. static INT32 KD_NVODResetPF(INT32 nNumber);
  59. static INT32 KD_ResetSCH(INT32 nNumber);
  60. static void quicksortEit(KB_NVODTime *pbuf,int low,int high);
  61. static int quickpartEit(KB_NVODTime *pbuf,int i,int j);
  62. static INT32 KD_NVODHandlePFOver(KB_OSPMsgNode *pInMsg);
  63. static INT32 KD_NVODHandleSCHOver(KB_OSPMsgNode *pInMsg);
  64. static void KD_NVODHandleTuner(KB_OSPMsgNode *pInMsg);
  65. static INT32 KB_NVODGetEitPF(UINT32 TsSequence);
  66. static void KB_NvodHandleEitSrhTimeOut(void);
  67. static INT32 KD_NVODInitTask(void);
  68. static INT32 KD_NVODPlayInit(void);
  69. static UINT8 KB_NVOD_AllocategatNvodInfo(UINT32 frequency);
  70. static void KB_NVOD_ResetTsData(UINT32 TsSequence);
  71. static INT32 KB_NVOD_SetCurrentTsPara(KB_DMDTunerParameters TsPara);
  72. static INT32 KD_NVODGetPF(INT32 nTsId, INT32 nSvcID, KB_SIEitTs eTs);
  73. static UINT32 KB_NVOD_GetNullPFTsNum(void);
  74. static INT32 KB_NVODGetEitSch(UINT32 TsSequence);
  75. static INT32 KD_NVODGetSchTimeShift(INT32 nTsId, INT32 nSvcID, KB_SIEitTs eTs);
  76. static void KB_NVOD_DirectInsertSort(KB_NVODTime TimeNode[], UINT16 TimeNum);
  77. static UINT32 KB_NVOD_GetNullSchTsNum(void);
  78. extern void KB_MENUTranslateMsg(KB_OSPMsgNode* pInMsg);
  79. INT32 KB_NVODInit(void)
  80. {
  81.     KD_NVODInitTask();
  82. KD_NVODPlayInit();
  83.     
  84.     
  85.     return RETOK;
  86. }
  87. INT32 KB_NVODCreate(void)
  88. {
  89.     KB_SIGetTime(&gNvodTime);  
  90. KB_EPGToNvod(TRUE);
  91.     if (KB_DB_DTV_SUCCESS != KB_NVODInit2())
  92.     {
  93.         printf("nKB_NVODCreate::KB_NVODInit2 failed!n");
  94.     }
  95.    
  96.     if(gNewFlag)
  97.     {
  98.         KB_EPGStopAllSCH();
  99.     KD_NVODStopAllPF();
  100.     KD_NVODStopAllSch();
  101.         KB_TimerDisable(EitSrhTimer);
  102.         printf("nKB_NVODCreate::关闭定时期 EitSrhTimer");
  103.     memset(gNvodSvcInfo, 0, sizeof(gNvodSvcInfo));
  104.     memset(gatNvod, 0, sizeof(gatNvod));
  105. gNvodRefSvcNum = 0;
  106.     gArriveNum = 0;
  107. gTimeOutNum = 0;
  108.         gNvodEitSchTableSwitchFlag = KB_EIT_SCHEDULE_CURRENT_TS_TABLE_DEFAULT;
  109. memset(gNvodRefFre,0,sizeof(gNvodRefFre));
  110. memset(gNvodRefSvcEachFre,0,sizeof(gNvodRefSvcEachFre));
  111. gFreqInd = 0;
  112. gFreqNum = 0;
  113. //memset(&NvodCurrentTs,0,sizeof(KB_DMDTunerParameters));
  114.     KB_NVODInit();
  115.     }
  116.     
  117.     return RETOK;
  118. }
  119. static void KD_NVODHandleTuner(KB_OSPMsgNode *pInMsg)
  120. {
  121.     switch (pInMsg->Word2)
  122.     {
  123.     case DMD_CALLBACK_SIGNAL_CONNECTED:
  124.         if (gPrgPlayStatus == NVOD_Connect)
  125.         {
  126.             gPrgPlayStatus = NVOD_Play;
  127.             KB_DTVStartCA(gCurTsID, gCurSvcID);
  128.         }
  129.         break;
  130.     case DMD_CALLBACK_SIGNAL_LOST:
  131.         break;
  132.         
  133.     default:
  134.         break;
  135.     }
  136. }
  137. void quicksortEit(KB_NVODTime *pbuf,int low,int high)
  138. {
  139. int i;
  140. if(low < high)
  141. {
  142. i = quickpartEit(pbuf,low,high);
  143. quicksortEit(pbuf,low,i-1);
  144. quicksortEit(pbuf,i + 1,high);
  145. }
  146. }
  147. int quickpartEit(KB_NVODTime *pbuf,int i,int j)
  148. {
  149. KB_NVODTime b;
  150. memcpy(&b,&pbuf[i],sizeof(KB_NVODTime));
  151. while(i<j)
  152. {
  153. while(i<j && pbuf[j].startTime >= b.startTime)
  154. {
  155. j --;
  156. }
  157. if(i< j)
  158. {
  159. memcpy(&pbuf[i++],&pbuf[j],sizeof(KB_NVODTime));
  160. }
  161. while(i<j && pbuf[i].startTime <= b.startTime)
  162. {
  163. i ++;
  164. }
  165. if(i<j)
  166. {
  167. memcpy(&pbuf[j --],&pbuf[i],sizeof(KB_NVODTime));
  168. }
  169. }
  170. memcpy(&pbuf[i],&b,sizeof(KB_NVODTime));
  171. return i;
  172. }
  173. static INT32 KD_NVODPlayInit(void)
  174. {
  175. UINT8 i =0;
  176.     gCurTsID  = 0xFFFFFFFF;
  177.     gCurSvcID = 0xFFFFFFFF;
  178.     gPrgPlayStatus = NVOD_Stop;
  179. memset(gatNvod, 0, sizeof(gatNvod));
  180. for (i = 0; i < KB_NVOD_MAX_TS_NUM; i++)
  181. {
  182. gatNvod[i].CurrentTsFlag = FALSE;
  183.         gatNvod[i].SearchStartFlag = FALSE;
  184. gatNvod[i].SearchCompleteFlag = FALSE;
  185. }
  186.    
  187.     return RETOK;
  188. }
  189. INT32 KD_NVODPlayStop(void)
  190. {
  191.     gCurTsID  = 0xFFFFFFFF;
  192.     gCurSvcID = 0xFFFFFFFF;
  193.     gPrgPlayStatus = NVOD_Stop;
  194.     KB_DTVStop();
  195.     return RETOK;
  196. }
  197. INT32 KD_NVODStartPlay(INT32 nTsId, INT32 nSvcID)
  198. {
  199.     unsigned short pFreq,pSymbl;
  200. unsigned char qam;
  201. KB_DMDTunerParameters tReqDmdPara, tCurrDmdPara;
  202.     
  203.     KB_DBGetChnlInfoByTsID((UINT16)nTsId,&pFreq,&pSymbl,&qam);
  204.     tReqDmdPara.type      = DMD_TYPE_QAM;
  205.     tReqDmdPara.inversion = INVERSION_AUTO;
  206.     tReqDmdPara.frequency = (UINT32)pFreq * 100;
  207.     tReqDmdPara.details.qam.symbolRatekSs = pSymbl;
  208.     tReqDmdPara.details.qam.modulation    = qam;
  209.     KB_DMDGetSignalParameters(&tCurrDmdPara);
  210.     //printf("nCur(%d, %d, %d), Play(%d, %d, %d)n",
  211.     //        tCurrDmdPara.frequency, tCurrDmdPara.details.qam.symbolRatekSs, tCurrDmdPara.details.qam.modulation,
  212.     //        tReqDmdPara.frequency, tReqDmdPara.details.qam.symbolRatekSs, tReqDmdPara.details.qam.modulation);
  213.     //printf("nTsId(%d), nSvcID(%d), gCurSvcID(%d)", nTsId, nSvcID, gCurSvcID);
  214.     if (KB_DMDQuerySignalStatus() == TRUE
  215.         && tCurrDmdPara.frequency == tReqDmdPara.frequency
  216.         && tCurrDmdPara.details.qam.symbolRatekSs == tReqDmdPara.details.qam.symbolRatekSs 
  217.         && tCurrDmdPara.details.qam.modulation    == tReqDmdPara.details.qam.modulation)
  218.     {        
  219.         if (0xFFFFFFFF == gCurSvcID)
  220.         {
  221.             gCurTsID  = nTsId;
  222.             gCurSvcID = nSvcID;
  223.             gPrgPlayStatus = NVOD_Play;
  224.             KB_DTVRunForNvod();
  225.             KB_DTVStartCA(nTsId, nSvcID); 
  226.             return RETOK;
  227.         }
  228.         else if (gCurSvcID != nSvcID)
  229.         {
  230.             KD_NVODPlayStop();
  231.             gPrgPlayStatus = NVOD_Play;
  232.             KB_DTVRunForNvod();
  233.             KB_DTVStartCA(nTsId, nSvcID);        
  234.         }
  235.     }
  236.     else
  237.     {
  238.         KD_NVODPlayStop();
  239.         gPrgPlayStatus = NVOD_Connect;
  240.         KB_DMDConnectSignal(&tReqDmdPara);
  241.     }
  242.     gCurTsID  = nTsId;
  243.     gCurSvcID = nSvcID;
  244.     
  245.     return RETOK;
  246. }
  247. INT32 KD_NVODSetVolume(INT32 nVolume)
  248. {       
  249.     if (nVolume < 0 || nVolume > KB_AV_MAX_VOLUME)
  250.     {
  251.         return RETFAIL3;
  252.     }
  253.     
  254.     KB_AVSetVolume(nVolume);
  255.     return RETOK;
  256. }
  257. INT32 KD_NVODGetVolume(void)
  258. {
  259.     return KB_AVGetVolume();
  260. }
  261. INT32 KD_NVODMute(BOOL nMute)
  262. {    
  263.     INT32 nCurrMute;
  264.     
  265.     if (nMute != TRUE && nMute != FALSE)
  266.     {
  267.         return RETFAIL3;
  268.     }
  269.     nCurrMute = KB_AVGetMuteFlag();
  270.     if (nCurrMute != nMute)
  271.     {
  272.      KB_AVSetMute(nMute);
  273.     }
  274.     return RETOK;
  275. }
  276. INT32 KD_NVODDestoryPlay(void)
  277. {
  278.     gNvodTime = 0;
  279.     gCurTsID  = 0xFFFFFFFF;
  280.     gCurSvcID = 0xFFFFFFFF;
  281.     gPrgPlayStatus = NVOD_Stop;
  282.     KD_NVODPlayStop();
  283.     
  284.     return RETOK;
  285. }
  286. BOOL KD_NVODGetMute(void)
  287. {
  288.     return (BOOL)KB_AVGetMuteFlag();
  289. }
  290. INT32 KD_NVODSetTrack(KB_DBTRACK nTrackType)
  291. {
  292.     KB_AVSetPrgTrack(nTrackType);
  293.     return RETOK;
  294. }
  295. KB_DBTRACK KD_NVODGetTrack(void)
  296. {    
  297. return KB_AVGetTrack();
  298. }
  299. INT32 KB_NVODDestroy(void)
  300. {
  301.     KB_EPGToNvod(FALSE);
  302.     KD_NVODStopAllPF();
  303.     KD_NVODStopAllSch();
  304.     KB_TimerDisable(EitSrhTimer);
  305.     printf("nKB_NVODDestroy::关闭定时期 EitSrhTimer");
  306.     KD_NVODDestoryPlay();
  307.     
  308.     return RETOK;
  309. }
  310. INT32 NVOD_HandleMsg(KB_OSPMsgNode *pInMsg)
  311. {
  312.     //UINT32 CurrentTsNum;
  313.     switch (pInMsg->Word1)
  314.     {
  315.         case MOD_SIPSI:
  316.             {                        
  317.          KB_DTVHandleMsg(pInMsg);
  318.          switch(pInMsg->Word2)
  319.          {
  320.          case KB_SI_MSG_TDT_DONE:
  321.          { 
  322.          KB_TimeSetCurTime(*((time_t*)pInMsg->Word3));
  323.                         gNvodTime = KB_TimeGetCurGMTTime();
  324.              //KB_TimeGetCurTime(&gNvodTime);  
  325.                         printf("nNVOD_HandleMsg::get gNvodTime(0x%x) ok",
  326.                                 gNvodTime);
  327.          }
  328.          break;
  329.          }            
  330.          }
  331.             break;
  332.             
  333.         case MOD_TUNER: 
  334.             {            
  335.          KD_NVODHandleTuner(pInMsg);
  336.              switch (pInMsg->Word2)
  337.              {
  338.                     case DMD_CALLBACK_SIGNAL_LOST:
  339.                         {
  340.                         }
  341.                         break;
  342.                     case DMD_CALLBACK_SIGNAL_CONNECTED:
  343.                         {
  344.                         }
  345.                         break;
  346.                     default:
  347.                         break;
  348.              }
  349.             }
  350.             break;
  351.         default:
  352.             break;
  353.     }
  354.     return RETOK;    
  355. }
  356. int KB_NVODInit2(void)
  357. {
  358.     UINT8   TsSequence;
  359. int i,j;
  360. int rt = KB_DB_DTV_FAILURE;
  361. //KB_SINitStruct * nit;
  362. int num;
  363. int ret;
  364. UINT16 tsid;
  365.     UINT32 CurrentTsTsSequence;
  366. unsigned short pFreq,pSymbl;
  367. unsigned char qam;
  368. KB_DMDTunerParameters    ts;
  369. #if 1
  370.     //对已初始化过的,不再进行初始化
  371.     CurrentTsTsSequence = KB_NVOD_GetCurrentTsNum();
  372.     if ((UINT32)(-1) != CurrentTsTsSequence
  373.         && gatNvod[CurrentTsTsSequence].TsPara.frequency == CurrentSignal.frequency)
  374.     {
  375.         printf("nKB_NVODInit2::不再重复初始化");
  376.         return KB_DB_DTV_SUCCESS;
  377.     }
  378. #endif
  379.     memset(gNvodSvcInfo, 0, sizeof(gNvodSvcInfo));
  380. gNvodRefSvcNum = 0;
  381.     gArriveNum = 0;
  382. gTimeOutNum = 0;
  383.     gNvodEitSchTableSwitchFlag = KB_EIT_SCHEDULE_CURRENT_TS_TABLE_DEFAULT;
  384.     memset(gRecieveState,0,sizeof(gRecieveState));
  385. memset(gNvodRefFre,0,sizeof(gNvodRefFre));
  386. memset(gNvodRefSvcEachFre,0,sizeof(gNvodRefSvcEachFre));
  387. gFreqInd = 0;
  388. gFreqNum = 0;
  389. ret = KB_DBGetNvodInfo(gNvodSvcInfo,&num);
  390. if(ret != RET_OK)
  391. {
  392. gSvcNum = 0;
  393. return rt;
  394. }
  395. gNvodRefSvcNum = num;
  396. if (0 == gNvodRefSvcNum)
  397.     {
  398.         gSvcNum = 0;
  399.         return KB_DB_DTV_SUCCESS;
  400.     }
  401. j = 1;
  402. for(i=1; i<gNvodRefSvcNum; i++)
  403. {
  404. if (gNvodSvcInfo[i-1].TsID != gNvodSvcInfo[i].TsID)
  405. {
  406. tsid = gNvodSvcInfo[i-1].TsID;
  407. KB_DBGetChnlInfoByTsID(tsid,&pFreq,&pSymbl,&qam);
  408.         ts.type      = DMD_TYPE_QAM;
  409.         ts.inversion = INVERSION_AUTO;
  410.         ts.frequency = ((UINT32)pFreq * 100);
  411.         ts.details.qam.symbolRatekSs = pSymbl;
  412.         ts.details.qam.modulation    = qam;
  413.             TsSequence = KB_NVOD_AllocategatNvodInfo(ts.frequency);
  414.             if (TsSequence < KB_NVOD_MAX_TS_NUM)
  415.             {
  416.                 memcpy(&gatNvod[TsSequence].TsPara, &ts, sizeof(KB_DMDTunerParameters));
  417.                 gatNvod[TsSequence].SearchStartFlag = FALSE;
  418.                 gatNvod[TsSequence].SearchCompleteFlag = FALSE;
  419.                 gatNvod[TsSequence].CurrentTsFlag = FALSE;
  420.             }
  421.             else if (TsSequence == KB_NVOD_ALLOCATE_REPEAT)
  422.             {
  423.                 printf("nKB_NVODInit2::KB_NVOD_AllocategatNvodInfo ALLOCATE REPEAT!n");
  424.             }
  425.             else
  426.             {
  427.                 printf("nKB_NVODInit2::KB_NVOD_AllocategatNvodInfo error!n");
  428.                 return KB_DB_DTV_FAILURE;
  429.             }
  430.             
  431. gNvodRefFre[gFreqInd] = ts;
  432. gNvodRefSvcEachFre[gFreqInd] = j;
  433. gFreqInd++;
  434. j = 1;
  435. }
  436. else
  437. {
  438. j++;
  439. }
  440. }
  441. tsid = gNvodSvcInfo[i-1].TsID;
  442. KB_DBGetChnlInfoByTsID(tsid,&pFreq,&pSymbl,&qam);
  443.     ts.type      = DMD_TYPE_QAM;
  444.     ts.inversion = INVERSION_AUTO;
  445.     ts.frequency = ((UINT32)pFreq * 100);
  446.     ts.details.qam.symbolRatekSs = pSymbl;
  447.     ts.details.qam.modulation    = qam;
  448.     TsSequence = KB_NVOD_AllocategatNvodInfo(ts.frequency);
  449.     if (TsSequence < KB_NVOD_MAX_TS_NUM)
  450.     {
  451.         memcpy(&gatNvod[TsSequence].TsPara, &ts, sizeof(KB_DMDTunerParameters));
  452.         gatNvod[TsSequence].SearchStartFlag = FALSE;
  453.         gatNvod[TsSequence].SearchCompleteFlag = FALSE;
  454.         gatNvod[TsSequence].CurrentTsFlag = FALSE;
  455.     }
  456.     else if (TsSequence == KB_NVOD_ALLOCATE_REPEAT)
  457.     {
  458.         printf("nKB_NVODInit2::KB_NVOD_AllocategatNvodInfo ALLOCATE REPEAT!n");
  459.     }
  460.     else
  461.     {
  462.         printf("nKB_NVODInit2::KB_NVOD_AllocategatNvodInfo error!n");
  463.         
  464.         for (i = 0; i < KB_NVOD_MAX_TS_NUM; i++)
  465.         {
  466.             KB_NVOD_ResetTsData(i);
  467.         }
  468.         
  469.         memcpy(&gatNvod[0].TsPara, &ts, sizeof(KB_DMDTunerParameters));
  470.         gatNvod[0].SearchStartFlag = FALSE;
  471.         gatNvod[0].SearchCompleteFlag = FALSE;
  472.         gatNvod[0].CurrentTsFlag = FALSE;
  473.     }
  474. gNvodRefFre[gFreqInd] = ts;
  475. gNvodRefSvcEachFre[gFreqInd] = j;
  476. gFreqInd++;
  477. gFreqNum = gFreqInd;
  478. gFreqInd = 0;
  479. ts = gNvodRefFre[gFreqInd];
  480. gSvcNum = gNvodRefSvcEachFre[gFreqInd];
  481.     if (0 == CurrentSignal.frequency)
  482.     {
  483.         printf("nKB_NVODInit2::serious error! CurrentSignal is NULL!");
  484.         if (0 != gatNvod[0].TsPara.frequency)
  485.         {
  486.             if (RET_OK != KB_NVOD_SetCurrentTsPara(gatNvod[0].TsPara))
  487.             {
  488.                 printf("nKB_NVODInit2::KB_NVOD_SetCurrentTsPara fail!n");
  489.                 return KB_DB_DTV_FAILURE;
  490.             }
  491.             KB_DMDDropSignal();
  492.             KB_DMDConnectSignal(&(gatNvod[0].TsPara));
  493.         }
  494.     }
  495.     else
  496.     {
  497.         if (RET_OK != KB_NVOD_SetCurrentTsPara(CurrentSignal))
  498.         {
  499.             printf("nKB_NVODInit2::KB_NVOD_SetCurrentTsPara fail!n");
  500.             return KB_DB_DTV_FAILURE;
  501.         }
  502.     }
  503.     
  504. //memcpy(&NvodCurrentTs, &ts, sizeof(KB_DMDTunerParameters));
  505. gArriveNum = 0;
  506. gTimeOutNum = 0;
  507.     gNvodEitSchTableSwitchFlag = KB_EIT_SCHEDULE_CURRENT_TS_TABLE_DEFAULT;
  508. gFreqInd++;
  509. if(ret == RET_OK)
  510. {
  511. if(num > KB_SI_MAX_REF_SVC_NUMS)
  512. {
  513. num = KB_SI_MAX_REF_SVC_NUMS;
  514. }
  515.         //先用gRecieveState记录下所有的参考业务ID和它对应的时移业务数
  516.           //以后只需将各参考业务收到的时移业务数(gRecieveState[i].recvSvcNum)清零,
  517.           //并更新该频点中的参考业务数(gSvcNum)即可
  518. for(i = 0; i < gNvodRefSvcNum; i ++)
  519. {
  520. if(gNvodSvcInfo[i].shiftSvcNum > KB_SI_MAX_SHIFT_SVC_NUMS)
  521. {
  522. gNvodSvcInfo[i].shiftSvcNum = KB_SI_MAX_SHIFT_SVC_NUMS;
  523. }
  524. gRecieveState[i].refScvId = gNvodSvcInfo[i].refScvId;
  525. gRecieveState[i].shiftSvcNum = gNvodSvcInfo[i].shiftSvcNum;
  526. gRecieveState[i].recvSvcNum = 0;
  527. }
  528. }
  529. return KB_DB_DTV_SUCCESS;
  530. }
  531. //NVOD的搜索总入口, 次序所有频点的CurrentTsEitPF-->所有频点的CurrentTsEitSch
  532. INT32 KB_NVODGetEit(void)
  533. {
  534.     UINT32 CurrentTsNum;
  535.     INT32  status;
  536.     if (0 ==gNvodRefSvcNum)
  537.     {
  538.         printf("nKB_NVODGetEit::无参考业务!n");
  539.         return  RETOK;
  540.     }
  541.     
  542.     CurrentTsNum = KB_NVOD_GetCurrentTsNum();
  543.     if ((UINT32)(-1) == CurrentTsNum)
  544.     {
  545.         printf("nKB_NVODGetEit::serious error! KB_NVOD_GetCurrentTsNum fail!n");
  546.         return  RETFIAL1;
  547.     }
  548.     
  549.     printf("nKB_NVODGetEit::启动定时器  EitSrhTimer");
  550.     status = KB_TimerEnable(EitSrhTimer, 90*1000);
  551. if(status != RETOK)
  552. {
  553.         printf("nKB_NVODGetEit::EitSrhTimer Enable failed!");
  554.     }
  555.     
  556. KB_NVODGetEitPF(CurrentTsNum);
  557.     return RET_OK;
  558. }
  559. static INT32 KB_NVODGetEitPF(UINT32 TsSequence)
  560. {
  561. int i;
  562.     UINT32   NullDataTsNum = (UINT32)(-1);
  563.     UINT32   CurrentTsNum = (UINT32)(-1);
  564.     BOOL    StartFlag = FALSE, NeedSrhPFFlag = FALSE;
  565. KB_SIEitTs eTs;
  566.     KB_OSPMsgNode message;
  567.     KB_DMDTunerParameters  *pTsPara = NULL;
  568.     //对搜索过程中,中途被打断的ts流, 先清掉以前的不完整数据
  569.     if (TRUE == gatNvod[TsSequence].SearchStartFlag
  570.         && FALSE ==gatNvod[TsSequence].SearchCompleteFlag)
  571.     {
  572.         KB_NVOD_ResetTsData(TsSequence);
  573.     }
  574.     if (TsSequence == KB_NVOD_GetCurrentTsNum())
  575.     {
  576.         eTs = KB_SI_EIT_CURRENT_TS;
  577.     }
  578.     else
  579.     {
  580.         eTs = KB_SI_EIT_OTHER_TS;
  581.     }
  582.     if (FALSE == gatNvod[TsSequence].SearchStartFlag
  583.         && FALSE == gatNvod[TsSequence].SearchCompleteFlag)
  584.     {          
  585.         //该标志的作用是防止本频点无NVOD参考事件, 产生死循环
  586.         NeedSrhPFFlag = TRUE;
  587.         for(i=0; i<gNvodRefSvcNum; i++)
  588.         {
  589.          if (((UINT32)gNvodSvcInfo[i].freq*100) == gatNvod[TsSequence].TsPara.frequency)
  590.          {
  591.              KD_NVODGetPF(gNvodSvcInfo[i].TsID, 
  592.                         gNvodSvcInfo[i].refScvId, 
  593.                         eTs);
  594.                 ++gatNvod[TsSequence].RefSrvNum;  //通常1个RefSrv只含有1一个RefEvent
  595.                 StartFlag = TRUE;
  596.          }
  597.         }
  598.     }
  599.     //本频点无NVOD参考事件, 无需继续搜索, 仅将标志设置即可
  600.     if (TRUE == NeedSrhPFFlag && FALSE == StartFlag)
  601.     {
  602.         gatNvod[TsSequence].SearchStartFlag = TRUE;
  603.         gatNvod[TsSequence].SearchCompleteFlag = TRUE;
  604.         printf("nWARNING: KB_NVODGetEitPF::there is no EIT-PF on the fre(%ld)",
  605.                 gatNvod[TsSequence].TsPara.frequency);
  606.     }
  607.     if (TRUE == StartFlag)
  608.     {
  609.         gatNvod[TsSequence].SearchStartFlag = TRUE;        
  610.         CurrentSearchTsNum = TsSequence;
  611.         CurrentPFCompleteFlag = 0;
  612.     }
  613.     //如果本频点无参考事件需要查找, 则启动下一个未搜索的TS流的数据搜索
  614.     else 
  615.     {
  616.         NullDataTsNum = KB_NVOD_GetNullPFTsNum();
  617.         //用户正在播放本频点节目时,不切换频点, 只搜索本频点数据
  618.         if (NVOD_Play != gPrgPlayStatus
  619.             && NullDataTsNum < KB_NVOD_MAX_TS_NUM)
  620.         {
  621.             //启动下一个Ts的参考事件搜索
  622.             printf("nKB_NVODGetEitPF::本频点(%d)无参考事件需要搜索, 启动下一个Ts的参考事件搜索",
  623.                     gatNvod[TsSequence].TsPara.frequency);
  624.             KD_NVODStopAllPF();
  625.             KB_DMDDropSignal();
  626.             pTsPara = KB_NVOD_GetTsParaFromTsSequence(NullDataTsNum);
  627.             if (NULL == pTsPara)
  628.             {
  629.                 printf("nKB_NVODGetEitSch::KB_NVOD_GetTsParaFromTsSequence error!n");
  630.                 return RETFIAL1;
  631.             }
  632.             KB_DMDConnectSignal(pTsPara);
  633.             KB_OSPTaskDelay(50);
  634.             KB_NVODGetEitPF(NullDataTsNum);
  635.         }
  636.         //如果所有的参考事件已经搜索完成, 则启动时移事件搜索
  637.         else
  638.         {
  639.             printf("nKB_NVODGetEitPF::所有的参考事件已经搜索完成, 则启动时移事件搜索");
  640.             KD_NVODStopAllPF();
  641.             
  642.             message.Word1 = MOD_NVOD;
  643. message.Word2 = KB_NVOD_OVER;
  644. message.Word3 = 0;
  645. message.Word4 = 0;
  646. KB_MENUTranslateMsg(&message);
  647.             
  648.             CurrentTsNum = KB_NVOD_GetCurrentTsNum();
  649.             if ((UINT32)(-1) == CurrentTsNum)
  650.             {
  651.                 printf("nKB_NVODGetEitPF::serious error! KB_NVOD_GetCurrentTsNum fail!n");
  652.                 return  RETFIAL1;
  653.             }
  654.             KB_NVODGetEitSch(CurrentTsNum);
  655.         }
  656.     }
  657.     return RETOK;
  658. }
  659. //目前仅搜索当前流SCh的0x50, 0x51表; 若不够用,可按模式添加
  660. //本函数仅负责0x50表, 其扩展表0x51的搜索在KD_NVODHandleEitSch进行
  661. static INT32 KB_NVODGetEitSch(UINT32 TsSequence)
  662. {
  663.     int i, j;
  664.     UINT32   NullDataTsNum = (UINT32)(-1);
  665.     //UINT32   CurrentTsNum = (UINT32)(-1);
  666.     BOOL    StartFlag = FALSE;
  667. KB_SIEitTs eTs;
  668.     //KB_OSPMsgNode message;
  669.     KB_DMDTunerParameters  *pTsPara = NULL;
  670.     //搜索总是从PF开始, 所以在这里不再无需再作数据完整性检查
  671.     //这里仅启动0x50的搜索, 0x51的搜索在KD_NVODHandleEitSch启动
  672.     if (TsSequence == KB_NVOD_GetCurrentTsNum())
  673.     {
  674.         eTs = KB_SI_EIT_CURRENT_TS;
  675.         gNvodEitSchTableSwitchFlag = KB_EIT_SCHEDULE_CURRENT_TS_TABLE_DEFAULT;
  676.         //printf("nKB_NVODGetEitSch::eTs = KB_SI_EIT_CURRENT_TSn");
  677.     }
  678.     else
  679.     {
  680.         eTs = KB_SI_EIT_OTHER_TS;
  681.         gNvodEitSchTableSwitchFlag = KB_EIT_SCHEDULE_OTHER_TS_TABLE_DEFAULT;
  682.         //printf("nKB_NVODGetEitSch::eTs = KB_SI_EIT_OTHER_TSn");
  683.     }
  684.     
  685.     if (FALSE == gatNvod[TsSequence].SearchCompleteFlag)
  686.     {
  687.         for(i=0; i<gNvodRefSvcNum; i++)
  688.         {
  689.          if (((UINT32)gNvodSvcInfo[i].freq*100) == gatNvod[TsSequence].TsPara.frequency)
  690.          {
  691.              for (j = 0; j < gNvodSvcInfo[i].shiftSvcNum; j++)
  692.                 {
  693.                     KD_NVODGetSchTimeShift(gNvodSvcInfo[i].shiftSvc[j].tsId, 
  694.                                        gNvodSvcInfo[i].shiftSvc[j].svcId, 
  695.                                        eTs);
  696.                 }
  697.                 StartFlag = TRUE;
  698.          }
  699.         }
  700.     }
  701.     if (TRUE == StartFlag)
  702.     {
  703.         CurrentSearchTsNum = TsSequence;
  704.         gSvcNum   = gatNvod[TsSequence].RefSrvNum;
  705.         gArriveNum = 0;
  706.     gTimeOutNum = 0;
  707.         //printf("nKB_NVODGetEitSch::gSvcNum(%d), gNvodRefSvcNum(%d)n",
  708.         //        gSvcNum, gNvodRefSvcNum);
  709.        
  710.         for(i = 0; i < gNvodRefSvcNum; i ++)
  711. {
  712. gRecieveState[i].recvSvcNum = 0;
  713. }
  714.     }
  715.     //如果本频点无参考事件需要查找, 则启动下一个未搜索频点的数据搜索
  716.     else 
  717.     {
  718.         printf("nKB_NVODGetEitSch::本频点无参考事件需要查找, 则启动下一个未搜索频点的数据搜索n");
  719.         NullDataTsNum = KB_NVOD_GetNullSchTsNum();
  720.         //用户正在播放本频点节目时,不切换频点, 只搜索本频点数据
  721.         if (NVOD_Play != gPrgPlayStatus
  722.             && NullDataTsNum < KB_NVOD_MAX_TS_NUM)
  723.         {
  724.             //启动下一个Ts的时移事件搜索
  725.             KD_NVODStopAllPF();
  726.             KD_NVODStopAllSch();
  727.             KB_DMDDropSignal();
  728.             pTsPara = KB_NVOD_GetTsParaFromTsSequence(NullDataTsNum);
  729.             if (NULL == pTsPara)
  730.             {
  731.                 printf("nKB_NVODGetEitSch::KB_NVOD_GetTsParaFromTsSequence error!n");
  732.                 return RETFIAL1;
  733.             }
  734.             KB_DMDConnectSignal(pTsPara);
  735.             KB_OSPTaskDelay(50);
  736.             KB_NVODGetEitSch(NullDataTsNum);
  737.         }
  738.         //如果所有的时移事件已经搜索完成, 则停止所有搜索,发送刷新消息到MENU
  739.         else
  740.         {
  741.          KB_OSPMsgNode movie_msg;
  742.             KD_NVODStopAllPF();
  743.         KD_NVODStopAllSch();
  744.             
  745.             KB_TimerDisable(EitSrhTimer);
  746.             printf("nKB_NVODGetEitSch::关闭定时期 EitSrhTimer");
  747.             //message.Word1 = MOD_NVOD;
  748. // message.Word2 = KB_NVOD_OVER;
  749. // message.Word3 = 0;
  750. // message.Word4 = 0;
  751. movie_msg.Word1 = KB_MOVIE_NVOD_TO_MOVIE;
  752. kb_machblue_task_post(&movie_msg);
  753. printf("nKB_NVODGetEitSch::XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
  754.         }
  755.     }
  756.     return RETOK;
  757. }
  758. int KB_NVODAddTime(UINT16 SerID,UINT16 refSerID,UINT16 evtID,UINT16 refEvtID,time_t start_time)
  759. {
  760. int index, ShiftEventNum, i = 0;
  761. //int add = 0;
  762.     UINT16 TsId = 0;
  763. index = KB_NVODFindEveInd(CurrentSearchTsNum, refSerID, refEvtID);
  764. if(index == -1)
  765. {
  766. return 0;
  767. }
  768. #if 0
  769. gSchTime = gNvodTime + 24 * 3600;//AcquireSixTime(pT);
  770. start_time += 8*3600;
  771. if((gatNvod[index].refSerID == refSerID) && (gatNvod[index].refEvtID == refEvtID ))
  772. {
  773. if( start_time + gatNvod[index].durTime < gNvodTime)
  774. {
  775. add = -1;
  776. }
  777. else  if( start_time + gatNvod[index].durTime > gSchTime )
  778. {
  779. add = -2;
  780. }
  781. else if((( start_time >= gNvodTime) && (start_time + gatNvod[index].durTime <= gSchTime))
  782.  || (( start_time < gNvodTime) && (start_time + gatNvod[index].durTime >= gNvodTime)))
  783. {
  784. add = 1;
  785. }
  786. }
  787. #endif
  788.     
  789. #if 0
  790.     //抛弃过期的SCH事件
  791.     if (0 == gNvodTime)
  792.     {
  793.         printf("nKB_NVODAddTime::gNvodTime 未获取");
  794.     }
  795.     else
  796.     {
  797.         if (start_time + gatNvod[CurrentSearchTsNum].RefEventData[index].durTime < gNvodTime)
  798.         {
  799.             return 0;
  800.         }
  801.     }
  802. #endif
  803. //if(add == 1)
  804. //{
  805. //if(gatNvod[index].TimeNum >= 200)
  806. //{
  807. // quicksortEit(gatNvod[index].TimeNode,0,gatNvod[index].TimeNum - 1);
  808. // gatNvod[index].TimeNum = 120;
  809. //return;
  810. //}
  811.     //超出最大限制  
  812.     ShiftEventNum = gatNvod[CurrentSearchTsNum].RefEventData[index].TimeNum;
  813.     if (ShiftEventNum >= 500)
  814. {
  815.     printf("nKB_NVODAddTime::ShiftEventNum 超出最大限制 n");
  816.         return 0;
  817.     }
  818.     //防止重复添加
  819.     for (i = 0; i < gatNvod[CurrentSearchTsNum].RefEventData[index].TimeNum; i++)
  820.     {
  821.         if (gatNvod[CurrentSearchTsNum].RefEventData[index].TimeNode[i].EvtID == evtID
  822.         &&gatNvod[CurrentSearchTsNum].RefEventData[index].TimeNode[i].SerID == SerID
  823.         &&gatNvod[CurrentSearchTsNum].RefEventData[index].TimeNode[i].startTime == start_time)
  824.         {
  825.             return 0;
  826.         }
  827.     }
  828.     if (RET_OK != KB_DBGetTsIDByFre(&TsId, 
  829.                                  gatNvod[CurrentSearchTsNum].TsPara.frequency/ 100))
  830.     {
  831.         printf("nKB_NVODAddTime::serious error! KB_DBGetTsIDByFre fail!n");
  832.         return 0;
  833.     }
  834.     
  835.     if (0 != TsId)
  836. {
  837.         gatNvod[CurrentSearchTsNum].RefEventData[index].TimeNode[ShiftEventNum].tsID = TsId;
  838. }
  839. gatNvod[CurrentSearchTsNum].RefEventData[index].TimeNode[ShiftEventNum].EvtID = evtID;
  840. gatNvod[CurrentSearchTsNum].RefEventData[index].TimeNode[ShiftEventNum].SerID = SerID;
  841. gatNvod[CurrentSearchTsNum].RefEventData[index].TimeNode[ShiftEventNum].startTime = start_time;
  842. gatNvod[CurrentSearchTsNum].RefEventData[index].TimeNum ++;
  843. //}
  844. return 1;
  845. }
  846. int KB_NVODFindEveInd(UINT32 TsSequence, UINT16 refSerID,UINT16 refEvtID)
  847. {
  848. int i;
  849. for(i = 0;i<gatNvod[TsSequence].RefEventNum; i++)
  850. {
  851. if((gatNvod[TsSequence].RefEventData[i].refEvtID == refEvtID) 
  852.             && (gatNvod[TsSequence].RefEventData[i].refSerID == refSerID))
  853. {
  854. return i;
  855. }
  856. }
  857. return -1;
  858. }
  859. int KB_NVODAddRefSvc(unsigned short tsID,
  860. unsigned short  refEvtID,
  861. unsigned short  refSerID,
  862. char  *PrgName,
  863. char *PrgTxt,
  864. UINT16  durTime)
  865. {
  866. int i;
  867. //int index;
  868. int len;
  869.     UINT8  EventNum;
  870. if((PrgName == NULL) || (PrgTxt == NULL) )
  871. {
  872. return -1;
  873. }
  874. if(gatNvod[CurrentSearchTsNum].RefEventNum >= KB_NVOD_MAX_RefEvent_One_Ts)
  875. {
  876. return -1;
  877. }
  878.     //目前本ts流的参考事件数目
  879.     EventNum = gatNvod[CurrentSearchTsNum].RefEventNum;
  880. for( i = 0;i < EventNum;i++)
  881. {
  882. if((gatNvod[CurrentSearchTsNum].RefEventData[i].refEvtID ==refEvtID ) 
  883.            && (gatNvod[CurrentSearchTsNum].RefEventData[i].refSerID ==refSerID ))
  884. {
  885. return -1;
  886. }
  887. }
  888. gatNvod[CurrentSearchTsNum].RefEventData[EventNum].durTime = durTime;
  889. gatNvod[CurrentSearchTsNum].RefEventData[EventNum].refSerID = refSerID;
  890. gatNvod[CurrentSearchTsNum].RefEventData[EventNum].refEvtID = refEvtID;
  891. memcpy(gatNvod[CurrentSearchTsNum].RefEventData[EventNum].PrgName,
  892.             PrgName,
  893.             30);
  894. gatNvod[CurrentSearchTsNum].RefEventData[EventNum].PrgName[28] = '';
  895. gatNvod[CurrentSearchTsNum].RefEventData[EventNum].PrgName[29] = '';
  896. len = strlen(PrgTxt);
  897. if(len >= 400)
  898. {
  899. len = 390;
  900. }
  901. memcpy(gatNvod[CurrentSearchTsNum].RefEventData[EventNum].PrgTxt,
  902.             PrgTxt,
  903.             len);
  904. gatNvod[CurrentSearchTsNum].RefEventNum++;
  905. return 0;
  906. }
  907. //static void KD_NVODHandleMsg3(KB_OSPMsgNode *pInMsg)
  908. //{
  909. // int j;
  910. //
  911. // for(j = 0;j<nvodEvent;j++)
  912. // {
  913. // quicksortEit(gatNvod[j].TimeNode,0,gatNvod[j].TimeNum - 1);
  914. // }
  915. //}
  916. INT32 KB_NVODHandleMsg(KB_OSPMsgNode *pInMsg)
  917. {
  918.     //UINT32        CurrentTsNum = (UINT32)(-1);
  919. KB_OSPMsgNode pSendMsg;
  920. //KB_DMDTunerParameters    ts;
  921.     switch (pInMsg->Word1)
  922.     {
  923.     case MOD_NVOD: 
  924.         {
  925.     switch (pInMsg->Word2)
  926.     {
  927.     case KB_NVOD_PF_OVER:
  928.         
  929.         break;
  930.     case KB_NVOD_PF_TIMEOUT:
  931.         {
  932.          gTimeOutNum++;
  933.          if(KD_NVODRefSvcReceiveStatus((UINT16)pInMsg->Word4, TRUE))
  934.          {
  935.          KD_NVODStopAllSch();
  936. gNvodEitSchTableSwitchFlag = KB_EIT_SCHEDULE_CURRENT_TS_TABLE_DEFAULT;
  937. //if (gFreqInd == gFreqNum)
  938. {
  939.          pSendMsg.Word1 = pInMsg->Word1;
  940.          pSendMsg.Word2 = KB_NVOD_OVER;
  941.          pSendMsg.Word3 = 0;
  942.          pSendMsg.Word4 = 0;
  943. KB_MENUTranslateMsg(&pSendMsg);
  944. }
  945. #if 0
  946. else
  947. {
  948.         KB_EPGStopAllSCH();
  949.     KD_NVODStopAllPF();
  950.     KD_NVODStopAllSch();
  951. KB_DMDDropSignal();
  952. ts = gNvodRefFre[gFreqInd];
  953. gSvcNum = gNvodRefSvcEachFre[gFreqInd];
  954. gArriveNum = 0;
  955. gTimeOutNum = 0;
  956. gFreqInd++;
  957. KB_DMDConnectSignal(&ts);
  958.                             if (RET_OK != KB_NVOD_SetCurrentTsPara(ts))
  959.                             {
  960.                                 printf("nKB_NVODHandleMsg::KB_NVOD_SetCurrentTsPara fail!n");
  961.                                 return KB_DB_DTV_FAILURE;
  962.                             }
  963. //memcpy(&NvodCurrentTs, &ts, sizeof(KB_DMDTunerParameters));
  964. }
  965. #endif
  966. }
  967.         }
  968.         break;
  969.     case KB_NVOD_SCH_OVER:
  970.         {
  971.         //KB_NVODHandleMsg(pInMsg);
  972. KD_NVODHandleEitSch(pInMsg);
  973.         }
  974.         break;
  975. case KB_NVOD_SCH_TIMEOUT:
  976. KD_NVODHandleEitSch(pInMsg);
  977. break;
  978.     default:
  979.         break;
  980.     }
  981.         }
  982.         break;
  983.     default :
  984.      break;
  985.     }
  986. return 0;
  987. }
  988. INT32 KB_NVODGetPrgNum(UINT32 TsSequence)
  989. {
  990. return gatNvod[TsSequence].RefEventNum;
  991. }
  992. char *KB_NVODGetPrgName(UINT32 TsSequence, INT32 RefEventIndex)
  993. {
  994. if(RefEventIndex < 0 
  995.    || RefEventIndex >= KB_NVOD_MAX_RefEvent_One_Ts 
  996.    || TsSequence >= KB_NVOD_MAX_TS_NUM)
  997. {
  998. return NULL;
  999. }
  1000. return gatNvod[TsSequence].RefEventData[RefEventIndex].PrgName;
  1001. }
  1002. char *KB_NVODGetPrgContent(UINT32 TsSequence, INT32 RefEventIndex)
  1003. {
  1004. if(RefEventIndex < 0 
  1005.    || RefEventIndex >= KB_NVOD_MAX_RefEvent_One_Ts 
  1006.    || TsSequence >= KB_NVOD_MAX_TS_NUM)
  1007. {
  1008. return NULL;
  1009. }
  1010. return gatNvod[TsSequence].RefEventData[RefEventIndex].PrgTxt;
  1011. }
  1012. INT32 KB_NVODGetPrgDuring(UINT32 TsSequence, INT32 RefEventIndex)
  1013. {
  1014. if(RefEventIndex < 0 
  1015.    || RefEventIndex >= KB_NVOD_MAX_RefEvent_One_Ts 
  1016.    || TsSequence >= KB_NVOD_MAX_TS_NUM)
  1017. {
  1018. return 0;
  1019. }
  1020. return (INT32)(gatNvod[TsSequence].RefEventData[RefEventIndex].durTime);
  1021. }
  1022. INT32 KB_NVODGetPrgTimeNum(UINT32 TsSequence, INT32 RefEventIndex)
  1023. {
  1024. if(RefEventIndex < 0 
  1025.    || RefEventIndex >= KB_NVOD_MAX_RefEvent_One_Ts 
  1026.    || TsSequence >= KB_NVOD_MAX_TS_NUM)
  1027. {
  1028. return 0;
  1029. }
  1030. return (INT32)(gatNvod[TsSequence].RefEventData[RefEventIndex].TimeNum);
  1031. }
  1032. BOOL KB_NVODGetPrgRefSvcFlag(UINT32 TsSequence, 
  1033.                                   INT32 RefEventIndex, 
  1034.                                   UINT16 nRefSvcID)
  1035. {
  1036. if(RefEventIndex < 0 
  1037.    || RefEventIndex >= KB_NVOD_MAX_RefEvent_One_Ts 
  1038.    || TsSequence >= KB_NVOD_MAX_TS_NUM)
  1039. {
  1040. return 0;
  1041. }
  1042. return (gatNvod[TsSequence].RefEventData[RefEventIndex].refSerID == nRefSvcID);
  1043. }
  1044. time_t KB_NVODGetPrgStartTime(UINT32 TsSequence, 
  1045.                                    INT32 RefEventIndex, 
  1046.                                    INT32 ShiftEventIndex)
  1047. {
  1048. if(RefEventIndex < 0 
  1049.    || RefEventIndex >= KB_NVOD_MAX_RefEvent_One_Ts 
  1050.    || TsSequence >= KB_NVOD_MAX_TS_NUM)
  1051. {
  1052. return 0;
  1053. }
  1054. if(ShiftEventIndex<0 
  1055.    || ShiftEventIndex>=(INT32)(gatNvod[TsSequence].RefEventData[RefEventIndex].TimeNum))
  1056. {
  1057. return 0;
  1058. }
  1059. return gatNvod[TsSequence].RefEventData[RefEventIndex].TimeNode[ShiftEventIndex].startTime;
  1060. }
  1061. static BOOL KD_NVODRefSvcReceiveStatus(UINT16 refScvId, BOOL bTimeout)
  1062. {
  1063. int i;
  1064.   if(refScvId == (UINT16)(-1))
  1065.   {
  1066.   gArriveNum++;
  1067.   }
  1068.   else
  1069.   {
  1070. if(!bTimeout)
  1071. {
  1072. for(i=0; i<gSvcNum; i++)
  1073. {
  1074. if(gRecieveState[i].refScvId == refScvId)
  1075. {
  1076. ++gRecieveState[i].recvSvcNum;
  1077. if( gRecieveState[i].recvSvcNum == gRecieveState[i].shiftSvcNum)
  1078. {
  1079.     gArriveNum++;
  1080. }
  1081. break;
  1082. }
  1083. }
  1084. }
  1085. }
  1086.     if((UINT32)gArriveNum+ (UINT32)gTimeOutNum == gSvcNum)
  1087.     {
  1088.      return TRUE;
  1089.     }
  1090. return FALSE;
  1091. }
  1092. BOOL KB_NVODGetTimeInfo(UINT32 TsSequence, 
  1093.                             INT32 RefEventIndex, 
  1094.                             INT32 ShiftEventIndex,
  1095. INT32 *nTsId, 
  1096. INT32 *nSvcID)
  1097. {
  1098. unsigned short serID,refSerID;
  1099. int i,j;
  1100. if(RefEventIndex < 0 
  1101.    || RefEventIndex >= KB_NVOD_MAX_RefEvent_One_Ts 
  1102.    || TsSequence >= KB_NVOD_MAX_TS_NUM)
  1103. {
  1104. return FALSE;
  1105. }
  1106. if(ShiftEventIndex<0 
  1107.    || ShiftEventIndex>=(INT32)(gatNvod[TsSequence].RefEventData[RefEventIndex].TimeNum))
  1108. {
  1109. return FALSE;
  1110. }
  1111. *nSvcID = gatNvod[TsSequence].RefEventData[RefEventIndex].TimeNode[ShiftEventIndex].SerID;
  1112. refSerID = gatNvod[TsSequence].RefEventData[RefEventIndex].refSerID;
  1113. serID = gatNvod[TsSequence].RefEventData[RefEventIndex].TimeNode[ShiftEventIndex].SerID;
  1114. for(i = 0;i<gSvcNum;i++)
  1115. {
  1116. if(gNvodSvcInfo[i].refScvId == refSerID)
  1117. {
  1118. for(j = 0;j<gNvodSvcInfo[i].shiftSvcNum;j++)
  1119. {
  1120. if(gNvodSvcInfo[i].shiftSvc[j].svcId ==serID)
  1121. {
  1122. *nTsId = gNvodSvcInfo[i].shiftSvc[j].tsId;
  1123. return TRUE;
  1124. }
  1125. }
  1126. }
  1127. }
  1128. return FALSE;
  1129. }
  1130. INT32 KB_NVODGetClassNum(void)
  1131. {
  1132. return gNvodRefSvcNum;
  1133. }
  1134. char *KB_NVODGetClassName(INT32 index)
  1135. {
  1136. if(index<0 || index>=gNvodRefSvcNum)
  1137. {
  1138. return NULL;
  1139. }
  1140. return (char *)gNvodSvcInfo[index].refScvName;
  1141. }
  1142. UINT16 KB_NVODGetClassRefSvc(INT32 index)
  1143. {
  1144. if(index<0 || index>=gNvodRefSvcNum)
  1145. {
  1146. return (UINT16)-1;
  1147. }
  1148. return gNvodSvcInfo[index].refScvId;
  1149. }
  1150. void KB_NVODSetNewFlag(BOOL bFlag)
  1151. {
  1152. gNewFlag = bFlag;
  1153. }
  1154. BOOL KB_NVODGetNewFlag(void)
  1155. {
  1156. return gNewFlag;
  1157. }
  1158. void KB_NVODSetPrgEnd(time_t tTime)
  1159. {
  1160. gPrgEndTime = tTime;
  1161. }
  1162. time_t KB_NVODGetPrgEnd(void)
  1163. {
  1164. return gPrgEndTime;
  1165. }
  1166. static void KD_NVODHandleEitSch(KB_OSPMsgNode *pInMsg)
  1167. {
  1168. UINT16 time_shifted_service_id = 0xffff;
  1169. UINT16 reference_Service_id = 0xffff;
  1170. UINT16 shiftSvcNum;
  1171. UINT32 i,j;
  1172.     UINT32   NullDataTsNum = (UINT32)(-1);
  1173. KB_OSPMsgNode message;
  1174. //KB_DMDTunerParameters    ts;
  1175.     KB_DMDTunerParameters    *pTsPara = NULL;
  1176. time_shifted_service_id = (UINT16)pInMsg->Word3;
  1177. for(i=0; i<gNvodRefSvcNum; i++)
  1178. {
  1179.     shiftSvcNum = gNvodSvcInfo[i].shiftSvcNum;
  1180. for(j=0; j<shiftSvcNum; j++)
  1181. {
  1182. if (time_shifted_service_id == gNvodSvcInfo[i].shiftSvc[j].svcId)
  1183. {
  1184. reference_Service_id = gNvodSvcInfo[i].refScvId;
  1185. break;
  1186. }
  1187. }
  1188. if (reference_Service_id != 0xffff)
  1189. {
  1190. break;
  1191. }
  1192. }
  1193. for(i=0; i<KB_NVOD_MAX_REF; i++)
  1194. {
  1195. if (gRecieveState[i].refScvId == reference_Service_id)
  1196. {
  1197. gRecieveState[i].recvSvcNum++;                  
  1198. break;
  1199. }
  1200. }
  1201. if( gRecieveState[i].recvSvcNum == gRecieveState[i].shiftSvcNum)
  1202. {
  1203.      gArriveNum++;
  1204.     //printf("nKD_NVODHandleEitSch::gArriveNum++, gArriveNum(%d), gSvcNum(%d)n", 
  1205.         //        gArriveNum, gSvcNum);
  1206. }
  1207. if((UINT32)gArriveNum+ (UINT32)gTimeOutNum == gSvcNum)
  1208.     {
  1209. KD_NVODStopAllSch();
  1210. #if 1
  1211. message.Word1 = MOD_NVOD;
  1212. message.Word2 = KB_NVOD_OVER;
  1213. message.Word3 = 0;
  1214. message.Word4 = 0;
  1215. KB_MENUTranslateMsg(&message);
  1216. #endif
  1217.         //printf("nKD_NVODHandleEitSch::gArriveNum == gSvcNumn");
  1218.         
  1219.         switch(gNvodEitSchTableSwitchFlag)
  1220.         {
  1221.             //增加对表0x51的处理
  1222.             case KB_EIT_SCHEDULE_CURRENT_TS_TABLE_DEFAULT:
  1223. #if 0
  1224.                 //printf("nKD_NVODHandleEitSch::EIT_SCHEDULE_DONE 0x50n");
  1225.                 {
  1226.                     gNvodEitSchTableSwitchFlag = KB_EIT_SCHEDULE_CURRENT_TS_TABLE_0X51;
  1227.                     gArriveNum = 0;
  1228.              gTimeOutNum = 0;
  1229.                     for(i = 0; i < gNvodRefSvcNum; i ++)
  1230.              {
  1231.              gRecieveState[i].recvSvcNum = 0;
  1232.              }
  1233.                     if (FALSE == gatNvod[CurrentSearchTsNum].SearchCompleteFlag)
  1234.                     {
  1235.                         for(i = 0; i <gNvodRefSvcNum; i++)
  1236.                      {
  1237.                      if ((gNvodSvcInfo[i].freq*100) == gatNvod[CurrentSearchTsNum].TsPara.frequency)
  1238.                      {
  1239.                                 for (j = 0; j < gNvodSvcInfo[i].shiftSvcNum; j++)
  1240.                                 {
  1241.                               KD_NVODGetSchTimeShift(gNvodSvcInfo[i].shiftSvc[j].tsId, 
  1242.                                                      gNvodSvcInfo[i].shiftSvc[j].svcId, 
  1243.                                                      KB_SI_EIT_CURRENT_TS_FOR_0x51_table);
  1244.                                 }
  1245.                      }
  1246.                         }
  1247.                     }
  1248.                 }
  1249.                 break;
  1250.             //当前流0x50、0x51搜索完成, 首次启动各个其他流的搜索, 先找0x60
  1251.             case KB_EIT_SCHEDULE_CURRENT_TS_TABLE_0X51:
  1252. #endif
  1253.                 //printf("nKD_NVODHandleEitSch::EIT_SCHEDULE_DONE 0x51n");
  1254.                 {
  1255.                      gatNvod[CurrentSearchTsNum].SearchCompleteFlag = TRUE;
  1256. #if 0
  1257.                     message.Word1 = MOD_NVOD;
  1258.                     message.Word2 = KB_NVOD_OVER;
  1259.                     message.Word3 = 0;
  1260.                     message.Word4 = 0;
  1261.                     KB_MENUTranslateMsg(&message);
  1262. #endif        
  1263.                     NullDataTsNum = KB_NVOD_GetNullSchTsNum();
  1264.                     //用户正在播放本频点节目时,不切换频点, 只搜索本频点数据
  1265.                     if (NVOD_Play != gPrgPlayStatus
  1266.                         && NullDataTsNum < KB_NVOD_MAX_TS_NUM)
  1267.                     {
  1268.                         //启动下一个其他流的时移事件搜索
  1269.                         KD_NVODStopAllPF();
  1270.                         KB_DMDDropSignal();
  1271.                         pTsPara = KB_NVOD_GetTsParaFromTsSequence(NullDataTsNum);
  1272.                         if (NULL == pTsPara)
  1273.                         {
  1274.                             printf("nKD_NVODHandleEitSch::KB_NVOD_GetTsParaFromTsSequence error!n");
  1275.                             return;
  1276.                         }
  1277.                         KB_DMDConnectSignal(pTsPara);
  1278.                         KB_OSPTaskDelay(50);
  1279.                         KB_NVODGetEitSch(NullDataTsNum);
  1280.                     }
  1281.                     else
  1282.                     {
  1283.                      KB_OSPMsgNode movie_msg;
  1284. movie_msg.Word1 = KB_MOVIE_NVOD_TO_MOVIE;
  1285. kb_machblue_task_post(&movie_msg);
  1286.                         KB_TimerDisable(EitSrhTimer);
  1287.                         printf("nKD_NVODHandleEitSch::关闭定时期 EitSrhTimer");
  1288.                          printf("nKD_NVODHandleEitSch::没有其他流SCHn");
  1289.                     }
  1290.                 }
  1291.                 break;
  1292. //目前流程下面的代码不会执行到
  1293. #if 0
  1294.             //启动0x61的搜索
  1295.             case KB_EIT_SCHEDULE_OTHER_TS_TABLE_DEFAULT:
  1296.                 printf("nKD_NVODHandleEitSch::EIT_SCHEDULE_DONE 0x60n");
  1297.                 {
  1298.                     gNvodEitSchTableSwitchFlag = KB_EIT_SCHEDULE_OTHER_TS_TABLE_0X61;
  1299.                     gArriveNum = 0;
  1300.              gTimeOutNum = 0;
  1301.                     for(i = 0; i < gNvodRefSvcNum; i ++)
  1302.              {
  1303.              gRecieveState[i].recvSvcNum = 0;
  1304.              }
  1305.                     
  1306.                     for(i = 0; i <gNvodRefSvcNum; i++)
  1307.                  {
  1308.                  if ((gNvodSvcInfo[i].freq*100) == gatNvod[CurrentSearchTsNum].TsPara.frequency
  1309.                             && gatNvod[CurrentSearchTsNum].SearchCompleteFlag == FALSE)
  1310.                  {
  1311.                             for (j = 0; j < gNvodSvcInfo[i].shiftSvcNum; j++)
  1312.                             {
  1313.                           KD_NVODGetSchTimeShift(gNvodSvcInfo[i].shiftSvc[j].tsId, 
  1314.                                                  gNvodSvcInfo[i].shiftSvc[j].svcId, 
  1315.                                                  KB_SI_EIT_OTHER_TS_FOR_0x61_table);
  1316.                             }
  1317.                  }
  1318.                     }
  1319.                 }
  1320.                 break;
  1321.             //非首次启动其他频点的参考事件搜索
  1322.             case KB_EIT_SCHEDULE_OTHER_TS_TABLE_0X61:
  1323.                 printf("nKD_NVODHandleEitSch::EIT_SCHEDULE_DONE 0x61n");
  1324.                 {
  1325.                     gatNvod[CurrentSearchTsNum].SearchCompleteFlag = TRUE;
  1326.                     NullDataTsNum = KB_NVOD_GetNullSchTsNum();
  1327.                     //启动下一个其他流的时移事件搜索
  1328.                     if (NullDataTsNum < KB_NVOD_MAX_TS_NUM)
  1329.                     {
  1330.                         KB_NVODGetEitSch(NullDataTsNum);
  1331.                     }
  1332.                 }
  1333.                 break;
  1334. #endif
  1335.             default:
  1336.                 printf("nKD_NVODHandleEitSch::error!");
  1337.                 break;
  1338.         }
  1339. }
  1340. }
  1341. static INT32 KD_NVODInitTask(void)
  1342. {
  1343.     int i;
  1344.     gNvodPF = KB_OSPMalloc(sizeof(KB_SIEitPF) * KB_SI_MAX_REF_SVC_NUMS);  
  1345.     gNvodPFEvent = KB_OSPMalloc(sizeof(KB_SINVODEitPF) * KB_SI_MAX_REF_SVC_NUMS * KB_SI_EIT_PF_MAX_NVOD_EVENT_NUMBER);
  1346.     if (gNvodPF == NULL)
  1347.     {
  1348.         printf("KD_NVODInitTask gNvodPF == NULLn");
  1349.         return RETFAIL2;
  1350.     }
  1351.     else
  1352.     {
  1353.         for (i = 0; i < KB_SI_MAX_REF_SVC_NUMS; i++)
  1354.         {
  1355.             gNvodPFInfo[i].nTsId        = 0xFFFFFFFF;
  1356.             gNvodPFInfo[i].nEnable      = TRUE;
  1357.             gNvodPFInfo[i].nState       = KB_NVOD_EMPTY;
  1358.             gNvodPFInfo[i].nSvcID   = 0xFFFFFFFF;
  1359.             gNvodPFInfo[i].pPresent = gNvodPF + i;
  1360.             gNvodPFInfo[i].pPresent->NVODEvent = gNvodPFEvent + i * KB_SI_EIT_PF_MAX_NVOD_EVENT_NUMBER;
  1361.             
  1362.         }
  1363.     }
  1364.     
  1365.     //gNvodSchEvent = (KB_SIEitSchTimeShiftNode*)KB_EPGGetMemAddress();
  1366.     gNvodSchEvent = (KB_SIEitSchTimeShiftNode*)KB_OSPMalloc(sizeof(KB_SIEitSchTimeShiftNode) * KB_NVOD_MAX_ShiftSrv_One_Ts * KB_SI_MAX_SHIFT_EVENT_NUM_PER_SERVICE);  
  1367.     for (i = 0; i < KB_NVOD_MAX_ShiftSrv_One_Ts; i++)
  1368.     {
  1369.         gNvodSch[i].nTsId        = 0xFFFFFFFF;
  1370.         gNvodSch[i].nEnable      = TRUE;
  1371.         gNvodSch[i].nState       = KB_NVOD_EMPTY;
  1372.         gNvodSch[i].nSvcID   = 0xFFFFFFFF;
  1373.         gNvodSch[i].nSchInfo.ptTimeShift = gNvodSchEvent + i * KB_SI_MAX_SHIFT_EVENT_NUM_PER_SERVICE;
  1374.     }
  1375.     EitSrhTimer = KB_TimerCreate(KB_TIMER_ONCE,
  1376.                                  (KB_TIMER_FUNC_POINTER)KB_NvodHandleEitSrhTimeOut, 
  1377.                                  NULL);
  1378.     if (KB_TIMER_INVALID_ID == EitSrhTimer)
  1379.     {
  1380.        printf("nKD_NVODInitTask::EitSrhTimer create failed!");
  1381.     }
  1382.         
  1383.     return RETOK;
  1384. }
  1385. static void KB_NvodHandleEitSrhTimeOut(void)
  1386. {
  1387. KB_OSPMsgNode movie_msg;
  1388. KD_NVODStopAllPF();
  1389. KD_NVODStopAllSch();
  1390. movie_msg.Word1 = KB_MOVIE_NVOD_TO_MOVIE;
  1391. kb_machblue_task_post(&movie_msg);
  1392. printf("nKB_NVODGetEitSch::XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
  1393. printf("nKB_NvodHandleEitSrhTimeOut::EIT数据搜索超时");
  1394. return;
  1395. }
  1396. void KD_NVODHandleMsg2(KB_OSPMsgNode *pInMsg)
  1397. {
  1398.     UINT32   NullDataTsNum = (UINT32)(-1);
  1399.     UINT32   CurrentTsNum = (UINT32)(-1);
  1400.     KB_OSPMsgNode msgNode;
  1401.     //KB_SIEitPF *ptEitPf;
  1402.     KB_OSPMsgNode message;
  1403.     KB_DMDTunerParameters  *pTsPara = NULL;
  1404.     
  1405.     switch (pInMsg->Word1)
  1406.     {
  1407.     case MOD_SIPSI:
  1408.         
  1409.         msgNode.Word1 = J_EPG_MODULE;
  1410.         if (pInMsg->Word2 >= KB_SI_MSG_EIT_PF_DONE
  1411.             && pInMsg->Word2 <= KB_SI_MSG_EIT_SCHEDULE_TIMEOUT)
  1412.         {
  1413.             switch (pInMsg->Word2)
  1414.             {
  1415.             case KB_SI_MSG_EIT_PF_DONE: 
  1416.                 //printf("nKD_NVODHandleMsg2::SrvId(%d)n",
  1417.                 //        ((KB_SIEitPF*)pInMsg->Word3)->service_id);
  1418.                 KD_NVODHandlePFOver(pInMsg);
  1419.                 ++CurrentPFCompleteFlag;
  1420.                 if (CurrentSearchTsNum < KB_NVOD_MAX_TS_NUM
  1421.                     && CurrentPFCompleteFlag == gatNvod[CurrentSearchTsNum].RefSrvNum)
  1422.                 {
  1423.                     KD_NVODStopAllPF();
  1424.                     NullDataTsNum = KB_NVOD_GetNullPFTsNum();
  1425.                     //用户正在播放本频点节目时,不切换频点, 只搜索本频点数据
  1426.                     if (NVOD_Play != gPrgPlayStatus
  1427.                         && NullDataTsNum < KB_NVOD_MAX_TS_NUM)
  1428.                     {
  1429.                         //启动下一个Ts的参考事件搜索
  1430.                         KD_NVODStopAllPF();
  1431.                         KB_DMDDropSignal();
  1432.                         pTsPara = KB_NVOD_GetTsParaFromTsSequence(NullDataTsNum);
  1433.                         if (NULL == pTsPara)
  1434.                         {
  1435.                             printf("nKB_NVODGetEitSch::KB_NVOD_GetTsParaFromTsSequence error!n");
  1436.                             return;
  1437.                         }
  1438.                         KB_DMDConnectSignal(pTsPara);
  1439.                         KB_OSPTaskDelay(50);
  1440.                         KB_NVODGetEitPF(NullDataTsNum);
  1441.                     }
  1442.                     //如果所有的参考事件已经搜索完成, 则启动时移事件搜索
  1443.                     else
  1444.                     {
  1445.                         //printf("nKD_NVODHandleMsg2::EIT_PF_DONEn");
  1446.                         message.Word1 = MOD_NVOD;
  1447.              message.Word2 = KB_NVOD_OVER;
  1448.              message.Word3 = 0;
  1449.              message.Word4 = 0;
  1450.              KB_MENUTranslateMsg(&message);
  1451.                         
  1452.                         CurrentTsNum = KB_NVOD_GetCurrentTsNum();
  1453.                         if ((UINT32)(-1) == CurrentTsNum)
  1454.                         {
  1455.                             printf("nKD_NVODHandleMsg2::serious error! KB_NVOD_GetCurrentTsNum fail!n");
  1456.                             return;
  1457.                         }
  1458.                         KB_NVODGetEitSch(CurrentTsNum);
  1459.                     }
  1460.                 }
  1461.                 break;
  1462.             case KB_SI_MSG_EIT_PF_TIMEOUT:
  1463.                 msgNode.Word1 = MOD_NVOD;
  1464.                 msgNode.Word2 = KB_NVOD_PF_TIMEOUT;
  1465.                 msgNode.Word4 = pInMsg->Word4;
  1466.                 KB_NVODHandleMsg(&msgNode);
  1467.                 break;
  1468.                 
  1469.             case KB_SI_MSG_EIT_SCHEDULE_EVENT_DONE:
  1470.                 break;
  1471.                 
  1472.             case KB_SI_MSG_EIT_SCHEDULE_DONE: 
  1473.                 KD_NVODHandleSCHOver(pInMsg);
  1474.                 break;
  1475.             case KB_SI_MSG_EIT_SCHEDULE_TIMEOUT:
  1476.                 msgNode.Word1 = MOD_NVOD;
  1477.                 msgNode.Word2 = KB_NVOD_SCH_TIMEOUT;
  1478.                 msgNode.Word3 = pInMsg->Word4; 
  1479. msgNode.Word4 = 0xFFFFFFFF;
  1480.                 KB_NVODHandleMsg(&msgNode);
  1481.                 break;
  1482.                 
  1483.             default:
  1484.                 break;
  1485.             }           
  1486.         }                
  1487.         
  1488.         break;
  1489.     default:
  1490.         break;
  1491.     }
  1492. }
  1493. static INT32 KD_NVODGetPF(INT32 nTsId, INT32 nSvcID, KB_SIEitTs eTs)
  1494. {    
  1495.     INT32 nReturn, nNumber;
  1496.     nNumber = KD_NVODGetFreePF();
  1497.     if (nNumber == 0xFFFFFFFF)
  1498.     {
  1499.         return RETFIAL1;
  1500.     }
  1501.     nReturn = KB_SIGetEitPF(nSvcID, eTs,
  1502.                                 gNvodPFInfo[nNumber].pPresent,
  1503.                                 gNvodPFInfo[nNumber].pPresent, 
  1504.                                 KB_SI_RECEIVE_ONCE, 
  1505.                                 -1);       
  1506.     if (nReturn != 0)
  1507.     {
  1508.         return RETFIAL1;
  1509.     }
  1510.     else
  1511.     {
  1512.         gNvodPFInfo[nNumber].nTsId      = nTsId;
  1513.         gNvodPFInfo[nNumber].nSvcID = nSvcID;
  1514.         gNvodPFInfo[nNumber].nEnable    = FALSE;
  1515.         gNvodPFInfo[nNumber].nState     = KB_NVOD_RECEIVING;
  1516.         //printf("nKD_NVODGetPF::RefSrvId(%d), eTs(%d)n", nSvcID, eTs);
  1517.         return RETOK;
  1518.     }
  1519. }
  1520. static INT32 KD_NVODGetSchTimeShift(INT32 nTsId, 
  1521.                                          INT32 nSvcID, 
  1522.                                          KB_SIEitTs eTs)
  1523. {
  1524.     INT32 nNumber, nReturn;
  1525.     nNumber = KD_NVODGetFreeSch();
  1526.     if (nNumber == 0xFFFFFFFF)
  1527.     {
  1528.         return RETFIAL1;
  1529.     }
  1530.     
  1531.     nReturn = KB_SIGetEITSCHShift(nSvcID, 
  1532.                                     eTs, 
  1533.                                     &gNvodSch[nNumber].nSchInfo);
  1534.     if (nReturn != 0)
  1535.     {
  1536.         return RETFIAL1;
  1537.     }
  1538.     else
  1539.     {
  1540.         gNvodSch[nNumber].nTsId      = nTsId;
  1541.         gNvodSch[nNumber].nSvcID     = nSvcID;
  1542.         gNvodSch[nNumber].nEnable    = FALSE;
  1543.         gNvodSch[nNumber].nState     = KB_NVOD_RECEIVING;
  1544.         return RETOK;
  1545.     }
  1546. }
  1547. INT32 KD_NVODStopAllPF(void)
  1548. {
  1549.     int i;
  1550.     //对于KB_SI_STOP_ALL的情况, 第二个参数是不起作用的
  1551.     KB_SIStopEitPF(KB_SI_STOP_ALL, KB_SI_EIT_CURRENT_TS);    
  1552.         
  1553.     for (i = 0; i < KB_SI_MAX_REF_SVC_NUMS; i++)
  1554.     {
  1555.         KD_NVODResetPF(i);
  1556.     }
  1557.     return RETOK;
  1558. }
  1559. INT32 KD_NVODStopAllSch(void)
  1560. {
  1561.     int i;
  1562.     KB_SIStopEitSCHShift(KB_SI_STOP_ALL, KB_SI_EIT_CURRENT_TS);    
  1563.         
  1564.     for (i = 0; i < KB_NVOD_MAX_REF; i++)
  1565.     {
  1566.         KD_ResetSCH(i);
  1567.     }
  1568.     return RETOK;
  1569. }
  1570. static INT32 KD_NVODGetFreePF(void)
  1571. {
  1572.     INT32 i, nNumber;
  1573.     nNumber = 0xFFFFFFFF;
  1574.     for (i = 0; i < KB_SI_MAX_REF_SVC_NUMS; i++)
  1575.     {
  1576.         if (gNvodPFInfo[i].nEnable == TRUE)
  1577.         {
  1578.             nNumber = i;
  1579.             break;
  1580.         }
  1581.     }
  1582.     return nNumber;
  1583. }
  1584. static INT32 KD_NVODGetFreeSch(void)
  1585. {
  1586.     INT32 i, nNumber;
  1587.     nNumber = 0xFFFFFFFF;
  1588.     for (i = 0; i < KB_NVOD_MAX_ShiftSrv_One_Ts; i++)
  1589.     {
  1590.         if (gNvodSch[i].nEnable == TRUE)
  1591.         {
  1592.             nNumber = i;
  1593.             break;
  1594.         }
  1595.     }
  1596.     return nNumber;
  1597. }
  1598. static INT32 KD_NVODResetPF(INT32 nNumber)
  1599. {
  1600.     gNvodPFInfo[nNumber].nTsId        = 0xFFFFFFFF;    
  1601.     gNvodPFInfo[nNumber].nEnable      = TRUE;
  1602.     gNvodPFInfo[nNumber].nState       = KB_NVOD_EMPTY;
  1603.     gNvodPFInfo[nNumber].nSvcID   = 0xFFFFFFFF;    
  1604.     
  1605.     return RETOK;
  1606. }
  1607. static INT32 KD_ResetSCH(INT32 nNumber)
  1608. {
  1609.     gNvodSch[nNumber].nEnable      = TRUE;
  1610.     gNvodSch[nNumber].nState       = KB_NVOD_EMPTY;
  1611.     gNvodSch[nNumber].nSvcID   = 0xFFFFFFFF;
  1612.     gNvodSch[nNumber].nSchInfo.num = 0;
  1613.     gNvodSch[nNumber].nSchInfo.service_id = 65535;    
  1614.     return RETOK;
  1615. }
  1616. static INT32 KD_NVODHandlePFOver(KB_OSPMsgNode *pInMsg)
  1617. {
  1618.     KB_SIEitPF *ptEitPf;
  1619.     KB_SINVODEitPF *ptNvod;
  1620.     KB_OSPMsgNode msgNode;
  1621.     int i;
  1622.     
  1623.     ptEitPf = (KB_SIEitPF*)pInMsg->Word3;
  1624.     for (i = 0; i < ptEitPf->NVODEventNum; i++)
  1625.     {
  1626.         ptNvod = ptEitPf->NVODEvent + i;
  1627.         KB_NVODAddRefSvc(0, 
  1628.                           ptNvod->event_id, 
  1629.                           ptNvod->service_id, 
  1630.                           (char*)ptNvod->chinese.event_name,
  1631.                           (char*)ptNvod->chinese.text,
  1632.                           (UINT16)ptNvod->duration);        
  1633.     }
  1634.     msgNode.Word1 = MOD_NVOD;
  1635.     msgNode.Word2 = KB_NVOD_PF_OVER;
  1636.     msgNode.Word3 = ptEitPf->service_id;
  1637.     KB_NVODHandleMsg(&msgNode);
  1638.     
  1639.     return RETOK;
  1640. }
  1641. static INT32 KD_NVODHandleSCHOver(KB_OSPMsgNode *pInMsg)
  1642. {
  1643.     KB_SIEitSchTimeShift *ptShift;
  1644.     KB_SIEitSchTimeShiftNode *ptShiftEvent;
  1645.     KB_OSPMsgNode msgNode;
  1646.     int i;
  1647.     
  1648.     ptShift = (KB_SIEitSchTimeShift*)pInMsg->Word3;
  1649.     //printf("nKD_NVODHandleSCHOver::SrvId(%d), num(%d), RefSrvId(%d)",
  1650.     //        ptShift->service_id, ptShift->num, (ptShift->ptTimeShift)->reference_service_id);
  1651.     
  1652.     for (i = 0; i < ptShift->num; i++)
  1653.     {
  1654.         ptShiftEvent = ptShift->ptTimeShift + i;
  1655.         KB_NVODAddTime(ptShift->service_id, 
  1656.                     ptShiftEvent->reference_service_id,
  1657.                     ptShiftEvent->event_id,
  1658.                     ptShiftEvent->reference_event_id,
  1659.                     ptShiftEvent->start_time);
  1660.     }
  1661.     msgNode.Word1 = MOD_NVOD;
  1662.     msgNode.Word2 = KB_NVOD_SCH_OVER;
  1663.     msgNode.Word3 = ptShift->service_id; 
  1664.     if (ptShift->num == 0)
  1665.     {
  1666.         msgNode.Word4 = 0xFFFFFFFF;
  1667.     }
  1668.     else
  1669.     {
  1670.         msgNode.Word4 = ptShift->ptTimeShift->reference_service_id; 
  1671.     }
  1672.     KB_NVODHandleMsg(&msgNode);
  1673.     
  1674.     return RETOK;
  1675. }
  1676. INT32 KB_NvodGetRefEventNum(UINT32 TsSequence)
  1677. {
  1678.     return gatNvod[TsSequence].RefEventNum;
  1679. }
  1680. INT32 KB_NvodGetFreNum(UINT32 TsSequence)
  1681. {
  1682.     int i, count = 0;
  1683.     
  1684.     for (i = 0; i < KB_NVOD_MAX_TS_NUM; i++)
  1685.     {
  1686.         if (gatNvod[i].TsPara.frequency != 0)
  1687.         {
  1688.             count++;
  1689.         }
  1690.     }
  1691.     
  1692.     return count;
  1693. }
  1694. KB_NVOD_Info *KB_NvodGetRefNodeHead(void)
  1695. {
  1696.     return gatNvod;
  1697. }
  1698. #if 0
  1699. UINT16 KB_NvodGetTsIdFromRefsrvIdSrvId(UINT16 refSerID,UINT16 SerID)
  1700. {
  1701.     int i = 0, j = 0;
  1702.     UINT16   ret = 0;
  1703.         
  1704.     for (i = 0; i <gNvodRefSvcNum; i++)
  1705. {
  1706. if (gNvodSvcInfo[i].refScvId == refSerID)
  1707. {
  1708.             for (j = 0; j < gNvodSvcInfo[i].shiftSvcNum; j++)
  1709.             {
  1710.          if (gNvodSvcInfo[i].shiftSvc[j].svcId == SerID)
  1711.              {
  1712.                  ret = gNvodSvcInfo[i].shiftSvc[j].tsId;
  1713.                     break;
  1714.              }
  1715.             }
  1716. }
  1717. }
  1718.     return ret;
  1719. }
  1720. #endif
  1721. KB_NVODStruct *KB_NVOD_GetTsIndexFromCur(int CursorIndex)
  1722. {
  1723.     int i, j, count;
  1724.     KB_NVOD_Info       *pstNvodNodeHead;
  1725.     if (CursorIndex < 0)
  1726.     {
  1727.         printf("nKB_NVOD_GetTsIndexFromCur::input(%d) error!", CursorIndex);
  1728.         return NULL;
  1729.     }
  1730.     count = (int)CursorIndex;
  1731.     pstNvodNodeHead = KB_NvodGetRefNodeHead();
  1732.     
  1733.     for (i = 0; i < KB_NVOD_MAX_TS_NUM; i++)
  1734.     {
  1735.         for(j = 0; j < KB_NvodGetRefEventNum(i); j++)
  1736.         {
  1737.             if (--count < 0)
  1738.             {
  1739.                 return &(pstNvodNodeHead[i].RefEventData[j]);
  1740.             }
  1741.         }
  1742.     }
  1743.     return NULL;
  1744. }
  1745. UINT32 KB_NVOD_GetCurrentTsNum(void)
  1746. {
  1747.     int i;
  1748.     for(i = 0; i < KB_NVOD_MAX_TS_NUM; i++)
  1749.     {
  1750.         if (TRUE == gatNvod[i].CurrentTsFlag)
  1751.         {
  1752.             return i;
  1753.         }
  1754.     }
  1755.     return (UINT32)(-1);
  1756. }
  1757. static UINT32 KB_NVOD_GetNullPFTsNum(void)
  1758. {
  1759.     UINT8 i;
  1760.     for(i = 0; i < KB_NVOD_MAX_TS_NUM; i++)
  1761.     {
  1762.         if (0 != gatNvod[i].TsPara.frequency
  1763.             && FALSE == gatNvod[i].SearchStartFlag
  1764.             && FALSE == gatNvod[i].SearchCompleteFlag)
  1765.         {
  1766.             return i;
  1767.         }
  1768.     }
  1769.     return (UINT32)(-1);
  1770. }
  1771. static UINT32 KB_NVOD_GetNullSchTsNum(void)
  1772. {
  1773.     UINT8 i;
  1774.     for(i = 0; i < KB_NVOD_MAX_TS_NUM; i++)
  1775.     {
  1776.         if (0 != gatNvod[i].TsPara.frequency
  1777.             && TRUE == gatNvod[i].SearchStartFlag
  1778.             && FALSE == gatNvod[i].SearchCompleteFlag)
  1779.         {
  1780.             return i;
  1781.         }
  1782.     }
  1783.     return (UINT32)(-1);
  1784. }
  1785. static void KB_NVOD_ResetTsData(UINT32 TsSequence)
  1786. {
  1787.     KD_NVODStopAllPF();
  1788.     KD_NVODStopAllSch();
  1789.     memset(gatNvod[TsSequence].RefEventData, 
  1790.            0, 
  1791.            (sizeof(KB_NVODStruct)*KB_NVOD_MAX_RefEvent_One_Ts));
  1792.     gatNvod[TsSequence].RefSrvNum = 0;
  1793.     gatNvod[TsSequence].RefEventNum = 0;
  1794.     gatNvod[TsSequence].SearchStartFlag = FALSE;
  1795. gatNvod[TsSequence].SearchCompleteFlag = FALSE;
  1796.     return;
  1797. }
  1798. UINT32 KB_NVOD_GetTsSequenceFromFrequency(UINT32  frequency)
  1799. {
  1800.     int i;
  1801.     for(i = 0; i < KB_NVOD_MAX_TS_NUM; i++)
  1802.     {
  1803.         if (frequency == gatNvod[i].TsPara.frequency)
  1804.         {
  1805.             return i;
  1806.         }
  1807.     }
  1808.     return (UINT32)(-1);
  1809. }
  1810. KB_DMDTunerParameters *KB_NVOD_GetTsParaFromTsSequence(UINT32  TsSequence)
  1811. {
  1812.     if (TsSequence < KB_NVOD_MAX_TS_NUM
  1813.         && 0 != gatNvod[TsSequence].TsPara.frequency)
  1814.     {
  1815.         return &(gatNvod[TsSequence].TsPara);
  1816.     }
  1817.     return NULL;
  1818. }
  1819. static INT32 KB_NVOD_SetCurrentTsPara(KB_DMDTunerParameters TsPara)
  1820. {
  1821.     UINT8  i;
  1822.     UINT32 preTsNum, NowTsNum;
  1823.     preTsNum = KB_NVOD_GetCurrentTsNum();
  1824.     
  1825.     //将原当前流标志修改;如果是第一次搜索,当前流还没有设置
  1826.     if ((UINT32)(-1) != preTsNum)
  1827.     {
  1828.         gatNvod[preTsNum].CurrentTsFlag = FALSE;
  1829.     }
  1830.     for (i = 0; i < KB_NVOD_MAX_TS_NUM; i++)
  1831.     {
  1832.         if (gatNvod[i].TsPara.frequency == TsPara.frequency)
  1833.         {
  1834.             //该ts流已经申请了gatNvod,修改当前流标志后return
  1835.             gatNvod[i].CurrentTsFlag = TRUE;
  1836.             return RET_OK;
  1837.         }
  1838.     }
  1839.     //该ts流未申请gatNvod
  1840.     NowTsNum = KB_NVOD_AllocategatNvodInfo(TsPara.frequency);
  1841.     
  1842.     if (KB_NVOD_ALLOCATE_FAIL == NowTsNum)
  1843.     {
  1844.         printf("nKB_EPG_SetCurrentTsNum::KB_NVOD_AllocategatNvodInfo fail!n");
  1845.         return RET_FAIL;
  1846.     }
  1847.     //理论上是不可能出现的情况, 因为前面已处理已申请的情况
  1848.     else if (KB_NVOD_ALLOCATE_REPEAT == NowTsNum)
  1849.     {
  1850.         for (i = 0; i < KB_NVOD_MAX_TS_NUM; i++)
  1851.         {
  1852.             if (gatNvod[i].TsPara.frequency == TsPara.frequency)
  1853.             {
  1854.                 gatNvod[i].CurrentTsFlag = TRUE;
  1855.                 return RET_OK;
  1856.             }
  1857.         }
  1858.     }
  1859.     else
  1860.     {
  1861.      memcpy(&gatNvod[NowTsNum].TsPara, &TsPara, sizeof(KB_DMDTunerParameters));
  1862.         gatNvod[NowTsNum].CurrentTsFlag = TRUE;
  1863.         return RET_OK;
  1864.     }
  1865.     
  1866.     return RET_OK;
  1867. }
  1868. static UINT8 KB_NVOD_AllocategatNvodInfo(UINT32 frequency)
  1869. {
  1870.     UINT8 i, ret = KB_NVOD_ALLOCATE_FAIL;
  1871.     for(i = 0; i < KB_NVOD_MAX_TS_NUM; i++)
  1872.     {
  1873.         if (frequency == gatNvod[i].TsPara.frequency)
  1874.         {
  1875.             return KB_NVOD_ALLOCATE_REPEAT;
  1876.         }
  1877.     }
  1878.     
  1879.     for (i = 0; i < KB_NVOD_MAX_TS_NUM; i++)
  1880.     {
  1881.         if (0 == gatNvod[i].TsPara.frequency)
  1882.         {
  1883.             ret = i;
  1884.             break;
  1885.         }
  1886.     }
  1887.     return ret;
  1888. }
  1889. void KB_NVOD_FreegatNvodInfo(UINT32 frequency)
  1890. {
  1891.     UINT8 i;
  1892.     
  1893.     for (i = 0; i < KB_NVOD_MAX_TS_NUM; i++)
  1894.     {
  1895.         if (frequency == gatNvod[i].TsPara.frequency)
  1896.         {
  1897.             memset(&gatNvod[i], 0, sizeof(KB_NVOD_Info));
  1898.      gatNvod[i].CurrentTsFlag = FALSE;
  1899.      gatNvod[i].SearchCompleteFlag = FALSE;
  1900.             return;
  1901.         }
  1902.     }
  1903.     return;
  1904. }
  1905. BOOL KB_NVOD_IsThisTsShallSearched(UINT32 frequency)
  1906. {
  1907.     UINT8 i;
  1908.     for(i = 0; i < KB_NVOD_MAX_TS_NUM; i++)
  1909.     {
  1910.         if (frequency == gatNvod[i].TsPara.frequency)
  1911.         {
  1912.             return gatNvod[i].SearchCompleteFlag;
  1913.         }
  1914.     }
  1915.     printf("nKB_NVOD_IsThisTsShallSearch::input frequency error!n");
  1916.     return FALSE;
  1917. }
  1918. BOOL KB_NVOD_IsTsShallSearched(void)
  1919. {
  1920.     UINT8 i;
  1921.     //UINT8 flag = 0xff; 
  1922.     for(i = 0; i < KB_NVOD_MAX_TS_NUM; i++)
  1923.     {
  1924.         if (0 != gatNvod[i].TsPara.frequency
  1925.             && TRUE == gatNvod[i].SearchStartFlag
  1926.             && TRUE == gatNvod[i].SearchCompleteFlag)
  1927.         {
  1928.             
  1929.         }
  1930.         else
  1931.         {
  1932.             return TRUE;
  1933.         }
  1934.     }
  1935.     return FALSE;
  1936. }
  1937. void KB_NVOD_GetValidFreInfo(UINT8 *pNum, KB_NVOD_Info *Address[])
  1938. {
  1939.     UINT8 i = 0;
  1940.     if (NULL == pNum || NULL == Address)
  1941.     {
  1942.         printf("nKB_NVOD_GetValidFreInfo::input err!");
  1943.         return;
  1944.     }
  1945. #if 1
  1946.     //刷新播放时间列表,干掉所有过期的ShiftEvent
  1947.     if (TRUE != KB_NVOD_RefreshSchEvent())
  1948.     {
  1949.         printf("nKB_NVOD_GetValidFreInfo::refresh ShiftEvent failed.");
  1950.     }
  1951. #endif
  1952.     *pNum = 0;
  1953.     
  1954.     for(i = 0; i < KB_NVOD_MAX_TS_NUM; i++)
  1955.     {
  1956.         if (0 != gatNvod[i].TsPara.frequency)
  1957.         {
  1958.             Address[(*pNum)] = gatNvod + i;
  1959.             (*pNum)++;      
  1960.         }
  1961.     }
  1962.     return;
  1963. }
  1964. BOOL KB_NVOD_PlayForGrap(int nPrgCurRow, int nSchCurRow)
  1965. {
  1966.     UINT32 i = 0;
  1967.     UINT8 TsIndex = 0xff, RefEventIndex = 0xff;
  1968.     
  1969.     KB_DMDTunerParameters *pTsPara = NULL;
  1970.     //参数自减的原因是: 界面传入的RefEvent条目(即nPrgCurRow)、SchEvent条目(即nSchCurRow)编号从1开始
  1971.     nPrgCurRow--;
  1972.     nSchCurRow--;
  1973.     if (nPrgCurRow < 0 || nSchCurRow < 0)
  1974.     {
  1975.         printf("nKB_NVOD_PlayForGrap::input error!");
  1976.         return FALSE;
  1977.     }
  1978.     for (i = 0; i < KB_NVOD_MAX_TS_NUM; i++)
  1979.     {
  1980.         if (0 != gatNvod[i].TsPara.frequency)
  1981.         {
  1982.             nPrgCurRow -= (int)(KB_NvodGetRefEventNum(i));
  1983.         }
  1984.         if (nPrgCurRow < 0)
  1985.         {
  1986.             TsIndex = (UINT8)i;
  1987.             RefEventIndex = (UINT8)(nPrgCurRow + KB_NvodGetRefEventNum(i));
  1988.             break;
  1989.         }
  1990.     }
  1991.     if (TsIndex >= KB_NVOD_MAX_TS_NUM || RefEventIndex >= KB_NVOD_MAX_RefEvent_One_Ts)
  1992.     {
  1993.         printf("nKB_NVOD_PlayForGrap::TsIndex or RefEventIndex error!n");
  1994.         return FALSE;
  1995.     }
  1996.         
  1997.     if (TsIndex != KB_NVOD_GetCurrentTsNum())
  1998.     {
  1999.         printf("nKB_NVOD_PlayForGrap::Ts switched!n");
  2000.         KD_NVODStopAllPF();
  2001.         KD_NVODStopAllSch();
  2002.         KB_DMDDropSignal();
  2003.         pTsPara = KB_NVOD_GetTsParaFromTsSequence(TsIndex);
  2004.         if (NULL == pTsPara)
  2005.         {
  2006.             printf("nKB_NVOD_PlayForGrap::KB_NVOD_GetTsParaFromTsSequence error!n");
  2007.             return FALSE;
  2008.         }
  2009.         KB_DMDConnectSignal(pTsPara);
  2010.         KB_OSPTaskDelay(50);
  2011.         KB_NVODGetEit();
  2012.     }
  2013.     KD_NVODStartPlay((gatNvod[TsIndex].RefEventData[RefEventIndex].TimeNode[nSchCurRow].tsID), 
  2014.                        (gatNvod[TsIndex].RefEventData[RefEventIndex].TimeNode[nSchCurRow].SerID));
  2015.     return TRUE;
  2016. }
  2017. const KB_NVODStruct *KB_NVOD_GetCurRefEventInfoForGrap(int nPrgCurRow)
  2018. {
  2019.     UINT32 i = 0;
  2020.     UINT8 TsIndex = 0xff, RefEventIndex = 0xff;
  2021.     //参数自减的原因是: 界面传入的RefEvent条目(即nPrgCurRow)、SchEvent条目(即nSchCurRow)编号从1开始
  2022.     nPrgCurRow--;
  2023.     if (nPrgCurRow < 0)
  2024.     {
  2025.         printf("nKB_NVOD_GetCurRefEventInfoForGrap::input error!");
  2026.         return NULL;
  2027.     }
  2028.     for (i = 0; i < KB_NVOD_MAX_TS_NUM; i++)
  2029.     {
  2030.         if (0 != gatNvod[i].TsPara.frequency)
  2031.         {
  2032.             nPrgCurRow -= (int)(KB_NvodGetRefEventNum(i));
  2033.         }
  2034.         if (nPrgCurRow < 0)
  2035.         {
  2036.             TsIndex = (UINT8)i;
  2037.             RefEventIndex = (UINT8)(nPrgCurRow + KB_NvodGetRefEventNum(i));
  2038.             break;
  2039.         }
  2040.     }
  2041.     if (TsIndex >= KB_NVOD_MAX_TS_NUM || RefEventIndex >= KB_NVOD_MAX_RefEvent_One_Ts)
  2042.     {
  2043.         printf("nKB_NVOD_GetCurRefEventInfoForGrap::TsIndex or RefEventIndex error!n");
  2044.         return NULL;
  2045.     }
  2046.         
  2047.     
  2048.     return &(gatNvod[TsIndex].RefEventData[RefEventIndex]);
  2049. }
  2050. //刷新已搜索好的每个NVOD参考时间的ShiftEvent列表, 干掉所有过期的ShiftEvent
  2051. BOOL KB_NVOD_RefreshSchEvent(void)
  2052. {
  2053.     UINT16  i = 0;          //频点循环参数
  2054.     UINT16  j = 0;          //参考事件循环参数
  2055.     UINT16  k = 0;          //ShiftEvent循环参数
  2056.     UINT16  count = 0;      //计算过期的ShiftEvent个数
  2057.     
  2058.     
  2059.     if (0 == gNvodTime)
  2060.     {
  2061.         printf("nKB_NVOD_RefreshSchEvent::gNvodTime 未获取");
  2062.         return FALSE;
  2063.     }
  2064.     for(i = 0; i < KB_NVOD_MAX_TS_NUM; i++)
  2065.     {
  2066.         //该频点没有参考事件,则察看下一频点信息
  2067.         if (0 == gatNvod[i].RefEventNum)
  2068.         {
  2069.             continue;
  2070.         }
  2071.         for (j = 0; j < gatNvod[i].RefEventNum; j++)
  2072.         {
  2073.             //本参考事件无时移事件,则察看本频点的下一个参考事件信息
  2074.             if (0 == gatNvod[i].RefEventData[j].TimeNum)
  2075.             {
  2076.                 continue;
  2077.             }
  2078.             //对频点i的第j个参考事件的ShiftEvent列表, 按时间先后进行排序
  2079.             KB_NVOD_DirectInsertSort(gatNvod[i].RefEventData[j].TimeNode,
  2080.                                          gatNvod[i].RefEventData[j].TimeNum);
  2081.             count = 0;
  2082.             //计算目前总共有几个ShiftEvent过期
  2083.             for (k = 0; k < gatNvod[i].RefEventData[j].TimeNum; k++)
  2084.             {
  2085.                 if (gatNvod[i].RefEventData[j].TimeNode[k].startTime + gatNvod[i].RefEventData[j].durTime < gNvodTime)
  2086.                 {
  2087.                     count++;
  2088.                 }
  2089.                 else
  2090.                 {
  2091.                     break;
  2092.                 }
  2093.             }
  2094.             if (count > 0)
  2095.             {
  2096.                 for (k = 0; (k + count) < gatNvod[i].RefEventData[j].TimeNum; k++)
  2097.                 {
  2098.                     gatNvod[i].RefEventData[j].TimeNode[k].tsID      = gatNvod[i].RefEventData[j].TimeNode[(k+count)].tsID;
  2099.                     gatNvod[i].RefEventData[j].TimeNode[k].SerID     = gatNvod[i].RefEventData[j].TimeNode[(k+count)].SerID;
  2100.                     gatNvod[i].RefEventData[j].TimeNode[k].EvtID     = gatNvod[i].RefEventData[j].TimeNode[(k+count)].EvtID;
  2101.                     gatNvod[i].RefEventData[j].TimeNode[k].startTime = gatNvod[i].RefEventData[j].TimeNode[(k+count)].startTime;
  2102.                 }
  2103.             }
  2104.             gatNvod[i].RefEventData[j].TimeNum -= count;
  2105.         }
  2106.     }
  2107.     return TRUE;
  2108. }
  2109. //直接插入排序, 在基本有序和SIZE很小时是最好的排序方法
  2110. static void KB_NVOD_DirectInsertSort(KB_NVODTime TimeNode[], UINT16 TimeNum)
  2111. {
  2112.     int i = 0, j = 0;
  2113.     KB_NVODTime tmp;
  2114.     if (0 == TimeNum || TimeNum > 500 || NULL == TimeNode)
  2115.     {
  2116.         printf("nKB_NVOD_DirectInsertSort::input TimeNum(%d) error.", TimeNum);
  2117.         return;
  2118.     }
  2119.     for (i = 1; i < TimeNum; i++)
  2120.     {
  2121.         if (TimeNode[i].startTime < TimeNode[i-1].startTime)
  2122.         {
  2123.             tmp.tsID        = TimeNode[i].tsID;
  2124.             tmp.SerID       = TimeNode[i].SerID;
  2125.             tmp.EvtID       = TimeNode[i].EvtID;
  2126.             tmp.startTime   = TimeNode[i].startTime;
  2127.             TimeNode[i].tsID        = TimeNode[i-1].tsID;        
  2128.             TimeNode[i].SerID       = TimeNode[i-1].SerID;       
  2129.             TimeNode[i].EvtID       = TimeNode[i-1].EvtID;       
  2130.             TimeNode[i].startTime   = TimeNode[i-1].startTime;   
  2131.             
  2132.             for(j = i-2; j >= 0 && tmp.startTime < TimeNode[j].startTime; --j)
  2133.             {
  2134.                 TimeNode[j+1].tsID        = TimeNode[j].tsID;        
  2135.                 TimeNode[j+1].SerID       = TimeNode[j].SerID;       
  2136.                 TimeNode[j+1].EvtID       = TimeNode[j].EvtID;       
  2137.                 TimeNode[j+1].startTime   = TimeNode[j].startTime;  
  2138.             }
  2139.             TimeNode[j+1].tsID        = tmp.tsID;        
  2140.             TimeNode[j+1].SerID       = tmp.SerID;       
  2141.             TimeNode[j+1].EvtID       = tmp.EvtID;       
  2142.             TimeNode[j+1].startTime   = tmp.startTime; 
  2143.         }
  2144.     }
  2145.     return;
  2146. }
  2147. time_t KB_NVOD_GetNvodTime(void)
  2148. {
  2149.     return gNvodTime;
  2150. }
  2151. /* EOF */