TSStreamFile.cs 71 KB

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