1 /*
2  * Copyright (c) 2021-2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef MEDIA_FOUNDATION_AUDIO_TYPES_H
17 #define MEDIA_FOUNDATION_AUDIO_TYPES_H
18 
19 #include <cstdint>  // NOLINT: used it
20 
21 namespace OHOS {
22 namespace Media {
23 namespace Plugins {
24 /**
25  * @enum Audio AAC Profile
26  *
27  * AAC mode type.  Note that the term profile is used with the MPEG-2
28  * standard and the term object type and profile is used with MPEG-4
29  *
30  * @since 1.0
31  * @version 1.0
32  */
33 enum struct AudioAacProfile : uint8_t {
34     NONE = 0,           ///< Null, not used
35     MAIN = 1,           ///< AAC Main object
36     LC,                 ///< AAC Low Complexity object (AAC profile)
37     SSR,                ///< AAC Scalable Sample Rate object
38     LTP,                ///< AAC Long Term Prediction object
39     HE,                 ///< AAC High Efficiency (object type SBR, HE-AAC profile)
40     SCALABLE,           ///< AAC Scalable object
41     ERLC = 17,          ///< ER AAC Low Complexity object (Error Resilient AAC-LC)
42     ER_SCALABLE = 20,   ///< ER AAC scalable object
43     LD = 23,            ///< AAC Low Delay object (Error Resilient)
44     HE_PS = 29,         ///< AAC High Efficiency with Parametric Stereo coding (HE-AAC v2, object type PS)
45     ELD = 39,           ///< AAC Enhanced Low Delay. NOTE: Pending Khronos standardization
46     XHE = 42,           ///< extended High Efficiency AAC. NOTE: Pending Khronos standardization
47 };
48 
49 /**
50  * @enum Audio AAC Stream Format
51  *
52  * @since 1.0
53  * @version 1.0
54  */
55 enum struct AudioAacStreamFormat : uint8_t {
56     MP2ADTS = 0,        ///< AAC Audio Data Transport Stream 2 format
57     MP4ADTS,            ///< AAC Audio Data Transport Stream 4 format
58     MP4LOAS,            ///< AAC Low Overhead Audio Stream format
59     MP4LATM,            ///< AAC Low overhead Audio Transport Multiplex
60     ADIF,               ///< AAC Audio Data Interchange Format
61     MP4FF,              ///< AAC inside MPEG-4/ISO File Format
62     RAW,                ///< AAC Raw Format
63 };
64 
65 /*
66  * @brief Audio RenderInfo, default ContentType::CONTENT_TYPE_UNKNOWN(0) and StreamUsage::STREAM_USAGE_UNKNOWN(0)
67  * combined into AudioStreamType::STREAM_MUSIC.
68  */
69 struct AudioRenderInfo {
70     int32_t contentType {0};
71     int32_t streamUsage {0};
72     int32_t rendererFlags {0};
73 };
74 
75 enum class AudioInterruptMode {
76     SHARE_MODE,
77     INDEPENDENT_MODE
78 };
79 
80 enum AudioSampleFormat : int32_t {
81     SAMPLE_U8 = 0,
82     SAMPLE_S16LE = 1,
83     SAMPLE_S24LE = 2,
84     SAMPLE_S32LE = 3,
85     SAMPLE_F32LE = 4,
86     SAMPLE_U8P = 5,
87     SAMPLE_S16P = 6,
88     SAMPLE_S24P = 7,
89     SAMPLE_S32P = 8,
90     SAMPLE_F32P = 9,
91     SAMPLE_S8 = 10,
92     SAMPLE_S8P = 11,
93     SAMPLE_U16 = 12,
94     SAMPLE_U16P = 13,
95     SAMPLE_U24 = 14,
96     SAMPLE_U24P = 15,
97     SAMPLE_U32 = 16,
98     SAMPLE_U32P = 17,
99     SAMPLE_S64 = 18,
100     SAMPLE_U64 = 19,
101     SAMPLE_S64P = 20,
102     SAMPLE_U64P = 21,
103     SAMPLE_F64 = 22,
104     SAMPLE_F64P = 23,
105     INVALID_WIDTH = -1
106 };
107 
108 enum AudioChannelSet : uint64_t {
109     FRONT_LEFT = 1ULL << 0U,
110     FRONT_RIGHT = 1ULL << 1U,
111     FRONT_CENTER = 1ULL << 2U,
112     LOW_FREQUENCY = 1ULL << 3U,
113     BACK_LEFT = 1ULL << 4U,
114     BACK_RIGHT = 1ULL << 5U,
115     FRONT_LEFT_OF_CENTER = 1ULL << 6U,
116     FRONT_RIGHT_OF_CENTER = 1ULL << 7U,
117     BACK_CENTER = 1ULL << 8U,
118     SIDE_LEFT = 1ULL << 9U,
119     SIDE_RIGHT = 1ULL << 10U,
120     TOP_CENTER = 1ULL << 11U,
121     TOP_FRONT_LEFT = 1ULL << 12U,
122     TOP_FRONT_CENTER = 1ULL << 13U,
123     TOP_FRONT_RIGHT = 1ULL << 14U,
124     TOP_BACK_LEFT = 1ULL << 15U,
125     TOP_BACK_CENTER = 1ULL << 16U,
126     TOP_BACK_RIGHT = 1ULL << 17U,
127     STEREO_LEFT = 1ULL << 29U,
128     STEREO_RIGHT = 1ULL << 30U,
129     WIDE_LEFT = 1ULL << 31U,
130     WIDE_RIGHT = 1ULL << 32U,
131     SURROUND_DIRECT_LEFT = 1ULL << 33U,
132     SURROUND_DIRECT_RIGHT = 1ULL << 34U,
133     LOW_FREQUENCY_2 = 1ULL << 35U,
134     TOP_SIDE_LEFT = 1ULL << 36U,
135     TOP_SIDE_RIGHT = 1ULL << 37U,
136     BOTTOM_FRONT_CENTER = 1ULL << 38U,
137     BOTTOM_FRONT_LEFT = 1ULL << 39U,
138     BOTTOM_FRONT_RIGHT = 1ULL << 40U,
139 
140     // Ambisonics ACN formats
141     // 0th and first order ambisonics ACN
142     AMBISONICS_ACN0 = 1ULL << 41U,  /** 0th ambisonics channel number 0. */
143     AMBISONICS_ACN1 = 1ULL << 42U,  /** first-order ambisonics channel number 1. */
144     AMBISONICS_ACN2 = 1ULL << 43U,  /** first-order ambisonics channel number 2. */
145     AMBISONICS_ACN3 = 1ULL << 44U,  /** first-order ambisonics channel number 3. */
146     AMBISONICS_W = AMBISONICS_ACN0, /** same as 0th ambisonics channel number 0. */
147     AMBISONICS_Y = AMBISONICS_ACN1, /** same as first-order ambisonics channel number 1. */
148     AMBISONICS_Z = AMBISONICS_ACN2, /** same as first-order ambisonics channel number 2. */
149     AMBISONICS_X = AMBISONICS_ACN3, /** same as first-order ambisonics channel number 3. */
150 
151     // second order ambisonics ACN
152     AMBISONICS_ACN4 = 1ULL << 45U, /** second-order ambisonics channel number 4. */
153     AMBISONICS_ACN5 = 1ULL << 46U, /** second-order ambisonics channel number 5. */
154     AMBISONICS_ACN6 = 1ULL << 47U, /** second-order ambisonics channel number 6. */
155     AMBISONICS_ACN7 = 1ULL << 48U, /** second-order ambisonics channel number 7. */
156     AMBISONICS_ACN8 = 1ULL << 49U, /** second-order ambisonics channel number 8. */
157 
158     // third order ambisonics ACN
159     AMBISONICS_ACN9 = 1ULL << 50U,  /** third-order ambisonics channel number 9. */
160     AMBISONICS_ACN10 = 1ULL << 51U, /** third-order ambisonics channel number 10. */
161     AMBISONICS_ACN11 = 1ULL << 52U, /** third-order ambisonics channel number 11. */
162     AMBISONICS_ACN12 = 1ULL << 53U, /** third-order ambisonics channel number 12. */
163     AMBISONICS_ACN13 = 1ULL << 54U, /** third-order ambisonics channel number 13. */
164     AMBISONICS_ACN14 = 1ULL << 55U, /** third-order ambisonics channel number 14. */
165     AMBISONICS_ACN15 = 1ULL << 56U, /** third-order ambisonics channel number 15. */
166 };
167 
168 /**
169  * @brief Ambisonic attribute set.
170  *
171  * A set of 64-bit integers indicate the ambisonic attributes.
172  */
173 enum AmbAttributeSet : int64_t {
174     /** Ambisonic attribute: order 1 */
175     AMB_ORD_1 = 1ULL << 0U,
176 
177     /** Ambisonic attribute: order 2 */
178     AMB_ORD_2 = 2ULL << 0U,
179 
180     /** Ambisonic attribute: order 3 */
181     AMB_ORD_3 = 3ULL << 0U,
182 
183     /** Ambisonic attribute: ACN Component Ordering */
184     AMB_COM_ACN = 0ULL << 8U,
185 
186     /** Ambisonic attribute: FUMA Component Ordering */
187     AMB_COM_FUMA = 1ULL << 8U,
188 
189     /** Ambisonic attribute: N3D Normalization */
190     AMB_NOR_N3D = 0ULL << 12U,
191 
192     /** Ambisonic attribute: SN3D Normalization */
193     AMB_NOR_SN3D = 1ULL << 12U,
194 
195     /** Channel layout: Ambisonic mode */
196     AMB_MODE = 1ULL << 44U
197 };
198 
199 enum AudioChannelLayout : int64_t {
200     UNKNOWN = 0,
201 
202     MONO = (AudioChannelSet::FRONT_CENTER),
203 
204     STEREO = (AudioChannelSet::FRONT_LEFT | AudioChannelSet::FRONT_RIGHT),
205     STEREO_DOWNMIX = (AudioChannelSet::STEREO_LEFT | AudioChannelSet::STEREO_RIGHT),
206 
207     CH_2POINT1 = (STEREO | AudioChannelSet::LOW_FREQUENCY),
208 
209     /**CH_LAYOUT_3POINT0 in native_audio_channel_layout*/
210     CH_2_1 = (STEREO | AudioChannelSet::BACK_CENTER),
211     SURROUND = (STEREO | AudioChannelSet::FRONT_CENTER),
212     CH_3POINT1 = (SURROUND | AudioChannelSet::LOW_FREQUENCY),
213     CH_4POINT0 = (SURROUND | AudioChannelSet::BACK_CENTER),
214 
215     /**CH_LAYOUT_QUAD_SIDE in native_audio_channel_layout*/
216     CH_2_2 = (STEREO | AudioChannelSet::SIDE_LEFT | AudioChannelSet::SIDE_RIGHT),
217     QUAD = (STEREO | AudioChannelSet::BACK_LEFT | AudioChannelSet::BACK_RIGHT),
218     CH_2POINT0POINT2 = (STEREO | AudioChannelSet::TOP_SIDE_LEFT | AudioChannelSet::TOP_SIDE_RIGHT),
219     HOA_ORDER1_ACN_N3D = AMB_MODE | AMB_ORD_1 | AMB_COM_ACN | AMB_NOR_N3D,
220     HOA_ORDER1_ACN_SN3D = AMB_MODE | AMB_ORD_1 | AMB_COM_ACN | AMB_NOR_SN3D,
221     HOA_ORDER1_FUMA = AMB_MODE | AMB_ORD_1 | AMB_COM_FUMA,
222 
223     CH_4POINT1 = (CH_4POINT0 | AudioChannelSet::LOW_FREQUENCY),
224     CH_5POINT0 = (SURROUND | AudioChannelSet::SIDE_LEFT | AudioChannelSet::SIDE_RIGHT),
225     CH_5POINT0_BACK = (SURROUND | AudioChannelSet::BACK_LEFT | AudioChannelSet::BACK_RIGHT),
226     CH_2POINT1POINT2 = (CH_2POINT0POINT2 | AudioChannelSet::LOW_FREQUENCY),
227     CH_3POINT0POINT2 = (CH_2POINT0POINT2 | AudioChannelSet::FRONT_CENTER),
228 
229     CH_5POINT1 = (CH_5POINT0 | AudioChannelSet::LOW_FREQUENCY),
230     CH_5POINT1_BACK = (CH_5POINT0_BACK | AudioChannelSet::LOW_FREQUENCY),
231     CH_6POINT0 = (CH_5POINT0 | AudioChannelSet::BACK_CENTER),
232     CH_3POINT1POINT2 = (CH_3POINT1 | AudioChannelSet::TOP_FRONT_LEFT | AudioChannelSet::TOP_FRONT_RIGHT),
233     CH_6POINT0_FRONT = (CH_2_2 | AudioChannelSet::FRONT_LEFT_OF_CENTER | AudioChannelSet::FRONT_RIGHT_OF_CENTER),
234     HEXAGONAL = (CH_5POINT0_BACK | AudioChannelSet::BACK_CENTER),
235 
236     CH_6POINT1 = (CH_5POINT1 | AudioChannelSet::BACK_CENTER),
237     CH_6POINT1_BACK = (CH_5POINT1_BACK | AudioChannelSet::BACK_CENTER),
238     CH_6POINT1_FRONT = (CH_6POINT0_FRONT | AudioChannelSet::LOW_FREQUENCY),
239     CH_7POINT0 = (CH_5POINT0 | AudioChannelSet::BACK_LEFT | AudioChannelSet::BACK_RIGHT),
240     CH_7POINT0_FRONT = (CH_5POINT0 | AudioChannelSet::FRONT_LEFT_OF_CENTER | AudioChannelSet::FRONT_RIGHT_OF_CENTER),
241 
242     CH_7POINT1 = (CH_5POINT1 | AudioChannelSet::BACK_LEFT | AudioChannelSet::BACK_RIGHT),
243     OCTAGONAL = (CH_5POINT0 | AudioChannelSet::BACK_LEFT | AudioChannelSet::BACK_CENTER | AudioChannelSet::BACK_RIGHT),
244     CH_5POINT1POINT2 = (CH_5POINT1 | AudioChannelSet::TOP_SIDE_LEFT | AudioChannelSet::TOP_SIDE_RIGHT),
245     CH_7POINT1_WIDE = (CH_5POINT1 | AudioChannelSet::FRONT_LEFT_OF_CENTER | AudioChannelSet::FRONT_RIGHT_OF_CENTER),
246     CH_7POINT1_WIDE_BACK =
247         (CH_5POINT1_BACK | AudioChannelSet::FRONT_LEFT_OF_CENTER | AudioChannelSet::FRONT_RIGHT_OF_CENTER),
248 
249     HOA_ORDER2_ACN_N3D = AMB_MODE | AMB_ORD_2 | AMB_COM_ACN | AMB_NOR_N3D,
250     HOA_ORDER2_ACN_SN3D = AMB_MODE | AMB_ORD_2 | AMB_COM_ACN | AMB_NOR_SN3D,
251     HOA_ORDER2_FUMA = AMB_MODE | AMB_ORD_2 | AMB_COM_FUMA,
252     CH_5POINT1POINT4 = (CH_5POINT1 | AudioChannelSet::TOP_FRONT_LEFT | AudioChannelSet::TOP_FRONT_RIGHT |
253                         AudioChannelSet::TOP_BACK_LEFT | AudioChannelSet::TOP_BACK_RIGHT),
254     CH_7POINT1POINT2 = (CH_7POINT1 | AudioChannelSet::TOP_SIDE_LEFT | AudioChannelSet::TOP_SIDE_RIGHT),
255 
256     CH_7POINT1POINT4 = (CH_7POINT1 | AudioChannelSet::TOP_FRONT_LEFT | AudioChannelSet::TOP_FRONT_RIGHT |
257                         AudioChannelSet::TOP_BACK_LEFT | AudioChannelSet::TOP_BACK_RIGHT),
258     CH_10POINT2 = (AudioChannelSet::FRONT_LEFT | AudioChannelSet::FRONT_RIGHT | AudioChannelSet::FRONT_CENTER |
259                    AudioChannelSet::TOP_FRONT_LEFT | AudioChannelSet::TOP_FRONT_RIGHT | AudioChannelSet::BACK_LEFT |
260                    AudioChannelSet::BACK_RIGHT | AudioChannelSet::BACK_CENTER | AudioChannelSet::SIDE_LEFT |
261                    AudioChannelSet::SIDE_RIGHT | AudioChannelSet::WIDE_LEFT | AudioChannelSet::WIDE_RIGHT),
262 
263     CH_9POINT1POINT4 = (CH_7POINT1POINT4 | AudioChannelSet::WIDE_LEFT | AudioChannelSet::WIDE_RIGHT),
264 
265     CH_9POINT1POINT6 = (CH_9POINT1POINT4 | AudioChannelSet::TOP_SIDE_LEFT | AudioChannelSet::TOP_SIDE_RIGHT),
266     HEXADECAGONAL =
267         (OCTAGONAL | AudioChannelSet::WIDE_LEFT | AudioChannelSet::WIDE_RIGHT | AudioChannelSet::TOP_BACK_LEFT |
268          AudioChannelSet::TOP_BACK_RIGHT | AudioChannelSet::TOP_BACK_CENTER | AudioChannelSet::TOP_FRONT_CENTER |
269          AudioChannelSet::TOP_FRONT_LEFT | AudioChannelSet::TOP_FRONT_RIGHT),
270 
271     HOA_ORDER3_ACN_N3D = AMB_MODE | AMB_ORD_3 | AMB_COM_ACN | AMB_NOR_N3D,
272     HOA_ORDER3_ACN_SN3D = AMB_MODE | AMB_ORD_3 | AMB_COM_ACN | AMB_NOR_SN3D,
273     HOA_ORDER3_FUMA = AMB_MODE | AMB_ORD_3 | AMB_COM_FUMA,
274 
275     CH_22POINT2 = (CH_7POINT1POINT4 | AudioChannelSet::FRONT_LEFT_OF_CENTER | AudioChannelSet::FRONT_RIGHT_OF_CENTER |
276                    AudioChannelSet::BACK_CENTER | AudioChannelSet::TOP_CENTER | AudioChannelSet::TOP_FRONT_CENTER |
277                    AudioChannelSet::TOP_BACK_CENTER | AudioChannelSet::TOP_SIDE_LEFT | AudioChannelSet::TOP_SIDE_RIGHT |
278                    AudioChannelSet::BOTTOM_FRONT_LEFT | AudioChannelSet::BOTTOM_FRONT_RIGHT |
279                    AudioChannelSet::BOTTOM_FRONT_CENTER | AudioChannelSet::LOW_FREQUENCY_2),
280 };
281 
282 enum AACProfile : int32_t {
283     AAC_PROFILE_LC = 0,
284     AAC_PROFILE_ELD = 1,
285     AAC_PROFILE_ERLC = 2,
286     AAC_PROFILE_HE = 3,
287     AAC_PROFILE_HE_V2 = 4,
288     AAC_PROFILE_LD = 5,
289     AAC_PROFILE_MAIN = 6,
290 };
291 } // namespace Plugins
292 } // namespace Media
293 } // namespace OHOS
294 #endif // MEDIA_FOUNDATION_AUDIO_TYPES_H
295