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

多媒体编程

开发平台:

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. #pragma once
  22. #include "afxwin.h"
  23. #include "afxcmn.h"
  24. #include "....filterstransformbufferfilterbufferfilter.h"
  25. #include "FloatEdit.h"
  26. //
  27. template<class T>
  28. class CFormatElem
  29. {
  30. public:
  31. CMediaType mt;
  32. T caps;
  33. };
  34. template<class T>
  35. class CFormat : public CAutoPtrArray<CFormatElem<T> >
  36. {
  37. public:
  38. CString name;
  39. CFormat(CString name = _T("")) {this->name = name;}
  40. virtual ~CFormat() {}
  41. };
  42. template<class T>
  43. class CFormatArray : public CAutoPtrArray<CFormat<T> >
  44. {
  45. public:
  46. virtual ~CFormatArray() {}
  47. CFormat<T>* Find(CString name, bool fCreate = false)
  48. {
  49. for(int i = 0; i < (int)GetCount(); i++)
  50. {
  51. if(GetAt(i)->name == name)
  52. return(GetAt(i));
  53. }
  54. if(fCreate)
  55. {
  56. CAutoPtr<CFormat<T> > pf(new CFormat<T>(name));
  57. CFormat<T>* tmp = pf;
  58. Add(pf);
  59. return(tmp);
  60. }
  61. return(NULL);
  62. }
  63. bool FindFormat(AM_MEDIA_TYPE* pmt, CFormat<T>** ppf)
  64. {
  65. if(!pmt) return(false);
  66. for(int i = 0; i < (int)GetCount(); i++)
  67. {
  68. CFormat<T>* pf = GetAt(i);
  69. for(int j = 0; j < (int)pf->GetCount(); j++)
  70. {
  71. CFormatElem<T>* pfe = pf->GetAt(j);
  72. if(!pmt || (pfe->mt.majortype == pmt->majortype && pfe->mt.subtype == pmt->subtype))
  73. {
  74.                     if(ppf) *ppf = pf;
  75. return(true);
  76. }
  77. }
  78. }
  79. return(false);
  80. }
  81. bool FindFormat(AM_MEDIA_TYPE* pmt, T* pcaps, CFormat<T>** ppf, CFormatElem<T>** ppfe)
  82. {
  83. if(!pmt && !pcaps) return(false);
  84. for(int i = 0; i < (int)GetCount(); i++)
  85. {
  86. CFormat<T>* pf = GetAt(i);
  87. for(int j = 0; j < (int)pf->GetCount(); j++)
  88. {
  89. CFormatElem<T>* pfe = pf->GetAt(j);
  90. if((!pmt || pfe->mt == *pmt) && (!pcaps || !memcmp(pcaps, &pfe->caps, sizeof(T))))
  91. {
  92.                     if(ppf) *ppf = pf;
  93.                     if(ppfe) *ppfe = pfe;
  94. return(true);
  95. }
  96. }
  97. }
  98. return(false);
  99. }
  100. bool AddFormat(AM_MEDIA_TYPE* pmt, T caps)
  101. {
  102. if(!pmt) return(false);
  103. if(FindFormat(pmt, NULL, NULL, NULL)) {DeleteMediaType(pmt); return(false);}
  104. // if(pmt->formattype == FORMAT_VideoInfo2) {DeleteMediaType(pmt); return(false);} // TODO
  105. CFormat<T>* pf = Find(MakeFormatName(pmt), true);
  106. if(!pf) {DeleteMediaType(pmt); return(false);}
  107. CAutoPtr<CFormatElem<T> > pfe(new CFormatElem<T>());
  108. pfe->mt = *pmt;
  109. pfe->caps = caps;
  110. pf->Add(pfe);
  111. return(true);
  112. }
  113. bool AddFormat(AM_MEDIA_TYPE* pmt, void* pcaps, int size)
  114. {
  115. if(!pcaps) return false;
  116. ASSERT(size == sizeof(T));
  117. return AddFormat(pmt, *(T*)pcaps);
  118. }
  119. virtual CString MakeFormatName(AM_MEDIA_TYPE* pmt) = 0;
  120. virtual CString MakeDimensionName(CFormatElem<T>* pfe) = 0;
  121. };
  122. typedef CFormatElem<VIDEO_STREAM_CONFIG_CAPS> CVidFormatElem;
  123. typedef CFormat<VIDEO_STREAM_CONFIG_CAPS> CVidFormat;
  124. class CVidFormatArray : public CFormatArray<VIDEO_STREAM_CONFIG_CAPS>
  125. {
  126. public:
  127. CString MakeFormatName(AM_MEDIA_TYPE* pmt)
  128. {
  129. CString str(_T("Default"));
  130. if(!pmt) return(str);
  131. BITMAPINFOHEADER* bih = (pmt->formattype == FORMAT_VideoInfo)
  132. ? &((VIDEOINFOHEADER*)pmt->pbFormat)->bmiHeader
  133. : (pmt->formattype == FORMAT_VideoInfo2)
  134. ? &((VIDEOINFOHEADER2*)pmt->pbFormat)->bmiHeader
  135. : NULL;
  136. if(!bih) 
  137. {
  138. // it may have a fourcc in the mediasubtype, let's check that
  139. WCHAR guid[100];
  140. memset(guid, 0, 100*sizeof(WCHAR));
  141. StringFromGUID2(pmt->subtype, guid, 100);
  142. if(CStringW(guid).MakeUpper().Find(L"0000-0010-8000-00AA00389B71") >= 0)
  143. {
  144. str.Format(_T("%c%c%c%c"), 
  145. (TCHAR)((pmt->subtype.Data1>>0)&0xff), (TCHAR)((pmt->subtype.Data1>>8)&0xff), 
  146. (TCHAR)((pmt->subtype.Data1>>16)&0xff), (TCHAR)((pmt->subtype.Data1>>24)&0xff));
  147. }
  148. return(str);
  149. }
  150. switch(bih->biCompression)
  151. {
  152. case BI_RGB: str.Format(_T("RGB%d"), bih->biBitCount); break;
  153. case BI_RLE8: str = _T("RLE8"); break;
  154. case BI_RLE4: str = _T("RLE4"); break;
  155. case BI_BITFIELDS: str.Format(_T("BITF%d"), bih->biBitCount); break;
  156. case BI_JPEG: str = _T("JPEG"); break;
  157. case BI_PNG: str = _T("PNG"); break;
  158. default:  
  159. str.Format(_T("%c%c%c%c"), 
  160. (TCHAR)((bih->biCompression>>0)&0xff), (TCHAR)((bih->biCompression>>8)&0xff), 
  161. (TCHAR)((bih->biCompression>>16)&0xff), (TCHAR)((bih->biCompression>>24)&0xff));
  162. break;
  163. }
  164. return(str);
  165. }
  166. CString MakeDimensionName(CVidFormatElem* pfe)
  167. {
  168. CString str(_T("Default"));
  169. if(!pfe) return(str);
  170. BITMAPINFOHEADER* bih = (pfe->mt.formattype == FORMAT_VideoInfo)
  171. ? &((VIDEOINFOHEADER*)pfe->mt.pbFormat)->bmiHeader
  172. : (pfe->mt.formattype == FORMAT_VideoInfo2)
  173. ? &((VIDEOINFOHEADER2*)pfe->mt.pbFormat)->bmiHeader
  174. : NULL;
  175. if(bih == NULL) return(str);
  176. str.Format(_T("%dx%d %.2f"), bih->biWidth, bih->biHeight, (float)10000000/((VIDEOINFOHEADER*)pfe->mt.pbFormat)->AvgTimePerFrame);
  177. if(pfe->mt.formattype == FORMAT_VideoInfo2)
  178. {
  179. VIDEOINFOHEADER2* vih2 = (VIDEOINFOHEADER2*)pfe->mt.pbFormat;
  180. CString str2;
  181. str2.Format(_T(" i%02x %d:%d"), vih2->dwInterlaceFlags, vih2->dwPictAspectRatioX, vih2->dwPictAspectRatioY);
  182. str += str2;
  183. }
  184. return(str);
  185. }
  186. };
  187. typedef CFormatElem<AUDIO_STREAM_CONFIG_CAPS> CAudFormatElem;
  188. typedef CFormat<AUDIO_STREAM_CONFIG_CAPS> CAudFormat;
  189. class CAudFormatArray : public CFormatArray<AUDIO_STREAM_CONFIG_CAPS>
  190. {
  191. public:
  192. CString MakeFormatName(AM_MEDIA_TYPE* pmt)
  193. {
  194. CString str(_T("Unknown"));
  195. if(!pmt) return(str);
  196. WAVEFORMATEX* wfe = (pmt->formattype == FORMAT_WaveFormatEx)
  197. ? (WAVEFORMATEX*)pmt->pbFormat
  198. : NULL;
  199. if(!wfe)
  200. {
  201. WCHAR guid[100];
  202. memset(guid, 0, 100*sizeof(WCHAR));
  203. StringFromGUID2(pmt->subtype, guid, 100);
  204. if(CStringW(guid).MakeUpper().Find(L"0000-0010-8000-00AA00389B71") >= 0)
  205. {
  206. str.Format(_T("0x%04x"), pmt->subtype.Data1);
  207. }
  208. return(str);
  209. }
  210. switch(wfe->wFormatTag)
  211. {
  212. case 1: str = _T("PCM "); break;
  213. default: str.Format(_T("0x%03x "), wfe->wFormatTag); break;
  214. }
  215. return(str);
  216. }
  217. CString MakeDimensionName(CAudFormatElem* pfe)
  218. {
  219. CString str(_T("Unknown"));
  220. if(!pfe) return(str);
  221. WAVEFORMATEX* wfe = (pfe->mt.formattype == FORMAT_WaveFormatEx)
  222. ? (WAVEFORMATEX*)pfe->mt.pbFormat
  223. : NULL;
  224. if(!wfe) return(str);
  225. str.Empty();
  226. CString str2;
  227. str2.Format(_T("%6dKHz "), wfe->nSamplesPerSec); str += str2;
  228. str2.Format(_T("%dbps "), wfe->wBitsPerSample); str += str2;
  229. switch(wfe->nChannels)
  230. {
  231. case 1: str += _T("mono "); break;
  232. case 2: str += _T("stereo "); break;
  233. default: str2.Format(_T("%d channels "), wfe->nChannels); str += str2; break;
  234. }
  235. str2.Format(_T("%3dkbps "), wfe->nAvgBytesPerSec*8/1000); str += str2;
  236. return(str);
  237. }
  238. };
  239. //
  240. typedef struct
  241. {
  242. CComPtr<IMoniker> pMoniker;
  243. CComPtr<IBaseFilter> pBF;
  244. CString FriendlyName;
  245. CComBSTR DisplayName;
  246. } Codec;
  247. typedef CArray<Codec> CCodecArray;
  248. // CPlayerCaptureDialog dialog
  249. class CPlayerCaptureDialog : public CDialog
  250. {
  251. DECLARE_DYNAMIC(CPlayerCaptureDialog)
  252. // video input
  253. CStringW m_VidDisplayName;
  254. CComPtr<IAMStreamConfig> m_pAMVSC;
  255. CComPtr<IAMCrossbar> m_pAMXB;
  256. CComPtr<IAMTVTuner> m_pAMTuner;
  257. CComPtr<IAMVfwCaptureDialogs> m_pAMVfwCD;
  258. CVidFormatArray m_vfa;
  259. // audio input
  260. CStringW m_AudDisplayName;
  261. CComPtr<IAMStreamConfig> m_pAMASC;
  262. CInterfaceArray<IAMAudioInputMixer> m_pAMAIM;
  263. CAudFormatArray m_afa;
  264. // video codec
  265. CCodecArray m_pVidEncArray;
  266. CVidFormatArray m_vcfa;
  267. // audio codec
  268. CCodecArray m_pAudEncArray;
  269. CAudFormatArray m_acfa;
  270. void EmptyVideo();
  271. void EmptyAudio();
  272. void UpdateMediaTypes();
  273. void UpdateUserDefinableControls();
  274. void UpdateVideoCodec();
  275. void UpdateAudioCodec();
  276. void UpdateMuxer();
  277. void UpdateOutputControls();
  278. void UpdateGraph();
  279. CMap<HWND, HWND&, BOOL, BOOL&> m_wndenabledmap;
  280. void EnableControls(CWnd* pWnd, bool fEnable);
  281. bool m_fEnableOgm;
  282. public:
  283. CPlayerCaptureDialog();   // standard constructor
  284. virtual ~CPlayerCaptureDialog();
  285. BOOL Create(CWnd* pParent = NULL);
  286. // Dialog Data
  287. enum { IDD = IDD_CAPTUREDIALOG };
  288. CComboBox m_vidinput;
  289. CComboBox m_vidtype;
  290. CComboBox m_viddimension;
  291. CSpinButtonCtrl m_vidhor;
  292. CSpinButtonCtrl m_vidver;
  293. CEdit m_vidhoredit;
  294. CEdit m_vidveredit;
  295. CFloatEdit m_vidfpsedit;
  296. float m_vidfps;
  297. CButton m_vidsetres;
  298. CComboBox m_audinput;
  299. CComboBox m_audtype;
  300. CComboBox m_auddimension;
  301. CComboBox m_vidcodec;
  302. CComboBox m_vidcodectype;
  303. CComboBox m_vidcodecdimension;
  304. BOOL m_fVidOutput;
  305. CButton m_vidoutput;
  306. BOOL m_fVidPreview;
  307. CButton m_vidpreview;
  308. CComboBox m_audcodec;
  309. CComboBox m_audcodectype;
  310. CComboBox m_audcodecdimension;
  311. BOOL m_fAudOutput;
  312. CButton m_audoutput;
  313. BOOL m_fAudPreview;
  314. CButton m_audpreview;
  315. int m_nVidBuffers;
  316. int m_nAudBuffers;
  317. CString m_file;
  318. CButton m_recordbtn;
  319. BOOL m_fSepAudio;
  320. int m_muxtype;
  321. CComboBox m_muxctrl;
  322. CMediaType m_mtv, m_mta, m_mtcv, m_mtca;
  323. CComPtr<IBaseFilter> m_pVidEnc, m_pAudEnc, m_pMux, m_pDst, m_pAudMux, m_pAudDst;
  324. CComPtr<IMoniker> m_pVidEncMoniker, m_pAudEncMoniker;
  325. CComPtr<IBaseFilter> m_pVidBuffer, m_pAudBuffer;
  326. public:
  327. void SetupVideoControls(CStringW DisplayName, CComPtr<IAMStreamConfig> pAMSC, CComPtr<IAMCrossbar> pAMXB, CComPtr<IAMTVTuner> pAMTuner);
  328. void SetupVideoControls(CStringW DisplayName, CComPtr<IAMStreamConfig> pAMSC, CComPtr<IAMVfwCaptureDialogs> pAMVfwCD);
  329. void SetupAudioControls(CStringW DisplayName, CComPtr<IAMStreamConfig> pAMSC, CInterfaceArray<IAMAudioInputMixer>& pAMAIM);
  330. bool IsTunerActive();
  331. bool SetVideoInput(int input);
  332. bool SetVideoChannel(int channel);
  333. bool SetAudioInput(int input);
  334. int GetVideoInput();
  335. int GetVideoChannel();
  336. int GetAudioInput();
  337. protected:
  338. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  339. virtual BOOL PreTranslateMessage(MSG* pMsg);
  340. virtual BOOL OnInitDialog();
  341. virtual void OnOK() {}
  342. virtual void OnCancel() {}
  343. DECLARE_MESSAGE_MAP()
  344. public:
  345. afx_msg void OnDestroy();
  346. afx_msg void OnVideoInput();
  347. afx_msg void OnVideoType();
  348. afx_msg void OnVideoDimension();
  349. afx_msg void OnOverrideVideoDimension();
  350. afx_msg void OnAudioInput();
  351. afx_msg void OnAudioType();
  352. afx_msg void OnAudioDimension();
  353. afx_msg void OnRecordVideo();
  354. afx_msg void OnVideoCodec();
  355. afx_msg void OnVideoCodecType();
  356. afx_msg void OnVideoCodecDimension();
  357. afx_msg void OnRecordAudio();
  358. afx_msg void OnAudioCodec();
  359. afx_msg void OnAudioCodecType();
  360. afx_msg void OnAudioCodecDimension();
  361. afx_msg void OnOpenFile();
  362. afx_msg void OnRecord();
  363. afx_msg void OnEnChangeEdit9();
  364. afx_msg void OnEnChangeEdit12();
  365. afx_msg void OnTimer(UINT nIDEvent);
  366. afx_msg void OnBnClickedVidAudPreview();
  367. afx_msg void OnBnClickedCheck7();
  368. afx_msg void OnCbnSelchangeCombo14();
  369. };