TSStream.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801
  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. using System;
  20. using System.Collections.Generic;
  21. namespace BDInfo
  22. {
  23. public enum TSStreamType : byte
  24. {
  25. Unknown = 0,
  26. MPEG1_VIDEO = 0x01,
  27. MPEG2_VIDEO = 0x02,
  28. AVC_VIDEO = 0x1b,
  29. MVC_VIDEO = 0x20,
  30. VC1_VIDEO = 0xea,
  31. MPEG1_AUDIO = 0x03,
  32. MPEG2_AUDIO = 0x04,
  33. LPCM_AUDIO = 0x80,
  34. AC3_AUDIO = 0x81,
  35. AC3_PLUS_AUDIO = 0x84,
  36. AC3_PLUS_SECONDARY_AUDIO = 0xA1,
  37. AC3_TRUE_HD_AUDIO = 0x83,
  38. DTS_AUDIO = 0x82,
  39. DTS_HD_AUDIO = 0x85,
  40. DTS_HD_SECONDARY_AUDIO = 0xA2,
  41. DTS_HD_MASTER_AUDIO = 0x86,
  42. PRESENTATION_GRAPHICS = 0x90,
  43. INTERACTIVE_GRAPHICS = 0x91,
  44. SUBTITLE = 0x92
  45. }
  46. public enum TSVideoFormat : byte
  47. {
  48. Unknown = 0,
  49. VIDEOFORMAT_480i = 1,
  50. VIDEOFORMAT_576i = 2,
  51. VIDEOFORMAT_480p = 3,
  52. VIDEOFORMAT_1080i = 4,
  53. VIDEOFORMAT_720p = 5,
  54. VIDEOFORMAT_1080p = 6,
  55. VIDEOFORMAT_576p = 7,
  56. }
  57. public enum TSFrameRate : byte
  58. {
  59. Unknown = 0,
  60. FRAMERATE_23_976 = 1,
  61. FRAMERATE_24 = 2,
  62. FRAMERATE_25 = 3,
  63. FRAMERATE_29_97 = 4,
  64. FRAMERATE_50 = 6,
  65. FRAMERATE_59_94 = 7
  66. }
  67. public enum TSChannelLayout : byte
  68. {
  69. Unknown = 0,
  70. CHANNELLAYOUT_MONO = 1,
  71. CHANNELLAYOUT_STEREO = 3,
  72. CHANNELLAYOUT_MULTI = 6,
  73. CHANNELLAYOUT_COMBO = 12
  74. }
  75. public enum TSSampleRate : byte
  76. {
  77. Unknown = 0,
  78. SAMPLERATE_48 = 1,
  79. SAMPLERATE_96 = 4,
  80. SAMPLERATE_192 = 5,
  81. SAMPLERATE_48_192 = 12,
  82. SAMPLERATE_48_96 = 14
  83. }
  84. public enum TSAspectRatio
  85. {
  86. Unknown = 0,
  87. ASPECT_4_3 = 2,
  88. ASPECT_16_9 = 3,
  89. ASPECT_2_21 = 4
  90. }
  91. public class TSDescriptor
  92. {
  93. public byte Name;
  94. public byte[] Value;
  95. public TSDescriptor(byte name, byte length)
  96. {
  97. Name = name;
  98. Value = new byte[length];
  99. }
  100. public TSDescriptor Clone()
  101. {
  102. TSDescriptor descriptor =
  103. new TSDescriptor(Name, (byte)Value.Length);
  104. Value.CopyTo(descriptor.Value, 0);
  105. return descriptor;
  106. }
  107. }
  108. public abstract class TSStream
  109. {
  110. public TSStream()
  111. {
  112. }
  113. public override string ToString()
  114. {
  115. return string.Format("{0} ({1})", CodecShortName, PID);
  116. }
  117. public ushort PID;
  118. public TSStreamType StreamType;
  119. public List<TSDescriptor> Descriptors = null;
  120. public long BitRate = 0;
  121. public long ActiveBitRate = 0;
  122. public bool IsVBR = false;
  123. public bool IsInitialized = false;
  124. public string LanguageName;
  125. public bool IsHidden = false;
  126. public ulong PayloadBytes = 0;
  127. public ulong PacketCount = 0;
  128. public double PacketSeconds = 0;
  129. public int AngleIndex = 0;
  130. public ulong PacketSize
  131. {
  132. get
  133. {
  134. return PacketCount * 192;
  135. }
  136. }
  137. private string _LanguageCode;
  138. public string LanguageCode
  139. {
  140. get
  141. {
  142. return _LanguageCode;
  143. }
  144. set
  145. {
  146. _LanguageCode = value;
  147. LanguageName = LanguageCodes.GetName(value);
  148. }
  149. }
  150. public bool IsVideoStream
  151. {
  152. get
  153. {
  154. switch (StreamType)
  155. {
  156. case TSStreamType.MPEG1_VIDEO:
  157. case TSStreamType.MPEG2_VIDEO:
  158. case TSStreamType.AVC_VIDEO:
  159. case TSStreamType.MVC_VIDEO:
  160. case TSStreamType.VC1_VIDEO:
  161. return true;
  162. default:
  163. return false;
  164. }
  165. }
  166. }
  167. public bool IsAudioStream
  168. {
  169. get
  170. {
  171. switch (StreamType)
  172. {
  173. case TSStreamType.MPEG1_AUDIO:
  174. case TSStreamType.MPEG2_AUDIO:
  175. case TSStreamType.LPCM_AUDIO:
  176. case TSStreamType.AC3_AUDIO:
  177. case TSStreamType.AC3_PLUS_AUDIO:
  178. case TSStreamType.AC3_PLUS_SECONDARY_AUDIO:
  179. case TSStreamType.AC3_TRUE_HD_AUDIO:
  180. case TSStreamType.DTS_AUDIO:
  181. case TSStreamType.DTS_HD_AUDIO:
  182. case TSStreamType.DTS_HD_SECONDARY_AUDIO:
  183. case TSStreamType.DTS_HD_MASTER_AUDIO:
  184. return true;
  185. default:
  186. return false;
  187. }
  188. }
  189. }
  190. public bool IsGraphicsStream
  191. {
  192. get
  193. {
  194. switch (StreamType)
  195. {
  196. case TSStreamType.PRESENTATION_GRAPHICS:
  197. case TSStreamType.INTERACTIVE_GRAPHICS:
  198. return true;
  199. default:
  200. return false;
  201. }
  202. }
  203. }
  204. public bool IsTextStream
  205. {
  206. get
  207. {
  208. switch (StreamType)
  209. {
  210. case TSStreamType.SUBTITLE:
  211. return true;
  212. default:
  213. return false;
  214. }
  215. }
  216. }
  217. public string CodecName
  218. {
  219. get
  220. {
  221. switch (StreamType)
  222. {
  223. case TSStreamType.MPEG1_VIDEO:
  224. return "MPEG-1 Video";
  225. case TSStreamType.MPEG2_VIDEO:
  226. return "MPEG-2 Video";
  227. case TSStreamType.AVC_VIDEO:
  228. return "MPEG-4 AVC Video";
  229. case TSStreamType.MVC_VIDEO:
  230. return "MPEG-4 MVC Video";
  231. case TSStreamType.VC1_VIDEO:
  232. return "VC-1 Video";
  233. case TSStreamType.MPEG1_AUDIO:
  234. return "MP1 Audio";
  235. case TSStreamType.MPEG2_AUDIO:
  236. return "MP2 Audio";
  237. case TSStreamType.LPCM_AUDIO:
  238. return "LPCM Audio";
  239. case TSStreamType.AC3_AUDIO:
  240. if (((TSAudioStream)this).AudioMode == TSAudioMode.Extended)
  241. return "Dolby Digital EX Audio";
  242. else
  243. return "Dolby Digital Audio";
  244. case TSStreamType.AC3_PLUS_AUDIO:
  245. case TSStreamType.AC3_PLUS_SECONDARY_AUDIO:
  246. return "Dolby Digital Plus Audio";
  247. case TSStreamType.AC3_TRUE_HD_AUDIO:
  248. return "Dolby TrueHD Audio";
  249. case TSStreamType.DTS_AUDIO:
  250. if (((TSAudioStream)this).AudioMode == TSAudioMode.Extended)
  251. return "DTS-ES Audio";
  252. else
  253. return "DTS Audio";
  254. case TSStreamType.DTS_HD_AUDIO:
  255. return "DTS-HD High-Res Audio";
  256. case TSStreamType.DTS_HD_SECONDARY_AUDIO:
  257. return "DTS Express";
  258. case TSStreamType.DTS_HD_MASTER_AUDIO:
  259. return "DTS-HD Master Audio";
  260. case TSStreamType.PRESENTATION_GRAPHICS:
  261. return "Presentation Graphics";
  262. case TSStreamType.INTERACTIVE_GRAPHICS:
  263. return "Interactive Graphics";
  264. case TSStreamType.SUBTITLE:
  265. return "Subtitle";
  266. default:
  267. return "UNKNOWN";
  268. }
  269. }
  270. }
  271. public string CodecAltName
  272. {
  273. get
  274. {
  275. switch (StreamType)
  276. {
  277. case TSStreamType.MPEG1_VIDEO:
  278. return "MPEG-1";
  279. case TSStreamType.MPEG2_VIDEO:
  280. return "MPEG-2";
  281. case TSStreamType.AVC_VIDEO:
  282. return "AVC";
  283. case TSStreamType.MVC_VIDEO:
  284. return "MVC";
  285. case TSStreamType.VC1_VIDEO:
  286. return "VC-1";
  287. case TSStreamType.MPEG1_AUDIO:
  288. return "MP1";
  289. case TSStreamType.MPEG2_AUDIO:
  290. return "MP2";
  291. case TSStreamType.LPCM_AUDIO:
  292. return "LPCM";
  293. case TSStreamType.AC3_AUDIO:
  294. return "DD AC3";
  295. case TSStreamType.AC3_PLUS_AUDIO:
  296. case TSStreamType.AC3_PLUS_SECONDARY_AUDIO:
  297. return "DD AC3+";
  298. case TSStreamType.AC3_TRUE_HD_AUDIO:
  299. return "Dolby TrueHD";
  300. case TSStreamType.DTS_AUDIO:
  301. return "DTS";
  302. case TSStreamType.DTS_HD_AUDIO:
  303. return "DTS-HD Hi-Res";
  304. case TSStreamType.DTS_HD_SECONDARY_AUDIO:
  305. return "DTS Express";
  306. case TSStreamType.DTS_HD_MASTER_AUDIO:
  307. return "DTS-HD Master";
  308. case TSStreamType.PRESENTATION_GRAPHICS:
  309. return "PGS";
  310. case TSStreamType.INTERACTIVE_GRAPHICS:
  311. return "IGS";
  312. case TSStreamType.SUBTITLE:
  313. return "SUB";
  314. default:
  315. return "UNKNOWN";
  316. }
  317. }
  318. }
  319. public string CodecShortName
  320. {
  321. get
  322. {
  323. switch (StreamType)
  324. {
  325. case TSStreamType.MPEG1_VIDEO:
  326. return "MPEG-1";
  327. case TSStreamType.MPEG2_VIDEO:
  328. return "MPEG-2";
  329. case TSStreamType.AVC_VIDEO:
  330. return "AVC";
  331. case TSStreamType.MVC_VIDEO:
  332. return "MVC";
  333. case TSStreamType.VC1_VIDEO:
  334. return "VC-1";
  335. case TSStreamType.MPEG1_AUDIO:
  336. return "MP1";
  337. case TSStreamType.MPEG2_AUDIO:
  338. return "MP2";
  339. case TSStreamType.LPCM_AUDIO:
  340. return "LPCM";
  341. case TSStreamType.AC3_AUDIO:
  342. if (((TSAudioStream)this).AudioMode == TSAudioMode.Extended)
  343. return "AC3-EX";
  344. else
  345. return "AC3";
  346. case TSStreamType.AC3_PLUS_AUDIO:
  347. case TSStreamType.AC3_PLUS_SECONDARY_AUDIO:
  348. return "AC3+";
  349. case TSStreamType.AC3_TRUE_HD_AUDIO:
  350. return "TrueHD";
  351. case TSStreamType.DTS_AUDIO:
  352. if (((TSAudioStream)this).AudioMode == TSAudioMode.Extended)
  353. return "DTS-ES";
  354. else
  355. return "DTS";
  356. case TSStreamType.DTS_HD_AUDIO:
  357. return "DTS-HD HR";
  358. case TSStreamType.DTS_HD_SECONDARY_AUDIO:
  359. return "DTS Express";
  360. case TSStreamType.DTS_HD_MASTER_AUDIO:
  361. return "DTS-HD MA";
  362. case TSStreamType.PRESENTATION_GRAPHICS:
  363. return "PGS";
  364. case TSStreamType.INTERACTIVE_GRAPHICS:
  365. return "IGS";
  366. case TSStreamType.SUBTITLE:
  367. return "SUB";
  368. default:
  369. return "UNKNOWN";
  370. }
  371. }
  372. }
  373. public virtual string Description
  374. {
  375. get
  376. {
  377. return "";
  378. }
  379. }
  380. public abstract TSStream Clone();
  381. protected void CopyTo(TSStream stream)
  382. {
  383. stream.PID = PID;
  384. stream.StreamType = StreamType;
  385. stream.IsVBR = IsVBR;
  386. stream.BitRate = BitRate;
  387. stream.IsInitialized = IsInitialized;
  388. stream.LanguageCode = _LanguageCode;
  389. if (Descriptors != null)
  390. {
  391. stream.Descriptors = new List<TSDescriptor>();
  392. foreach (TSDescriptor descriptor in Descriptors)
  393. {
  394. stream.Descriptors.Add(descriptor.Clone());
  395. }
  396. }
  397. }
  398. }
  399. public class TSVideoStream : TSStream
  400. {
  401. public TSVideoStream()
  402. {
  403. }
  404. public int Width;
  405. public int Height;
  406. public bool IsInterlaced;
  407. public int FrameRateEnumerator;
  408. public int FrameRateDenominator;
  409. public TSAspectRatio AspectRatio;
  410. public string EncodingProfile;
  411. private TSVideoFormat _VideoFormat;
  412. public TSVideoFormat VideoFormat
  413. {
  414. get
  415. {
  416. return _VideoFormat;
  417. }
  418. set
  419. {
  420. _VideoFormat = value;
  421. switch (value)
  422. {
  423. case TSVideoFormat.VIDEOFORMAT_480i:
  424. Height = 480;
  425. IsInterlaced = true;
  426. break;
  427. case TSVideoFormat.VIDEOFORMAT_480p:
  428. Height = 480;
  429. IsInterlaced = false;
  430. break;
  431. case TSVideoFormat.VIDEOFORMAT_576i:
  432. Height = 576;
  433. IsInterlaced = true;
  434. break;
  435. case TSVideoFormat.VIDEOFORMAT_576p:
  436. Height = 576;
  437. IsInterlaced = false;
  438. break;
  439. case TSVideoFormat.VIDEOFORMAT_720p:
  440. Height = 720;
  441. IsInterlaced = false;
  442. break;
  443. case TSVideoFormat.VIDEOFORMAT_1080i:
  444. Height = 1080;
  445. IsInterlaced = true;
  446. break;
  447. case TSVideoFormat.VIDEOFORMAT_1080p:
  448. Height = 1080;
  449. IsInterlaced = false;
  450. break;
  451. }
  452. }
  453. }
  454. private TSFrameRate _FrameRate;
  455. public TSFrameRate FrameRate
  456. {
  457. get
  458. {
  459. return _FrameRate;
  460. }
  461. set
  462. {
  463. _FrameRate = value;
  464. switch (value)
  465. {
  466. case TSFrameRate.FRAMERATE_23_976:
  467. FrameRateEnumerator = 24000;
  468. FrameRateDenominator = 1001;
  469. break;
  470. case TSFrameRate.FRAMERATE_24:
  471. FrameRateEnumerator = 24000;
  472. FrameRateDenominator = 1000;
  473. break;
  474. case TSFrameRate.FRAMERATE_25:
  475. FrameRateEnumerator = 25000;
  476. FrameRateDenominator = 1000;
  477. break;
  478. case TSFrameRate.FRAMERATE_29_97:
  479. FrameRateEnumerator = 30000;
  480. FrameRateDenominator = 1001;
  481. break;
  482. case TSFrameRate.FRAMERATE_50:
  483. FrameRateEnumerator = 50000;
  484. FrameRateDenominator = 1000;
  485. break;
  486. case TSFrameRate.FRAMERATE_59_94:
  487. FrameRateEnumerator = 60000;
  488. FrameRateDenominator = 1001;
  489. break;
  490. }
  491. }
  492. }
  493. public override string Description
  494. {
  495. get
  496. {
  497. string description = "";
  498. if (Height > 0)
  499. {
  500. description += string.Format("{0:D}{1} / ",
  501. Height,
  502. IsInterlaced ? "i" : "p");
  503. }
  504. if (FrameRateEnumerator > 0 &&
  505. FrameRateDenominator > 0)
  506. {
  507. if (FrameRateEnumerator % FrameRateDenominator == 0)
  508. {
  509. description += string.Format("{0:D} fps / ",
  510. FrameRateEnumerator / FrameRateDenominator);
  511. }
  512. else
  513. {
  514. description += string.Format("{0:F3} fps / ",
  515. (double)FrameRateEnumerator / FrameRateDenominator);
  516. }
  517. }
  518. if (AspectRatio == TSAspectRatio.ASPECT_4_3)
  519. {
  520. description += "4:3 / ";
  521. }
  522. else if (AspectRatio == TSAspectRatio.ASPECT_16_9)
  523. {
  524. description += "16:9 / ";
  525. }
  526. if (EncodingProfile != null)
  527. {
  528. description += EncodingProfile + " / ";
  529. }
  530. if (description.EndsWith(" / "))
  531. {
  532. description = description.Substring(0, description.Length - 3);
  533. }
  534. return description;
  535. }
  536. }
  537. public override TSStream Clone()
  538. {
  539. TSVideoStream stream = new TSVideoStream();
  540. CopyTo(stream);
  541. stream.VideoFormat = _VideoFormat;
  542. stream.FrameRate = _FrameRate;
  543. stream.Width = Width;
  544. stream.Height = Height;
  545. stream.IsInterlaced = IsInterlaced;
  546. stream.FrameRateEnumerator = FrameRateEnumerator;
  547. stream.FrameRateDenominator = FrameRateDenominator;
  548. stream.AspectRatio = AspectRatio;
  549. stream.EncodingProfile = EncodingProfile;
  550. return stream;
  551. }
  552. }
  553. public enum TSAudioMode
  554. {
  555. Unknown,
  556. DualMono,
  557. Stereo,
  558. Surround,
  559. Extended
  560. }
  561. public class TSAudioStream : TSStream
  562. {
  563. public TSAudioStream()
  564. {
  565. }
  566. public int SampleRate;
  567. public int ChannelCount;
  568. public int BitDepth;
  569. public int LFE;
  570. public int DialNorm;
  571. public TSAudioMode AudioMode;
  572. public TSAudioStream CoreStream;
  573. public TSChannelLayout ChannelLayout;
  574. public static int ConvertSampleRate(
  575. TSSampleRate sampleRate)
  576. {
  577. switch (sampleRate)
  578. {
  579. case TSSampleRate.SAMPLERATE_48:
  580. return 48000;
  581. case TSSampleRate.SAMPLERATE_96:
  582. case TSSampleRate.SAMPLERATE_48_96:
  583. return 96000;
  584. case TSSampleRate.SAMPLERATE_192:
  585. case TSSampleRate.SAMPLERATE_48_192:
  586. return 192000;
  587. }
  588. return 0;
  589. }
  590. public string ChannelDescription
  591. {
  592. get
  593. {
  594. if (ChannelLayout == TSChannelLayout.CHANNELLAYOUT_MONO &&
  595. ChannelCount == 2)
  596. {
  597. }
  598. string description = "";
  599. if (ChannelCount > 0)
  600. {
  601. description += string.Format(
  602. "{0:D}.{1:D}",
  603. ChannelCount, LFE);
  604. }
  605. else
  606. {
  607. switch (ChannelLayout)
  608. {
  609. case TSChannelLayout.CHANNELLAYOUT_MONO:
  610. description += "1.0";
  611. break;
  612. case TSChannelLayout.CHANNELLAYOUT_STEREO:
  613. description += "2.0";
  614. break;
  615. case TSChannelLayout.CHANNELLAYOUT_MULTI:
  616. description += "5.1";
  617. break;
  618. }
  619. }
  620. if (AudioMode == TSAudioMode.Extended)
  621. {
  622. if (StreamType == TSStreamType.AC3_AUDIO)
  623. {
  624. description += "-EX";
  625. }
  626. if (StreamType == TSStreamType.DTS_AUDIO ||
  627. StreamType == TSStreamType.DTS_HD_AUDIO ||
  628. StreamType == TSStreamType.DTS_HD_MASTER_AUDIO)
  629. {
  630. description += "-ES";
  631. }
  632. }
  633. return description;
  634. }
  635. }
  636. public override string Description
  637. {
  638. get
  639. {
  640. string description = ChannelDescription;
  641. if (SampleRate > 0)
  642. {
  643. description += string.Format(
  644. " / {0:D} kHz", SampleRate / 1000);
  645. }
  646. if (BitRate > 0)
  647. {
  648. description += string.Format(
  649. " / {0:D} kbps", (uint)Math.Round((double)BitRate / 1000));
  650. }
  651. if (BitDepth > 0)
  652. {
  653. description += string.Format(
  654. " / {0:D}-bit", BitDepth);
  655. }
  656. if (DialNorm != 0)
  657. {
  658. description += string.Format(
  659. " / DN {0}dB", DialNorm);
  660. }
  661. if (ChannelCount == 2)
  662. {
  663. switch (AudioMode)
  664. {
  665. case TSAudioMode.DualMono:
  666. description += " / Dual Mono";
  667. break;
  668. case TSAudioMode.Surround:
  669. description += " / Dolby Surround";
  670. break;
  671. }
  672. }
  673. if (description.EndsWith(" / "))
  674. {
  675. description = description.Substring(0, description.Length - 3);
  676. }
  677. if (CoreStream != null)
  678. {
  679. string codec = "";
  680. switch (CoreStream.StreamType)
  681. {
  682. case TSStreamType.AC3_AUDIO:
  683. codec = "AC3 Embedded";
  684. break;
  685. case TSStreamType.DTS_AUDIO:
  686. codec = "DTS Core";
  687. break;
  688. }
  689. description += string.Format(
  690. " ({0}: {1})",
  691. codec,
  692. CoreStream.Description);
  693. }
  694. return description;
  695. }
  696. }
  697. public override TSStream Clone()
  698. {
  699. TSAudioStream stream = new TSAudioStream();
  700. CopyTo(stream);
  701. stream.SampleRate = SampleRate;
  702. stream.ChannelLayout = ChannelLayout;
  703. stream.ChannelCount = ChannelCount;
  704. stream.BitDepth = BitDepth;
  705. stream.LFE = LFE;
  706. stream.DialNorm = DialNorm;
  707. stream.AudioMode = AudioMode;
  708. if (CoreStream != null)
  709. {
  710. stream.CoreStream = (TSAudioStream)CoreStream.Clone();
  711. }
  712. return stream;
  713. }
  714. }
  715. public class TSGraphicsStream : TSStream
  716. {
  717. public TSGraphicsStream()
  718. {
  719. IsVBR = true;
  720. IsInitialized = true;
  721. }
  722. public override TSStream Clone()
  723. {
  724. TSGraphicsStream stream = new TSGraphicsStream();
  725. CopyTo(stream);
  726. return stream;
  727. }
  728. }
  729. public class TSTextStream : TSStream
  730. {
  731. public TSTextStream()
  732. {
  733. IsVBR = true;
  734. IsInitialized = true;
  735. }
  736. public override TSStream Clone()
  737. {
  738. TSTextStream stream = new TSTextStream();
  739. CopyTo(stream);
  740. return stream;
  741. }
  742. }
  743. }