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

多媒体编程

开发平台:

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. #ifdef UNICODE
  23. #ifdef DEBUG
  24. #pragma comment(lib, "dsutilDU")
  25. #else
  26. #pragma comment(lib, "dsutilRU")
  27. #endif
  28. #else
  29. #ifdef DEBUG
  30. #pragma comment(lib, "dsutilD")
  31. #else
  32. #pragma comment(lib, "dsutilR")
  33. #endif
  34. #endif
  35. #include <afx.h>
  36. #include <afxwin.h>
  37. #include <afxtempl.h>
  38. #include "NullRenderers.h"
  39. //#include "MediaTypes.h"
  40. #include "MediaTypeEx.h"
  41. #include "vd.h"
  42. #include "text.h"
  43. extern void DumpStreamConfig(TCHAR* fn, IAMStreamConfig* pAMVSCCap);
  44. extern int CountPins(IBaseFilter* pBF, int& nIn, int& nOut, int& nInC, int& nOutC);
  45. extern bool IsSplitter(IBaseFilter* pBF, bool fCountConnectedOnly = false);
  46. extern bool IsMultiplexer(IBaseFilter* pBF, bool fCountConnectedOnly = false);
  47. extern bool IsStreamStart(IBaseFilter* pBF);
  48. extern bool IsStreamEnd(IBaseFilter* pBF);
  49. extern bool IsVideoRenderer(IBaseFilter* pBF);
  50. extern bool IsAudioWaveRenderer(IBaseFilter* pBF);
  51. extern IBaseFilter* GetUpStreamFilter(IBaseFilter* pBF, IPin* pInputPin = NULL);
  52. extern IPin* GetUpStreamPin(IBaseFilter* pBF, IPin* pInputPin = NULL);
  53. extern IPin* GetFirstPin(IBaseFilter* pBF, PIN_DIRECTION dir = PINDIR_INPUT);
  54. extern IPin* GetFirstDisconnectedPin(IBaseFilter* pBF, PIN_DIRECTION dir);
  55. extern int RenderFilterPins(IBaseFilter* pBF, IGraphBuilder* pGB, bool fAll = false);
  56. extern void NukeDownstream(IBaseFilter* pBF, IFilterGraph* pFG);
  57. extern void NukeDownstream(IPin* pPin, IFilterGraph* pFG);
  58. extern HRESULT AddFilterToGraph(IFilterGraph* pFG, IBaseFilter* pBF, WCHAR* pName);
  59. extern IBaseFilter* FindFilter(LPCWSTR clsid, IFilterGraph* pFG);
  60. extern IBaseFilter* FindFilter(const CLSID& clsid, IFilterGraph* pFG);
  61. extern CStringW GetFilterName(IBaseFilter* pBF);
  62. extern CStringW GetPinName(IPin* pPin);
  63. extern IFilterGraph* GetGraphFromFilter(IBaseFilter* pBF);
  64. extern IBaseFilter* GetFilterFromPin(IPin* pPin);
  65. extern IPin* AppendFilter(IPin* pPin, CString DisplayName, IGraphBuilder* pGB);
  66. extern IPin* InsertFilter(IPin* pPin, CString DisplayName, IGraphBuilder* pGB);
  67. extern void ShowPPage(CString DisplayName, HWND hParentWnd);
  68. extern void ShowPPage(IUnknown* pUnknown, HWND hParentWnd);
  69. extern CLSID GetCLSID(IBaseFilter* pBF);
  70. extern CLSID GetCLSID(IPin* pPin);
  71. extern bool IsCLSIDRegistered(LPCTSTR clsid);
  72. extern bool IsCLSIDRegistered(const CLSID& clsid);
  73. extern void StringToBin(CString s, CByteArray& data);
  74. extern CString BinToString(BYTE* ptr, int len);
  75. typedef enum {CDROM_NotFound, CDROM_Audio, CDROM_VideoCD, CDROM_DVDVideo, CDROM_Unknown} cdrom_t;
  76. extern cdrom_t GetCDROMType(TCHAR drive, CList<CString>& files);
  77. extern CString GetDriveLabel(TCHAR drive);
  78. extern bool GetKeyFrames(CString fn, CUIntArray& kfs);
  79. extern DVD_HMSF_TIMECODE RT2HMSF(REFERENCE_TIME rt, double fps = 0);
  80. extern REFERENCE_TIME HMSF2RT(DVD_HMSF_TIMECODE hmsf, double fps = 0);
  81. extern HRESULT AddToRot(IUnknown* pUnkGraph, DWORD* pdwRegister);
  82. extern void RemoveFromRot(DWORD& dwRegister);
  83. extern void memsetd(void* dst, unsigned int c, int nbytes);
  84. extern bool ExtractBIH(const AM_MEDIA_TYPE* pmt, BITMAPINFOHEADER* bih);
  85. extern bool ExtractBIH(IMediaSample* pMS, BITMAPINFOHEADER* bih);
  86. extern bool ExtractDim(const AM_MEDIA_TYPE* pmt, int& w, int& h, int& arx, int& ary);
  87. extern bool MakeMPEG2MediaType(CMediaType& mt, BYTE* seqhdr, DWORD len, int w, int h);
  88. extern unsigned __int64 GetFileVersion(LPCTSTR fn);
  89. extern bool CreateFilter(CStringW DisplayName, IBaseFilter** ppBF, CStringW& FriendlyName);
  90. extern IBaseFilter* AppendFilter(IPin* pPin, IMoniker* pMoniker, IGraphBuilder* pGB);
  91. extern CStringW GetFriendlyName(CStringW DisplayName);
  92. extern HRESULT LoadExternalObject(LPCTSTR path, REFCLSID clsid, REFIID iid, void** ppv);
  93. extern HRESULT LoadExternalFilter(LPCTSTR path, REFCLSID clsid, IBaseFilter** ppBF);
  94. extern HRESULT LoadExternalPropertyPage(IPersist* pP, REFCLSID clsid, IPropertyPage** ppPP);
  95. extern void UnloadExternalObjects();
  96. extern CString MakeFullPath(LPCTSTR path);
  97. extern CString GetMediaTypeName(const GUID& guid);
  98. extern GUID GUIDFromCString(CString str);
  99. extern CString CStringFromGUID(const GUID& guid);
  100. extern CStringW UTF8To16(LPCSTR utf8);
  101. extern CStringA UTF16To8(LPCWSTR utf16);
  102. extern CString ISO6391ToLanguage(LPCSTR code);
  103. extern CString ISO6392ToLanguage(LPCSTR code);
  104. extern CString ISO6391To6392(LPCSTR code);
  105. extern CString LanguageToISO6392(LPCTSTR lang);
  106. extern int MakeAACInitData(BYTE* pData, int profile, int freq, int channels);
  107. extern BOOL CFileGetStatus(LPCTSTR lpszFileName, CFileStatus& status);
  108. extern bool DeleteRegKey(LPCTSTR pszKey, LPCTSTR pszSubkey);
  109. extern bool SetRegKeyValue(LPCTSTR pszKey, LPCTSTR pszSubkey, LPCTSTR pszValueName, LPCTSTR pszValue);
  110. extern bool SetRegKeyValue(LPCTSTR pszKey, LPCTSTR pszSubkey, LPCTSTR pszValue);
  111. extern void RegisterSourceFilter(const CLSID& clsid, const GUID& subtype2, LPCTSTR chkbytes, LPCTSTR ext = NULL, ...);
  112. extern void RegisterSourceFilter(const CLSID& clsid, const GUID& subtype2, const CList<CString>& chkbytes, LPCTSTR ext = NULL, ...);
  113. extern void UnRegisterSourceFilter(const GUID& subtype);
  114. class CPinInfo : public PIN_INFO
  115. {
  116. public:
  117. CPinInfo() {pFilter = NULL;}
  118. ~CPinInfo() {if(pFilter) pFilter->Release();}
  119. };
  120. class CFilterInfo : public FILTER_INFO
  121. {
  122. public:
  123. CFilterInfo() {pGraph = NULL;}
  124. ~CFilterInfo() {if(pGraph) pGraph->Release();}
  125. };
  126. #define BeginEnumFilters(pFilterGraph, pEnumFilters, pBaseFilter) 
  127. {CComPtr<IEnumFilters> pEnumFilters; 
  128. if(pFilterGraph && SUCCEEDED(pFilterGraph->EnumFilters(&pEnumFilters))) 
  129. for(CComPtr<IBaseFilter> pBaseFilter; S_OK == pEnumFilters->Next(1, &pBaseFilter, 0); pBaseFilter = NULL) 
  130. #define EndEnumFilters }}}
  131. #define BeginEnumPins(pBaseFilter, pEnumPins, pPin) 
  132. {CComPtr<IEnumPins> pEnumPins; 
  133. if(pBaseFilter && SUCCEEDED(pBaseFilter->EnumPins(&pEnumPins))) 
  134. for(CComPtr<IPin> pPin; S_OK == pEnumPins->Next(1, &pPin, 0); pPin = NULL) 
  135. #define EndEnumPins }}}
  136. #define BeginEnumMediaTypes(pPin, pEnumMediaTypes, pMediaType) 
  137. {CComPtr<IEnumMediaTypes> pEnumMediaTypes; 
  138. if(pPin && SUCCEEDED(pPin->EnumMediaTypes(&pEnumMediaTypes))) 
  139. AM_MEDIA_TYPE* pMediaType = NULL; 
  140. for(; S_OK == pEnumMediaTypes->Next(1, &pMediaType, NULL); DeleteMediaType(pMediaType), pMediaType = NULL) 
  141. #define EndEnumMediaTypes(pMediaType) } if(pMediaType) DeleteMediaType(pMediaType); }}
  142. #define BeginEnumSysDev(clsid, pMoniker) 
  143. {CComPtr<ICreateDevEnum> pDevEnum4$##clsid; 
  144. pDevEnum4$##clsid.CoCreateInstance(CLSID_SystemDeviceEnum); 
  145. CComPtr<IEnumMoniker> pClassEnum4$##clsid; 
  146. if(SUCCEEDED(pDevEnum4$##clsid->CreateClassEnumerator(clsid, &pClassEnum4$##clsid, 0)) 
  147. && pClassEnum4$##clsid) 
  148. for(CComPtr<IMoniker> pMoniker; pClassEnum4$##clsid->Next(1, &pMoniker, 0) == S_OK; pMoniker = NULL) 
  149. #define EndEnumSysDev }}}
  150. #define QI(i) (riid == __uuidof(i)) ? GetInterface((i*)this, ppv) :
  151. #define QI2(i) (riid == IID_##i) ? GetInterface((i*)this, ppv) :
  152. template <typename T> __inline void INITDDSTRUCT(T& dd)
  153. {
  154.     ZeroMemory(&dd, sizeof(dd));
  155.     dd.dwSize = sizeof(dd);
  156. }
  157. #define countof(array) (sizeof(array)/sizeof(array[0]))
  158. template <class T>
  159. static CUnknown* WINAPI CreateInstance(LPUNKNOWN lpunk, HRESULT* phr)
  160. {
  161. *phr = S_OK;
  162.     CUnknown* punk = new T(lpunk, phr);
  163.     if(punk == NULL) *phr = E_OUTOFMEMORY;
  164. return punk;
  165. }