TsProgram.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5. using System.Text;
  6. using MatrixIO.IO.MpegTs.Streams;
  7. using MatrixIO.IO.MpegTs.Tables;
  8. namespace MatrixIO.IO.MpegTs
  9. {
  10. public enum TsProgramStatus
  11. {
  12. Current,
  13. Dicontinued,
  14. Next,
  15. }
  16. public class TsProgram
  17. {
  18. private readonly object _syncObject = new object();
  19. public ushort ProgramNumber { get; private set; }
  20. public TsProgramStatus Status { get; internal set; }
  21. public TableStream ProgramMapStream { get; internal set; }
  22. public IList<TsStream> Streams { get; private set; }
  23. public IList<TsDescriptor> Info { get; private set; }
  24. public event EventHandler<ProgramStreamEventArgs> StreamAdded;
  25. public TsProgram(ushort programNumber, TableStream programMapStream)
  26. {
  27. ProgramNumber = programNumber;
  28. ProgramMapStream = programMapStream;
  29. ProgramMapStream.UnitReceived += ProgramMapTableReceived;
  30. Streams = Portability.CreateList<TsStream>();
  31. }
  32. void ProgramMapTableReceived(object sender, TsStreamEventArgs eventArgs)
  33. {
  34. var e = eventArgs as TsStreamEventArgs<TsTable>;
  35. if (e == null) return;
  36. lock (_syncObject)
  37. {
  38. var pmt = e.DecodedUnit.TableIdentifier == TableIdentifier.ProgramMap ? (ProgramMapTable) e.DecodedUnit : null;
  39. if (pmt == null) return;
  40. Debug.WriteLine("Program Map Received");
  41. Debug.WriteLine("Program Number: " + pmt.ProgramNumber + " Program Clock Reference PID: " +
  42. pmt.ProgramClockReferencePid);
  43. Info = pmt.ProgramInfo;
  44. foreach (var pm in pmt.Rows)
  45. {
  46. Debug.WriteLine("******** " + pm.StreamType + " on PID " + pm.PacketIdentifier);
  47. #if DEBUG
  48. foreach (var descriptor in pm.StreamInfo)
  49. Debug.WriteLine("\tHas " + descriptor.Tag + " descriptor.");
  50. #endif
  51. var stream =
  52. (from s in Streams where s.PacketIdentifier == pm.PacketIdentifier select s).FirstOrDefault();
  53. if (stream == null)
  54. {
  55. try
  56. {
  57. stream = (TsStream) Activator.CreateInstance(TsStream.StreamTypes[pm.StreamType]);
  58. stream.PacketIdentifier = pm.PacketIdentifier;
  59. }
  60. catch (Exception)
  61. {
  62. stream = new ByteStream() {PacketIdentifier = pm.PacketIdentifier};
  63. }
  64. Streams.Add(stream);
  65. OnStreamAdded(stream);
  66. }
  67. stream.Type = pm.StreamType;
  68. stream.Info = pm.StreamInfo;
  69. }
  70. }
  71. }
  72. private void OnStreamAdded(TsStream stream)
  73. {
  74. if (StreamAdded != null) StreamAdded(this, new ProgramStreamEventArgs() { Stream = stream });
  75. }
  76. public override string ToString()
  77. {
  78. return "Program " + ProgramNumber;
  79. }
  80. }
  81. public class ProgramStreamEventArgs : EventArgs
  82. {
  83. public TsStream Stream { get; set; }
  84. }
  85. }