PatParse.cpp
上传用户:thjx518
上传日期:2022-03-16
资源大小:179k
文件大小:7k
源码类别:

mpeg/mp3

开发平台:

Visual C++

  1. // PatParse.cpp: implementation of the CPatParse class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "PSParse.h"
  6. #include "PatParse.h"
  7. //////////////////////////////////////////////////////////////////////
  8. // Construction/Destruction
  9. //////////////////////////////////////////////////////////////////////
  10. int ParsePat(CTSParse*ts,PATType*pat)
  11. {
  12. CPrivateSection ps(ts,0);
  13. UCHAR buf[1024];
  14. memset(buf,0,1024);
  15. ps.GetSections(buf,0);
  16. pat->tableId =GET_8(buf,0);
  17. pat->streamId =GET_16(buf,3);
  18. pat->versionNo =GET_5(buf,5,5);
  19. pat->sectionLength =GET_12((buf+1),0);
  20. int len=pat->sectionLength-4-5;
  21. UCHAR *p=buf+8;
  22. pat->numProgs=0;
  23. for(int i=0;len>0;i++){
  24. pat->programs[i].programNumber=GET_16(p,0);
  25. pat->programs[i].programMapPID=GET_13(p,2);
  26. pat->numProgs++;
  27. len-=4;p+=4;
  28. }
  29. return pat->numProgs;
  30. }
  31. int ParsePmt(CTSParse*ts,PMTType*pmt,USHORT pmtpid)
  32. {
  33. CPrivateSection ps(ts,pmtpid);
  34. UCHAR buf[102400];
  35. ps.GetSections(buf,2);
  36. pmt->tableId=GET_8(buf,0);
  37. pmt->programNumber =GET_16(buf,3);
  38. pmt->versionNo =GET_5(buf,5,1);
  39. pmt->tableId = GET_8(buf, 0);
  40. pmt->sectionLength = GET_12(buf, 1);
  41. pmt->programNumber = GET_16(buf, 3);
  42. pmt->versionNo = GET_5(buf, 5, 5);
  43. pmt->pcrPid = GET_13(buf, 8);
  44. int len=GET_12(buf,10);
  45. int offset=12;
  46. int i;
  47. pmt->numDescriptors=0;
  48. for(i=0;len>0;i++){
  49. pmt->descriptor[i].tag=GET_8(buf,offset++);
  50. int dsclen=GET_8(buf,offset++);
  51. pmt->descriptor[i].length=dsclen;
  52. memcpy(pmt->descriptor[i].data,buf+offset,dsclen);
  53. len-=dsclen+2;
  54. offset+=dsclen;
  55. pmt->numDescriptors++;
  56. }
  57. pmt->numStreams=0;
  58. for(i=0;offset<pmt->sectionLength-4;i++)
  59. {
  60. pmt->stream[i].typeOfStream=GET_8(buf,offset++);
  61. pmt->stream[i].pid=GET_13(buf,offset);
  62. offset+=2;
  63. len=GET_12(buf,offset);
  64. offset+=2;
  65. pmt->stream[i].numDescriptors=0;
  66. for(int j=0;len>0;j++){
  67. pmt->stream[i].descriptor[i].tag=GET_8(buf,offset++);
  68. int dsclen=GET_8(buf,offset++);
  69. pmt->stream[i].descriptor[i].length=dsclen;
  70. memcpy(pmt->stream[i].descriptor[i].data,buf+offset,dsclen);
  71. len-=dsclen+2;
  72. offset+=dsclen;
  73. pmt->stream[i].numDescriptors++;
  74. }
  75. pmt->numStreams++;
  76. }
  77. return 0;
  78. }
  79. int ParseNit(CTSParse*ts,NITType*nit,bool actual)
  80. {
  81. CPrivateSection ps(ts,0x10);
  82. UCHAR buf[102400];
  83. ps.GetSections(buf,actual?0x40:0x41);
  84. nit->tableId=GET_8(buf,0);
  85. nit->networkId =GET_16(buf,3);
  86. nit->versionNo =GET_5(buf,5,1);
  87. nit->tableId = GET_8(buf, 0);
  88. nit->sectionLength = GET_12(buf, 1);
  89. nit->versionNo = GET_5(buf, 5, 5);
  90. int len=GET_12(buf,8);//get network descriptor length 
  91. int offset=10;
  92. int i;
  93. nit->numDescriptors=0;
  94. for(i=0;len>0;i++){
  95. nit->descriptor[i].tag=GET_8(buf,offset++);
  96. int dsclen=GET_8(buf,offset++);
  97. nit->descriptor[i].length=dsclen;
  98. memcpy(nit->descriptor[i].data,buf+offset,dsclen);
  99. len-=dsclen+2;
  100. offset+=dsclen;
  101. nit->numDescriptors++;
  102. }
  103. len=GET_12(buf,offset);
  104. offset+=2;
  105. nit->numStreams=0;
  106. for(i=0;offset<nit->sectionLength-4;i++)
  107. {
  108. nit->stream[i].streamId=GET_16(buf,offset);
  109. nit->stream[i].networkId=GET_16(buf,offset+2);
  110. int len=GET_12(buf,offset+4);
  111. offset+=6;
  112. nit->stream[i].numDescriptors=0;
  113. for(int j=0;len>0;j++)
  114. {
  115. nit->stream[i].descriptor[j].tag=GET_8(buf,offset++);
  116. int dsclen=GET_8(buf,offset++);
  117. nit->stream[i].descriptor[j].length=dsclen;
  118. memcpy(nit->stream[i].descriptor[j].data,buf+offset,dsclen);
  119. offset+=dsclen;
  120. len-=2+dsclen;
  121. nit->stream[i].numDescriptors++;
  122. }
  123. nit->numStreams++;
  124. }
  125. return 0;
  126. }
  127. int ParseSdt(CTSParse*ts,SDTType*sdt,bool actual)
  128. {
  129. CPrivateSection ps(ts,0x11);
  130. UCHAR buf[102400];
  131. ps.GetSections(buf,actual?0x42:0x46);
  132. sdt->tableId=GET_8(buf,0);
  133. sdt->streamId =GET_16(buf,3);
  134. sdt->versionNo =GET_5(buf,5,1);
  135. sdt->tableId =GET_8(buf, 0);
  136. sdt->sectionLength =GET_12(buf, 1);
  137. sdt->versionNo =GET_5(buf, 5, 5);
  138. sdt->origNetId =GET_16(buf,8);//get original network id
  139. int offset=11;
  140. sdt->numServices=0;
  141. for(int i=0;offset<sdt->sectionLength-4;i++)
  142. {
  143. sdt->service[i].serviceId=GET_16(buf,offset);
  144. offset+=2;
  145. sdt->service[i].eitSchedule=GET_1(buf, offset, 1);
  146. sdt->service[i].eitPresent= GET_1(buf, offset, 0);
  147. offset++;
  148. sdt->service[i].runningStatus= GET_3(buf, offset, 7);
  149. sdt->service[i].freeCAMode = GET_1(buf, offset, 4);
  150. int len=GET_12(buf,offset);
  151. offset+=2;
  152. sdt->service[i].numDescriptors=0;
  153. for(int j=0;len>0;j++){
  154. sdt->service[i].descriptor[j].tag=GET_8(buf,offset++);
  155. int dsclen=GET_8(buf,offset++);
  156. sdt->service[i].descriptor[j].length=dsclen;
  157. memcpy(sdt->service[i].descriptor[j].data,buf+offset,dsclen);
  158. len-=2+dsclen;
  159. offset+=dsclen;
  160. sdt->service[i].numDescriptors++;
  161. }
  162. sdt->numServices++;
  163. }
  164. return 0;
  165. }
  166. int ParseEit(CTSParse*ts,EITType*eit,UCHAR tableid,USHORT serviceid)
  167. {
  168. CPrivateSection ps(ts,0x12);
  169. UCHAR buf[102400];
  170. ps.GetSections(buf,tableid,serviceid);
  171. eit->tableId=GET_8(buf,0);
  172. eit->serviceId =GET_16(buf,3);
  173. eit->versionNo =GET_5(buf,5,1);
  174. eit->tableId =GET_8(buf, 0);
  175. eit->sectionLength =GET_12(buf, 1);
  176. eit->versionNo =GET_5(buf, 5, 5);
  177. eit->streamId =GET_16(buf,8);//get original network id
  178. eit->numEvents=0;
  179. int offset=14;
  180. eit->numEvents=0;
  181. for(int i=0;offset<eit->sectionLength-4;i++)
  182. {
  183. eit->event[i].eventId=GET_16(buf,offset);
  184. offset+=2;
  185. eit->event[i].startTimeHi=GET_32(buf,offset);
  186. offset+=4;
  187. eit->event[i].startTimeLo=GET_8(buf,offset++);
  188. eit->event[i].duration=GET_24(buf,offset);
  189. offset+=3;
  190. eit->event[i].runningStatus=(RunStatusType)GET_3(buf,offset,5);
  191. eit->event[i].caMode=(CAModeType)GET_1(buf,offset,4);
  192. int len=GET_12(buf,offset);
  193. offset+=2;
  194. eit->event[i].numDescriptors=0;
  195. for(int j=0;len>0;j++)
  196. {
  197. eit->event[i].descriptor[j].tag=GET_8(buf,offset++);
  198. int dsclen=GET_8(buf,offset++);
  199. eit->event[i].descriptor[j].length=dsclen;
  200. memcpy(eit->event[i].descriptor[j].data,buf+offset,dsclen);
  201. offset+=dsclen;
  202. len-=2+dsclen;
  203. eit->event[i].numDescriptors++;
  204. }
  205. eit->numEvents++;
  206. }
  207. return 0;
  208. }
  209. void GetDateTimeFromMJD(__int64 mjd,char*tmstr)
  210. {
  211. UINT y1,m1,yy,mm,dd;
  212. USHORT k,hh,min,sec;
  213. UINT utc=mjd&0xffffff;
  214. mjd=mjd>>24;
  215. y1=(int)((mjd-15078.2)/365.25);
  216. m1=(int)((mjd-14956.1-(int)(y1*365.25))/30.6001);
  217. dd=mjd-14956-(int)(y1*365.25)-(int)(m1*30.6001);
  218. k=(m1==14||m1==15)?1:0;
  219. yy=y1+k;
  220. mm=m1-1-k*12;
  221. hh=(utc>>16)&0xff;
  222. min=(utc>>8)&0xff;
  223. sec=utc&0xff;
  224. sprintf(tmstr,"%04d-%02d-%02d %02x:%02x:%02x",
  225. 1900+yy,mm,dd,hh,min,sec);
  226. }