Context.h 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786
  1. //
  2. // Notice Regarding Standards. AMD does not provide a license or sublicense to
  3. // any Intellectual Property Rights relating to any standards, including but not
  4. // limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4;
  5. // AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3
  6. // (collectively, the "Media Technologies"). For clarity, you will pay any
  7. // royalties due for such third party technologies, which may include the Media
  8. // Technologies that are owed as a result of AMD providing the Software to you.
  9. //
  10. // MIT license
  11. //
  12. // Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved.
  13. //
  14. // Permission is hereby granted, free of charge, to any person obtaining a copy
  15. // of this software and associated documentation files (the "Software"), to deal
  16. // in the Software without restriction, including without limitation the rights
  17. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  18. // copies of the Software, and to permit persons to whom the Software is
  19. // furnished to do so, subject to the following conditions:
  20. //
  21. // The above copyright notice and this permission notice shall be included in
  22. // all copies or substantial portions of the Software.
  23. //
  24. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  25. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  26. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  27. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  28. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  29. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  30. // THE SOFTWARE.
  31. //
  32. #ifndef AMF_Context_h
  33. #define AMF_Context_h
  34. #pragma once
  35. #include "Buffer.h"
  36. #include "AudioBuffer.h"
  37. #include "Surface.h"
  38. #include "Compute.h"
  39. #include "ComputeFactory.h"
  40. #if defined(__cplusplus)
  41. namespace amf
  42. {
  43. #endif
  44. //----------------------------------------------------------------------------------------------
  45. // AMFContext interface
  46. //----------------------------------------------------------------------------------------------
  47. #if defined(__cplusplus)
  48. class AMF_NO_VTABLE AMFContext : public AMFPropertyStorage
  49. {
  50. public:
  51. AMF_DECLARE_IID(0xa76a13f0, 0xd80e, 0x4fcc, 0xb5, 0x8, 0x65, 0xd0, 0xb5, 0x2e, 0xd9, 0xee)
  52. // Cleanup
  53. virtual AMF_RESULT AMF_STD_CALL Terminate() = 0;
  54. // DX9
  55. virtual AMF_RESULT AMF_STD_CALL InitDX9(void* pDX9Device) = 0;
  56. virtual void* AMF_STD_CALL GetDX9Device(AMF_DX_VERSION dxVersionRequired = AMF_DX9) = 0;
  57. virtual AMF_RESULT AMF_STD_CALL LockDX9() = 0;
  58. virtual AMF_RESULT AMF_STD_CALL UnlockDX9() = 0;
  59. class AMFDX9Locker;
  60. // DX11
  61. virtual AMF_RESULT AMF_STD_CALL InitDX11(void* pDX11Device, AMF_DX_VERSION dxVersionRequired = AMF_DX11_0) = 0;
  62. virtual void* AMF_STD_CALL GetDX11Device(AMF_DX_VERSION dxVersionRequired = AMF_DX11_0) = 0;
  63. virtual AMF_RESULT AMF_STD_CALL LockDX11() = 0;
  64. virtual AMF_RESULT AMF_STD_CALL UnlockDX11() = 0;
  65. class AMFDX11Locker;
  66. // OpenCL
  67. virtual AMF_RESULT AMF_STD_CALL InitOpenCL(void* pCommandQueue = NULL) = 0;
  68. virtual void* AMF_STD_CALL GetOpenCLContext() = 0;
  69. virtual void* AMF_STD_CALL GetOpenCLCommandQueue() = 0;
  70. virtual void* AMF_STD_CALL GetOpenCLDeviceID() = 0;
  71. virtual AMF_RESULT AMF_STD_CALL GetOpenCLComputeFactory(AMFComputeFactory **ppFactory) = 0; // advanced compute - multiple queries
  72. virtual AMF_RESULT AMF_STD_CALL InitOpenCLEx(AMFComputeDevice *pDevice) = 0;
  73. virtual AMF_RESULT AMF_STD_CALL LockOpenCL() = 0;
  74. virtual AMF_RESULT AMF_STD_CALL UnlockOpenCL() = 0;
  75. class AMFOpenCLLocker;
  76. // OpenGL
  77. virtual AMF_RESULT AMF_STD_CALL InitOpenGL(amf_handle hOpenGLContext, amf_handle hWindow, amf_handle hDC) = 0;
  78. virtual amf_handle AMF_STD_CALL GetOpenGLContext() = 0;
  79. virtual amf_handle AMF_STD_CALL GetOpenGLDrawable() = 0;
  80. virtual AMF_RESULT AMF_STD_CALL LockOpenGL() = 0;
  81. virtual AMF_RESULT AMF_STD_CALL UnlockOpenGL() = 0;
  82. class AMFOpenGLLocker;
  83. // XV - Linux
  84. virtual AMF_RESULT AMF_STD_CALL InitXV(void* pXVDevice) = 0;
  85. virtual void* AMF_STD_CALL GetXVDevice() = 0;
  86. virtual AMF_RESULT AMF_STD_CALL LockXV() = 0;
  87. virtual AMF_RESULT AMF_STD_CALL UnlockXV() = 0;
  88. class AMFXVLocker;
  89. // Gralloc - Android
  90. virtual AMF_RESULT AMF_STD_CALL InitGralloc(void* pGrallocDevice) = 0;
  91. virtual void* AMF_STD_CALL GetGrallocDevice() = 0;
  92. virtual AMF_RESULT AMF_STD_CALL LockGralloc() = 0;
  93. virtual AMF_RESULT AMF_STD_CALL UnlockGralloc() = 0;
  94. class AMFGrallocLocker;
  95. // Allocation
  96. virtual AMF_RESULT AMF_STD_CALL AllocBuffer(AMF_MEMORY_TYPE type, amf_size size, AMFBuffer** ppBuffer) = 0;
  97. virtual AMF_RESULT AMF_STD_CALL AllocSurface(AMF_MEMORY_TYPE type, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, AMFSurface** ppSurface) = 0;
  98. virtual AMF_RESULT AMF_STD_CALL AllocAudioBuffer(AMF_MEMORY_TYPE type, AMF_AUDIO_FORMAT format, amf_int32 samples, amf_int32 sampleRate, amf_int32 channels,
  99. AMFAudioBuffer** ppAudioBuffer) = 0;
  100. // Wrap existing objects
  101. virtual AMF_RESULT AMF_STD_CALL CreateBufferFromHostNative(void* pHostBuffer, amf_size size, AMFBuffer** ppBuffer, AMFBufferObserver* pObserver) = 0;
  102. virtual AMF_RESULT AMF_STD_CALL CreateSurfaceFromHostNative(AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, amf_int32 hPitch, amf_int32 vPitch, void* pData,
  103. AMFSurface** ppSurface, AMFSurfaceObserver* pObserver) = 0;
  104. virtual AMF_RESULT AMF_STD_CALL CreateSurfaceFromDX9Native(void* pDX9Surface, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver) = 0;
  105. virtual AMF_RESULT AMF_STD_CALL CreateSurfaceFromDX11Native(void* pDX11Surface, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver) = 0;
  106. virtual AMF_RESULT AMF_STD_CALL CreateSurfaceFromOpenGLNative(AMF_SURFACE_FORMAT format, amf_handle hGLTextureID, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver) = 0;
  107. virtual AMF_RESULT AMF_STD_CALL CreateSurfaceFromGrallocNative(amf_handle hGrallocSurface, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver) = 0;
  108. virtual AMF_RESULT AMF_STD_CALL CreateSurfaceFromOpenCLNative(AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, void** pClPlanes,
  109. AMFSurface** ppSurface, AMFSurfaceObserver* pObserver) = 0;
  110. virtual AMF_RESULT AMF_STD_CALL CreateBufferFromOpenCLNative(void* pCLBuffer, amf_size size, AMFBuffer** ppBuffer) = 0;
  111. // Access to AMFCompute interface - AMF_MEMORY_OPENCL, AMF_MEMORY_COMPUTE_FOR_DX9, AMF_MEMORY_COMPUTE_FOR_DX11 are currently supported
  112. virtual AMF_RESULT AMF_STD_CALL GetCompute(AMF_MEMORY_TYPE eMemType, AMFCompute** ppCompute) = 0;
  113. };
  114. //----------------------------------------------------------------------------------------------
  115. // smart pointer
  116. //----------------------------------------------------------------------------------------------
  117. typedef AMFInterfacePtr_T<AMFContext> AMFContextPtr;
  118. //----------------------------------------------------------------------------------------------
  119. // AMFContext1 interface
  120. //----------------------------------------------------------------------------------------------
  121. class AMF_NO_VTABLE AMFContext1 : public AMFContext
  122. {
  123. public:
  124. AMF_DECLARE_IID(0xd9e9f868, 0x6220, 0x44c6, 0xa2, 0x2f, 0x7c, 0xd6, 0xda, 0xc6, 0x86, 0x46)
  125. virtual AMF_RESULT AMF_STD_CALL CreateBufferFromDX11Native(void* pHostBuffer, AMFBuffer** ppBuffer, AMFBufferObserver* pObserver) = 0;
  126. virtual AMF_RESULT AMF_STD_CALL AllocBufferEx(AMF_MEMORY_TYPE type, amf_size size, AMF_BUFFER_USAGE usage, AMF_MEMORY_CPU_ACCESS access, AMFBuffer** ppBuffer) = 0;
  127. virtual AMF_RESULT AMF_STD_CALL AllocSurfaceEx(AMF_MEMORY_TYPE type, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, AMF_SURFACE_USAGE usage, AMF_MEMORY_CPU_ACCESS access, AMFSurface** ppSurface) = 0;
  128. // Vulkan - Windows, Linux
  129. virtual AMF_RESULT AMF_STD_CALL InitVulkan(void* pVulkanDevice) = 0;
  130. virtual void* AMF_STD_CALL GetVulkanDevice() = 0;
  131. virtual AMF_RESULT AMF_STD_CALL LockVulkan() = 0;
  132. virtual AMF_RESULT AMF_STD_CALL UnlockVulkan() = 0;
  133. virtual AMF_RESULT AMF_STD_CALL CreateSurfaceFromVulkanNative(void* pVulkanImage, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver) = 0;
  134. virtual AMF_RESULT AMF_STD_CALL CreateBufferFromVulkanNative(void* pVulkanBuffer, AMFBuffer** ppBuffer, AMFBufferObserver* pObserver) = 0;
  135. virtual AMF_RESULT AMF_STD_CALL GetVulkanDeviceExtensions(amf_size *pCount, const char **ppExtensions) = 0;
  136. class AMFVulkanLocker;
  137. };
  138. //----------------------------------------------------------------------------------------------
  139. // smart pointer
  140. //----------------------------------------------------------------------------------------------
  141. typedef AMFInterfacePtr_T<AMFContext1> AMFContext1Ptr;
  142. class AMF_NO_VTABLE AMFContext2 : public AMFContext1
  143. {
  144. public:
  145. AMF_DECLARE_IID(0x726241d3, 0xbd46, 0x4e90, 0x99, 0x68, 0x93, 0xe0, 0x7e, 0xa2, 0x98, 0x4d)
  146. // DX12
  147. virtual AMF_RESULT AMF_STD_CALL InitDX12(void* pDX11Device, AMF_DX_VERSION dxVersionRequired = AMF_DX12) = 0;
  148. virtual void* AMF_STD_CALL GetDX12Device(AMF_DX_VERSION dxVersionRequired = AMF_DX12) = 0;
  149. virtual AMF_RESULT AMF_STD_CALL LockDX12() = 0;
  150. virtual AMF_RESULT AMF_STD_CALL UnlockDX12() = 0;
  151. virtual AMF_RESULT AMF_STD_CALL CreateSurfaceFromDX12Native(void* pResourceTexture, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver) = 0;
  152. virtual AMF_RESULT AMF_STD_CALL CreateBufferFromDX12Native(void* pResourceBuffer, AMFBuffer** ppBuffer, AMFBufferObserver* pObserver) = 0;
  153. class AMFDX12Locker;
  154. };
  155. typedef AMFInterfacePtr_T<AMFContext2> AMFContext2Ptr;
  156. #else
  157. typedef struct AMFContext AMFContext;
  158. AMF_DECLARE_IID(AMFContext, 0xa76a13f0, 0xd80e, 0x4fcc, 0xb5, 0x8, 0x65, 0xd0, 0xb5, 0x2e, 0xd9, 0xee)
  159. typedef struct AMFContextVtbl
  160. {
  161. // AMFInterface interface
  162. amf_long (AMF_STD_CALL *Acquire)(AMFContext* pThis);
  163. amf_long (AMF_STD_CALL *Release)(AMFContext* pThis);
  164. enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFContext* pThis, const struct AMFGuid *interfaceID, void** ppInterface);
  165. // AMFInterface AMFPropertyStorage
  166. AMF_RESULT (AMF_STD_CALL *SetProperty)(AMFContext* pThis, const wchar_t* name, AMFVariantStruct value);
  167. AMF_RESULT (AMF_STD_CALL *GetProperty)(AMFContext* pThis, const wchar_t* name, AMFVariantStruct* pValue);
  168. amf_bool (AMF_STD_CALL *HasProperty)(AMFContext* pThis, const wchar_t* name);
  169. amf_size (AMF_STD_CALL *GetPropertyCount)(AMFContext* pThis);
  170. AMF_RESULT (AMF_STD_CALL *GetPropertyAt)(AMFContext* pThis, amf_size index, wchar_t* name, amf_size nameSize, AMFVariantStruct* pValue);
  171. AMF_RESULT (AMF_STD_CALL *Clear)(AMFContext* pThis);
  172. AMF_RESULT (AMF_STD_CALL *AddTo)(AMFContext* pThis, AMFPropertyStorage* pDest, amf_bool overwrite, amf_bool deep);
  173. AMF_RESULT (AMF_STD_CALL *CopyTo)(AMFContext* pThis, AMFPropertyStorage* pDest, amf_bool deep);
  174. void (AMF_STD_CALL *AddObserver)(AMFContext* pThis, AMFPropertyStorageObserver* pObserver);
  175. void (AMF_STD_CALL *RemoveObserver)(AMFContext* pThis, AMFPropertyStorageObserver* pObserver);
  176. // AMFContext interface
  177. // Cleanup
  178. AMF_RESULT (AMF_STD_CALL *Terminate)(AMFContext* pThis);
  179. // DX9
  180. AMF_RESULT (AMF_STD_CALL *InitDX9)(AMFContext* pThis, void* pDX9Device);
  181. void* (AMF_STD_CALL *GetDX9Device)(AMFContext* pThis, AMF_DX_VERSION dxVersionRequired);
  182. AMF_RESULT (AMF_STD_CALL *LockDX9)(AMFContext* pThis);
  183. AMF_RESULT (AMF_STD_CALL *UnlockDX9)(AMFContext* pThis);
  184. // DX11
  185. AMF_RESULT (AMF_STD_CALL *InitDX11)(AMFContext* pThis, void* pDX11Device, AMF_DX_VERSION dxVersionRequired);
  186. void* (AMF_STD_CALL *GetDX11Device)(AMFContext* pThis, AMF_DX_VERSION dxVersionRequired);
  187. AMF_RESULT (AMF_STD_CALL *LockDX11)(AMFContext* pThis);
  188. AMF_RESULT (AMF_STD_CALL *UnlockDX11)(AMFContext* pThis);
  189. // OpenCL
  190. AMF_RESULT (AMF_STD_CALL *InitOpenCL)(AMFContext* pThis, void* pCommandQueue);
  191. void* (AMF_STD_CALL *GetOpenCLContext)(AMFContext* pThis);
  192. void* (AMF_STD_CALL *GetOpenCLCommandQueue)(AMFContext* pThis);
  193. void* (AMF_STD_CALL *GetOpenCLDeviceID)(AMFContext* pThis);
  194. AMF_RESULT (AMF_STD_CALL *GetOpenCLComputeFactory)(AMFContext* pThis, AMFComputeFactory **ppFactory); // advanced compute - multiple queries
  195. AMF_RESULT (AMF_STD_CALL *InitOpenCLEx)(AMFContext* pThis, AMFComputeDevice *pDevice);
  196. AMF_RESULT (AMF_STD_CALL *LockOpenCL)(AMFContext* pThis);
  197. AMF_RESULT (AMF_STD_CALL *UnlockOpenCL)(AMFContext* pThis);
  198. // OpenGL
  199. AMF_RESULT (AMF_STD_CALL *InitOpenGL)(AMFContext* pThis, amf_handle hOpenGLContext, amf_handle hWindow, amf_handle hDC);
  200. amf_handle (AMF_STD_CALL *GetOpenGLContext)(AMFContext* pThis);
  201. amf_handle (AMF_STD_CALL *GetOpenGLDrawable)(AMFContext* pThis);
  202. AMF_RESULT (AMF_STD_CALL *LockOpenGL)(AMFContext* pThis);
  203. AMF_RESULT (AMF_STD_CALL *UnlockOpenGL)(AMFContext* pThis);
  204. // XV - Linux
  205. AMF_RESULT (AMF_STD_CALL *InitXV)(AMFContext* pThis, void* pXVDevice);
  206. void* (AMF_STD_CALL *GetXVDevice)(AMFContext* pThis);
  207. AMF_RESULT (AMF_STD_CALL *LockXV)(AMFContext* pThis);
  208. AMF_RESULT (AMF_STD_CALL *UnlockXV)(AMFContext* pThis);
  209. // Gralloc - Android
  210. AMF_RESULT (AMF_STD_CALL *InitGralloc)(AMFContext* pThis, void* pGrallocDevice);
  211. void* (AMF_STD_CALL *GetGrallocDevice)(AMFContext* pThis);
  212. AMF_RESULT (AMF_STD_CALL *LockGralloc)(AMFContext* pThis);
  213. AMF_RESULT (AMF_STD_CALL *UnlockGralloc)(AMFContext* pThis);
  214. // Allocation
  215. AMF_RESULT (AMF_STD_CALL *AllocBuffer)(AMFContext* pThis, AMF_MEMORY_TYPE type, amf_size size, AMFBuffer** ppBuffer);
  216. AMF_RESULT (AMF_STD_CALL *AllocSurface)(AMFContext* pThis, AMF_MEMORY_TYPE type, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, AMFSurface** ppSurface);
  217. AMF_RESULT (AMF_STD_CALL *AllocAudioBuffer)(AMFContext* pThis, AMF_MEMORY_TYPE type, AMF_AUDIO_FORMAT format, amf_int32 samples, amf_int32 sampleRate, amf_int32 channels,
  218. AMFAudioBuffer** ppAudioBuffer);
  219. // Wrap existing objects
  220. AMF_RESULT (AMF_STD_CALL *CreateBufferFromHostNative)(AMFContext* pThis, void* pHostBuffer, amf_size size, AMFBuffer** ppBuffer, AMFBufferObserver* pObserver);
  221. AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromHostNative)(AMFContext* pThis, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, amf_int32 hPitch, amf_int32 vPitch, void* pData,
  222. AMFSurface** ppSurface, AMFSurfaceObserver* pObserver);
  223. AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromDX9Native)(AMFContext* pThis, void* pDX9Surface, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver);
  224. AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromDX11Native)(AMFContext* pThis, void* pDX11Surface, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver);
  225. AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromOpenGLNative)(AMFContext* pThis, AMF_SURFACE_FORMAT format, amf_handle hGLTextureID, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver);
  226. AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromGrallocNative)(AMFContext* pThis, amf_handle hGrallocSurface, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver);
  227. AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromOpenCLNative)(AMFContext* pThis, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, void** pClPlanes,
  228. AMFSurface** ppSurface, AMFSurfaceObserver* pObserver);
  229. AMF_RESULT (AMF_STD_CALL *CreateBufferFromOpenCLNative)(AMFContext* pThis, void* pCLBuffer, amf_size size, AMFBuffer** ppBuffer);
  230. // Access to AMFCompute interface - AMF_MEMORY_OPENCL, AMF_MEMORY_COMPUTE_FOR_DX9, AMF_MEMORY_COMPUTE_FOR_DX11 are currently supported
  231. AMF_RESULT (AMF_STD_CALL *GetCompute)(AMFContext* pThis, AMF_MEMORY_TYPE eMemType, AMFCompute** ppCompute);
  232. } AMFContextVtbl;
  233. struct AMFContext
  234. {
  235. const AMFContextVtbl *pVtbl;
  236. };
  237. typedef struct AMFContext1 AMFContext1;
  238. AMF_DECLARE_IID(AMFContext1, 0xd9e9f868, 0x6220, 0x44c6, 0xa2, 0x2f, 0x7c, 0xd6, 0xda, 0xc6, 0x86, 0x46)
  239. typedef struct AMFContext1Vtbl
  240. {
  241. // AMFInterface interface
  242. amf_long (AMF_STD_CALL *Acquire)(AMFContext1* pThis);
  243. amf_long (AMF_STD_CALL *Release)(AMFContext1* pThis);
  244. enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFContext1* pThis, const struct AMFGuid *interfaceID, void** ppInterface);
  245. // AMFInterface AMFPropertyStorage
  246. AMF_RESULT (AMF_STD_CALL *SetProperty)(AMFContext1* pThis, const wchar_t* name, AMFVariantStruct value);
  247. AMF_RESULT (AMF_STD_CALL *GetProperty)(AMFContext1* pThis, const wchar_t* name, AMFVariantStruct* pValue);
  248. amf_bool (AMF_STD_CALL *HasProperty)(AMFContext1* pThis, const wchar_t* name);
  249. amf_size (AMF_STD_CALL *GetPropertyCount)(AMFContext1* pThis);
  250. AMF_RESULT (AMF_STD_CALL *GetPropertyAt)(AMFContext1* pThis, amf_size index, wchar_t* name, amf_size nameSize, AMFVariantStruct* pValue);
  251. AMF_RESULT (AMF_STD_CALL *Clear)(AMFContext1* pThis);
  252. AMF_RESULT (AMF_STD_CALL *AddTo)(AMFContext1* pThis, AMFPropertyStorage* pDest, amf_bool overwrite, amf_bool deep);
  253. AMF_RESULT (AMF_STD_CALL *CopyTo)(AMFContext1* pThis, AMFPropertyStorage* pDest, amf_bool deep);
  254. void (AMF_STD_CALL *AddObserver)(AMFContext1* pThis, AMFPropertyStorageObserver* pObserver);
  255. void (AMF_STD_CALL *RemoveObserver)(AMFContext1* pThis, AMFPropertyStorageObserver* pObserver);
  256. // AMFContext interface
  257. // Cleanup
  258. AMF_RESULT (AMF_STD_CALL *Terminate)(AMFContext1* pThis);
  259. // DX9
  260. AMF_RESULT (AMF_STD_CALL *InitDX9)(AMFContext1* pThis, void* pDX9Device);
  261. void* (AMF_STD_CALL *GetDX9Device)(AMFContext1* pThis, AMF_DX_VERSION dxVersionRequired);
  262. AMF_RESULT (AMF_STD_CALL *LockDX9)(AMFContext1* pThis);
  263. AMF_RESULT (AMF_STD_CALL *UnlockDX9)(AMFContext1* pThis);
  264. // DX11
  265. AMF_RESULT (AMF_STD_CALL *InitDX11)(AMFContext1* pThis, void* pDX11Device, AMF_DX_VERSION dxVersionRequired);
  266. void* (AMF_STD_CALL *GetDX11Device)(AMFContext1* pThis, AMF_DX_VERSION dxVersionRequired);
  267. AMF_RESULT (AMF_STD_CALL *LockDX11)(AMFContext1* pThis);
  268. AMF_RESULT (AMF_STD_CALL *UnlockDX11)(AMFContext1* pThis);
  269. // OpenCL
  270. AMF_RESULT (AMF_STD_CALL *InitOpenCL)(AMFContext1* pThis, void* pCommandQueue);
  271. void* (AMF_STD_CALL *GetOpenCLContext)(AMFContext1* pThis);
  272. void* (AMF_STD_CALL *GetOpenCLCommandQueue)(AMFContext1* pThis);
  273. void* (AMF_STD_CALL *GetOpenCLDeviceID)(AMFContext1* pThis);
  274. AMF_RESULT (AMF_STD_CALL *GetOpenCLComputeFactory)(AMFContext1* pThis, AMFComputeFactory **ppFactory); // advanced compute - multiple queries
  275. AMF_RESULT (AMF_STD_CALL *InitOpenCLEx)(AMFContext1* pThis, AMFComputeDevice *pDevice);
  276. AMF_RESULT (AMF_STD_CALL *LockOpenCL)(AMFContext1* pThis);
  277. AMF_RESULT (AMF_STD_CALL *UnlockOpenCL)(AMFContext1* pThis);
  278. // OpenGL
  279. AMF_RESULT (AMF_STD_CALL *InitOpenGL)(AMFContext1* pThis, amf_handle hOpenGLContext, amf_handle hWindow, amf_handle hDC);
  280. amf_handle (AMF_STD_CALL *GetOpenGLContext)(AMFContext1* pThis);
  281. amf_handle (AMF_STD_CALL *GetOpenGLDrawable)(AMFContext1* pThis);
  282. AMF_RESULT (AMF_STD_CALL *LockOpenGL)(AMFContext1* pThis);
  283. AMF_RESULT (AMF_STD_CALL *UnlockOpenGL)(AMFContext1* pThis);
  284. // XV - Linux
  285. AMF_RESULT (AMF_STD_CALL *InitXV)(AMFContext1* pThis, void* pXVDevice);
  286. void* (AMF_STD_CALL *GetXVDevice)(AMFContext1* pThis);
  287. AMF_RESULT (AMF_STD_CALL *LockXV)(AMFContext1* pThis);
  288. AMF_RESULT (AMF_STD_CALL *UnlockXV)(AMFContext1* pThis);
  289. // Gralloc - Android
  290. AMF_RESULT (AMF_STD_CALL *InitGralloc)(AMFContext1* pThis, void* pGrallocDevice);
  291. void* (AMF_STD_CALL *GetGrallocDevice)(AMFContext1* pThis);
  292. AMF_RESULT (AMF_STD_CALL *LockGralloc)(AMFContext1* pThis);
  293. AMF_RESULT (AMF_STD_CALL *UnlockGralloc)(AMFContext1* pThis);
  294. // Allocation
  295. AMF_RESULT (AMF_STD_CALL *AllocBuffer)(AMFContext1* pThis, AMF_MEMORY_TYPE type, amf_size size, AMFBuffer** ppBuffer);
  296. AMF_RESULT (AMF_STD_CALL *AllocSurface)(AMFContext1* pThis, AMF_MEMORY_TYPE type, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, AMFSurface** ppSurface);
  297. AMF_RESULT (AMF_STD_CALL *AllocAudioBuffer)(AMFContext1* pThis, AMF_MEMORY_TYPE type, AMF_AUDIO_FORMAT format, amf_int32 samples, amf_int32 sampleRate, amf_int32 channels,
  298. AMFAudioBuffer** ppAudioBuffer);
  299. // Wrap existing objects
  300. AMF_RESULT (AMF_STD_CALL *CreateBufferFromHostNative)(AMFContext1* pThis, void* pHostBuffer, amf_size size, AMFBuffer** ppBuffer, AMFBufferObserver* pObserver);
  301. AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromHostNative)(AMFContext1* pThis, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, amf_int32 hPitch, amf_int32 vPitch, void* pData,
  302. AMFSurface** ppSurface, AMFSurfaceObserver* pObserver);
  303. AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromDX9Native)(AMFContext1* pThis, void* pDX9Surface, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver);
  304. AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromDX11Native)(AMFContext1* pThis, void* pDX11Surface, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver);
  305. AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromOpenGLNative)(AMFContext1* pThis, AMF_SURFACE_FORMAT format, amf_handle hGLTextureID, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver);
  306. AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromGrallocNative)(AMFContext1* pThis, amf_handle hGrallocSurface, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver);
  307. AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromOpenCLNative)(AMFContext1* pThis, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, void** pClPlanes,
  308. AMFSurface** ppSurface, AMFSurfaceObserver* pObserver);
  309. AMF_RESULT (AMF_STD_CALL *CreateBufferFromOpenCLNative)(AMFContext1* pThis, void* pCLBuffer, amf_size size, AMFBuffer** ppBuffer);
  310. // Access to AMFCompute interface - AMF_MEMORY_OPENCL, AMF_MEMORY_COMPUTE_FOR_DX9, AMF_MEMORY_COMPUTE_FOR_DX11 are currently supported
  311. AMF_RESULT (AMF_STD_CALL *GetCompute)(AMFContext1* pThis, AMF_MEMORY_TYPE eMemType, AMFCompute** ppCompute);
  312. // AMFContext1 interface
  313. AMF_RESULT (AMF_STD_CALL *CreateBufferFromDX11Native)(AMFContext1* pThis, void* pHostBuffer, AMFBuffer** ppBuffer, AMFBufferObserver* pObserver);
  314. AMF_RESULT (AMF_STD_CALL *AllocBufferEx)(AMFContext1* pThis, AMF_MEMORY_TYPE type, amf_size size, AMF_BUFFER_USAGE usage, AMF_MEMORY_CPU_ACCESS access, AMFBuffer** ppBuffer);
  315. AMF_RESULT (AMF_STD_CALL *AllocSurfaceEx)(AMFContext1* pThis, AMF_MEMORY_TYPE type, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, AMF_SURFACE_USAGE usage, AMF_MEMORY_CPU_ACCESS access, AMFSurface** ppSurface);
  316. // Vulkan - Windows, Linux
  317. AMF_RESULT (AMF_STD_CALL *InitVulkan)(AMFContext1* pThis, void* pVulkanDevice);
  318. void* (AMF_STD_CALL *GetVulkanDevice)(AMFContext1* pThis);
  319. AMF_RESULT (AMF_STD_CALL *LockVulkan)(AMFContext1* pThis);
  320. AMF_RESULT (AMF_STD_CALL *UnlockVulkan)(AMFContext1* pThis);
  321. AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromVulkanNative)(AMFContext1* pThis, void* pVulkanImage, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver);
  322. AMF_RESULT (AMF_STD_CALL *CreateBufferFromVulkanNative)(AMFContext1* pThis, void* pVulkanBuffer, AMFBuffer** ppBuffer, AMFBufferObserver* pObserver);
  323. AMF_RESULT (AMF_STD_CALL *GetVulkanDeviceExtensions)(AMFContext1* pThis, amf_size *pCount, const char **ppExtensions);
  324. } AMFContext1Vtbl;
  325. struct AMFContext1
  326. {
  327. const AMFContext1Vtbl *pVtbl;
  328. };
  329. typedef struct AMFContext2 AMFContext2;
  330. AMF_DECLARE_IID(AMFContext2, 0xd9e9f868, 0x6220, 0x44c6, 0xa2, 0x2f, 0x7c, 0xd6, 0xda, 0xc6, 0x86, 0x46)
  331. typedef struct AMFContext2Vtbl
  332. {
  333. // AMFInterface interface
  334. amf_long (AMF_STD_CALL *Acquire)(AMFContext2* pThis);
  335. amf_long (AMF_STD_CALL *Release)(AMFContext2* pThis);
  336. enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFContext2* pThis, const struct AMFGuid *interfaceID, void** ppInterface);
  337. // AMFInterface AMFPropertyStorage
  338. AMF_RESULT (AMF_STD_CALL *SetProperty)(AMFContext2* pThis, const wchar_t* name, AMFVariantStruct value);
  339. AMF_RESULT (AMF_STD_CALL *GetProperty)(AMFContext2* pThis, const wchar_t* name, AMFVariantStruct* pValue);
  340. amf_bool (AMF_STD_CALL *HasProperty)(AMFContext2* pThis, const wchar_t* name);
  341. amf_size (AMF_STD_CALL *GetPropertyCount)(AMFContext2* pThis);
  342. AMF_RESULT (AMF_STD_CALL *GetPropertyAt)(AMFContext2* pThis, amf_size index, wchar_t* name, amf_size nameSize, AMFVariantStruct* pValue);
  343. AMF_RESULT (AMF_STD_CALL *Clear)(AMFContext2* pThis);
  344. AMF_RESULT (AMF_STD_CALL *AddTo)(AMFContext2* pThis, AMFPropertyStorage* pDest, amf_bool overwrite, amf_bool deep);
  345. AMF_RESULT (AMF_STD_CALL *CopyTo)(AMFContext2* pThis, AMFPropertyStorage* pDest, amf_bool deep);
  346. void (AMF_STD_CALL *AddObserver)(AMFContext2* pThis, AMFPropertyStorageObserver* pObserver);
  347. void (AMF_STD_CALL *RemoveObserver)(AMFContext2* pThis, AMFPropertyStorageObserver* pObserver);
  348. // AMFContext interface
  349. // Cleanup
  350. AMF_RESULT (AMF_STD_CALL *Terminate)(AMFContext2* pThis);
  351. // DX9
  352. AMF_RESULT (AMF_STD_CALL *InitDX9)(AMFContext2* pThis, void* pDX9Device);
  353. void* (AMF_STD_CALL *GetDX9Device)(AMFContext2* pThis, AMF_DX_VERSION dxVersionRequired);
  354. AMF_RESULT (AMF_STD_CALL *LockDX9)(AMFContext2* pThis);
  355. AMF_RESULT (AMF_STD_CALL *UnlockDX9)(AMFContext2* pThis);
  356. // DX11
  357. AMF_RESULT (AMF_STD_CALL *InitDX11)(AMFContext2* pThis, void* pDX11Device, AMF_DX_VERSION dxVersionRequired);
  358. void* (AMF_STD_CALL *GetDX11Device)(AMFContext2* pThis, AMF_DX_VERSION dxVersionRequired);
  359. AMF_RESULT (AMF_STD_CALL *LockDX11)(AMFContext2* pThis);
  360. AMF_RESULT (AMF_STD_CALL *UnlockDX11)(AMFContext2* pThis);
  361. // OpenCL
  362. AMF_RESULT (AMF_STD_CALL *InitOpenCL)(AMFContext2* pThis, void* pCommandQueue);
  363. void* (AMF_STD_CALL *GetOpenCLContext)(AMFContext2* pThis);
  364. void* (AMF_STD_CALL *GetOpenCLCommandQueue)(AMFContext2* pThis);
  365. void* (AMF_STD_CALL *GetOpenCLDeviceID)(AMFContext2* pThis);
  366. AMF_RESULT (AMF_STD_CALL *GetOpenCLComputeFactory)(AMFContext2* pThis, AMFComputeFactory **ppFactory); // advanced compute - multiple queries
  367. AMF_RESULT (AMF_STD_CALL *InitOpenCLEx)(AMFContext2* pThis, AMFComputeDevice *pDevice);
  368. AMF_RESULT (AMF_STD_CALL *LockOpenCL)(AMFContext2* pThis);
  369. AMF_RESULT (AMF_STD_CALL *UnlockOpenCL)(AMFContext2* pThis);
  370. // OpenGL
  371. AMF_RESULT (AMF_STD_CALL *InitOpenGL)(AMFContext2* pThis, amf_handle hOpenGLContext, amf_handle hWindow, amf_handle hDC);
  372. amf_handle (AMF_STD_CALL *GetOpenGLContext)(AMFContext2* pThis);
  373. amf_handle (AMF_STD_CALL *GetOpenGLDrawable)(AMFContext2* pThis);
  374. AMF_RESULT (AMF_STD_CALL *LockOpenGL)(AMFContext2* pThis);
  375. AMF_RESULT (AMF_STD_CALL *UnlockOpenGL)(AMFContext2* pThis);
  376. // XV - Linux
  377. AMF_RESULT (AMF_STD_CALL *InitXV)(AMFContext2* pThis, void* pXVDevice);
  378. void* (AMF_STD_CALL *GetXVDevice)(AMFContext2* pThis);
  379. AMF_RESULT (AMF_STD_CALL *LockXV)(AMFContext2* pThis);
  380. AMF_RESULT (AMF_STD_CALL *UnlockXV)(AMFContext2* pThis);
  381. // Gralloc - Android
  382. AMF_RESULT (AMF_STD_CALL *InitGralloc)(AMFContext2* pThis, void* pGrallocDevice);
  383. void* (AMF_STD_CALL *GetGrallocDevice)(AMFContext2* pThis);
  384. AMF_RESULT (AMF_STD_CALL *LockGralloc)(AMFContext2* pThis);
  385. AMF_RESULT (AMF_STD_CALL *UnlockGralloc)(AMFContext2* pThis);
  386. // Allocation
  387. AMF_RESULT (AMF_STD_CALL *AllocBuffer)(AMFContext2* pThis, AMF_MEMORY_TYPE type, amf_size size, AMFBuffer** ppBuffer);
  388. AMF_RESULT (AMF_STD_CALL *AllocSurface)(AMFContext2* pThis, AMF_MEMORY_TYPE type, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, AMFSurface** ppSurface);
  389. AMF_RESULT (AMF_STD_CALL *AllocAudioBuffer)(AMFContext2* pThis, AMF_MEMORY_TYPE type, AMF_AUDIO_FORMAT format, amf_int32 samples, amf_int32 sampleRate, amf_int32 channels, AMFAudioBuffer** ppAudioBuffer);
  390. // Wrap existing objects
  391. AMF_RESULT (AMF_STD_CALL *CreateBufferFromHostNative)(AMFContext2* pThis, void* pHostBuffer, amf_size size, AMFBuffer** ppBuffer, AMFBufferObserver* pObserver);
  392. AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromHostNative)(AMFContext2* pThis, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, amf_int32 hPitch, amf_int32 vPitch, void* pData,AMFSurface** ppSurface, AMFSurfaceObserver* pObserver);
  393. AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromDX9Native)(AMFContext2* pThis, void* pDX9Surface, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver);
  394. AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromDX11Native)(AMFContext2* pThis, void* pDX11Surface, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver);
  395. AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromOpenGLNative)(AMFContext2* pThis, AMF_SURFACE_FORMAT format, amf_handle hGLTextureID, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver);
  396. AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromGrallocNative)(AMFContext2* pThis, amf_handle hGrallocSurface, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver);
  397. AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromOpenCLNative)(AMFContext2* pThis, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, void** pClPlanes, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver);
  398. AMF_RESULT (AMF_STD_CALL *CreateBufferFromOpenCLNative)(AMFContext2* pThis, void* pCLBuffer, amf_size size, AMFBuffer** ppBuffer);
  399. // Access to AMFCompute interface - AMF_MEMORY_OPENCL, AMF_MEMORY_COMPUTE_FOR_DX9, AMF_MEMORY_COMPUTE_FOR_DX11 are currently supported
  400. AMF_RESULT (AMF_STD_CALL *GetCompute)(AMFContext2* pThis, AMF_MEMORY_TYPE eMemType, AMFCompute** ppCompute);
  401. // AMFContext1 interface
  402. AMF_RESULT (AMF_STD_CALL *CreateBufferFromDX11Native)(AMFContext2* pThis, void* pHostBuffer, AMFBuffer** ppBuffer, AMFBufferObserver* pObserver);
  403. AMF_RESULT (AMF_STD_CALL *AllocBufferEx)(AMFContext2* pThis, AMF_MEMORY_TYPE type, amf_size size, AMF_BUFFER_USAGE usage, AMF_MEMORY_CPU_ACCESS access, AMFBuffer** ppBuffer);
  404. AMF_RESULT (AMF_STD_CALL *AllocSurfaceEx)(AMFContext2* pThis, AMF_MEMORY_TYPE type, AMF_SURFACE_FORMAT format, amf_int32 width, amf_int32 height, AMF_SURFACE_USAGE usage, AMF_MEMORY_CPU_ACCESS access, AMFSurface** ppSurface);
  405. // Vulkan - Windows, Linux
  406. AMF_RESULT (AMF_STD_CALL *InitVulkan)(AMFContext2* pThis, void* pVulkanDevice);
  407. void* (AMF_STD_CALL *GetVulkanDevice)(AMFContext2* pThis);
  408. AMF_RESULT (AMF_STD_CALL *LockVulkan)(AMFContext2* pThis);
  409. AMF_RESULT (AMF_STD_CALL *UnlockVulkan)(AMFContext2* pThis);
  410. AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromVulkanNative)(AMFContext2* pThis, void* pVulkanImage, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver);
  411. AMF_RESULT (AMF_STD_CALL *CreateBufferFromVulkanNative)(AMFContext2* pThis, void* pVulkanBuffer, AMFBuffer** ppBuffer, AMFBufferObserver* pObserver);
  412. AMF_RESULT (AMF_STD_CALL *GetVulkanDeviceExtensions)(AMFContext2* pThis, amf_size *pCount, const char **ppExtensions);
  413. // AMFContext2 interface
  414. AMF_RESULT (AMF_STD_CALL *InitDX12)(AMFContext2* pThis, void* pDX11Device, AMF_DX_VERSION dxVersionRequired);
  415. void* (AMF_STD_CALL *GetDX12Device)(AMFContext2* pThis, AMF_DX_VERSION dxVersionRequired);
  416. AMF_RESULT (AMF_STD_CALL *LockDX12)(AMFContext2* pThis);
  417. AMF_RESULT (AMF_STD_CALL *UnlockDX12)(AMFContext2* pThis);
  418. AMF_RESULT (AMF_STD_CALL *CreateSurfaceFromDX12Native)(AMFContext2* pThis, void* pResourceTexture, AMFSurface** ppSurface, AMFSurfaceObserver* pObserver);
  419. AMF_RESULT (AMF_STD_CALL *CreateBufferFromDX12Native)(AMFContext2* pThis, void* pResourceBuffer, AMFBuffer** ppBuffer, AMFBufferObserver* pObserver);
  420. } AMFContext2Vtbl;
  421. struct AMFContext2
  422. {
  423. const AMFContext2Vtbl *pVtbl;
  424. };
  425. #endif
  426. #if defined(__cplusplus)
  427. //----------------------------------------------------------------------------------------------
  428. // Lockers
  429. //----------------------------------------------------------------------------------------------
  430. class AMFContext::AMFDX9Locker
  431. {
  432. public:
  433. AMFDX9Locker() : m_Context(NULL)
  434. {}
  435. AMFDX9Locker(AMFContext* resources) : m_Context(NULL)
  436. {
  437. Lock(resources);
  438. }
  439. ~AMFDX9Locker()
  440. {
  441. if(m_Context != NULL)
  442. {
  443. m_Context->UnlockDX9();
  444. }
  445. }
  446. void Lock(AMFContext* resources)
  447. {
  448. if(m_Context != NULL)
  449. {
  450. m_Context->UnlockDX9();
  451. }
  452. m_Context = resources;
  453. if(m_Context != NULL)
  454. {
  455. m_Context->LockDX9();
  456. }
  457. }
  458. protected:
  459. AMFContext* m_Context;
  460. private:
  461. AMFDX9Locker(const AMFDX9Locker&);
  462. AMFDX9Locker& operator=(const AMFDX9Locker&);
  463. };
  464. //----------------------------------------------------------------------------------------------
  465. class AMFContext::AMFDX11Locker
  466. {
  467. public:
  468. AMFDX11Locker() : m_Context(NULL)
  469. {}
  470. AMFDX11Locker(AMFContext* resources) : m_Context(NULL)
  471. {
  472. Lock(resources);
  473. }
  474. ~AMFDX11Locker()
  475. {
  476. if(m_Context != NULL)
  477. {
  478. m_Context->UnlockDX11();
  479. }
  480. }
  481. void Lock(AMFContext* resources)
  482. {
  483. if(m_Context != NULL)
  484. {
  485. m_Context->UnlockDX11();
  486. }
  487. m_Context = resources;
  488. if(m_Context != NULL)
  489. {
  490. m_Context->LockDX11();
  491. }
  492. }
  493. protected:
  494. AMFContext* m_Context;
  495. private:
  496. AMFDX11Locker(const AMFDX11Locker&);
  497. AMFDX11Locker& operator=(const AMFDX11Locker&);
  498. };
  499. //----------------------------------------------------------------------------------------------
  500. class AMFContext::AMFOpenCLLocker
  501. {
  502. public:
  503. AMFOpenCLLocker() : m_Context(NULL)
  504. {}
  505. AMFOpenCLLocker(AMFContext* resources) : m_Context(NULL)
  506. {
  507. Lock(resources);
  508. }
  509. ~AMFOpenCLLocker()
  510. {
  511. if(m_Context != NULL)
  512. {
  513. m_Context->UnlockOpenCL();
  514. }
  515. }
  516. void Lock(AMFContext* resources)
  517. {
  518. if(m_Context != NULL)
  519. {
  520. m_Context->UnlockOpenCL();
  521. }
  522. m_Context = resources;
  523. if(m_Context != NULL)
  524. {
  525. m_Context->LockOpenCL();
  526. }
  527. }
  528. protected:
  529. AMFContext* m_Context;
  530. private:
  531. AMFOpenCLLocker(const AMFOpenCLLocker&);
  532. AMFOpenCLLocker& operator=(const AMFOpenCLLocker&);
  533. };
  534. //----------------------------------------------------------------------------------------------
  535. class AMFContext::AMFOpenGLLocker
  536. {
  537. public:
  538. AMFOpenGLLocker(AMFContext* pContext) : m_pContext(pContext),
  539. m_GLLocked(false)
  540. {
  541. if(m_pContext != NULL)
  542. {
  543. if(m_pContext->LockOpenGL() == AMF_OK)
  544. {
  545. m_GLLocked = true;
  546. }
  547. }
  548. }
  549. ~AMFOpenGLLocker()
  550. {
  551. if(m_GLLocked)
  552. {
  553. m_pContext->UnlockOpenGL();
  554. }
  555. }
  556. private:
  557. AMFContext* m_pContext;
  558. amf_bool m_GLLocked; ///< AMFOpenGLLocker can be called when OpenGL is not initialized yet
  559. ///< in this case don't call UnlockOpenGL
  560. AMFOpenGLLocker(const AMFOpenGLLocker&);
  561. AMFOpenGLLocker& operator=(const AMFOpenGLLocker&);
  562. };
  563. //----------------------------------------------------------------------------------------------
  564. class AMFContext::AMFXVLocker
  565. {
  566. public:
  567. AMFXVLocker() : m_pContext(NULL)
  568. {}
  569. AMFXVLocker(AMFContext* pContext) : m_pContext(NULL)
  570. {
  571. Lock(pContext);
  572. }
  573. ~AMFXVLocker()
  574. {
  575. if(m_pContext != NULL)
  576. {
  577. m_pContext->UnlockXV();
  578. }
  579. }
  580. void Lock(AMFContext* pContext)
  581. {
  582. if((pContext != NULL) && (pContext->GetXVDevice() != NULL))
  583. {
  584. m_pContext = pContext;
  585. m_pContext->LockXV();
  586. }
  587. }
  588. protected:
  589. AMFContext* m_pContext;
  590. private:
  591. AMFXVLocker(const AMFXVLocker&);
  592. AMFXVLocker& operator=(const AMFXVLocker&);
  593. };
  594. //----------------------------------------------------------------------------------------------
  595. class AMFContext::AMFGrallocLocker
  596. {
  597. public:
  598. AMFGrallocLocker() : m_pContext(NULL)
  599. {}
  600. AMFGrallocLocker(AMFContext* pContext) : m_pContext(NULL)
  601. {
  602. Lock(pContext);
  603. }
  604. ~AMFGrallocLocker()
  605. {
  606. if(m_pContext != NULL)
  607. {
  608. m_pContext->UnlockGralloc();
  609. }
  610. }
  611. void Lock(AMFContext* pContext)
  612. {
  613. if((pContext != NULL) && (pContext->GetGrallocDevice() != NULL))
  614. {
  615. m_pContext = pContext;
  616. m_pContext->LockGralloc();
  617. }
  618. }
  619. protected:
  620. AMFContext* m_pContext;
  621. private:
  622. AMFGrallocLocker(const AMFGrallocLocker&);
  623. AMFGrallocLocker& operator=(const AMFGrallocLocker&);
  624. };
  625. //----------------------------------------------------------------------------------------------
  626. class AMFContext1::AMFVulkanLocker
  627. {
  628. public:
  629. AMFVulkanLocker() : m_pContext(NULL)
  630. {}
  631. AMFVulkanLocker(AMFContext1* pContext) : m_pContext(NULL)
  632. {
  633. Lock(pContext);
  634. }
  635. ~AMFVulkanLocker()
  636. {
  637. if(m_pContext != NULL)
  638. {
  639. m_pContext->UnlockVulkan();
  640. }
  641. }
  642. void Lock(AMFContext1* pContext)
  643. {
  644. if((pContext != NULL) && (pContext->GetVulkanDevice() != NULL))
  645. {
  646. m_pContext = pContext;
  647. m_pContext->LockVulkan();
  648. }
  649. }
  650. protected:
  651. AMFContext1* m_pContext;
  652. private:
  653. AMFVulkanLocker(const AMFVulkanLocker&);
  654. AMFVulkanLocker& operator=(const AMFVulkanLocker&);
  655. };
  656. //----------------------------------------------------------------------------------------------
  657. class AMFContext2::AMFDX12Locker
  658. {
  659. public:
  660. AMFDX12Locker() : m_Context(NULL)
  661. {}
  662. AMFDX12Locker(AMFContext2* resources) : m_Context(NULL)
  663. {
  664. Lock(resources);
  665. }
  666. ~AMFDX12Locker()
  667. {
  668. if (m_Context != NULL)
  669. {
  670. m_Context->UnlockDX12();
  671. }
  672. }
  673. void Lock(AMFContext2* resources)
  674. {
  675. if (m_Context != NULL)
  676. {
  677. m_Context->UnlockDX12();
  678. }
  679. m_Context = resources;
  680. if (m_Context != NULL)
  681. {
  682. m_Context->LockDX12();
  683. }
  684. }
  685. protected:
  686. AMFContext2* m_Context;
  687. private:
  688. AMFDX12Locker(const AMFDX12Locker&);
  689. AMFDX12Locker& operator=(const AMFDX12Locker&);
  690. };
  691. //----------------------------------------------------------------------------------------------
  692. //----------------------------------------------------------------------------------------------
  693. //----------------------------------------------------------------------------------------------
  694. #endif
  695. #if defined(__cplusplus)
  696. }
  697. #endif
  698. enum AMF_CONTEXT_DEVICETYPE_ENUM
  699. {
  700. AMF_CONTEXT_DEVICE_TYPE_GPU = 0,
  701. AMF_CONTEXT_DEVICE_TYPE_CPU
  702. };
  703. #define AMF_CONTEXT_DEVICE_TYPE L"AMF_Context_DeviceType" //Value type: amf_int64; Values : AMF_CONTEXT_DEVICE_TYPE_GPU for GPU (default) , AMF_CONTEXT_DEVICE_TYPE_CPU for CPU.
  704. #endif //#ifndef AMF_Context_h