Capture.h
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:10k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*
  2.  *  Openmysee
  3.  *
  4.  *  This program is free software; you can redistribute it and/or modify
  5.  *  it under the terms of the GNU General Public License as published by
  6.  *  the Free Software Foundation; either version 2 of the License, or
  7.  *  (at your option) any later version.
  8.  *
  9.  *  This program is distributed in the hope that it will be useful,
  10.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *  GNU General Public License for more details.
  13.  *
  14.  *  You should have received a copy of the GNU General Public License
  15.  *  along with this program; if not, write to the Free Software
  16.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  */
  19. #ifndef __CAPTURE_H__
  20. #define __CAPTURE_H__ 
  21. #include "../captureserver/TVSourceConfig.h"
  22. // definition of IGraph interface, this interface now is not useful, but
  23. // it can extend later development.
  24. class IGraph: public IUnknown
  25. {
  26. public:
  27. // initialize & unintiliase graph
  28. STDMETHOD(Initialize)() PURE;
  29. STDMETHOD(Uninitialize)() PURE;
  30. STDMETHOD(BuildGraph)() PURE;
  31. STDMETHOD(DisassembleGraph)() PURE;
  32. STDMETHOD(AddFilter)(CLSID clsidFilter,    
  33. IBaseFilter** ppIFilter,
  34. LPCTSTR pstrFilterName = NULL) PURE;
  35. STDMETHOD(RemoveFilter)(IBaseFilter* pIFilter) PURE;
  36. // Connects two pins together.
  37. // pIFilterOutput    -- A pointer to the filter that contains the output pin
  38. //    to connect.
  39. // pstrPinNameOutput -- The name of the output pin. If it is NULL, the 
  40. //                      first output pin found will be connected.
  41. // pIFilterInput     -- A pointer to the filter that contains the input pin
  42. //    to connect
  43. // pstrPinNameInput  -- The name of the input pin. If NULL, the first input
  44. //                      pin found will be connected
  45. // pmt -- The media type of the connection.
  46. STDMETHOD(ConnectPins)(IBaseFilter* pIFilterOutput, 
  47. LPCTSTR pstrPinNameOutput,
  48. IBaseFilter* pIFilterInput, 
  49. LPCTSTR pstrPinNameInput,
  50. AM_MEDIA_TYPE* pmt = NULL) PURE;
  51. // Disconnects the specified pin.
  52. // pIFilter -- The filter that contains the pstrPinName
  53. // pstrPinName   -- The name of pin be disconnected
  54. // dir -- The direction of pin
  55. //    PINDIR_INPUT : input pin/PINDIR_OUTPUT : output pin
  56. STDMETHOD(DisconnectPin)(IBaseFilter *pIFilter, 
  57. LPCTSTR pstrPinName,
  58. PIN_DIRECTION dir = PINDIR_OUTPUT) PURE;
  59. STDMETHOD_(BOOL, IsConnected)(IBaseFilter *pFilter,
  60. LPCTSTR pstrPinName, 
  61. PIN_DIRECTION pd = PINDIR_OUTPUT) PURE;
  62. // Finds the specified pin on a filter.
  63. // pIFilter   -- The filter that contains the pstrPinName
  64. // pstrPinName -- The name of pin to be find
  65. // dir   -- Same with below
  66. STDMETHOD_(IPin* ,FindPinOnFilter)(IBaseFilter* pIFilter, 
  67. LPCTSTR pstrPinName,
  68. PIN_DIRECTION dir = PINDIR_OUTPUT) PURE;
  69. // graph controls
  70. STDMETHOD(Run)() PURE;
  71. STDMETHOD(Stop)() PURE;
  72. STDMETHOD(Pause)() PURE;
  73. };
  74. class CCaptureGraph: public IGraph
  75. {
  76. friend class CAudioCompressSelectorDlg;
  77. // reference count of object
  78. ULONG m_RefCount;
  79. IGraphBuilder *m_pGB;         // capture graph
  80. CComPtr<ICaptureGraphBuilder2> graphBuilder2_;
  81. IAMCrossbar* m_pSB;
  82. IVideoWindow *m_pVW;          // video window
  83. IMediaControl *m_pMC;         // media control
  84. ITVSourceConfig *m_pTVConfig; // tv sink config
  85. // filters in graph 
  86. IBaseFilter *m_pVideoCapture;
  87. IBaseFilter *m_pVideoEncoder;
  88. IBaseFilter *m_pAudioEncoder;
  89. IBaseFilter *m_pAudioCapture;
  90. IBaseFilter *m_pTVStreamSink;
  91. IBaseFilter *m_pVideoSmartTee;
  92. IBaseFilter* m_pDVDecoder;
  93. //xiezhouwei 05-08-17添加
  94. IBaseFilter *m_pVideoOverlay;
  95. CPtrArray m_arrayOtherFilter;// filters that created by Render() func.
  96. // three filters added by zk 2004-04-16 for saving video and audio data to persist harddisk
  97. IBaseFilter *m_pAudioSmartTee;
  98. IBaseFilter *m_pAVIMuxer;
  99. IBaseFilter *m_pFileWriter;
  100. IBaseFilter* m_pftrDVSpliter;
  101. BOOL m_bGraphBuiled;
  102. BOOL m_bIsPreview;
  103. BOOL m_bIsOnlyAudio;
  104. BOOL m_bSave; // added by zk for saving 2004-04-16
  105. BOOL mbIsDV; //added by xiezhouwei 2005-09-01
  106. //xiezhouwei 05-08-23
  107. BOOL m_bNeedOverlay;
  108. BOOL m_bISCrossBar;
  109. // current video encoder used to config
  110. CString m_strCurVideoEncoder;
  111. // current audio format that user selected, it will be used in
  112. // ConnectPin() func.
  113. AM_MEDIA_TYPE *m_pCurAudioAMT;
  114. // video owner window
  115. HWND m_hWndOwner;
  116. char m_szAVIFile[ MAX_PATH ];//AVI保存路径
  117. public:
  118. CCaptureGraph();
  119. ~CCaptureGraph();
  120. BOOL m_config;
  121. BYTE *state;
  122. int sstate;
  123. // Iunknown interface
  124. public:
  125. STDMETHODIMP_(ULONG) AddRef();
  126. STDMETHODIMP_(ULONG) Release();
  127. STDMETHODIMP QueryInterface(REFIID iid, void** ppInter);
  128. public:
  129. bool SetVideoState(BYTE* apState,  int aiSize);
  130. bool SetCurMediaType(AM_MEDIA_TYPE* aMTMediaType);
  131. bool GetCurMediaType(AM_MEDIA_TYPE** aMTMediaType);
  132. // ini & unini
  133. STDMETHODIMP Initialize();
  134. STDMETHODIMP Uninitialize();
  135. // controls
  136. STDMETHODIMP Run();
  137. STDMETHODIMP Stop();
  138. STDMETHODIMP Pause();
  139. // enums,it respectively call EnumSpeciFilters
  140. // with diffrent specification
  141.     STDMETHODIMP EnumVideoCapDevices(CStringArray &);
  142.     STDMETHODIMP EnumAudioCapDevices(CStringArray &);
  143.     STDMETHODIMP EnumVideoEncoders(CStringArray &);
  144. STDMETHODIMP EnumAudioEncoders(CStringArray &);
  145. // configs
  146. STDMETHODIMP ConfigVideoCapDeviceByName(HWND hParent);
  147.     STDMETHODIMP ConfigAudioCapDeviceByName(HWND hParent);
  148. STDMETHODIMP ConfigVideoEncoderByName(HWND hParent);
  149. STDMETHODIMP ConfigAudioEncoderByName(HWND hParent);
  150. STDMETHODIMP ConfigSysCfg(HWND hParent);
  151. // some filter creations must be implemented by enumulator
  152. // implemented with FindFilterByName auxily function
  153.     HRESULT CreateVideoCapDeviceFilterByName(LPTSTR strName);
  154.     HRESULT CreateAudioCapDeviceFilterByName(LPTSTR strName);
  155. HRESULT CreateVideoEncoderFilterByName(LPTSTR strName);
  156. HRESULT CreateAudioEncoderFilterByName(LPTSTR strName);
  157. //判断是否是DMOFilter by xiezhouwei
  158. BOOL IsDMOFilter();
  159. //设置DMO属性 by xiezhouwei
  160. STDMETHODIMP BuildVideoDMOEncoder();
  161. //设置DMO时,得到媒体类型 by xiezhouwei 0917
  162. HRESULT GetInputMediaType(IBaseFilter* pCap, AM_MEDIA_TYPE& mt);
  163. //创建DMOFilter
  164. HRESULT CreateV9EncoderFilter();
  165. //
  166. //xiezhouwei 05-08-17 添加
  167. //初始化字幕Filter
  168. // 设置是否需要字幕的
  169. //void SetNeedOverlay(bool abNeedOverlay);
  170. HRESULT CreateUideoOverlay();
  171. HRESULT ConfigVideoOverlay(HWND hParent);
  172. void ReleaseUideoOverlay();
  173. // video owner wnd
  174. void SetOwner(HWND hWnd){m_hWndOwner = hWnd;}
  175. // preview
  176. VOID SetPreview(BOOL bIsPreview);
  177. BOOL IsPreview(){ return m_bIsPreview; }
  178. // CrossBar
  179. VOID SetCrossBar(BOOL abIsCrossBar)
  180. if (abIsCrossBar != m_bISCrossBar)
  181. {
  182. m_bISCrossBar = abIsCrossBar;
  183. DisassembleGraph();
  184. }
  185. }
  186. // only audio
  187. void SetOnlyAudio( BOOL bIsOnlyAudio );
  188. BOOL IsOnlyAudio(){ return m_bIsOnlyAudio; }
  189. // compress bit rate 
  190. FLOAT GetCompressRata(){ return m_pTVConfig->GetCompressedSpeed();}
  191. //=========================================
  192. // Writed by zhuwei 2005-8-12 
  193. //Show Pin Setting
  194. public:
  195. void ShowPinSetting(HWND);
  196. //Set AVI FileName
  197. public:
  198. void SetAVIFile( char* );
  199. private:
  200. //////////////////////////////////////////////////////////////////////////
  201. //与DV的相关处理
  202. //////////////////////////////////////////////////////////////////////////
  203. //判断是否为DV
  204. void JudgeDV();
  205. //将DV信号分离
  206. STDMETHODIMP DVSplitter();
  207. //构建DV音频链路
  208. STDMETHODIMP BuildDVAudio();
  209. //添加DV字幕
  210. STDMETHODIMP AddDVVideoOverlay();
  211. //构建DV视频预览
  212. STDMETHODIMP BuildDVVideoPrview();
  213. //构建DV视频链路
  214. STDMETHODIMP BuildDVVideo();
  215. //Build DV链路
  216. STDMETHODIMP DisplayDV();
  217. //////////////////////////////////////////////////////////////////////////
  218. //一般的采集链路
  219. //////////////////////////////////////////////////////////////////////////
  220. //构建一般的Graph的音频部分
  221. STDMETHODIMP BuildGeneralAudio();
  222. //在VideoGraph中加入字幕Filter
  223. STDMETHODIMP AddVideoOverlayFilter();
  224. //视频部分预览
  225. STDMETHODIMP BuildVideoPreview();
  226. //打开CrossBar
  227. STDMETHODIMP OpenCrossBar();
  228. //构建并预览一般的Graph的视频部分
  229. STDMETHODIMP BuildGeneralVideo();
  230. //构建存储链路
  231. STDMETHODIMP BuildSaveGraph();
  232. //构建一般的Graph
  233. STDMETHODIMP BuildGeneralGraph();
  234. //=========================================
  235. private:
  236. STDMETHODIMP AddFilter(CLSID clsidFilter,    
  237. IBaseFilter** ppIFilter,
  238. LPCTSTR pstrFilterName = NULL);
  239. STDMETHODIMP RemoveFilter(IBaseFilter* pIFilter);
  240. STDMETHODIMP ConnectPins(IBaseFilter* pIFilterOutput, 
  241. LPCTSTR pstrPinNameOutput,
  242. IBaseFilter* pIFilterInput, 
  243. LPCTSTR pstrPinNameInput,
  244. AM_MEDIA_TYPE* pmt = NULL);
  245. //自动连接Filter
  246. STDMETHODIMP CCaptureGraph::ConnectAutoPins(IBaseFilter* pIFilterOutput, 
  247. LPCTSTR pstrPinNameOutput,
  248. IBaseFilter* pIFilterInput, 
  249. LPCTSTR pstrPinNameInput);
  250. STDMETHODIMP_(BOOL) IsConnected(IBaseFilter *pFilter,
  251. LPCTSTR pstrPinName, 
  252. PIN_DIRECTION pd = PINDIR_OUTPUT);
  253. STDMETHODIMP DisconnectPin(IBaseFilter *pIFilter, 
  254. LPCTSTR pstrPinName,
  255. PIN_DIRECTION dir = PINDIR_OUTPUT);
  256. STDMETHODIMP_(IPin*) FindPinOnFilter(IBaseFilter* pIFilter, 
  257. LPCTSTR pstrPinName,
  258. PIN_DIRECTION dir = PINDIR_OUTPUT);
  259. STDMETHODIMP BuildGraph();
  260. STDMETHODIMP DisassembleGraph();
  261. // audio compression format
  262. HRESULT EnumAudioWaveFormat(CListBox* pLB);// called by main dlg
  263. void SetAudioWaveformat(AM_MEDIA_TYPE* pamt);// called by selector dlg
  264. // used to enum fiters in specified catagory
  265. HRESULT EnumSpeciFilters(IID iidEnumType, CStringArray &);
  266. // used to create filter 
  267. HRESULT FindFilterByName(LPTSTR strName, IBaseFilter **ppFilter, IID iidEnumType);
  268. // used to get audio capture device 
  269. HRESULT GetAudioCaptureDevice();
  270. // used for filling the m_arryOtherFilter, diff from our 
  271. // refrenced filters
  272. BOOL IsFilterInStdFilters(IBaseFilter *pFilter);
  273. };
  274. #endif// __CAPTURE_H__