AudioBuffer.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  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_AudioBuffer_h
  33. #define AMF_AudioBuffer_h
  34. #pragma once
  35. #include "Data.h"
  36. #if defined(_MSC_VER)
  37. #pragma warning( push )
  38. #pragma warning(disable : 4263)
  39. #pragma warning(disable : 4264)
  40. #endif
  41. #if defined(__cplusplus)
  42. namespace amf
  43. {
  44. #endif
  45. typedef enum AMF_AUDIO_FORMAT
  46. {
  47. AMFAF_UNKNOWN =-1,
  48. AMFAF_U8 = 0, // amf_uint8
  49. AMFAF_S16 = 1, // amf_int16
  50. AMFAF_S32 = 2, // amf_int32
  51. AMFAF_FLT = 3, // amf_float
  52. AMFAF_DBL = 4, // amf_double
  53. AMFAF_U8P = 5, // amf_uint8
  54. AMFAF_S16P = 6, // amf_int16
  55. AMFAF_S32P = 7, // amf_int32
  56. AMFAF_FLTP = 8, // amf_float
  57. AMFAF_DBLP = 9, // amf_double
  58. AMFAF_FIRST = AMFAF_U8,
  59. AMFAF_LAST = AMFAF_DBLP,
  60. } AMF_AUDIO_FORMAT;
  61. typedef enum AMF_AUDIO_CHANNEL_LAYOUT
  62. {
  63. AMFACL_SPEAKER_FRONT_LEFT = 0x1,
  64. AMFACL_SPEAKER_FRONT_RIGHT = 0x2,
  65. AMFACL_SPEAKER_FRONT_CENTER = 0x4,
  66. AMFACL_SPEAKER_LOW_FREQUENCY = 0x8,
  67. AMFACL_SPEAKER_BACK_LEFT = 0x10,
  68. AMFACL_SPEAKER_BACK_RIGHT = 0x20,
  69. AMFACL_SPEAKER_FRONT_LEFT_OF_CENTER = 0x40,
  70. AMFACL_SPEAKER_FRONT_RIGHT_OF_CENTER = 0x80,
  71. AMFACL_SPEAKER_BACK_CENTER = 0x100,
  72. AMFACL_SPEAKER_SIDE_LEFT = 0x200,
  73. AMFACL_SPEAKER_SIDE_RIGHT = 0x400,
  74. AMFACL_SPEAKER_TOP_CENTER = 0x800,
  75. AMFACL_SPEAKER_TOP_FRONT_LEFT = 0x1000,
  76. AMFACL_SPEAKER_TOP_FRONT_CENTER = 0x2000,
  77. AMFACL_SPEAKER_TOP_FRONT_RIGHT = 0x4000,
  78. AMFACL_SPEAKER_TOP_BACK_LEFT = 0x8000,
  79. AMFACL_SPEAKER_TOP_BACK_CENTER = 0x10000,
  80. AMFACL_SPEAKER_TOP_BACK_RIGHT = 0x20000
  81. } AMF_AUDIO_CHANNEL_LAYOUT;
  82. // get the most common layout for a given number of speakers
  83. inline int GetDefaultChannelLayout(int channels)
  84. {
  85. switch (channels)
  86. {
  87. case 1:
  88. return (AMFACL_SPEAKER_FRONT_CENTER);
  89. case 2:
  90. return (AMFACL_SPEAKER_FRONT_LEFT | AMFACL_SPEAKER_FRONT_RIGHT);
  91. case 4:
  92. return (AMFACL_SPEAKER_FRONT_LEFT | AMFACL_SPEAKER_FRONT_RIGHT | AMFACL_SPEAKER_BACK_LEFT | AMFACL_SPEAKER_BACK_RIGHT);
  93. case 6:
  94. return (AMFACL_SPEAKER_FRONT_LEFT | AMFACL_SPEAKER_FRONT_RIGHT | AMFACL_SPEAKER_FRONT_CENTER | AMFACL_SPEAKER_LOW_FREQUENCY | AMFACL_SPEAKER_BACK_LEFT | AMFACL_SPEAKER_BACK_RIGHT);
  95. case 8:
  96. return (AMFACL_SPEAKER_FRONT_LEFT | AMFACL_SPEAKER_FRONT_RIGHT | AMFACL_SPEAKER_FRONT_CENTER | AMFACL_SPEAKER_LOW_FREQUENCY | AMFACL_SPEAKER_BACK_LEFT | AMFACL_SPEAKER_BACK_RIGHT | AMFACL_SPEAKER_FRONT_LEFT_OF_CENTER | AMFACL_SPEAKER_FRONT_RIGHT_OF_CENTER);
  97. }
  98. return AMFACL_SPEAKER_FRONT_LEFT | AMFACL_SPEAKER_FRONT_RIGHT;
  99. }
  100. //----------------------------------------------------------------------------------------------
  101. // AMFAudioBufferObserver interface - callback
  102. //----------------------------------------------------------------------------------------------
  103. #if defined(__cplusplus)
  104. class AMFAudioBuffer;
  105. class AMF_NO_VTABLE AMFAudioBufferObserver
  106. {
  107. public:
  108. virtual void AMF_STD_CALL OnBufferDataRelease(AMFAudioBuffer* pBuffer) = 0;
  109. };
  110. #else // #if defined(__cplusplus)
  111. typedef struct AMFAudioBuffer AMFAudioBuffer;
  112. typedef struct AMFAudioBufferObserver AMFAudioBufferObserver;
  113. typedef struct AMFAudioBufferObserverVtbl
  114. {
  115. void (AMF_STD_CALL *OnBufferDataRelease)(AMFAudioBufferObserver* pThis, AMFAudioBuffer* pBuffer);
  116. } AMFAudioBufferObserverVtbl;
  117. struct AMFAudioBufferObserver
  118. {
  119. const AMFAudioBufferObserverVtbl *pVtbl;
  120. };
  121. #endif // #if defined(__cplusplus)
  122. //----------------------------------------------------------------------------------------------
  123. // AudioBuffer interface
  124. //----------------------------------------------------------------------------------------------
  125. #if defined(__cplusplus)
  126. class AMF_NO_VTABLE AMFAudioBuffer : public AMFData
  127. {
  128. public:
  129. AMF_DECLARE_IID(0x2212ff8, 0x6107, 0x430b, 0xb6, 0x3c, 0xc7, 0xe5, 0x40, 0xe5, 0xf8, 0xeb)
  130. virtual amf_int32 AMF_STD_CALL GetSampleCount() = 0;
  131. virtual amf_int32 AMF_STD_CALL GetSampleRate() = 0;
  132. virtual amf_int32 AMF_STD_CALL GetChannelCount() = 0;
  133. virtual AMF_AUDIO_FORMAT AMF_STD_CALL GetSampleFormat() = 0;
  134. virtual amf_int32 AMF_STD_CALL GetSampleSize() = 0;
  135. virtual amf_uint32 AMF_STD_CALL GetChannelLayout() = 0;
  136. virtual void* AMF_STD_CALL GetNative() = 0;
  137. virtual amf_size AMF_STD_CALL GetSize() = 0;
  138. // Observer management
  139. #ifdef __clang__
  140. #pragma clang diagnostic push
  141. #pragma clang diagnostic ignored "-Woverloaded-virtual"
  142. #endif
  143. virtual void AMF_STD_CALL AddObserver(AMFAudioBufferObserver* pObserver) = 0;
  144. virtual void AMF_STD_CALL RemoveObserver(AMFAudioBufferObserver* pObserver) = 0;
  145. #ifdef __clang__
  146. #pragma clang diagnostic pop
  147. #endif
  148. };
  149. //----------------------------------------------------------------------------------------------
  150. // smart pointer
  151. //----------------------------------------------------------------------------------------------
  152. typedef AMFInterfacePtr_T<AMFAudioBuffer> AMFAudioBufferPtr;
  153. //----------------------------------------------------------------------------------------------
  154. #else // #if defined(__cplusplus)
  155. AMF_DECLARE_IID(AMFAudioBuffer, 0x2212ff8, 0x6107, 0x430b, 0xb6, 0x3c, 0xc7, 0xe5, 0x40, 0xe5, 0xf8, 0xeb)
  156. typedef struct AMFAudioBufferVtbl
  157. {
  158. // AMFInterface interface
  159. amf_long (AMF_STD_CALL *Acquire)(AMFAudioBuffer* pThis);
  160. amf_long (AMF_STD_CALL *Release)(AMFAudioBuffer* pThis);
  161. enum AMF_RESULT (AMF_STD_CALL *QueryInterface)(AMFAudioBuffer* pThis, const struct AMFGuid *interfaceID, void** ppInterface);
  162. // AMFPropertyStorage interface
  163. AMF_RESULT (AMF_STD_CALL *SetProperty)(AMFAudioBuffer* pThis, const wchar_t* name, AMFVariantStruct value);
  164. AMF_RESULT (AMF_STD_CALL *GetProperty)(AMFAudioBuffer* pThis, const wchar_t* name, AMFVariantStruct* pValue);
  165. amf_bool (AMF_STD_CALL *HasProperty)(AMFAudioBuffer* pThis, const wchar_t* name);
  166. amf_size (AMF_STD_CALL *GetPropertyCount)(AMFAudioBuffer* pThis);
  167. AMF_RESULT (AMF_STD_CALL *GetPropertyAt)(AMFAudioBuffer* pThis, amf_size index, wchar_t* name, amf_size nameSize, AMFVariantStruct* pValue);
  168. AMF_RESULT (AMF_STD_CALL *Clear)(AMFAudioBuffer* pThis);
  169. AMF_RESULT (AMF_STD_CALL *AddTo)(AMFAudioBuffer* pThis, AMFPropertyStorage* pDest, amf_bool overwrite, amf_bool deep);
  170. AMF_RESULT (AMF_STD_CALL *CopyTo)(AMFAudioBuffer* pThis, AMFPropertyStorage* pDest, amf_bool deep);
  171. void (AMF_STD_CALL *AddObserver)(AMFAudioBuffer* pThis, AMFPropertyStorageObserver* pObserver);
  172. void (AMF_STD_CALL *RemoveObserver)(AMFAudioBuffer* pThis, AMFPropertyStorageObserver* pObserver);
  173. // AMFData interface
  174. AMF_MEMORY_TYPE (AMF_STD_CALL *GetMemoryType)(AMFAudioBuffer* pThis);
  175. AMF_RESULT (AMF_STD_CALL *Duplicate)(AMFAudioBuffer* pThis, AMF_MEMORY_TYPE type, AMFData** ppData);
  176. AMF_RESULT (AMF_STD_CALL *Convert)(AMFAudioBuffer* pThis, AMF_MEMORY_TYPE type); // optimal interop if possilble. Copy through host memory if needed
  177. AMF_RESULT (AMF_STD_CALL *Interop)(AMFAudioBuffer* pThis, AMF_MEMORY_TYPE type); // only optimal interop if possilble. No copy through host memory for GPU objects
  178. AMF_DATA_TYPE (AMF_STD_CALL *GetDataType)(AMFAudioBuffer* pThis);
  179. amf_bool (AMF_STD_CALL *IsReusable)(AMFAudioBuffer* pThis);
  180. void (AMF_STD_CALL *SetPts)(AMFAudioBuffer* pThis, amf_pts pts);
  181. amf_pts (AMF_STD_CALL *GetPts)(AMFAudioBuffer* pThis);
  182. void (AMF_STD_CALL *SetDuration)(AMFAudioBuffer* pThis, amf_pts duration);
  183. amf_pts (AMF_STD_CALL *GetDuration)(AMFAudioBuffer* pThis);
  184. // AMFAudioBuffer interface
  185. amf_int32 (AMF_STD_CALL *GetSampleCount)(AMFAudioBuffer* pThis);
  186. amf_int32 (AMF_STD_CALL *GetSampleRate)(AMFAudioBuffer* pThis);
  187. amf_int32 (AMF_STD_CALL *GetChannelCount)(AMFAudioBuffer* pThis);
  188. AMF_AUDIO_FORMAT (AMF_STD_CALL *GetSampleFormat)(AMFAudioBuffer* pThis);
  189. amf_int32 (AMF_STD_CALL *GetSampleSize)(AMFAudioBuffer* pThis);
  190. amf_uint32 (AMF_STD_CALL *GetChannelLayout)(AMFAudioBuffer* pThis);
  191. void* (AMF_STD_CALL *GetNative)(AMFAudioBuffer* pThis);
  192. amf_size (AMF_STD_CALL *GetSize)(AMFAudioBuffer* pThis);
  193. // Observer management
  194. void (AMF_STD_CALL *AddObserver_AudioBuffer)(AMFAudioBuffer* pThis, AMFAudioBufferObserver* pObserver);
  195. void (AMF_STD_CALL *RemoveObserver_AudioBuffer)(AMFAudioBuffer* pThis, AMFAudioBufferObserver* pObserver);
  196. } AMFAudioBufferVtbl;
  197. struct AMFAudioBuffer
  198. {
  199. const AMFAudioBufferVtbl *pVtbl;
  200. };
  201. #endif // #if defined(__cplusplus)
  202. #if defined(__cplusplus)
  203. } // namespace
  204. #endif
  205. #if defined(_MSC_VER)
  206. #pragma warning( pop )
  207. #endif
  208. #endif //#ifndef AMF_AudioBuffer_h