• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 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 AV_AUDIO_STREAM_INFO_H
17 #define AV_AUDIO_STREAM_INFO_H
18 
19 namespace OHOS::AVSession {
20 
21 const uint32_t CH_MODE_OFFSET = 44;
22 const uint32_t CH_HOA_ORDNUM_OFFSET = 0;
23 const uint32_t CH_HOA_COMORD_OFFSET = 8;
24 const uint32_t CH_HOA_NOR_OFFSET = 12;
25 
26 // sampling rate
27 enum AudioSamplingRate {
28     SAMPLE_RATE_8000 = 8000,
29     SAMPLE_RATE_11025 = 11025,
30     SAMPLE_RATE_12000 = 12000,
31     SAMPLE_RATE_16000 = 16000,
32     SAMPLE_RATE_22050 = 22050,
33     SAMPLE_RATE_24000 = 24000,
34     SAMPLE_RATE_32000 = 32000,
35     SAMPLE_RATE_44100 = 44100,
36     SAMPLE_RATE_48000 = 48000,
37     SAMPLE_RATE_64000 = 64000,
38     SAMPLE_RATE_88200 = 88200,
39     SAMPLE_RATE_96000 = 96000,
40     SAMPLE_RATE_176400 = 176400,
41     SAMPLE_RATE_192000 = 192000
42 };
43 
44 enum AudioEncodingType {
45     ENCODING_INVALID = -1,
46     ENCODING_PCM = 0,
47     ENCODING_AUDIOVIVID = 1
48 };
49 
50 
51 // format
52 enum AudioSampleFormat : uint8_t {
53     SAMPLE_U8 = 0,
54     SAMPLE_S16LE = 1,
55     SAMPLE_S24LE = 2,
56     SAMPLE_S32LE = 3,
57     SAMPLE_F32LE = 4,
58     INVALID_WIDTH = -1
59 };
60 
61 // channel
62 enum AudioChannel : uint8_t {
63     CHANNEL_UNKNOW = 0,
64     MONO = 1,
65     STEREO = 2,
66     CHANNEL_3 = 3,
67     CHANNEL_4 = 4,
68     CHANNEL_5 = 5,
69     CHANNEL_6 = 6,
70     CHANNEL_7 = 7,
71     CHANNEL_8 = 8,
72     CHANNEL_9 = 9,
73     CHANNEL_10 = 10,
74     CHANNEL_11 = 11,
75     CHANNEL_12 = 12,
76     CHANNEL_13 = 13,
77     CHANNEL_14 = 14,
78     CHANNEL_15 = 15,
79     CHANNEL_16 = 16
80 };
81 
82 enum AudioChannelSet: uint64_t {
83     FRONT_LEFT = 1ULL << 0U, FRONT_RIGHT = 1ULL << 1U, FRONT_CENTER = 1ULL << 2U,
84     LOW_FREQUENCY = 1ULL << 3U,
85     BACK_LEFT = 1ULL << 4U, BACK_RIGHT = 1ULL << 5U,
86     FRONT_LEFT_OF_CENTER = 1ULL << 6U, FRONT_RIGHT_OF_CENTER = 1ULL << 7U,
87     BACK_CENTER = 1ULL << 8U,
88     SIDE_LEFT = 1ULL << 9U, SIDE_RIGHT = 1ULL << 10U,
89     TOP_CENTER = 1ULL << 11U,
90     TOP_FRONT_LEFT = 1ULL << 12U, TOP_FRONT_CENTER = 1ULL << 13U, TOP_FRONT_RIGHT = 1ULL << 14U,
91     TOP_BACK_LEFT = 1ULL << 15U, TOP_BACK_CENTER = 1ULL << 16U, TOP_BACK_RIGHT = 1ULL << 17U,
92     STEREO_LEFT = 1ULL << 29U, STEREO_RIGHT = 1ULL << 30U,
93     WIDE_LEFT = 1ULL << 31U, WIDE_RIGHT = 1ULL << 32U,
94     SURROUND_DIRECT_LEFT = 1ULL << 33U, SURROUND_DIRECT_RIGHT = 1ULL << 34U,
95     LOW_FREQUENCY_2 = 1ULL << 35U,
96     TOP_SIDE_LEFT = 1ULL << 36U, TOP_SIDE_RIGHT = 1ULL << 37U,
97     BOTTOM_FRONT_CENTER = 1ULL << 38U, BOTTOM_FRONT_LEFT = 1ULL << 39U, BOTTOM_FRONT_RIGHT = 1ULL << 40U
98 };
99 
100 enum ChannelMode: uint64_t {
101     CHANNEL_MDOE_NORMAL = 0ULL,
102     CHANNEL_MDOE_AMBISONIC = 1ULL,
103     CHANNEL_MDOE_BINAURAL = 2ULL
104 };
105 
106 enum HOAOrderNumber: uint64_t {
107     HOA_ORDNUM_1 = 1ULL,
108     HOA_ORDNUM_2 = 2ULL,
109     HOA_ORDNUM_3 = 3ULL
110 };
111 
112 enum HOAComponentOrdering: uint64_t {
113     HOA_COMORD_ACN = 0ULL,
114     HOA_COMORD_FUMA = 1ULL,
115 };
116 
117 enum HOANormalization: uint64_t {
118     HOA_NOR_N3D = 0ULL,
119     HOA_NOR_SN3D = 1ULL,
120 };
121 
122 enum AudioChannelLayout: uint64_t {
123     CH_LAYOUT_UNKNOWN = 0ULL,
124     /** Channel count: 1*/
125     CH_LAYOUT_MONO = FRONT_CENTER,
126     /** Channel count: 2*/
127     CH_LAYOUT_STEREO = FRONT_LEFT | FRONT_RIGHT,
128     CH_LAYOUT_STEREO_DOWNMIX = STEREO_LEFT | STEREO_RIGHT,
129     /** Channel count: 3*/
130     CH_LAYOUT_2POINT1 = CH_LAYOUT_STEREO | LOW_FREQUENCY,
131     CH_LAYOUT_3POINT0 = CH_LAYOUT_STEREO | BACK_CENTER,
132     CH_LAYOUT_SURROUND = CH_LAYOUT_STEREO | FRONT_CENTER,
133     /** Channel count: 4*/
134     CH_LAYOUT_3POINT1 = CH_LAYOUT_SURROUND | LOW_FREQUENCY,
135     CH_LAYOUT_4POINT0 = CH_LAYOUT_SURROUND | BACK_CENTER,
136     CH_LAYOUT_QUAD_SIDE = CH_LAYOUT_STEREO | SIDE_LEFT | SIDE_RIGHT,
137     CH_LAYOUT_QUAD = CH_LAYOUT_STEREO | BACK_LEFT | BACK_RIGHT,
138     CH_LAYOUT_2POINT0POINT2 = CH_LAYOUT_STEREO | TOP_SIDE_LEFT | TOP_SIDE_RIGHT,
139     /** Channel count: 5*/
140     CH_LAYOUT_4POINT1 = CH_LAYOUT_4POINT0 | LOW_FREQUENCY,
141     CH_LAYOUT_5POINT0 = CH_LAYOUT_SURROUND | SIDE_LEFT | SIDE_RIGHT,
142     CH_LAYOUT_5POINT0_BACK = CH_LAYOUT_SURROUND | BACK_LEFT | BACK_RIGHT,
143     CH_LAYOUT_2POINT1POINT2 = CH_LAYOUT_2POINT0POINT2 | LOW_FREQUENCY,
144     CH_LAYOUT_3POINT0POINT2 = CH_LAYOUT_2POINT0POINT2 | FRONT_CENTER,
145     /** Channel count: 6*/
146     CH_LAYOUT_5POINT1 = CH_LAYOUT_5POINT0 | LOW_FREQUENCY,
147     CH_LAYOUT_5POINT1_BACK = CH_LAYOUT_5POINT0_BACK | LOW_FREQUENCY,
148     CH_LAYOUT_6POINT0 = CH_LAYOUT_5POINT0 | BACK_CENTER,
149     CH_LAYOUT_HEXAGONAL = CH_LAYOUT_5POINT0_BACK | BACK_CENTER,
150     CH_LAYOUT_3POINT1POINT2 = CH_LAYOUT_3POINT1 | TOP_FRONT_LEFT | TOP_FRONT_RIGHT,
151     CH_LAYOUT_6POINT0_FRONT = CH_LAYOUT_QUAD_SIDE | FRONT_LEFT_OF_CENTER | FRONT_RIGHT_OF_CENTER,
152     /** Channel count: 7*/
153     CH_LAYOUT_6POINT1 = CH_LAYOUT_5POINT1 | BACK_CENTER,
154     CH_LAYOUT_6POINT1_BACK = CH_LAYOUT_5POINT1_BACK | BACK_CENTER,
155     CH_LAYOUT_6POINT1_FRONT = CH_LAYOUT_6POINT0_FRONT | LOW_FREQUENCY,
156     CH_LAYOUT_7POINT0 = CH_LAYOUT_5POINT0 | BACK_LEFT | BACK_RIGHT,
157     CH_LAYOUT_7POINT0_FRONT = CH_LAYOUT_5POINT0 | FRONT_LEFT_OF_CENTER | FRONT_RIGHT_OF_CENTER,
158     /** Channel count: 8*/
159     CH_LAYOUT_7POINT1 = CH_LAYOUT_5POINT1 | BACK_LEFT | BACK_RIGHT,
160     CH_LAYOUT_OCTAGONAL = CH_LAYOUT_5POINT0 | BACK_CENTER | BACK_LEFT | BACK_RIGHT,
161     CH_LAYOUT_5POINT1POINT2 = CH_LAYOUT_5POINT1 | TOP_SIDE_LEFT | TOP_SIDE_RIGHT,
162     CH_LAYOUT_7POINT1_WIDE = CH_LAYOUT_5POINT1 | FRONT_LEFT_OF_CENTER | FRONT_RIGHT_OF_CENTER,
163     CH_LAYOUT_7POINT1_WIDE_BACK = CH_LAYOUT_5POINT1_BACK | FRONT_LEFT_OF_CENTER | FRONT_RIGHT_OF_CENTER,
164     /** Channel count: 10*/
165     CH_LAYOUT_5POINT1POINT4 = CH_LAYOUT_5POINT1 | TOP_FRONT_LEFT | TOP_FRONT_RIGHT | TOP_BACK_LEFT |TOP_BACK_RIGHT,
166     CH_LAYOUT_7POINT1POINT2 = CH_LAYOUT_7POINT1 | TOP_SIDE_LEFT | TOP_SIDE_RIGHT,
167     /** Channel count: 12*/
168     CH_LAYOUT_7POINT1POINT4 = CH_LAYOUT_7POINT1 | TOP_FRONT_LEFT | TOP_FRONT_RIGHT | TOP_BACK_LEFT | TOP_BACK_RIGHT,
169     CH_LAYOUT_10POINT2 = FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | TOP_FRONT_LEFT | TOP_FRONT_RIGHT | BACK_LEFT
170         | BACK_RIGHT | BACK_CENTER | SIDE_LEFT | SIDE_RIGHT | WIDE_LEFT | WIDE_RIGHT,
171     /** Channel count: 14*/
172     CH_LAYOUT_9POINT1POINT4 = CH_LAYOUT_7POINT1POINT4 | WIDE_LEFT | WIDE_RIGHT,
173     /** Channel count: 16*/
174     CH_LAYOUT_9POINT1POINT6 = CH_LAYOUT_9POINT1POINT4 | TOP_SIDE_LEFT | TOP_SIDE_RIGHT,
175     CH_LAYOUT_HEXADECAGONAL = CH_LAYOUT_OCTAGONAL | WIDE_LEFT | WIDE_RIGHT | TOP_BACK_LEFT | TOP_BACK_RIGHT
176         | TOP_BACK_CENTER | TOP_FRONT_CENTER | TOP_FRONT_LEFT | TOP_FRONT_RIGHT,
177     /** HOA: fitst order*/
178     CH_LAYOUT_HOA_ORDER1_ACN_N3D = (CHANNEL_MDOE_AMBISONIC << CH_MODE_OFFSET) | (HOA_ORDNUM_1 << CH_HOA_ORDNUM_OFFSET)
179         | (HOA_COMORD_ACN << CH_HOA_COMORD_OFFSET) | (HOA_NOR_N3D << CH_HOA_NOR_OFFSET),
180     CH_LAYOUT_HOA_ORDER1_ACN_SN3D = (CHANNEL_MDOE_AMBISONIC << CH_MODE_OFFSET) | (HOA_ORDNUM_1 << CH_HOA_ORDNUM_OFFSET)
181         | (HOA_COMORD_ACN << CH_HOA_COMORD_OFFSET) | (HOA_NOR_SN3D << CH_HOA_NOR_OFFSET),
182     CH_LAYOUT_HOA_ORDER1_FUMA = (CHANNEL_MDOE_AMBISONIC << CH_MODE_OFFSET) | (HOA_ORDNUM_1 << CH_HOA_ORDNUM_OFFSET)
183         | (HOA_COMORD_FUMA << CH_HOA_COMORD_OFFSET),
184     /** HOA: second order*/
185     CH_LAYOUT_HOA_ORDER2_ACN_N3D = (CHANNEL_MDOE_AMBISONIC << CH_MODE_OFFSET) | (HOA_ORDNUM_2 << CH_HOA_ORDNUM_OFFSET)
186         | (HOA_COMORD_ACN << CH_HOA_COMORD_OFFSET) | (HOA_NOR_N3D << CH_HOA_NOR_OFFSET),
187     CH_LAYOUT_HOA_ORDER2_ACN_SN3D = (CHANNEL_MDOE_AMBISONIC << CH_MODE_OFFSET) | (HOA_ORDNUM_2 << CH_HOA_ORDNUM_OFFSET)
188         | (HOA_COMORD_ACN << CH_HOA_COMORD_OFFSET) | (HOA_NOR_SN3D << CH_HOA_NOR_OFFSET),
189     CH_LAYOUT_HOA_ORDER2_FUMA = (CHANNEL_MDOE_AMBISONIC << CH_MODE_OFFSET) | (HOA_ORDNUM_2 << CH_HOA_ORDNUM_OFFSET)
190         | (HOA_COMORD_FUMA << CH_HOA_COMORD_OFFSET),
191     /** HOA: third order*/
192     CH_LAYOUT_HOA_ORDER3_ACN_N3D = (CHANNEL_MDOE_AMBISONIC << CH_MODE_OFFSET) | (HOA_ORDNUM_3 << CH_HOA_ORDNUM_OFFSET)
193         | (HOA_COMORD_ACN << CH_HOA_COMORD_OFFSET) | (HOA_NOR_N3D << CH_HOA_NOR_OFFSET),
194     CH_LAYOUT_HOA_ORDER3_ACN_SN3D = (CHANNEL_MDOE_AMBISONIC << CH_MODE_OFFSET) | (HOA_ORDNUM_3 << CH_HOA_ORDNUM_OFFSET)
195         | (HOA_COMORD_ACN << CH_HOA_COMORD_OFFSET) | (HOA_NOR_SN3D << CH_HOA_NOR_OFFSET),
196     CH_LAYOUT_HOA_ORDER3_FUMA = (CHANNEL_MDOE_AMBISONIC << CH_MODE_OFFSET) | (HOA_ORDNUM_3 << CH_HOA_ORDNUM_OFFSET)
197         | (HOA_COMORD_FUMA << CH_HOA_COMORD_OFFSET),
198 };
199 
200 class AudioStreamInfo {
201 public:
202     AudioSamplingRate samplingRate;
203     AudioEncodingType encoding = AudioEncodingType::ENCODING_PCM;
204     AudioSampleFormat format = AudioSampleFormat::INVALID_WIDTH;
205     AudioChannel channels;
206     AudioChannelLayout channelLayout  = AudioChannelLayout::CH_LAYOUT_UNKNOWN;
207     constexpr AudioStreamInfo(AudioSamplingRate samplingRate_, AudioEncodingType encoding_, AudioSampleFormat format_,
208         AudioChannel channels_, AudioChannelLayout channelLayout_ = AudioChannelLayout::CH_LAYOUT_UNKNOWN)
samplingRate(samplingRate_)209         : samplingRate(samplingRate_), encoding(encoding_), format(format_), channels(channels_),
210         channelLayout(channelLayout_)
211     {}
212     AudioStreamInfo() = default;
WriteToParcel(Parcel & parcel)213     bool WriteToParcel(Parcel &parcel) const
214     {
215         return parcel.WriteInt32(static_cast<int32_t>(samplingRate))
216             && parcel.WriteInt32(static_cast<int32_t>(encoding))
217             && parcel.WriteInt32(static_cast<int32_t>(format))
218             && parcel.WriteInt32(static_cast<int32_t>(channels))
219             && parcel.WriteUint64(channelLayout);
220     }
ReadFromParcel(Parcel & parcel)221     bool ReadFromParcel(Parcel &parcel)
222     {
223         samplingRate = static_cast<AudioSamplingRate>(parcel.ReadInt32());
224         encoding = static_cast<AudioEncodingType>(parcel.ReadInt32());
225         format = static_cast<AudioSampleFormat>(parcel.ReadInt32());
226         channels = static_cast<AudioChannel>(parcel.ReadInt32());
227         channelLayout = static_cast<AudioChannelLayout>(parcel.ReadUint64());
228         return true;
229     }
230 };
231 
232 } // namespace OHOS::AVSession
233 
234 #endif // AV_AUDIO_STREAM_INFO_H