/Releases/2.0.4771/Players/WPF/Pvp.App/ViewModel/MediaInformationViewModel.cs

# · C# · 200 lines · 168 code · 30 blank · 2 comment · 51 complexity · 644d3a2dff70a2a24e337944fafa1e8a MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Windows.Input;
  5. using GalaSoft.MvvmLight;
  6. using GalaSoft.MvvmLight.Command;
  7. using GalaSoft.MvvmLight.Messaging;
  8. using Pvp.App.Messaging;
  9. using Pvp.Core.DirectShow;
  10. using Pvp.Core.MediaEngine;
  11. using Pvp.Core.MediaEngine.Description;
  12. namespace Pvp.App.ViewModel
  13. {
  14. public class MediaInformationViewModel : ViewModelBase
  15. {
  16. private readonly IMediaEngineFacade _engine;
  17. private readonly List<MediaInfoItem> _infoList;
  18. private ICommand _okCommand;
  19. public MediaInformationViewModel(IMediaEngineFacade engine)
  20. {
  21. _engine = engine;
  22. _infoList = new List<MediaInfoItem>();
  23. Load();
  24. }
  25. private void Load()
  26. {
  27. var info = _engine.MediaInfo;
  28. if (info != null)
  29. {
  30. AddInfoItem(Resources.Resources.infodialog_media_source, info.source);
  31. AddInfoItem(Resources.Resources.infodialog_type_format, info.GetStreamSubType());
  32. string s = String.Empty;
  33. if (info.StreamSubType != MediaSubType.DVD)
  34. {
  35. var duration = _engine.Duration;
  36. if (duration != TimeSpan.Zero)
  37. {
  38. AddInfoItem(Resources.Resources.infodialog_duration,
  39. string.Format("{0:d2}:{1:d2}:{2:d2}", duration.Hours, duration.Minutes, duration.Seconds));
  40. }
  41. }
  42. else
  43. {
  44. AddInfoItem(String.Empty, String.Empty);
  45. DVD_DOMAIN domain;
  46. if (_engine.GetCurrentDomain(out domain))
  47. {
  48. switch (domain)
  49. {
  50. case DVD_DOMAIN.DVD_DOMAIN_FirstPlay:
  51. s = Resources.Resources.infodialog_dvddomain_FirstPlay;
  52. break;
  53. case DVD_DOMAIN.DVD_DOMAIN_VideoManagerMenu:
  54. s = Resources.Resources.infodialog_dvddomain_VideoManagerMenu;
  55. break;
  56. case DVD_DOMAIN.DVD_DOMAIN_VideoTitleSetMenu:
  57. s = Resources.Resources.infodialog_dvddomain_VideoTitleSetMenu;
  58. break;
  59. case DVD_DOMAIN.DVD_DOMAIN_Title:
  60. s = Resources.Resources.infodialog_dvddomain_Title;
  61. break;
  62. case DVD_DOMAIN.DVD_DOMAIN_Stop:
  63. s = Resources.Resources.infodialog_dvddomain_Stop;
  64. break;
  65. }
  66. AddInfoItem(Resources.Resources.infodialog_Current_Domain, s);
  67. if (domain == DVD_DOMAIN.DVD_DOMAIN_Title)
  68. {
  69. AddInfoItem(Resources.Resources.infodialog_Current_Title, _engine.CurrentTitle.ToString());
  70. AddInfoItem(Resources.Resources.infodialog_Current_Chapter, _engine.CurrentChapter.ToString());
  71. var duration = _engine.Duration;
  72. if (duration != TimeSpan.Zero)
  73. {
  74. AddInfoItem(Resources.Resources.infodialog_Title_Duration,
  75. string.Format("{0:d2}:{1:d2}:{2:d2}", duration.Hours, duration.Minutes, duration.Seconds));
  76. }
  77. }
  78. }
  79. }
  80. double d;
  81. int count = info.NumberOfStreams;
  82. for (int i = 0; i < count; i++)
  83. {
  84. AddInfoItem(String.Empty, String.Empty);
  85. var pStreamInfo = info.GetStreamInfo(i);
  86. AddInfoItem(String.Format(Resources.Resources.infodialog_Stream_format, i + 1), pStreamInfo.GetMajorType());
  87. if ((pStreamInfo.Flags & StreamInfoFlags.SI_FOURCC) != 0)
  88. AddInfoItem(Resources.Resources.infodialog_Format_Type, pStreamInfo.GetVideoSubType());
  89. if ((pStreamInfo.Flags & StreamInfoFlags.SI_DVDCOMPRESSION) != 0)
  90. AddInfoItem(Resources.Resources.infodialog_Video_Format, pStreamInfo.GetDVDCompressionType());
  91. if ((pStreamInfo.Flags & StreamInfoFlags.SI_DVDFRAMEHEIGHT) != 0)
  92. AddInfoItem(Resources.Resources.infodialog_TV_System, String.Format(Resources.Resources.infodialog_tv_system_value_format,
  93. pStreamInfo.ulFrameHeight, pStreamInfo.ulFrameRate));
  94. if ((pStreamInfo.Flags & StreamInfoFlags.SI_RECT) != 0)
  95. AddInfoItem(Resources.Resources.infodialog_Video_Size, String.Format("{0} x {1}",
  96. pStreamInfo.rcSrc.right, pStreamInfo.rcSrc.bottom));
  97. if ((pStreamInfo.Flags & StreamInfoFlags.SI_ASPECTRATIO) != 0)
  98. AddInfoItem(Resources.Resources.infodialog_Aspect_Ratio, String.Format("{0} : {1}",
  99. pStreamInfo.dwPictAspectRatioX, pStreamInfo.dwPictAspectRatioY));
  100. if ((pStreamInfo.Flags & StreamInfoFlags.SI_FRAMERATE) != 0)
  101. {
  102. d = CoreDefinitions.ONE_SECOND;
  103. double dTimePerFrame = pStreamInfo.AvgTimePerFrame;
  104. d /= dTimePerFrame;
  105. AddInfoItem(Resources.Resources.infodialog_Frame_Rate,
  106. String.Format(Resources.Resources.infodialog_framerate_value_format, d));
  107. }
  108. // if ((pStreamInfo.Flags & StreamInfoFlags.SI_DVDFRAMERATE)!=0)
  109. // AddInfoItem("Frame Rate", pStreamInfo.ulFrameRate);
  110. if ((pStreamInfo.Flags & StreamInfoFlags.SI_INTERLACEMODE) != 0)
  111. AddInfoItem(Resources.Resources.infodialog_Interlace_Mode, pStreamInfo.GetInterlaceMode());
  112. if ((pStreamInfo.Flags & StreamInfoFlags.SI_WAVEFORMAT) != 0)
  113. AddInfoItem(Resources.Resources.infodialog_Format_Type, pStreamInfo.GetWaveFormat());
  114. if ((pStreamInfo.Flags & StreamInfoFlags.SI_DVDAUDIOFORMAT) != 0)
  115. AddInfoItem(Resources.Resources.infodialog_Format_Type, pStreamInfo.GetDVDAudioFormat());
  116. if ((pStreamInfo.Flags & StreamInfoFlags.SI_DVDAUDIOSTREAMNAME) != 0)
  117. AddInfoItem(Resources.Resources.infodialog_Language, pStreamInfo.strDVDAudioStreamName);
  118. s = String.Empty;
  119. string s1;
  120. if ((pStreamInfo.Flags & StreamInfoFlags.SI_SAMPLERATE) != 0)
  121. s = String.Format(Resources.Resources.infodialog_samplerate_value_format, pStreamInfo.nSamplesPerSec);
  122. if ((pStreamInfo.Flags & StreamInfoFlags.SI_DVDFREQUENCY) != 0)
  123. s = String.Format(Resources.Resources.infodialog_dvd_frequency_value_format, pStreamInfo.dwFrequency);
  124. if ((pStreamInfo.Flags & StreamInfoFlags.SI_WAVECHANNELS) != 0)
  125. {
  126. if (pStreamInfo.nChannels == 1)
  127. s1 = String.Format(Resources.Resources.infodialog_channel_format, pStreamInfo.nChannels);
  128. else
  129. s1 = String.Format(Resources.Resources.infodialog_channels_format, pStreamInfo.nChannels);
  130. s += s1;
  131. }
  132. if ((pStreamInfo.Flags & StreamInfoFlags.SI_BITSPERSAMPLE) != 0
  133. && pStreamInfo.wBitsPerSample != 0)
  134. {
  135. s1 = String.Format(Resources.Resources.infodialog_bits_per_sample_format, pStreamInfo.wBitsPerSample);
  136. s += s1;
  137. }
  138. if (s.Length != 0)
  139. AddInfoItem(Resources.Resources.infodialog_Format, s);
  140. if ((pStreamInfo.Flags & StreamInfoFlags.SI_AUDIOBITRATE) != 0)
  141. AddInfoItem(Resources.Resources.infodialog_Bit_Rate,
  142. String.Format(Resources.Resources.infodialog_bitrate_value_format, 8 * pStreamInfo.nAvgBytesPerSec / 1000));
  143. }
  144. }
  145. }
  146. private void AddInfoItem(string name, string value)
  147. {
  148. _infoList.Add(new MediaInfoItem(name, value));
  149. }
  150. public IEnumerable<MediaInfoItem> MediaInfo
  151. {
  152. get { return _infoList; }
  153. }
  154. public ICommand OkCommand
  155. {
  156. get
  157. {
  158. if (_okCommand == null)
  159. {
  160. _okCommand = new RelayCommand(
  161. () =>
  162. {
  163. Messenger.Default.Send<CommandMessage>(new CommandMessage(Command.MediaInformationWindowClose));
  164. });
  165. }
  166. return _okCommand;
  167. }
  168. }
  169. }
  170. }