PlayerCaptureDialog.h
上传用户:tangyu_668
上传日期:2014-02-27
资源大小:678k
文件大小:5k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2006 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_Vide