2
0

TSStreamFile.cs 71 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551
  1. //============================================================================
  2. // BDInfo - Blu-ray Video and Audio Analysis Tool
  3. // Copyright © 2010 Cinema Squid
  4. //
  5. // This library is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU Lesser General Public
  7. // License as published by the Free Software Foundation; either
  8. // version 2.1 of the License, or (at your option) any later version.
  9. //
  10. // This library is distributed in the hope that it will be useful,
  11. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. // Lesser General Public License for more details.
  14. //
  15. // You should have received a copy of the GNU Lesser General Public
  16. // License along with this library; if not, write to the Free Software
  17. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  18. //=============================================================================
  19. #undef DEBUG
  20. using System;
  21. using System.Collections.Generic;
  22. using System.Diagnostics;
  23. using System.IO;
  24. using System.Text;
  25. namespace BDInfo
  26. {
  27. public class TSStreamState
  28. {
  29. public ulong TransferCount = 0;
  30. public string StreamTag = null;
  31. public ulong TotalPackets = 0;
  32. public ulong WindowPackets = 0;
  33. public ulong TotalBytes = 0;
  34. public ulong WindowBytes = 0;
  35. public long PeakTransferLength = 0;
  36. public long PeakTransferRate = 0;
  37. public double TransferMarker = 0;
  38. public double TransferInterval = 0;
  39. public TSStreamBuffer StreamBuffer = new TSStreamBuffer();
  40. public uint Parse = 0;
  41. public bool TransferState = false;
  42. public int TransferLength = 0;
  43. public int PacketLength = 0;
  44. public byte PacketLengthParse = 0;
  45. public byte PacketParse = 0;
  46. public byte PTSParse = 0;
  47. public ulong PTS = 0;
  48. public ulong PTSTemp = 0;
  49. public ulong PTSLast = 0;
  50. public ulong PTSPrev = 0;
  51. public ulong PTSDiff = 0;
  52. public ulong PTSCount = 0;
  53. public ulong PTSTransfer = 0;
  54. public byte DTSParse = 0;
  55. public ulong DTSTemp = 0;
  56. public ulong DTSPrev = 0;
  57. public byte PESHeaderLength = 0;
  58. public byte PESHeaderFlags = 0;
  59. #if DEBUG
  60. public byte PESHeaderIndex = 0;
  61. public byte[] PESHeader = new byte[256 + 9];
  62. #endif
  63. }
  64. public class TSPacketParser
  65. {
  66. public bool SyncState = false;
  67. public byte TimeCodeParse = 4;
  68. public byte PacketLength = 0;
  69. public byte HeaderParse = 0;
  70. public uint TimeCode;
  71. public byte TransportErrorIndicator;
  72. public byte PayloadUnitStartIndicator;
  73. public byte TransportPriority;
  74. public ushort PID;
  75. public byte TransportScramblingControl;
  76. public byte AdaptionFieldControl;
  77. public bool AdaptionFieldState = false;
  78. public byte AdaptionFieldParse = 0;
  79. public byte AdaptionFieldLength = 0;
  80. public ushort PCRPID = 0xFFFF;
  81. public byte PCRParse = 0;
  82. public ulong PreviousPCR = 0;
  83. public ulong PCR = 0;
  84. public ulong PCRCount = 0;
  85. public ulong PTSFirst = ulong.MaxValue;
  86. public ulong PTSLast = ulong.MinValue;
  87. public ulong PTSDiff = 0;
  88. public byte[] PAT = new byte[1024];
  89. public bool PATSectionStart = false;
  90. public byte PATPointerField = 0;
  91. public uint PATOffset = 0;
  92. public byte PATSectionLengthParse = 0;
  93. public ushort PATSectionLength = 0;
  94. public uint PATSectionParse = 0;
  95. public bool PATTransferState = false;
  96. public byte PATSectionNumber = 0;
  97. public byte PATLastSectionNumber = 0;
  98. public ushort TransportStreamId = 0xFFFF;
  99. public List<TSDescriptor> PMTProgramDescriptors = new List<TSDescriptor>();
  100. public ushort PMTPID = 0xFFFF;
  101. public Dictionary<ushort, byte[]> PMT = new Dictionary<ushort, byte[]>();
  102. public bool PMTSectionStart = false;
  103. public ushort PMTProgramInfoLength = 0;
  104. public byte PMTProgramDescriptor = 0;
  105. public byte PMTProgramDescriptorLengthParse = 0;
  106. public byte PMTProgramDescriptorLength = 0;
  107. public ushort PMTStreamInfoLength = 0;
  108. public uint PMTStreamDescriptorLengthParse = 0;
  109. public uint PMTStreamDescriptorLength = 0;
  110. public byte PMTPointerField = 0;
  111. public uint PMTOffset = 0;
  112. public uint PMTSectionLengthParse = 0;
  113. public ushort PMTSectionLength = 0;
  114. public uint PMTSectionParse = 0;
  115. public bool PMTTransferState = false;
  116. public byte PMTSectionNumber = 0;
  117. public byte PMTLastSectionNumber = 0;
  118. public byte PMTTemp = 0;
  119. public TSStream Stream = null;
  120. public TSStreamState StreamState = null;
  121. public ulong TotalPackets = 0;
  122. }
  123. public class TSStreamDiagnostics
  124. {
  125. public ulong Bytes = 0;
  126. public ulong Packets = 0;
  127. public double Marker = 0;
  128. public double Interval = 0;
  129. public string Tag = null;
  130. }
  131. public class TSStreamFile
  132. {
  133. public FileInfo FileInfo = null;
  134. public string Name = null;
  135. public long Size = 0;
  136. public double Length = 0;
  137. public TSInterleavedFile InterleavedFile = null;
  138. private Dictionary<ushort, TSStreamState> StreamStates =
  139. new Dictionary<ushort, TSStreamState>();
  140. public Dictionary<ushort, TSStream> Streams =
  141. new Dictionary<ushort, TSStream>();
  142. public Dictionary<ushort, List<TSStreamDiagnostics>> StreamDiagnostics =
  143. new Dictionary<ushort, List<TSStreamDiagnostics>>();
  144. private List<TSPlaylistFile> Playlists = null;
  145. public TSStreamFile(FileInfo fileInfo)
  146. {
  147. FileInfo = fileInfo;
  148. Name = fileInfo.Name.ToUpper();
  149. }
  150. public string DisplayName
  151. {
  152. get
  153. {
  154. if (BDInfoSettings.EnableSSIF &&
  155. InterleavedFile != null)
  156. {
  157. return InterleavedFile.Name;
  158. }
  159. return Name;
  160. }
  161. }
  162. private bool ScanStream(
  163. TSStream stream,
  164. TSStreamState streamState,
  165. TSStreamBuffer buffer)
  166. {
  167. streamState.StreamTag = null;
  168. long bitrate = 0;
  169. if (stream.IsAudioStream &&
  170. streamState.PTSTransfer > 0)
  171. {
  172. bitrate = (long)Math.Round(
  173. (buffer.TransferLength * 8.0) /
  174. ((double)streamState.PTSTransfer / 90000));
  175. if (bitrate > streamState.PeakTransferRate)
  176. {
  177. streamState.PeakTransferRate = bitrate;
  178. }
  179. }
  180. if (buffer.TransferLength > streamState.PeakTransferLength)
  181. {
  182. streamState.PeakTransferLength = buffer.TransferLength;
  183. }
  184. buffer.BeginRead();
  185. switch (stream.StreamType)
  186. {
  187. case TSStreamType.MPEG2_VIDEO:
  188. TSCodecMPEG2.Scan(
  189. (TSVideoStream)stream, buffer, ref streamState.StreamTag);
  190. break;
  191. case TSStreamType.AVC_VIDEO:
  192. TSCodecAVC.Scan(
  193. (TSVideoStream)stream, buffer, ref streamState.StreamTag);
  194. break;
  195. case TSStreamType.MVC_VIDEO:
  196. TSCodecMVC.Scan(
  197. (TSVideoStream)stream, buffer, ref streamState.StreamTag);
  198. break;
  199. case TSStreamType.VC1_VIDEO:
  200. TSCodecVC1.Scan(
  201. (TSVideoStream)stream, buffer, ref streamState.StreamTag);
  202. break;
  203. case TSStreamType.AC3_AUDIO:
  204. TSCodecAC3.Scan(
  205. (TSAudioStream)stream, buffer, ref streamState.StreamTag);
  206. break;
  207. case TSStreamType.AC3_PLUS_AUDIO:
  208. case TSStreamType.AC3_PLUS_SECONDARY_AUDIO:
  209. TSCodecAC3.Scan(
  210. (TSAudioStream)stream, buffer, ref streamState.StreamTag);
  211. break;
  212. case TSStreamType.AC3_TRUE_HD_AUDIO:
  213. TSCodecTrueHD.Scan(
  214. (TSAudioStream)stream, buffer, ref streamState.StreamTag);
  215. break;
  216. case TSStreamType.LPCM_AUDIO:
  217. TSCodecLPCM.Scan(
  218. (TSAudioStream)stream, buffer, ref streamState.StreamTag);
  219. break;
  220. case TSStreamType.DTS_AUDIO:
  221. TSCodecDTS.Scan(
  222. (TSAudioStream)stream, buffer, bitrate, ref streamState.StreamTag);
  223. break;
  224. case TSStreamType.DTS_HD_AUDIO:
  225. case TSStreamType.DTS_HD_MASTER_AUDIO:
  226. case TSStreamType.DTS_HD_SECONDARY_AUDIO:
  227. TSCodecDTSHD.Scan(
  228. (TSAudioStream)stream, buffer, bitrate, ref streamState.StreamTag);
  229. break;
  230. default:
  231. stream.IsInitialized = true;
  232. break;
  233. }
  234. buffer.EndRead();
  235. streamState.StreamBuffer.Reset();
  236. bool isAVC = false;
  237. bool isMVC = false;
  238. foreach (TSStream finishedStream in Streams.Values)
  239. {
  240. if (!finishedStream.IsInitialized)
  241. {
  242. return false;
  243. }
  244. if (finishedStream.StreamType == TSStreamType.AVC_VIDEO)
  245. {
  246. isAVC = true;
  247. }
  248. if (finishedStream.StreamType == TSStreamType.MVC_VIDEO)
  249. {
  250. isMVC = true;
  251. }
  252. }
  253. if (isMVC && !isAVC)
  254. {
  255. return false;
  256. }
  257. return true;
  258. }
  259. private void UpdateStreamBitrates(
  260. ushort PTSPID,
  261. ulong PTS,
  262. ulong PTSDiff)
  263. {
  264. if (Playlists == null) return;
  265. foreach (ushort PID in StreamStates.Keys)
  266. {
  267. if (Streams.ContainsKey(PID) &&
  268. Streams[PID].IsVideoStream &&
  269. PID != PTSPID)
  270. {
  271. continue;
  272. }
  273. if (StreamStates[PID].WindowPackets == 0)
  274. {
  275. continue;
  276. }
  277. UpdateStreamBitrate(PID, PTSPID, PTS, PTSDiff);
  278. }
  279. foreach (TSPlaylistFile playlist in Playlists)
  280. {
  281. double packetSeconds = 0;
  282. foreach (TSStreamClip clip in playlist.StreamClips)
  283. {
  284. if (clip.AngleIndex == 0)
  285. {
  286. packetSeconds += clip.PacketSeconds;
  287. }
  288. }
  289. if (packetSeconds > 0)
  290. {
  291. foreach (TSStream playlistStream in playlist.SortedStreams)
  292. {
  293. if (playlistStream.IsVBR)
  294. {
  295. playlistStream.BitRate = (long)Math.Round(
  296. ((playlistStream.PayloadBytes * 8.0) / packetSeconds));
  297. if (playlistStream.StreamType == TSStreamType.AC3_TRUE_HD_AUDIO &&
  298. ((TSAudioStream)playlistStream).CoreStream != null)
  299. {
  300. playlistStream.BitRate -=
  301. ((TSAudioStream)playlistStream).CoreStream.BitRate;
  302. }
  303. }
  304. }
  305. }
  306. }
  307. }
  308. private void UpdateStreamBitrate(
  309. ushort PID,
  310. ushort PTSPID,
  311. ulong PTS,
  312. ulong PTSDiff)
  313. {
  314. if (Playlists == null) return;
  315. TSStreamState streamState = StreamStates[PID];
  316. double streamTime = (double)PTS / 90000;
  317. double streamInterval = (double)PTSDiff / 90000;
  318. double streamOffset = streamTime + streamInterval;
  319. foreach (TSPlaylistFile playlist in Playlists)
  320. {
  321. foreach (TSStreamClip clip in playlist.StreamClips)
  322. {
  323. if (clip.Name != this.Name) continue;
  324. if (streamTime == 0 ||
  325. (streamTime >= clip.TimeIn &&
  326. streamTime <= clip.TimeOut))
  327. {
  328. clip.PayloadBytes += streamState.WindowBytes;
  329. clip.PacketCount += streamState.WindowPackets;
  330. if (streamOffset > clip.TimeIn &&
  331. streamOffset - clip.TimeIn > clip.PacketSeconds)
  332. {
  333. clip.PacketSeconds = streamOffset - clip.TimeIn;
  334. }
  335. Dictionary<ushort, TSStream> playlistStreams = playlist.Streams;
  336. if (clip.AngleIndex > 0 &&
  337. clip.AngleIndex < playlist.AngleStreams.Count + 1)
  338. {
  339. playlistStreams = playlist.AngleStreams[clip.AngleIndex - 1];
  340. }
  341. if (playlistStreams.ContainsKey(PID))
  342. {
  343. TSStream stream = playlistStreams[PID];
  344. stream.PayloadBytes += streamState.WindowBytes;
  345. stream.PacketCount += streamState.WindowPackets;
  346. if (stream.IsVideoStream)
  347. {
  348. stream.PacketSeconds += streamInterval;
  349. stream.ActiveBitRate = (long)Math.Round(
  350. ((stream.PayloadBytes * 8.0) /
  351. stream.PacketSeconds));
  352. }
  353. if (stream.StreamType == TSStreamType.AC3_TRUE_HD_AUDIO &&
  354. ((TSAudioStream)stream).CoreStream != null)
  355. {
  356. stream.ActiveBitRate -=
  357. ((TSAudioStream)stream).CoreStream.BitRate;
  358. }
  359. }
  360. }
  361. }
  362. }
  363. if (Streams.ContainsKey(PID))
  364. {
  365. TSStream stream = Streams[PID];
  366. stream.PayloadBytes += streamState.WindowBytes;
  367. stream.PacketCount += streamState.WindowPackets;
  368. if (stream.IsVideoStream)
  369. {
  370. TSStreamDiagnostics diag = new TSStreamDiagnostics();
  371. diag.Marker = (double)PTS / 90000;
  372. diag.Interval = (double)PTSDiff / 90000;
  373. diag.Bytes = streamState.WindowBytes;
  374. diag.Packets = streamState.WindowPackets;
  375. diag.Tag = streamState.StreamTag;
  376. StreamDiagnostics[PID].Add(diag);
  377. stream.PacketSeconds += streamInterval;
  378. }
  379. }
  380. streamState.WindowPackets = 0;
  381. streamState.WindowBytes = 0;
  382. }
  383. public void Scan(List<TSPlaylistFile> playlists, bool isFullScan)
  384. {
  385. if (playlists == null || playlists.Count == 0)
  386. {
  387. return;
  388. }
  389. Playlists = playlists;
  390. int dataSize = 16384;
  391. FileStream fileStream = null;
  392. try
  393. {
  394. string fileName;
  395. if (BDInfoSettings.EnableSSIF &&
  396. InterleavedFile != null)
  397. {
  398. fileName = InterleavedFile.FileInfo.FullName;
  399. }
  400. else
  401. {
  402. fileName = FileInfo.FullName;
  403. }
  404. fileStream = new FileStream(
  405. fileName,
  406. FileMode.Open,
  407. FileAccess.Read,
  408. FileShare.Read,
  409. dataSize, false);
  410. Size = 0;
  411. Length = 0;
  412. Streams.Clear();
  413. StreamStates.Clear();
  414. StreamDiagnostics.Clear();
  415. TSPacketParser parser =
  416. new TSPacketParser();
  417. long fileLength = (uint)fileStream.Length;
  418. byte[] buffer = new byte[dataSize];
  419. int bufferLength = 0;
  420. while ((bufferLength =
  421. fileStream.Read(buffer, 0, buffer.Length)) > 0)
  422. {
  423. int offset = 0;
  424. for (int i = 0; i < bufferLength; i++)
  425. {
  426. if (parser.SyncState == false)
  427. {
  428. if (parser.TimeCodeParse > 0)
  429. {
  430. parser.TimeCodeParse--;
  431. switch (parser.TimeCodeParse)
  432. {
  433. case 3:
  434. parser.TimeCode = 0;
  435. parser.TimeCode |=
  436. ((uint)buffer[i] & 0x3F) << 24;
  437. break;
  438. case 2:
  439. parser.TimeCode |=
  440. ((uint)buffer[i] & 0xFF) << 16;
  441. break;
  442. case 1:
  443. parser.TimeCode |=
  444. ((uint)buffer[i] & 0xFF) << 8;
  445. break;
  446. case 0:
  447. parser.TimeCode |=
  448. ((uint)buffer[i] & 0xFF);
  449. break;
  450. }
  451. }
  452. else if (buffer[i] == 0x47)
  453. {
  454. parser.SyncState = true;
  455. parser.PacketLength = 187;
  456. parser.TimeCodeParse = 4;
  457. parser.HeaderParse = 3;
  458. }
  459. }
  460. else if (parser.HeaderParse > 0)
  461. {
  462. parser.PacketLength--;
  463. parser.HeaderParse--;
  464. switch (parser.HeaderParse)
  465. {
  466. case 2:
  467. {
  468. parser.TransportErrorIndicator =
  469. (byte)((buffer[i] >> 7) & 0x1);
  470. parser.PayloadUnitStartIndicator =
  471. (byte)((buffer[i] >> 6) & 0x1);
  472. parser.TransportPriority =
  473. (byte)((buffer[i] >> 5) & 0x1);
  474. parser.PID =
  475. (ushort)((buffer[i] & 0x1f) << 8);
  476. }
  477. break;
  478. case 1:
  479. {
  480. parser.PID |= (ushort)buffer[i];
  481. if (Streams.ContainsKey(parser.PID))
  482. {
  483. parser.Stream = Streams[parser.PID];
  484. }
  485. else
  486. {
  487. parser.Stream = null;
  488. }
  489. if (!StreamStates.ContainsKey(parser.PID))
  490. {
  491. StreamStates[parser.PID] = new TSStreamState();
  492. }
  493. parser.StreamState = StreamStates[parser.PID];
  494. parser.StreamState.TotalPackets++;
  495. parser.StreamState.WindowPackets++;
  496. parser.TotalPackets++;
  497. }
  498. break;
  499. case 0:
  500. {
  501. parser.TransportScramblingControl =
  502. (byte)((buffer[i] >> 6) & 0x3);
  503. parser.AdaptionFieldControl =
  504. (byte)((buffer[i] >> 4) & 0x3);
  505. if ((parser.AdaptionFieldControl & 0x2) == 0x2)
  506. {
  507. parser.AdaptionFieldState = true;
  508. }
  509. if (parser.PayloadUnitStartIndicator == 1)
  510. {
  511. if (parser.PID == 0)
  512. {
  513. parser.PATSectionStart = true;
  514. }
  515. else if (parser.PID == parser.PMTPID)
  516. {
  517. parser.PMTSectionStart = true;
  518. }
  519. else if (parser.StreamState != null &&
  520. parser.StreamState.TransferState)
  521. {
  522. parser.StreamState.TransferState = false;
  523. parser.StreamState.TransferCount++;
  524. bool isFinished = ScanStream(
  525. parser.Stream,
  526. parser.StreamState,
  527. parser.StreamState.StreamBuffer);
  528. if (!isFullScan && isFinished)
  529. {
  530. return;
  531. }
  532. }
  533. }
  534. }
  535. break;
  536. }
  537. }
  538. else if (parser.AdaptionFieldState)
  539. {
  540. parser.PacketLength--;
  541. parser.AdaptionFieldParse = buffer[i];
  542. parser.AdaptionFieldLength = buffer[i];
  543. parser.AdaptionFieldState = false;
  544. }
  545. else if (parser.AdaptionFieldParse > 0)
  546. {
  547. parser.PacketLength--;
  548. parser.AdaptionFieldParse--;
  549. if ((parser.AdaptionFieldLength - parser.AdaptionFieldParse) == 1)
  550. {
  551. if ((buffer[i] & 0x10) == 0x10)
  552. {
  553. parser.PCRParse = 6;
  554. parser.PCR = 0;
  555. }
  556. }
  557. else if (parser.PCRParse > 0)
  558. {
  559. parser.PCRParse--;
  560. parser.PCR = (parser.PCR << 8) + (ulong)buffer[i];
  561. if (parser.PCRParse == 0)
  562. {
  563. parser.PreviousPCR = parser.PCR;
  564. parser.PCR = (parser.PCR & 0x1FF) +
  565. ((parser.PCR >> 15) * 300);
  566. }
  567. parser.PCRCount++;
  568. }
  569. if (parser.PacketLength == 0)
  570. {
  571. parser.SyncState = false;
  572. }
  573. }
  574. else if (parser.PID == 0)
  575. {
  576. if (parser.PATTransferState)
  577. {
  578. if ((bufferLength - i) > parser.PATSectionLength)
  579. {
  580. offset = parser.PATSectionLength;
  581. }
  582. else
  583. {
  584. offset = (bufferLength - i);
  585. }
  586. if (parser.PacketLength <= offset)
  587. {
  588. offset = parser.PacketLength;
  589. }
  590. for (int k = 0; k < offset; k++)
  591. {
  592. parser.PAT[parser.PATOffset++] = buffer[i++];
  593. parser.PATSectionLength--;
  594. parser.PacketLength--;
  595. } --i;
  596. if (parser.PATSectionLength == 0)
  597. {
  598. parser.PATTransferState = false;
  599. if (parser.PATSectionNumber == parser.PATLastSectionNumber)
  600. {
  601. for (int k = 0; k < (parser.PATOffset - 4); k += 4)
  602. {
  603. uint programNumber = (uint)
  604. ((parser.PAT[k] << 8) +
  605. parser.PAT[k + 1]);
  606. ushort programPID = (ushort)
  607. (((parser.PAT[k + 2] & 0x1F) << 8) +
  608. parser.PAT[k + 3]);
  609. if (programNumber == 1)
  610. {
  611. parser.PMTPID = programPID;
  612. }
  613. }
  614. }
  615. }
  616. }
  617. else
  618. {
  619. --parser.PacketLength;
  620. if (parser.PATSectionStart)
  621. {
  622. parser.PATPointerField = buffer[i];
  623. if (parser.PATPointerField == 0)
  624. {
  625. parser.PATSectionLengthParse = 3;
  626. }
  627. parser.PATSectionStart = false;
  628. }
  629. else if (parser.PATPointerField > 0)
  630. {
  631. --parser.PATPointerField;
  632. if (parser.PATPointerField == 0)
  633. {
  634. parser.PATSectionLengthParse = 3;
  635. }
  636. }
  637. else if (parser.PATSectionLengthParse > 0)
  638. {
  639. --parser.PATSectionLengthParse;
  640. switch (parser.PATSectionLengthParse)
  641. {
  642. case 2:
  643. break;
  644. case 1:
  645. parser.PATSectionLength = (ushort)
  646. ((buffer[i] & 0xF) << 8);
  647. break;
  648. case 0:
  649. parser.PATSectionLength |= buffer[i];
  650. if (parser.PATSectionLength > 1021)
  651. {
  652. parser.PATSectionLength = 0;
  653. }
  654. else
  655. {
  656. parser.PATSectionParse = 5;
  657. }
  658. break;
  659. }
  660. }
  661. else if (parser.PATSectionParse > 0)
  662. {
  663. --parser.PATSectionLength;
  664. --parser.PATSectionParse;
  665. switch (parser.PATSectionParse)
  666. {
  667. case 4:
  668. parser.TransportStreamId = (ushort)
  669. (buffer[i] << 8);
  670. break;
  671. case 3:
  672. parser.TransportStreamId |= buffer[i];
  673. break;
  674. case 2:
  675. break;
  676. case 1:
  677. parser.PATSectionNumber = buffer[i];
  678. if (parser.PATSectionNumber == 0)
  679. {
  680. parser.PATOffset = 0;
  681. }
  682. break;
  683. case 0:
  684. parser.PATLastSectionNumber = buffer[i];
  685. parser.PATTransferState = true;
  686. break;
  687. }
  688. }
  689. }
  690. if (parser.PacketLength == 0)
  691. {
  692. parser.SyncState = false;
  693. }
  694. }
  695. else if (parser.PID == parser.PMTPID)
  696. {
  697. if (parser.PMTTransferState)
  698. {
  699. if ((bufferLength - i) >= parser.PMTSectionLength)
  700. {
  701. offset = parser.PMTSectionLength;
  702. }
  703. else
  704. {
  705. offset = (bufferLength - i);
  706. }
  707. if (parser.PacketLength <= offset)
  708. {
  709. offset = parser.PacketLength;
  710. }
  711. if (!parser.PMT.ContainsKey(parser.PID))
  712. {
  713. parser.PMT[parser.PID] = new byte[1024];
  714. }
  715. byte[] PMT = parser.PMT[parser.PID];
  716. for (int k = 0; k < offset; k++)
  717. {
  718. PMT[parser.PMTOffset++] = buffer[i++];
  719. --parser.PMTSectionLength;
  720. --parser.PacketLength;
  721. } --i;
  722. if (parser.PMTSectionLength == 0)
  723. {
  724. parser.PMTTransferState = false;
  725. if (parser.PMTSectionNumber == parser.PMTLastSectionNumber)
  726. {
  727. //Console.WriteLine("PMT Start: " + parser.PMTTemp);
  728. try
  729. {
  730. for (int k = 0; k < (parser.PMTOffset - 4); k += 5)
  731. {
  732. byte streamType = PMT[k];
  733. ushort streamPID = (ushort)
  734. (((PMT[k + 1] & 0x1F) << 8) +
  735. PMT[k + 2]);
  736. ushort streamInfoLength = (ushort)
  737. (((PMT[k + 3] & 0xF) << 8) +
  738. PMT[k + 4]);
  739. /*
  740. if (streamInfoLength == 2)
  741. {
  742. // TODO: Cleanup
  743. //streamInfoLength = 0;
  744. }
  745. Console.WriteLine(string.Format(
  746. "Type: {0} PID: {1} Length: {2}",
  747. streamType, streamPID, streamInfoLength));
  748. */
  749. if (!Streams.ContainsKey(streamPID))
  750. {
  751. List<TSDescriptor> streamDescriptors =
  752. new List<TSDescriptor>();
  753. /*
  754. * TODO: Getting bad streamInfoLength
  755. if (streamInfoLength > 0)
  756. {
  757. for (int d = 0; d < streamInfoLength; d++)
  758. {
  759. byte name = PMT[k + d + 5];
  760. byte length = PMT[k + d + 6];
  761. TSDescriptor descriptor =
  762. new TSDescriptor(name, length);
  763. for (int v = 0; v < length; v++)
  764. {
  765. descriptor.Value[v] =
  766. PMT[k + d + v + 7];
  767. }
  768. streamDescriptors.Add(descriptor);
  769. d += (length + 1);
  770. }
  771. }
  772. */
  773. CreateStream(streamPID, streamType, streamDescriptors);
  774. }
  775. k += streamInfoLength;
  776. }
  777. }
  778. catch (Exception ex)
  779. {
  780. // TODO
  781. Console.WriteLine(ex.Message);
  782. }
  783. }
  784. }
  785. }
  786. else
  787. {
  788. --parser.PacketLength;
  789. if (parser.PMTSectionStart)
  790. {
  791. parser.PMTPointerField = buffer[i];
  792. if (parser.PMTPointerField == 0)
  793. {
  794. parser.PMTSectionLengthParse = 3;
  795. }
  796. parser.PMTSectionStart = false;
  797. }
  798. else if (parser.PMTPointerField > 0)
  799. {
  800. --parser.PMTPointerField;
  801. if (parser.PMTPointerField == 0)
  802. {
  803. parser.PMTSectionLengthParse = 3;
  804. }
  805. }
  806. else if (parser.PMTSectionLengthParse > 0)
  807. {
  808. --parser.PMTSectionLengthParse;
  809. switch (parser.PMTSectionLengthParse)
  810. {
  811. case 2:
  812. if (buffer[i] != 0x2)
  813. {
  814. parser.PMTSectionLengthParse = 0;
  815. }
  816. break;
  817. case 1:
  818. parser.PMTSectionLength = (ushort)
  819. ((buffer[i] & 0xF) << 8);
  820. break;
  821. case 0:
  822. parser.PMTSectionLength |= buffer[i];
  823. if (parser.PMTSectionLength > 1021)
  824. {
  825. parser.PMTSectionLength = 0;
  826. }
  827. else
  828. {
  829. parser.PMTSectionParse = 9;
  830. }
  831. break;
  832. }
  833. }
  834. else if (parser.PMTSectionParse > 0)
  835. {
  836. --parser.PMTSectionLength;
  837. --parser.PMTSectionParse;
  838. switch (parser.PMTSectionParse)
  839. {
  840. case 8:
  841. case 7:
  842. break;
  843. case 6:
  844. parser.PMTTemp = buffer[i];
  845. break;
  846. case 5:
  847. parser.PMTSectionNumber = buffer[i];
  848. if (parser.PMTSectionNumber == 0)
  849. {
  850. parser.PMTOffset = 0;
  851. }
  852. break;
  853. case 4:
  854. parser.PMTLastSectionNumber = buffer[i];
  855. break;
  856. case 3:
  857. parser.PCRPID = (ushort)
  858. ((buffer[i] & 0x1F) << 8);
  859. break;
  860. case 2:
  861. parser.PCRPID |= buffer[i];
  862. break;
  863. case 1:
  864. parser.PMTProgramInfoLength = (ushort)
  865. ((buffer[i] & 0xF) << 8);
  866. break;
  867. case 0:
  868. parser.PMTProgramInfoLength |= buffer[i];
  869. if (parser.PMTProgramInfoLength == 0)
  870. {
  871. parser.PMTTransferState = true;
  872. }
  873. else
  874. {
  875. parser.PMTProgramDescriptorLengthParse = 2;
  876. }
  877. break;
  878. }
  879. }
  880. else if (parser.PMTProgramInfoLength > 0)
  881. {
  882. --parser.PMTSectionLength;
  883. --parser.PMTProgramInfoLength;
  884. if (parser.PMTProgramDescriptorLengthParse > 0)
  885. {
  886. --parser.PMTProgramDescriptorLengthParse;
  887. switch (parser.PMTProgramDescriptorLengthParse)
  888. {
  889. case 1:
  890. parser.PMTProgramDescriptor = buffer[i];
  891. break;
  892. case 0:
  893. parser.PMTProgramDescriptorLength = buffer[i];
  894. parser.PMTProgramDescriptors.Add(
  895. new TSDescriptor(
  896. parser.PMTProgramDescriptor,
  897. parser.PMTProgramDescriptorLength));
  898. break;
  899. }
  900. }
  901. else if (parser.PMTProgramDescriptorLength > 0)
  902. {
  903. --parser.PMTProgramDescriptorLength;
  904. TSDescriptor descriptor = parser.PMTProgramDescriptors[
  905. parser.PMTProgramDescriptors.Count - 1];
  906. int valueIndex =
  907. descriptor.Value.Length -
  908. parser.PMTProgramDescriptorLength - 1;
  909. descriptor.Value[valueIndex] = buffer[i];
  910. if (parser.PMTProgramDescriptorLength == 0 &&
  911. parser.PMTProgramInfoLength > 0)
  912. {
  913. parser.PMTProgramDescriptorLengthParse = 2;
  914. }
  915. }
  916. if (parser.PMTProgramInfoLength == 0)
  917. {
  918. parser.PMTTransferState = true;
  919. }
  920. }
  921. }
  922. if (parser.PacketLength == 0)
  923. {
  924. parser.SyncState = false;
  925. }
  926. }
  927. else if (parser.Stream != null &&
  928. parser.StreamState != null &&
  929. parser.TransportScramblingControl == 0)
  930. {
  931. TSStream stream = parser.Stream;
  932. TSStreamState streamState = parser.StreamState;
  933. streamState.Parse =
  934. (streamState.Parse << 8) + buffer[i];
  935. if (streamState.TransferState)
  936. {
  937. if ((bufferLength - i) >= streamState.PacketLength &&
  938. streamState.PacketLength > 0)
  939. {
  940. offset = streamState.PacketLength;
  941. }
  942. else
  943. {
  944. offset = (bufferLength - i);
  945. }
  946. if (parser.PacketLength <= offset)
  947. {
  948. offset = parser.PacketLength;
  949. }
  950. streamState.TransferLength = offset;
  951. if (!stream.IsInitialized ||
  952. stream.IsVideoStream)
  953. {
  954. streamState.StreamBuffer.Add(
  955. buffer, i, offset);
  956. }
  957. else
  958. {
  959. streamState.StreamBuffer.TransferLength += offset;
  960. }
  961. i += (int)(streamState.TransferLength - 1);
  962. streamState.PacketLength -= streamState.TransferLength;
  963. parser.PacketLength -= (byte)streamState.TransferLength;
  964. streamState.TotalBytes += (ulong)streamState.TransferLength;
  965. streamState.WindowBytes += (ulong)streamState.TransferLength;
  966. if (streamState.PacketLength == 0)
  967. {
  968. streamState.TransferState = false;
  969. streamState.TransferCount++;
  970. bool isFinished = ScanStream(
  971. stream,
  972. streamState,
  973. streamState.StreamBuffer);
  974. if (!isFullScan && isFinished)
  975. {
  976. return;
  977. }
  978. }
  979. }
  980. else
  981. {
  982. --parser.PacketLength;
  983. bool headerFound = false;
  984. if (stream.IsVideoStream &&
  985. streamState.Parse == 0x000001FD)
  986. {
  987. headerFound = true;
  988. }
  989. if (stream.IsVideoStream &&
  990. streamState.Parse >= 0x000001E0 &&
  991. streamState.Parse <= 0x000001EF)
  992. {
  993. headerFound = true;
  994. }
  995. if (stream.IsAudioStream &&
  996. streamState.Parse == 0x000001BD)
  997. {
  998. headerFound = true;
  999. }
  1000. if (stream.IsAudioStream &&
  1001. (streamState.Parse == 0x000001FA ||
  1002. streamState.Parse == 0x000001FD))
  1003. {
  1004. headerFound = true;
  1005. }
  1006. if (!stream.IsVideoStream &&
  1007. !stream.IsAudioStream &&
  1008. (streamState.Parse == 0x000001FA ||
  1009. streamState.Parse == 0x000001FD ||
  1010. streamState.Parse == 0x000001BD ||
  1011. (streamState.Parse >= 0x000001E0 &&
  1012. streamState.Parse <= 0x000001EF)))
  1013. {
  1014. headerFound = true;
  1015. }
  1016. if (headerFound)
  1017. {
  1018. streamState.PacketLengthParse = 2;
  1019. #if DEBUG
  1020. streamState.PESHeaderIndex = 0;
  1021. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1022. (byte)((streamState.Parse >> 24) & 0xFF);
  1023. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1024. (byte)((streamState.Parse >> 16) & 0xFF);
  1025. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1026. (byte)((streamState.Parse >> 8) & 0xFF);
  1027. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1028. (byte)(streamState.Parse & 0xFF);
  1029. #endif
  1030. }
  1031. else if (streamState.PacketLengthParse > 0)
  1032. {
  1033. --streamState.PacketLengthParse;
  1034. switch (streamState.PacketLengthParse)
  1035. {
  1036. case 1:
  1037. #if DEBUG
  1038. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1039. (byte)(streamState.Parse & 0xFF);
  1040. #endif
  1041. break;
  1042. case 0:
  1043. streamState.PacketLength =
  1044. (int)(streamState.Parse & 0xFFFF);
  1045. streamState.PacketParse = 3;
  1046. #if DEBUG
  1047. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1048. (byte)(streamState.Parse & 0xFF);
  1049. #endif
  1050. break;
  1051. }
  1052. }
  1053. else if (streamState.PacketParse > 0)
  1054. {
  1055. --streamState.PacketLength;
  1056. --streamState.PacketParse;
  1057. switch (streamState.PacketParse)
  1058. {
  1059. case 2:
  1060. #if DEBUG
  1061. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1062. (byte)(streamState.Parse & 0xFF);
  1063. #endif
  1064. break;
  1065. case 1:
  1066. streamState.PESHeaderFlags =
  1067. (byte)(streamState.Parse & 0xFF);
  1068. #if DEBUG
  1069. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1070. (byte)(streamState.Parse & 0xFF);
  1071. #endif
  1072. break;
  1073. case 0:
  1074. streamState.PESHeaderLength =
  1075. (byte)(streamState.Parse & 0xFF);
  1076. #if DEBUG
  1077. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1078. (byte)(streamState.Parse & 0xFF);
  1079. #endif
  1080. if ((streamState.PESHeaderFlags & 0xC0) == 0x80)
  1081. {
  1082. streamState.PTSParse = 5;
  1083. }
  1084. else if ((streamState.PESHeaderFlags & 0xC0) == 0xC0)
  1085. {
  1086. streamState.DTSParse = 10;
  1087. }
  1088. if (streamState.PESHeaderLength == 0)
  1089. {
  1090. streamState.TransferState = true;
  1091. }
  1092. break;
  1093. }
  1094. }
  1095. else if (streamState.PTSParse > 0)
  1096. {
  1097. --streamState.PacketLength;
  1098. --streamState.PESHeaderLength;
  1099. --streamState.PTSParse;
  1100. switch (streamState.PTSParse)
  1101. {
  1102. case 4:
  1103. streamState.PTSTemp =
  1104. ((streamState.Parse & 0xE) << 29);
  1105. #if DEBUG
  1106. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1107. (byte)(streamState.Parse & 0xff);
  1108. #endif
  1109. break;
  1110. case 3:
  1111. streamState.PTSTemp |=
  1112. ((streamState.Parse & 0xFF) << 22);
  1113. #if DEBUG
  1114. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1115. (byte)(streamState.Parse & 0xFF);
  1116. #endif
  1117. break;
  1118. case 2:
  1119. streamState.PTSTemp |=
  1120. ((streamState.Parse & 0xFE) << 14);
  1121. #if DEBUG
  1122. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1123. (byte)(streamState.Parse & 0xFF);
  1124. #endif
  1125. break;
  1126. case 1:
  1127. streamState.PTSTemp |=
  1128. ((streamState.Parse & 0xFF) << 7);
  1129. #if DEBUG
  1130. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1131. (byte)(streamState.Parse & 0xFF);
  1132. #endif
  1133. break;
  1134. case 0:
  1135. streamState.PTSTemp |=
  1136. ((streamState.Parse & 0xFE) >> 1);
  1137. #if DEBUG
  1138. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1139. (byte)(streamState.Parse & 0xff);
  1140. #endif
  1141. streamState.PTS = streamState.PTSTemp;
  1142. if (streamState.PTS > streamState.PTSLast)
  1143. {
  1144. if (streamState.PTSLast > 0)
  1145. {
  1146. streamState.PTSTransfer = (streamState.PTS - streamState.PTSLast);
  1147. }
  1148. streamState.PTSLast = streamState.PTS;
  1149. }
  1150. streamState.PTSDiff = streamState.PTS - streamState.DTSPrev;
  1151. if (streamState.PTSCount > 0 &&
  1152. stream.IsVideoStream)
  1153. {
  1154. UpdateStreamBitrates(stream.PID, streamState.PTS, streamState.PTSDiff);
  1155. if (streamState.DTSTemp < parser.PTSFirst)
  1156. {
  1157. parser.PTSFirst = streamState.DTSTemp;
  1158. }
  1159. if (streamState.DTSTemp > parser.PTSLast)
  1160. {
  1161. parser.PTSLast = streamState.DTSTemp;
  1162. }
  1163. Length = (double)(parser.PTSLast - parser.PTSFirst) / 90000;
  1164. }
  1165. streamState.DTSPrev = streamState.PTS;
  1166. streamState.PTSCount++;
  1167. if (streamState.PESHeaderLength == 0)
  1168. {
  1169. streamState.TransferState = true;
  1170. }
  1171. break;
  1172. }
  1173. }
  1174. else if (streamState.DTSParse > 0)
  1175. {
  1176. --streamState.PacketLength;
  1177. --streamState.PESHeaderLength;
  1178. --streamState.DTSParse;
  1179. switch (streamState.DTSParse)
  1180. {
  1181. case 9:
  1182. streamState.PTSTemp =
  1183. ((streamState.Parse & 0xE) << 29);
  1184. #if DEBUG
  1185. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1186. (byte)(streamState.Parse & 0xFF);
  1187. #endif
  1188. break;
  1189. case 8:
  1190. streamState.PTSTemp |=
  1191. ((streamState.Parse & 0xFF) << 22);
  1192. #if DEBUG
  1193. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1194. (byte)(streamState.Parse & 0xFF);
  1195. #endif
  1196. break;
  1197. case 7:
  1198. streamState.PTSTemp |=
  1199. ((streamState.Parse & 0xFE) << 14);
  1200. #if DEBUG
  1201. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1202. (byte)(streamState.Parse & 0xff);
  1203. #endif
  1204. break;
  1205. case 6:
  1206. streamState.PTSTemp |=
  1207. ((streamState.Parse & 0xFF) << 7);
  1208. #if DEBUG
  1209. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1210. (byte)(streamState.Parse & 0xFF);
  1211. #endif
  1212. break;
  1213. case 5:
  1214. streamState.PTSTemp |=
  1215. ((streamState.Parse & 0xFE) >> 1);
  1216. #if DEBUG
  1217. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1218. (byte)(streamState.Parse & 0xff);
  1219. #endif
  1220. streamState.PTS = streamState.PTSTemp;
  1221. if (streamState.PTS > streamState.PTSLast)
  1222. {
  1223. streamState.PTSLast = streamState.PTS;
  1224. }
  1225. break;
  1226. case 4:
  1227. streamState.DTSTemp =
  1228. ((streamState.Parse & 0xE) << 29);
  1229. #if DEBUG
  1230. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1231. (byte)(streamState.Parse & 0xff);
  1232. #endif
  1233. break;
  1234. case 3:
  1235. streamState.DTSTemp |=
  1236. ((streamState.Parse & 0xFF) << 22);
  1237. #if DEBUG
  1238. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1239. (byte)(streamState.Parse & 0xff);
  1240. #endif
  1241. break;
  1242. case 2:
  1243. streamState.DTSTemp |=
  1244. ((streamState.Parse & 0xFE) << 14);
  1245. #if DEBUG
  1246. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1247. (byte)(streamState.Parse & 0xff);
  1248. #endif
  1249. break;
  1250. case 1:
  1251. streamState.DTSTemp |=
  1252. ((streamState.Parse & 0xFF) << 7);
  1253. #if DEBUG
  1254. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1255. (byte)(streamState.Parse & 0xFF);
  1256. #endif
  1257. break;
  1258. case 0:
  1259. streamState.DTSTemp |=
  1260. ((streamState.Parse & 0xFE) >> 1);
  1261. #if DEBUG
  1262. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1263. (byte)(streamState.Parse & 0xff);
  1264. #endif
  1265. streamState.PTSDiff = streamState.DTSTemp - streamState.DTSPrev;
  1266. if (streamState.PTSCount > 0 &&
  1267. stream.IsVideoStream)
  1268. {
  1269. UpdateStreamBitrates(stream.PID, streamState.DTSTemp, streamState.PTSDiff);
  1270. if (streamState.DTSTemp < parser.PTSFirst)
  1271. {
  1272. parser.PTSFirst = streamState.DTSTemp;
  1273. }
  1274. if (streamState.DTSTemp > parser.PTSLast)
  1275. {
  1276. parser.PTSLast = streamState.DTSTemp;
  1277. }
  1278. Length = (double)(parser.PTSLast - parser.PTSFirst) / 90000;
  1279. }
  1280. streamState.DTSPrev = streamState.DTSTemp;
  1281. streamState.PTSCount++;
  1282. if (streamState.PESHeaderLength == 0)
  1283. {
  1284. streamState.TransferState = true;
  1285. }
  1286. break;
  1287. }
  1288. }
  1289. else if (streamState.PESHeaderLength > 0)
  1290. {
  1291. --streamState.PacketLength;
  1292. --streamState.PESHeaderLength;
  1293. #if DEBUG
  1294. streamState.PESHeader[streamState.PESHeaderIndex++] =
  1295. (byte)(streamState.Parse & 0xFF);
  1296. #endif
  1297. if (streamState.PESHeaderLength == 0)
  1298. {
  1299. streamState.TransferState = true;
  1300. }
  1301. }
  1302. }
  1303. if (parser.PacketLength == 0)
  1304. {
  1305. parser.SyncState = false;
  1306. }
  1307. }
  1308. else
  1309. {
  1310. parser.PacketLength--;
  1311. if ((bufferLength - i) >= parser.PacketLength)
  1312. {
  1313. i = i + parser.PacketLength;
  1314. parser.PacketLength = 0;
  1315. }
  1316. else
  1317. {
  1318. parser.PacketLength -= (byte)((bufferLength - i) + 1);
  1319. i = bufferLength;
  1320. }
  1321. if (parser.PacketLength == 0)
  1322. {
  1323. parser.SyncState = false;
  1324. }
  1325. }
  1326. }
  1327. Size += bufferLength;
  1328. }
  1329. ulong PTSLast = 0;
  1330. ulong PTSDiff = 0;
  1331. foreach (TSStream stream in Streams.Values)
  1332. {
  1333. if (!stream.IsVideoStream) continue;
  1334. if (StreamStates.ContainsKey(stream.PID) &&
  1335. StreamStates[stream.PID].PTSLast > PTSLast)
  1336. {
  1337. PTSLast = StreamStates[stream.PID].PTSLast;
  1338. PTSDiff = PTSLast - StreamStates[stream.PID].DTSPrev;
  1339. }
  1340. UpdateStreamBitrates(stream.PID, PTSLast, PTSDiff);
  1341. }
  1342. }
  1343. finally
  1344. {
  1345. if (fileStream != null)
  1346. {
  1347. fileStream.Close();
  1348. }
  1349. }
  1350. }
  1351. private TSStream CreateStream(
  1352. ushort streamPID,
  1353. byte streamType,
  1354. List<TSDescriptor> streamDescriptors)
  1355. {
  1356. TSStream stream = null;
  1357. switch ((TSStreamType)streamType)
  1358. {
  1359. case TSStreamType.MVC_VIDEO:
  1360. case TSStreamType.AVC_VIDEO:
  1361. case TSStreamType.MPEG1_VIDEO:
  1362. case TSStreamType.MPEG2_VIDEO:
  1363. case TSStreamType.VC1_VIDEO:
  1364. {
  1365. stream = new TSVideoStream();
  1366. }
  1367. break;
  1368. case TSStreamType.AC3_AUDIO:
  1369. case TSStreamType.AC3_PLUS_AUDIO:
  1370. case TSStreamType.AC3_PLUS_SECONDARY_AUDIO:
  1371. case TSStreamType.AC3_TRUE_HD_AUDIO:
  1372. case TSStreamType.DTS_AUDIO:
  1373. case TSStreamType.DTS_HD_AUDIO:
  1374. case TSStreamType.DTS_HD_MASTER_AUDIO:
  1375. case TSStreamType.DTS_HD_SECONDARY_AUDIO:
  1376. case TSStreamType.LPCM_AUDIO:
  1377. case TSStreamType.MPEG1_AUDIO:
  1378. case TSStreamType.MPEG2_AUDIO:
  1379. {
  1380. stream = new TSAudioStream();
  1381. }
  1382. break;
  1383. case TSStreamType.INTERACTIVE_GRAPHICS:
  1384. case TSStreamType.PRESENTATION_GRAPHICS:
  1385. {
  1386. stream = new TSGraphicsStream();
  1387. }
  1388. break;
  1389. case TSStreamType.SUBTITLE:
  1390. {
  1391. stream = new TSTextStream();
  1392. }
  1393. break;
  1394. default:
  1395. break;
  1396. }
  1397. if (stream != null &&
  1398. !Streams.ContainsKey(streamPID))
  1399. {
  1400. stream.PID = streamPID;
  1401. stream.StreamType = (TSStreamType)streamType;
  1402. stream.Descriptors = streamDescriptors;
  1403. Streams[stream.PID] = stream;
  1404. }
  1405. if (!StreamDiagnostics.ContainsKey(streamPID))
  1406. {
  1407. StreamDiagnostics[streamPID] =
  1408. new List<TSStreamDiagnostics>();
  1409. }
  1410. return stream;
  1411. }
  1412. }
  1413. }