TSStreamFile.cs 71 KB

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