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

多媒体编程

开发平台:

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 <atlbase.h>
  23. #include <atlcoll.h>
  24. #include "CoordGeom.h"
  25. #pragma pack(push, 1)
  26. struct SubPicDesc
  27. {
  28. int type;
  29. int w, h, bpp, pitch, pitchUV;
  30. void* bits;
  31. BYTE* bitsU;
  32. BYTE* bitsV;
  33. RECT vidrect; // video rectangle
  34. struct SubPicDesc() {type = 0; w = h = bpp = pitch = pitchUV = 0; bits = NULL; bitsU = bitsV = NULL;}
  35. };
  36. #pragma pack(pop)
  37. //
  38. // ISubPic
  39. //
  40. [uuid("449E11F3-52D1-4a27-AA61-E2733AC92CC0")]
  41. interface ISubPic : public IUnknown
  42. {
  43. STDMETHOD_(void*, GetObject) () PURE;
  44. STDMETHOD_(REFERENCE_TIME, GetStart) () PURE;
  45. STDMETHOD_(REFERENCE_TIME, GetStop) () PURE;
  46. STDMETHOD_(void, SetStart) (REFERENCE_TIME rtStart) PURE;
  47. STDMETHOD_(void, SetStop) (REFERENCE_TIME rtStop) PURE;
  48. STDMETHOD (GetDesc) (SubPicDesc& spd /*[out]*/) PURE;
  49. STDMETHOD (CopyTo) (ISubPic* pSubPic /*[in]*/) PURE;
  50. STDMETHOD (ClearDirtyRect) (DWORD color /*[in]*/) PURE;
  51. STDMETHOD (GetDirtyRect) (RECT* pDirtyRect /*[out]*/) PURE;
  52. STDMETHOD (SetDirtyRect) (RECT* pDirtyRect /*[in]*/) PURE;
  53. STDMETHOD (GetMaxSize) (SIZE* pMaxSize /*[out]*/) PURE;
  54. STDMETHOD (SetSize) (SIZE pSize /*[in]*/, RECT vidrect /*[in]*/) PURE;
  55. STDMETHOD (Lock) (SubPicDesc& spd /*[out]*/) PURE;
  56. STDMETHOD (Unlock) (RECT* pDirtyRect /*[in]*/) PURE;
  57. STDMETHOD (AlphaBlt) (RECT* pSrc, RECT* pDst, SubPicDesc* pTarget = NULL /*[in]*/) PURE;
  58. };
  59. class ISubPicImpl : public CUnknown, public ISubPic
  60. {
  61. protected:
  62. REFERENCE_TIME m_rtStart, m_rtStop;
  63. CRect m_rcDirty;
  64. CSize m_maxsize, m_size;
  65. CRect m_vidrect;
  66. public:
  67. ISubPicImpl();
  68. DECLARE_IUNKNOWN;
  69. STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
  70. // ISubPic
  71. STDMETHODIMP_(REFERENCE_TIME) GetStart();
  72. STDMETHODIMP_(REFERENCE_TIME) GetStop();
  73. STDMETHODIMP_(void) SetStart(REFERENCE_TIME rtStart);
  74. STDMETHODIMP_(void) SetStop(REFERENCE_TIME rtStop);
  75. STDMETHODIMP GetDesc(SubPicDesc& spd) = 0;
  76. STDMETHODIMP CopyTo(ISubPic* pSubPic);
  77. STDMETHODIMP ClearDirtyRect(DWORD color) = 0;
  78. STDMETHODIMP GetDirtyRect(RECT* pDirtyRect);
  79. STDMETHODIMP SetDirtyRect(RECT* pDirtyRect);
  80. STDMETHODIMP GetMaxSize(SIZE* pMaxSize);
  81. STDMETHODIMP SetSize(SIZE size, RECT vidrect);
  82. STDMETHODIMP Lock(SubPicDesc& spd) = 0;
  83. STDMETHODIMP Unlock(RECT* pDirtyRect) = 0;
  84. STDMETHODIMP AlphaBlt(RECT* pSrc, RECT* pDst, SubPicDesc* pTarget) = 0;
  85. };
  86. //
  87. // ISubPicAllocator
  88. //
  89. [uuid("CF7C3C23-6392-4a42-9E72-0736CFF793CB")]
  90. interface ISubPicAllocator : public IUnknown
  91. {
  92. STDMETHOD (SetCurSize) (SIZE size /*[in]*/) PURE;
  93. STDMETHOD (SetCurVidRect) (RECT curvidrect) PURE;
  94. STDMETHOD (GetStatic) (ISubPic** ppSubPic /*[out]*/) PURE;
  95. STDMETHOD (AllocDynamic) (ISubPic** ppSubPic /*[out]*/) PURE;
  96. STDMETHOD_(bool, IsDynamicWriteOnly) () PURE;
  97. STDMETHOD (ChangeDevice) (IUnknown* pDev) PURE;
  98. };
  99. class ISubPicAllocatorImpl : public CUnknown, public ISubPicAllocator
  100. {
  101. CComPtr<ISubPic> m_pStatic;
  102. private:
  103. CSize m_cursize;
  104. CRect m_curvidrect;
  105. bool m_fDynamicWriteOnly;
  106. virtual bool Alloc(bool fStatic, ISubPic** ppSubPic) = 0;
  107. protected:
  108. bool m_fPow2Textures;
  109. public:
  110. ISubPicAllocatorImpl(SIZE cursize, bool fDynamicWriteOnly, bool fPow2Textures);
  111. DECLARE_IUNKNOWN;
  112. STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
  113. // ISubPicAllocator
  114. STDMETHODIMP SetCurSize(SIZE cursize);
  115. STDMETHODIMP SetCurVidRect(RECT curvidrect);
  116. STDMETHODIMP GetStatic(ISubPic** ppSubPic);
  117. STDMETHODIMP AllocDynamic(ISubPic** ppSubPic);
  118. STDMETHODIMP_(bool) IsDynamicWriteOnly();
  119. STDMETHODIMP ChangeDevice(IUnknown* pDev);
  120. };
  121. //
  122. // ISubPicProvider
  123. //
  124. [uuid("D62B9A1A-879A-42db-AB04-88AA8F243CFD")]
  125. interface ISubPicProvider : public IUnknown
  126. {
  127. STDMETHOD (Lock) () PURE;
  128. STDMETHOD (Unlock) () PURE;
  129. STDMETHOD_(POSITION, GetStartPosition) (REFERENCE_TIME rt, double fps) PURE;
  130. STDMETHOD_(POSITION, GetNext) (POSITION pos) PURE;
  131. STDMETHOD_(REFERENCE_TIME, GetStart) (POSITION pos, double fps) PURE;
  132. STDMETHOD_(REFERENCE_TIME, GetStop) (POSITION pos, double fps) PURE;
  133. STDMETHOD_(bool, IsAnimated) (POSITION pos) PURE;
  134. STDMETHOD (Render) (SubPicDesc& spd, REFERENCE_TIME rt, double fps, RECT& bbox) PURE;
  135. };
  136. class ISubPicProviderImpl : public CUnknown, public ISubPicProvider
  137. {
  138. protected:
  139. CCritSec* m_pLock;
  140. public:
  141. ISubPicProviderImpl(CCritSec* pLock);
  142. virtual ~ISubPicProviderImpl();
  143. DECLARE_IUNKNOWN;
  144. STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
  145. // ISubPicProvider
  146. STDMETHODIMP Lock();
  147. STDMETHODIMP Unlock();
  148. STDMETHODIMP_(POSITION) GetStartPosition(REFERENCE_TIME rt, double fps) = 0;
  149. STDMETHODIMP_(POSITION) GetNext(POSITION pos) = 0;
  150. STDMETHODIMP_(REFERENCE_TIME) GetStart(POSITION pos, double fps) = 0;
  151. STDMETHODIMP_(REFERENCE_TIME) GetStop(POSITION pos, double fps) = 0;
  152. STDMETHODIMP Render(SubPicDesc& spd, REFERENCE_TIME rt, double fps, RECT& bbox) = 0;
  153. };
  154. //
  155. // ISubPicQueue
  156. //
  157. [uuid("C8334466-CD1E-4ad1-9D2D-8EE8519BD180")]
  158. interface ISubPicQueue : public IUnknown
  159. {
  160. STDMETHOD (SetSubPicProvider) (ISubPicProvider* pSubPicProvider /*[in]*/) PURE;
  161. STDMETHOD (GetSubPicProvider) (ISubPicProvider** pSubPicProvider /*[out]*/) PURE;
  162. STDMETHOD (SetFPS) (double fps /*[in]*/) PURE;
  163. STDMETHOD (SetTime) (REFERENCE_TIME rtNow /*[in]*/) PURE;
  164. STDMETHOD (Invalidate) (REFERENCE_TIME rtInvalidate = -1) PURE;
  165. STDMETHOD_(bool, LookupSubPic) (REFERENCE_TIME rtNow /*[in]*/, ISubPic** ppSubPic /*[out]*/) PURE;
  166. STDMETHOD (GetStats) (int& nSubPics, REFERENCE_TIME& rtNow, REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop /*[out]*/) PURE;
  167. STDMETHOD (GetStats) (int nSubPic /*[in]*/, REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop /*[out]*/) PURE;
  168. };
  169. class ISubPicQueueImpl : public CUnknown, public ISubPicQueue
  170. {
  171. CCritSec m_csSubPicProvider;
  172. CComPtr<ISubPicProvider> m_pSubPicProvider;
  173. protected:
  174. double m_fps;
  175. REFERENCE_TIME m_rtNow;
  176. CComPtr<ISubPicAllocator> m_pAllocator;
  177. HRESULT RenderTo(ISubPic* pSubPic, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, double fps);
  178. public:
  179. ISubPicQueueImpl(ISubPicAllocator* pAllocator, HRESULT* phr);
  180. virtual ~ISubPicQueueImpl();
  181. DECLARE_IUNKNOWN;
  182. STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
  183. // ISubPicQueue
  184. STDMETHODIMP SetSubPicProvider(ISubPicProvider* pSubPicProvider);
  185. STDMETHODIMP GetSubPicProvider(ISubPicProvider** pSubPicProvider);
  186. STDMETHODIMP SetFPS(double fps);
  187. STDMETHODIMP SetTime(REFERENCE_TIME rtNow);
  188. /*
  189. STDMETHODIMP Invalidate(REFERENCE_TIME rtInvalidate = -1) = 0;
  190. STDMETHODIMP_(bool) LookupSubPic(REFERENCE_TIME rtNow, ISubPic** ppSubPic) = 0;
  191. STDMETHODIMP GetStats(int& nSubPics, REFERENCE_TIME& rtNow, REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop) = 0;
  192. STDMETHODIMP GetStats(int nSubPics, REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop) = 0;
  193. */
  194. };
  195. class CSubPicQueue : public ISubPicQueueImpl, private CInterfaceList<ISubPic>, private CAMThread
  196. {
  197. int m_nMaxSubPic;
  198. CCritSec m_csQueueLock; // for protecting CInterfaceList<ISubPic>
  199. REFERENCE_TIME UpdateQueue();
  200. void AppendQueue(ISubPic* pSubPic);
  201. REFERENCE_TIME m_rtQueueStart, m_rtInvalidate;
  202. // CAMThread
  203. bool m_fBreakBuffering;
  204. enum {EVENT_EXIT, EVENT_TIME, EVENT_COUNT}; // IMPORTANT: _EXIT must come before _TIME if we want to exit fast from the destructor
  205. HANDLE m_ThreadEvents[EVENT_COUNT];
  206.     DWORD ThreadProc();
  207. public:
  208. CSubPicQueue(int nMaxSubPic, ISubPicAllocator* pAllocator, HRESULT* phr);
  209. virtual ~CSubPicQueue();
  210. // ISubPicQueue
  211. STDMETHODIMP SetFPS(double fps);
  212. STDMETHODIMP SetTime(REFERENCE_TIME rtNow);
  213. STDMETHODIMP Invalidate(REFERENCE_TIME rtInvalidate = -1);
  214. STDMETHODIMP_(bool) LookupSubPic(REFERENCE_TIME rtNow, ISubPic** ppSubPic);
  215. STDMETHODIMP GetStats(int& nSubPics, REFERENCE_TIME& rtNow, REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop);
  216. STDMETHODIMP GetStats(int nSubPic, REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop);
  217. };
  218. class CSubPicQueueNoThread : public ISubPicQueueImpl
  219. {
  220. CCritSec m_csLock;
  221. CComPtr<ISubPic> m_pSubPic;
  222. public:
  223. CSubPicQueueNoThread(ISubPicAllocator* pAllocator, HRESULT* phr);
  224. virtual ~CSubPicQueueNoThread();
  225. // ISubPicQueue
  226. STDMETHODIMP Invalidate(REFERENCE_TIME rtInvalidate = -1);
  227. STDMETHODIMP_(bool) LookupSubPic(REFERENCE_TIME rtNow, ISubPic** ppSubPic);
  228. STDMETHODIMP GetStats(int& nSubPics, REFERENCE_TIME& rtNow, REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop);
  229. STDMETHODIMP GetStats(int nSubPic, REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop);
  230. };
  231. //
  232. // ISubPicAllocatorPresenter
  233. //
  234. [uuid("CF75B1F0-535C-4074-8869-B15F177F944E")]
  235. interface ISubPicAllocatorPresenter : public IUnknown
  236. {
  237. STDMETHOD (CreateRenderer) (IUnknown** ppRenderer) PURE;
  238. STDMETHOD_(SIZE, GetVideoSize) (bool fCorrectAR = true) PURE;
  239. STDMETHOD_(void, SetPosition) (RECT w, RECT v) PURE;
  240. STDMETHOD_(bool, Paint) (bool fAll) PURE;
  241. STDMETHOD_(void, SetTime) (REFERENCE_TIME rtNow) PURE;
  242. STDMETHOD_(double, GetFPS) () PURE;
  243. STDMETHOD_(void, SetSubPicProvider) (ISubPicProvider* pSubPicProvider) PURE;
  244. STDMETHOD_(void, Invalidate) (REFERENCE_TIME rtInvalidate = -1) PURE;
  245. STDMETHOD (GetDIB) (BYTE* lpDib, DWORD* size) PURE;
  246. STDMETHOD (SetVideoAngle) (Vector v, bool fRepaint = true) PURE;
  247. STDMETHOD (SetPixelShader) (LPCSTR pSrcData, LPCSTR pTarget) PURE;
  248. };
  249. class ISubPicAllocatorPresenterImpl 
  250. : public CUnknown
  251. , public CCritSec
  252. , public ISubPicAllocatorPresenter
  253. {
  254. protected:
  255. HWND m_hWnd;
  256. CSize m_spMaxSize; // TODO:
  257. int m_spMaxQueued; // TODO:
  258. CSize m_NativeVideoSize, m_AspectRatio;
  259. CRect m_VideoRect, m_WindowRect;
  260. REFERENCE_TIME m_rtNow;
  261. double m_fps;
  262. CComPtr<ISubPicAllocator> m_pAllocator;
  263. CComPtr<ISubPicQueue> m_pSubPicQueue;
  264. void AlphaBltSubPic(CSize size, SubPicDesc* pTarget = NULL);
  265.     XForm m_xform;
  266. void Transform(CRect r, Vector v[4]);
  267. public:
  268. ISubPicAllocatorPresenterImpl(HWND hWnd);
  269. virtual ~ISubPicAllocatorPresenterImpl();
  270. DECLARE_IUNKNOWN;
  271. STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
  272. // ISubPicAllocatorPresenter
  273. STDMETHODIMP CreateRenderer(IUnknown** ppRenderer) = 0;
  274. STDMETHODIMP_(SIZE) GetVideoSize(bool fCorrectAR = true);
  275. STDMETHODIMP_(void) SetPosition(RECT w, RECT v);
  276. STDMETHODIMP_(bool) Paint(bool fAll) = 0;
  277. STDMETHODIMP_(void) SetTime(REFERENCE_TIME rtNow);
  278. STDMETHODIMP_(double) GetFPS();
  279. STDMETHODIMP_(void) SetSubPicProvider(ISubPicProvider* pSubPicProvider);
  280. STDMETHODIMP_(void) Invalidate(REFERENCE_TIME rtInvalidate = -1);
  281. STDMETHODIMP GetDIB(BYTE* lpDib, DWORD* size) {return E_NOTIMPL;}
  282. STDMETHODIMP SetVideoAngle(Vector v, bool fRepaint = true);
  283. STDMETHODIMP SetPixelShader(LPCSTR pSrcData, LPCSTR pTarget) {return E_NOTIMPL;}
  284. };
  285. //
  286. // ISubStream
  287. //
  288. [uuid("DE11E2FB-02D3-45e4-A174-6B7CE2783BDB")]
  289. interface ISubStream : public IPersist
  290. {
  291. STDMETHOD_(int, GetStreamCount) () PURE;
  292. STDMETHOD (GetStreamInfo) (int i, WCHAR** ppName, LCID* pLCID) PURE;
  293. STDMETHOD_(int, GetStream) () PURE;
  294. STDMETHOD (SetStream) (int iStream) PURE;
  295. STDMETHOD (Reload) () PURE;
  296. // TODO: get rid of IPersist to identify type and use only 
  297. // interface functions to modify the settings of the substream
  298. };