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

DVD

开发平台:

C/C++

  1. //-----------------------------------------------------------------------------
  2. // Project include files:
  3. //-----------------------------------------------------------------------------
  4. #include "kb_dc_pub.h"
  5. DCDIR  *gDCDir = NULL;
  6. DCFILE *gDCFile = NULL;
  7. unsigned long gDcTimeOut = 0;
  8. void ResetTimeOut(void)
  9. {
  10. gDcTimeOut=0;
  11. }
  12. //-----------------------------------------------------------------------------
  13. // FUNCTION:    SetDCDIR
  14. //
  15. // DESCRIPTION: 设置当前DIR 
  16. //
  17. // RETURN:      
  18. //
  19. // NOTES:       None
  20. //-----------------------------------------------------------------------------
  21. void  SetDCDIR(DCDIR *dir)
  22. {
  23.     gDCDir=dir;
  24. }
  25. //-----------------------------------------------------------------------------
  26. // FUNCTION:    GetDCDIR
  27. //
  28. // DESCRIPTION: 获得当前DIR 
  29. //
  30. // RETURN:      
  31. //
  32. // NOTES:       None
  33. //-----------------------------------------------------------------------------
  34. pDCDIR  GetDCDIR()
  35. {
  36.    return gDCDir;
  37. }
  38. //-----------------------------------------------------------------------------
  39. // FUNCTION:    SetDCFILE
  40. //
  41. // DESCRIPTION: 设置当前文件指针
  42. //
  43. // RETURN:      
  44. //
  45. // NOTES:       None
  46. //-----------------------------------------------------------------------------
  47. void SetDCFILE(DCFILE *file)
  48. {
  49.     gDCFile=file;
  50. }
  51. //-----------------------------------------------------------------------------
  52. // FUNCTION:    GetDCFILE
  53. //
  54. // DESCRIPTION: 获得当前的文件指针
  55. //
  56. // RETURN:      
  57. //
  58. // NOTES:       None
  59. //-----------------------------------------------------------------------------
  60. pDCFILE GetDCFILE( )
  61. {
  62.    return  gDCFile;
  63. }
  64. //-----------------------------------------------------------------------------
  65. // FUNCTION:    ParseDIISection
  66. //
  67. // DESCRIPTION: DII section pareser
  68. //
  69. // RETURN:      None
  70. //
  71. // NOTES:        
  72. //-----------------------------------------------------------------------------
  73. int ParseDIISection(const char* fileName,unsigned char *buf,unsigned long length)
  74. {
  75.     DCFILE *file;
  76.     DCDIR *dir;
  77.   
  78.     // 获得dir 结构
  79.     dir = OpenDirectory(buf,(int)length);    
  80.     if(dir==NULL)   
  81.     {
  82.        DCDebug1("n OpenDirectory error");
  83.          return 0;
  84.     }
  85.     SetDCDIR(dir);
  86.     dir = GetDCDIR();   
  87.     //根据filename解析生成file
  88.     file=DcOpenFile(dir,fileName);
  89.     if(file==NULL)
  90.     {
  91.   DCDebug1("n DcOpenFile error");
  92.   return 0;
  93.     }
  94.     SetDCFILE(file);
  95.     
  96.     return 1; 
  97. }
  98. //-----------------------------------------------------------------------------
  99. // FUNCTION:    ParseModuleDDBSection
  100. //
  101. // DESCRIPTION: 解析一个module的所有DDB数据
  102. //
  103. // RETURN:      None
  104. //
  105. // NOTES:        
  106. //-
  107. int ParseModuleDDBSection(unsigned char *buf,unsigned int firstmodId)
  108. {
  109. DDBHead head;
  110. unsigned char *data,*pTemp;
  111. int length;   
  112. DCFILE *file;
  113. unsigned int modId, index;
  114. file=GetDCFILE();
  115. if(file==NULL) return 0;
  116. // get ddb data
  117. GetDDBHead(buf,&head);
  118. modId = head.moduleID;
  119. data = GetDDBData(buf,&length);   
  120. file->position+=length;     
  121. if(head.blockNumber>255||head.blockNumber>=file->BufStatus.modStat[index].blockCount)
  122. {
  123. DCDebug1("n head.blockNumber[%d] out of range", head.blockNumber);
  124. return 0;
  125. }
  126. DCDebug2("nnthe blockNumber is %d,the length is %d of moduleid:%d n",head.blockNumber,length,modId);
  127. DCDebug4("nnow the file.position is %dn",file->position); 
  128. //the data will be written into the file->section structure in cycle   
  129. pTemp=(file->section)  + (head.blockNumber)*(4066);
  130. KBDcMemcpy((void*)pTemp,(const void*)data,(size_t)length); 
  131. //填充buffer 状态
  132. index = modId - firstmodId;
  133. if(file->BufStatus.modcount>0&&file->BufStatus.modStat!=NULL)
  134. {
  135. if(file->BufStatus.modStat[index].blockCount>0&&file->BufStatus.modStat[index].blockStat!=NULL)
  136. {
  137. file->BufStatus.modStat[index].blockStat[head.blockNumber] = FILLED;
  138. }
  139. }
  140. return 1;
  141. #if 0
  142. PrintfDDBData(data,length,head.blockNumber);
  143. printf("nn------------------n");
  144. PrintfDDBData(((file->section)  + (head.blockNumber)*(4066)), length,  head.blockNumber);
  145. #endif
  146.    
  147. }
  148. //----------------------------------------------------------------------------
  149. // DESCRIPTION: 解析一个文件所包含的所有DDB数据,它调用ParseModuleDDBSection()
  150. //-
  151. int ParseALLDDBSection(unsigned char *buf,unsigned int firstModId)
  152. {
  153. unsigned int DDBOfmoduleId; 
  154. DCFILE *file;
  155. DDBHead head;   
  156. int filemodNum = 0;
  157. int index = 0;
  158. file = GetDCFILE();
  159. if(file==NULL)
  160. {
  161. DCDebug1("n  file or is NULL!!!");
  162. return -4;
  163. }
  164. GetDDBHead(buf,&head);
  165. DDBOfmoduleId = head.moduleID;
  166. filemodNum = DCGetModNumByFile(file);   
  167. if(filemodNum<0)
  168. {
  169. DCDebug1("n DCGetModNumByFile error!!!");
  170. return -3;
  171. }
  172. // 判断该DDB是否是在制定文件所包含的module范围内
  173. // 如果不是,则不作任何处理
  174. // 判断一个DDB是否已经接收,如果是,则不作任何处理。
  175. if(DDBOfmoduleId<firstModId
  176. ||DDBOfmoduleId>=firstModId+filemodNum)
  177. {
  178. DCDebug1("n block number[mod=%d] out of module range!!!", DDBOfmoduleId);
  179. DCDebug1("n firstModId=%d    filemodNum=%d",firstModId, filemodNum);
  180. return -1;   
  181. }
  182. index = DDBOfmoduleId-firstModId;
  183. if(index < 0) index = 0;
  184. if(head.blockNumber>255||head.blockNumber>=file->BufStatus.modStat[index].blockCount)
  185. {
  186. DCDebug1("n head.blockNumber[%d] out of range", head.blockNumber);
  187. return -5;
  188. }
  189. if(file->BufStatus.modcount>0&&file->BufStatus.modStat!=NULL)
  190. {
  191. if(file->BufStatus.modStat[index].blockCount>0&&file->BufStatus.modStat[index].blockStat!=NULL)
  192. {
  193. if(file->BufStatus.modStat[index].blockStat[head.blockNumber]==FILLED)
  194. {
  195. DCDebug3("n mod[%d]:  %d already  received!!!", index, head.blockNumber);
  196. // 记录重复收取section的次数,过多的重复收取被认为是
  197. // 可能存在错误,需要强制退出数据过滤以进行其它冗余处理
  198. gDcTimeOut++;
  199. if((gDcTimeOut/(file->BufStatus.modStat[index].blockCount))>=5)
  200. {
  201. gDcTimeOut=0;
  202. DCDebug2("n too many repeat, begin  one-by-one filter mode!");
  203. return -2;
  204. }
  205. else
  206. return 0;
  207. }
  208. }
  209. }
  210. //解析一个DDB
  211. if(ParseModuleDDBSection(buf,firstModId)==0)
  212. {    
  213. DCDebug1("n ParseModuleDDBSection return error!");
  214.        return -6;
  215. }     
  216. // 读取完一个file的所有module的所有DDB section
  217. if(file->position == file->fileLength)
  218. {    
  219. DCDebug2("nn all modules been parsed[%d]vs[%d]n", file->position, file->fileLength);
  220. //PrintfDCFileData(GetDCFILE());
  221.        return 1;
  222. }     
  223. return 0;
  224. }
  225. //-----------------------------------------------------------------------------
  226. // FUNCTION:    printfFileData
  227. //
  228. // DESCRIPTION: 打印文件数据
  229. //
  230. // RETURN:      None
  231. //
  232. // NOTES:        
  233. //-
  234. void PrintfDCFileData(DCFILE *file)
  235. {
  236. int i;
  237. unsigned int line = 0x00000000;
  238. DCDebug4("[%s]:[%ld]n", file->fileName, file->fileLength);
  239. for(i=0;i<file->fileLength;i++) 
  240. {   
  241. if(i==0)
  242. {
  243. DCDebug4("n");
  244. DCDebug4("%x: ",line);
  245. }
  246. DCDebug4("%4.2x",file->section[i]);  
  247. if((i+1)%16==0)
  248. {      
  249. line = line + 16;
  250. DCDebug4("n");
  251. DCDebug4("%x: ",line);   
  252. }  
  253. }  
  254. DCDebug4("n print endn");
  255. return;
  256. }
  257. void PrintfDDBData(unsigned char *data, int size,int blockNo)
  258. {
  259.        int i;
  260.       unsigned int line = 0x00000000;
  261.        DCDebug4("n--------------PrintfDDBData------------------");
  262.        for(i=0;i<size;i++) 
  263. {   
  264. if(i==0)
  265. {
  266. DCDebug4("n");
  267. DCDebug4("%x: ",line);
  268. }
  269.        
  270. DCDebug4("%4.2x",data[i]);  
  271. if((i+1)%16==0)
  272. {      
  273.   line = line + 16;
  274.   DCDebug4("n");
  275.   DCDebug4("%x: ",line);   
  276. }
  277. }          
  278. DCDebug4("n print ddb %d end",blockNo);
  279. return;
  280. }