MainWindow.xaml.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Diagnostics;
  5. using System.Linq;
  6. using System.Net;
  7. using System.Text;
  8. using System.Timers;
  9. using System.Windows;
  10. using System.Windows.Controls;
  11. using System.Windows.Data;
  12. using System.Windows.Documents;
  13. using System.Windows.Input;
  14. using System.Windows.Media;
  15. using System.Windows.Media.Imaging;
  16. using System.Windows.Navigation;
  17. using System.Windows.Shapes;
  18. using MatrixIO.IO.MpegTs;
  19. namespace TsViewer
  20. {
  21. /// <summary>
  22. /// Interaction logic for MainWindow.xaml
  23. /// </summary>
  24. public partial class MainWindow : Window
  25. {
  26. public DispatchingObservableCollection<TsSource> Sources { get; set; }
  27. private readonly Timer _updateTimer = new Timer(1000);
  28. private readonly TextWriterTraceListener _logWriter = new TextWriterTraceListener(@"C:\Temp\TsViewer.txt");
  29. public MainWindow()
  30. {
  31. Trace.Listeners.Add(_logWriter);
  32. Sources = new DispatchingObservableCollection<TsSource>();
  33. InitializeComponent();
  34. Loaded += MainWindow_Loaded;
  35. _updateTimer.Elapsed += _updateTimer_Elapsed;
  36. _updateTimer.AutoReset = true;
  37. #if DEBUG
  38. debugMenu.Visibility = Visibility.Visible;
  39. #endif
  40. }
  41. protected override void OnClosed(EventArgs e)
  42. {
  43. base.OnClosed(e);
  44. foreach (var source in Sources)
  45. {
  46. source.Stop();
  47. }
  48. }
  49. private static readonly string[] RateUnits = { "", "K", "M", "G", "T", "P", "Z"};
  50. void _updateTimer_Elapsed(object sender, ElapsedEventArgs e)
  51. {
  52. double averagePacketSize = 0;
  53. var totalBitrate = Sources.Count > 0
  54. ? Sources.OfType<TsUdpSource>().Select(udpSource => udpSource.Bitrate).Sum()
  55. : 0;
  56. averagePacketSize = totalBitrate / 8;
  57. int bitrateUnits = 0;
  58. while(bitrateUnits < RateUnits.Length && totalBitrate > 1024)
  59. {
  60. totalBitrate /= 1024;
  61. bitrateUnits++;
  62. }
  63. string statusBarBitrateText = String.Format("Bitrate: {0:0.000}{1}bps", totalBitrate, RateUnits[bitrateUnits]);
  64. var totalPacketrate = Sources.Count > 0
  65. ? Sources.OfType<TsUdpSource>().Select(udpSource => udpSource.Packetrate).Sum()
  66. : 0;
  67. averagePacketSize /= totalPacketrate;
  68. int packetrateUnits = 0;
  69. while (packetrateUnits < RateUnits.Length && totalPacketrate > 1024)
  70. {
  71. totalPacketrate /= 1024;
  72. packetrateUnits++;
  73. }
  74. string statusBarPacketrateText = String.Format("Packetrate: {0:0.000}{1}pps", totalPacketrate, RateUnits[packetrateUnits]);
  75. int packetsizeUnits = 0;
  76. while (packetsizeUnits < RateUnits.Length && averagePacketSize > 1024)
  77. {
  78. averagePacketSize /= 1024;
  79. packetsizeUnits++;
  80. }
  81. string statusBarPacketsizeText = String.Format("Avg. Packet: {0:0.000}{1}B", averagePacketSize, RateUnits[packetsizeUnits]);
  82. double droppedPackets = Sources.OfType<TsUdpSource>().Select(udpSource => udpSource.Demuxer.Streams.Select(stream => stream.DroppedPackets).Sum()).Sum();
  83. int droppedPacketUnits = 0;
  84. while (droppedPacketUnits < RateUnits.Length && droppedPackets > 1024)
  85. {
  86. droppedPackets /= 1024;
  87. droppedPacketUnits++;
  88. }
  89. string statusBarDroppedPacketText = String.Format("Dropped Packets: {0:0.###}{1}", droppedPackets, RateUnits[droppedPacketUnits]);
  90. var totalProcessingTime = Sources.Count > 0
  91. ? Sources.OfType<TsUdpSource>().Select(
  92. udpSource => udpSource.ProcessingTime.Ticks).Sum()
  93. : 0;
  94. string statusBarProcessingTimeText = String.Format("Time/Packet: {0}", new TimeSpan((long)totalProcessingTime));
  95. statusBarBitrate.Dispatcher.Invoke(
  96. System.Windows.Threading.DispatcherPriority.Normal,
  97. new Action(delegate()
  98. {
  99. statusBarBitrate.Text = statusBarBitrateText;
  100. statusBarPacketrate.Text = statusBarPacketrateText;
  101. statusBarPacketsize.Text = statusBarPacketsizeText;
  102. statusBarDroppedPackets.Text = statusBarDroppedPacketText;
  103. statusBarProcessingTime.Text = statusBarProcessingTimeText;
  104. }));
  105. }
  106. void MainWindow_Loaded(object sender, RoutedEventArgs e)
  107. {
  108. _updateTimer.Start();
  109. try
  110. {
  111. Sources.Add(TsSource.Create(@"C:\temp\00011.m2ts"));
  112. //Sources.Add(TsSource.Create("udp://@224.0.0.42:4242"));
  113. }
  114. catch (Exception err)
  115. {
  116. Trace.WriteLine(err.ToString());
  117. }
  118. }
  119. private void MenuItem_Break_Click(object sender, RoutedEventArgs e)
  120. {
  121. Debugger.Break();
  122. }
  123. private LogWindow _logWindow;
  124. private void MenuItem_Log_Click(object sender, RoutedEventArgs e)
  125. {
  126. if (_logWindow == null)
  127. {
  128. _logWindow = new LogWindow();
  129. _logWindow.Closed += (sender2, e2) => { _logWindow = null; };
  130. _logWindow.Show();
  131. }
  132. else
  133. {
  134. _logWindow.Activate();
  135. }
  136. }
  137. }
  138. }