MediaTypesDlg.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:10k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program 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
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. // MediaTypesDlg.cpp : implementation file
  22. //
  23. #include "stdafx.h"
  24. #include "mplayerc.h"
  25. #include "MediaTypesDlg.h"
  26. #include "....DSUtilDSUtil.h"
  27. #include "......includemoreuuids.h"
  28. #pragma pack(push, 1)
  29. typedef struct
  30. {
  31. WAVEFORMATEX Format;
  32. BYTE bBigEndian;
  33. BYTE bsid;
  34. BYTE lfeon;
  35. BYTE copyrightb;
  36. BYTE nAuxBitsCode;  //  Aux bits per frame
  37. } DOLBYAC3WAVEFORMAT;
  38. #pragma pack(pop)
  39. // CMediaTypesDlg dialog
  40. //IMPLEMENT_DYNAMIC(CMediaTypesDlg, CResizableDialog)
  41. CMediaTypesDlg::CMediaTypesDlg(CGraphBuilder& gb, CWnd* pParent /*=NULL*/)
  42. : CResizableDialog(CMediaTypesDlg::IDD, pParent)
  43. {
  44. CGraphBuilder::DeadEnd* pde;
  45. for(int i = 0; pde = gb.GetDeadEnd(i); i++) m_DeadEnds.Add(pde);
  46. m_subtype = GUID_NULL;
  47. m_type = UNKNOWN;
  48. }
  49. CMediaTypesDlg::~CMediaTypesDlg()
  50. {
  51. }
  52. void CMediaTypesDlg::DoDataExchange(CDataExchange* pDX)
  53. {
  54. CResizableDialog::DoDataExchange(pDX);
  55. DDX_Control(pDX, IDC_COMBO1, m_pins);
  56. DDX_Control(pDX, IDC_EDIT1, m_report);
  57. }
  58. void CMediaTypesDlg::AddLine(CString str)
  59. {
  60. str.Replace(_T("n"), _T("rn"));
  61. int len = m_report.GetWindowTextLength();
  62. m_report.SetSel(len, len, TRUE);
  63. m_report.ReplaceSel(str);
  64. }
  65. void CMediaTypesDlg::AddMediaType(AM_MEDIA_TYPE* pmt)
  66. {
  67. CString major = CStringFromGUID(pmt->majortype);
  68. CString sub = CStringFromGUID(pmt->subtype);
  69. CString format = CStringFromGUID(pmt->formattype);
  70. m_subtype = pmt->subtype;
  71. if(pmt->majortype == MEDIATYPE_Video) m_type = VIDEO;
  72. else if(pmt->majortype == MEDIATYPE_Audio) m_type = AUDIO;
  73. else m_type = UNKNOWN;
  74. CString str;
  75. AddLine(_T("AM_MEDIA_TYPE:n"));
  76. str.Format(_T("majortype: %s %sn"), CString(GuidNames[pmt->majortype]), major);
  77. AddLine(str);
  78. str.Format(_T("subtype: %s %sn"), CString(GuidNames[pmt->subtype]), sub);
  79. AddLine(str);
  80. str.Format(_T("formattype: %s %sn"), CString(GuidNames[pmt->formattype]), format);
  81. AddLine(str);
  82. str.Format(_T("bFixedSizeSamples: %dn"), pmt->bFixedSizeSamples);
  83. AddLine(str);
  84. str.Format(_T("bTemporalCompression: %dn"), pmt->bTemporalCompression);
  85. AddLine(str);
  86. str.Format(_T("lSampleSize: %dn"), pmt->lSampleSize);
  87. AddLine(str);
  88. str.Format(_T("cbFormat: %dn"), pmt->cbFormat);
  89. AddLine(str);
  90. AddLine();
  91. if(pmt->formattype == FORMAT_VideoInfo || pmt->formattype == FORMAT_VideoInfo2)
  92. {
  93. VIDEOINFOHEADER& vih = *((VIDEOINFOHEADER*)pmt->pbFormat);
  94. BITMAPINFOHEADER* bih = &vih.bmiHeader;
  95. AddLine(_T("VIDEOINFOHEADER:n"));
  96. str.Format(_T("rcSource: (%d,%d)-(%d,%d)n"), vih.rcSource);
  97. AddLine(str);
  98. str.Format(_T("rcTarget: (%d,%d)-(%d,%d)n"), vih.rcTarget);
  99. AddLine(str);
  100. str.Format(_T("dwBitRate: %dn"), vih.dwBitRate);
  101. AddLine(str);
  102. str.Format(_T("dwBitErrorRate: %dn"), vih.dwBitErrorRate);
  103. AddLine(str);
  104. str.Format(_T("AvgTimePerFrame: %I64dn"), vih.AvgTimePerFrame);
  105. AddLine(str);
  106. if(pmt->formattype == FORMAT_VideoInfo2)
  107. {
  108. VIDEOINFOHEADER2& vih = *((VIDEOINFOHEADER2*)pmt->pbFormat);
  109. bih = &vih.bmiHeader;
  110. AddLine(_T("VIDEOINFOHEADER2:n"));
  111. str.Format(_T("dwInterlaceFlags: 0x%08xn"), vih.dwInterlaceFlags);
  112. AddLine(str);
  113. str.Format(_T("dwCopyProtectFlags: 0x%08xn"), vih.dwCopyProtectFlags);
  114. AddLine(str);
  115. str.Format(_T("dwPictAspectRatioX: %dn"), vih.dwPictAspectRatioX);
  116. AddLine(str);
  117. str.Format(_T("dwPictAspectRatioY: %dn"), vih.dwPictAspectRatioY);
  118. AddLine(str);
  119. str.Format(_T("dwControlFlags: 0x%08xn"), vih.dwControlFlags);
  120. AddLine(str);
  121. str.Format(_T("dwReserved2: 0x%08xn"), vih.dwReserved2);
  122. AddLine(str);
  123. }
  124. AddLine();
  125. AddLine(_T("BITMAPINFOHEADER:n"));
  126. str.Format(_T("biSize: %dn"), bih->biSize);
  127. AddLine(str);
  128. str.Format(_T("biWidth: %dn"), bih->biWidth);
  129. AddLine(str);
  130. str.Format(_T("biHeight: %dn"), bih->biHeight);
  131. AddLine(str);
  132. str.Format(_T("biPlanes: %dn"), bih->biPlanes);
  133. AddLine(str);
  134. str.Format(_T("biBitCount: %dn"), bih->biBitCount);
  135. AddLine(str);
  136. if(bih->biCompression < 256) str.Format(_T("biCompression: %dn"), bih->biCompression);
  137. else str.Format(_T("biCompression: %4.4hsn"), &bih->biCompression);
  138. AddLine(str);
  139. str.Format(_T("biSizeImage: %dn"), bih->biSizeImage);
  140. AddLine(str);
  141. str.Format(_T("biXPelsPerMeter: %dn"), bih->biXPelsPerMeter);
  142. AddLine(str);
  143. str.Format(_T("biYPelsPerMeter: %dn"), bih->biYPelsPerMeter);
  144. AddLine(str);
  145. str.Format(_T("biYPelsPerMeter: %dn"), bih->biYPelsPerMeter);
  146. AddLine(str);
  147. str.Format(_T("biClrUsed: %dn"), bih->biClrUsed);
  148. AddLine(str);
  149. str.Format(_T("biClrImportant: %dn"), bih->biClrImportant);
  150. AddLine(str);
  151.     }
  152. else if(pmt->formattype == FORMAT_WaveFormatEx)
  153. {
  154. WAVEFORMATEX& wfe = *((WAVEFORMATEX*)pmt->pbFormat);
  155. AddLine(_T("WAVEFORMATEX:n"));
  156. str.Format(_T("wFormatTag: 0x%04xn"), wfe.wFormatTag);
  157. AddLine(str);
  158. str.Format(_T("nChannels: %dn"), wfe.nChannels);
  159. AddLine(str);
  160. str.Format(_T("nSamplesPerSec: %dn"), wfe.nSamplesPerSec);
  161. AddLine(str);
  162. str.Format(_T("nAvgBytesPerSec: %dn"), wfe.nAvgBytesPerSec);
  163. AddLine(str);
  164. str.Format(_T("nBlockAlign: %dn"), wfe.nBlockAlign);
  165. AddLine(str);
  166. str.Format(_T("wBitsPerSample: %dn"), wfe.wBitsPerSample);
  167. AddLine(str);
  168. if(wfe.wFormatTag != WAVE_FORMAT_PCM && wfe.cbSize > 0)
  169. {
  170. str.Format(_T("cbSize: %d (extra bytes)n"), wfe.cbSize);
  171. AddLine(str);
  172. if(wfe.wFormatTag == WAVE_FORMAT_EXTENSIBLE && wfe.cbSize == sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX))
  173. {
  174. WAVEFORMATEXTENSIBLE& wfe = *((WAVEFORMATEXTENSIBLE*)pmt->pbFormat);
  175. AddLine(_T("WAVEFORMATEXTENSIBLE:n"));
  176. if(wfe.Format.wBitsPerSample != 0) str.Format(_T("wValidBitsPerSample: %dn"), wfe.Samples.wValidBitsPerSample);
  177. else str.Format(_T("wSamplesPerBlock: %dn"), wfe.Samples.wSamplesPerBlock);
  178. AddLine(str);
  179. str.Format(_T("dwChannelMask: 0x%08xn"), wfe.dwChannelMask);
  180. AddLine(str);
  181. str.Format(_T("SubFormat: %sn"), CStringFromGUID(wfe.SubFormat));
  182. AddLine(str);
  183. }
  184. else if(wfe.wFormatTag == WAVE_FORMAT_DOLBY_AC3 && wfe.cbSize == sizeof(DOLBYAC3WAVEFORMAT)-sizeof(WAVEFORMATEX))
  185. {
  186. DOLBYAC3WAVEFORMAT& wfe = *((DOLBYAC3WAVEFORMAT*)pmt->pbFormat);
  187. AddLine(_T("DOLBYAC3WAVEFORMAT:n"));
  188. str.Format(_T("bBigEndian: %dn"), wfe.bBigEndian);
  189. AddLine(str);
  190. str.Format(_T("bsid: %dn"), wfe.bsid);
  191. AddLine(str);
  192. str.Format(_T("lfeon: %dn"), wfe.lfeon);
  193. AddLine(str);
  194. str.Format(_T("copyrightb: %dn"), wfe.copyrightb);
  195. AddLine(str);
  196. str.Format(_T("nAuxBitsCode: %dn"), wfe.nAuxBitsCode);
  197. AddLine(str);
  198. }
  199. }
  200. AddLine();
  201. }
  202. }
  203. BEGIN_MESSAGE_MAP(CMediaTypesDlg, CResizableDialog)
  204. ON_CBN_SELCHANGE(IDC_COMBO1, OnCbnSelchangeCombo1)
  205. ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
  206. ON_UPDATE_COMMAND_UI(IDC_BUTTON1, OnUpdateButton1)
  207. END_MESSAGE_MAP()
  208. // CMediaTypesDlg message handlers
  209. BOOL CMediaTypesDlg::OnInitDialog()
  210. {
  211. CResizableDialog::OnInitDialog();
  212. for(int i = 0; i < m_DeadEnds.GetCount(); i++)
  213. {
  214. m_pins.SetItemData(
  215. m_pins.AddString(m_DeadEnds[i]->filter + _T("::") + m_DeadEnds[i]->pin), 
  216. (DWORD_PTR)m_DeadEnds[i]);
  217. }
  218. m_pins.SetCurSel(0);
  219. OnCbnSelchangeCombo1();
  220. AddAnchor(IDC_STATIC1, TOP_LEFT, TOP_RIGHT);
  221. AddAnchor(IDC_STATIC2, TOP_LEFT, TOP_RIGHT);
  222. AddAnchor(IDC_COMBO1, TOP_LEFT, TOP_RIGHT);
  223. AddAnchor(IDC_EDIT1, TOP_LEFT, BOTTOM_RIGHT);
  224. AddAnchor(IDC_BUTTON1, BOTTOM_LEFT);
  225. AddAnchor(IDOK, BOTTOM_RIGHT);
  226. SetMinTrackSize(CSize(300, 200));
  227. return TRUE;  // return TRUE unless you set the focus to a control
  228. // EXCEPTION: OCX Property Pages should return FALSE
  229. }
  230. void CMediaTypesDlg::OnCbnSelchangeCombo1()
  231. {
  232. m_report.SetWindowText(_T(""));
  233. int i = m_pins.GetCurSel();
  234. if(i < 0) return;
  235. POSITION pos;
  236. CList<CString>& path = m_DeadEnds[i]->path;
  237. pos = path.GetHeadPosition();
  238. while(pos)
  239. {
  240. AddLine(path.GetNext(pos) + _T("n"));
  241. if(!pos) AddLine(_T("n"));
  242. }
  243. pos = m_DeadEnds[i]->mts.GetHeadPosition();
  244. for(int j = 0; pos; j++)
  245. {
  246. CString str;
  247. str.Format(_T("Media Type %d:n"), j);
  248. AddLine(str);
  249. AddLine(_T("--------------------------n"));
  250. AddMediaType(&m_DeadEnds[i]->mts.GetNext(pos));
  251. AddLine();
  252. }
  253. m_report.SetSel(0, 0);
  254. }
  255. void CMediaTypesDlg::OnBnClickedButton1()
  256. {
  257. if(m_subtype.Data2 == 0x0000 && m_subtype.Data3 == 0x0010
  258. && *(unsigned __int64*)m_subtype.Data4 == 0x719b3800aa000080i64)
  259. {
  260. BYTE* p = (BYTE*)&m_subtype.Data1;
  261. for(int i = 0; i < 4; i++, p++)
  262. if(*p >= 'a' && *p <= 'z') *p -= 0x20;
  263. }
  264. CString str;
  265. str.Format(_T("http://gabest.org/codec.php?type=%d&guid=%s"), m_type, CStringFromGUID(m_subtype));
  266. ShellExecute(NULL, _T("open"), str, NULL, NULL, SW_SHOW);
  267. }
  268. void CMediaTypesDlg::OnUpdateButton1(CCmdUI* pCmdUI)
  269. {
  270. pCmdUI->Enable(m_subtype != GUID_NULL);
  271. }