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