1 /* 2 * Copyright (C) 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 A2DP_CODEC_CONSTANT_H 17 #define A2DP_CODEC_CONSTANT_H 18 19 #include <cstddef> 20 #include <cstdint> 21 22 #define A2DP_CODEC_SIZE 20 23 #define A2DP_MEDIA_TYPE_AUDIO 0 24 #define A2DP_MEDIA_TYPE_VIDEO 1 25 #define MAX_BUFFER_SIZE 19200 26 27 #define A2DP_CODEC_TYPE_INDEX 2 28 #define A2DP_CODEC_SBC_INFO_LEN 6 29 #define A2DP_CODEC_AAC_INFO_LEN 8 30 31 #define A2DP_SBC_MIN_BITPOOL 2 32 #define A2DP_SBC_MAX_BITPOOL 250 33 34 #define A2DP_AAC_DEFAULT_BITRATE 320000 // 320 kbps 35 #define A2DP_AAC_MIN_BITRATE 64000 // 64 kbps 36 37 #define A2DP_SUCCESS 0 38 #define A2DP_BADPARAM (-1) 39 40 enum A2dpCodecType : uint8_t { 41 A2DP_CODEC_TYPE_SBC = 0, 42 A2DP_CODEC_TYPE_MPEG1 = 0x01, 43 A2DP_CODEC_TYPE_AAC = 0x01 << 1, 44 A2DP_CODEC_TYPE_ATRAC = 0x01 << 2, 45 A2DP_CODEC_TYPE_NONA2DP = 0xFF 46 }; 47 48 enum A2dpCodecIndex : uint8_t { 49 A2DP_SOURCE_CODEC_INDEX_SBC = 1, 50 A2DP_SOURCE_CODEC_INDEX_AAC, 51 A2DP_SOURCE_CODEC_INDEX_MAX, 52 A2DP_SINK_CODEC_INDEX_MIN = A2DP_SOURCE_CODEC_INDEX_MAX, 53 A2DP_SINK_CODEC_INDEX_SBC = A2DP_SINK_CODEC_INDEX_MIN, 54 A2DP_SINK_CODEC_INDEX_AAC, 55 A2DP_SINK_CODEC_INDEX_MAX, 56 A2DP_CODEC_INDEX_MIN = A2DP_SOURCE_CODEC_INDEX_SBC, 57 A2DP_CODEC_INDEX_MAX = A2DP_SINK_CODEC_INDEX_MAX 58 }; 59 60 enum A2dpCodecPriority : uint32_t { 61 A2DP_CODEC_PRIORITY_DISABLED = 0, 62 A2DP_CODEC_PRIORITY_DEFAULT, 63 A2DP_CODEC_PRIORITY_HIGHEST = 1000 * 1000, 64 }; 65 66 enum A2dpCodecSampeRate : uint32_t { 67 A2DP_SAMPLE_RATE_NONE = 0x0, 68 A2DP_SBC_SAMPLE_RATE_48000 = 0x1 << 4, /* octet0 b4 */ 69 A2DP_SBC_SAMPLE_RATE_44100 = 0x1 << 5, /* octet0 b5 */ 70 A2DP_SBC_SAMPLE_RATE_32000 = 0x1 << 6, /* octet0 b6 */ 71 A2DP_SBC_SAMPLE_RATE_16000 = 0x1 << 7, /* octet0 b7 */ 72 A2DP_SBC_SAMPLE_RATE_MSK = 0xF0, 73 A2DP_AAC_SAMPLE_RATE_OCTET1_44100 = 0x01, 74 A2DP_AAC_SAMPLE_RATE_OCTET1_32000 = 0x01 << 1, 75 A2DP_AAC_SAMPLE_RATE_OCTET1_24000 = 0x01 << 2, 76 A2DP_AAC_SAMPLE_RATE_OCTET1_22050 = 0x01 << 3, 77 A2DP_AAC_SAMPLE_RATE_OCTET1_16000 = 0x01 << 4, 78 A2DP_AAC_SAMPLE_RATE_OCTET1_12000 = 0x01 << 5, 79 A2DP_AAC_SAMPLE_RATE_OCTET1_11025 = 0x01 << 6, 80 A2DP_AAC_SAMPLE_RATE_OCTET1_8000 = 0x01 << 7, 81 A2DP_AAC_SAMPLE_RATE_OCTET1_MSK = 0xFF, 82 A2DP_AAC_SAMPLE_RATE_OCTET2_96000 = 0x01 << 12, 83 A2DP_AAC_SAMPLE_RATE_OCTET2_88200 = 0x01 << 13, 84 A2DP_AAC_SAMPLE_RATE_OCTET2_64000 = 0x01 << 14, 85 A2DP_AAC_SAMPLE_RATE_OCTET2_48000 = 0x01 << 15, 86 A2DP_AAC_SAMPLE_RATE_OCTET2_MSK = 0xF0, 87 }; 88 89 enum A2dpCodecChannelMode : uint8_t { 90 A2DP_CHANNEL_MODE_NONE = 0x0, 91 A2DP_SBC_CHANNEL_MODE_JOINT_STEREO = 0x1, /* octet0 b0 */ 92 A2DP_SBC_CHANNEL_MODE_STEREO = 0x1 << 1, /* octet0 b1 */ 93 A2DP_SBC_CHANNEL_MODE_DUAL = 0x1 << 2, /* octet0 b2 */ 94 A2DP_SBC_CHANNEL_MODE_MONO = 0x1 << 3, /* octet0 b3 */ 95 A2DP_SBC_CHANNEL_MODE_MSK = 0x0F, 96 A2DP_AAC_CHANNEL_MODE_OCTET2_DOUBLE = 0x01 << 2, /* octet2 b2 */ 97 A2DP_AAC_CHANNEL_MODE_OCTET2_SINGLE = 0x01 << 3, /* octet2 b3 */ 98 A2DP_AAC_CHANNEL_MODE_OCTET2_MSK = 0x0C, 99 }; 100 101 enum A2dpCodecBlock : uint8_t { 102 A2DP_SBC_BLOCKS_16 = 0x1 << 4, /* octet1 b4: 16 */ 103 A2DP_SBC_BLOCKS_12 = 0x1 << 5, /* octet1 b5: 12 */ 104 A2DP_SBC_BLOCKS_8 = 0x1 << 6, /* octet1 b6: 8 */ 105 A2DP_SBC_BLOCKS_4 = 0x1 << 7, /* octet1 b7: 4 */ 106 A2DP_SBC_BLOCKS_MSK = 0xF0 107 }; 108 109 enum A2dpCodecSubBannds : uint8_t { 110 A2DP_SBC_SUBBAND_8 = 0x1 << 2, /* octet1 b2: 8 */ 111 A2DP_SBC_SUBBAND_4 = 0x1 << 3, /* octet1 b3: 4 */ 112 A2DP_SBC_SUBBAND_MSK = 0x0C 113 }; 114 115 enum A2dpCodecAllocMode : uint8_t { 116 A2DP_SBC_ALLOC_MODE_L = 0x1, /* octet1 b0: loudness */ 117 A2DP_SBC_ALLOC_MODE_S = 0x1 << 1, /* octet1 b1: SNR */ 118 A2DP_SBC_ALLOC_MODE_MSK = 0x03 119 }; 120 121 enum A2dpCodecBitsPerSample : uint32_t { 122 A2DP_SAMPLE_BITS_NONE = 0x0, 123 A2DP_SAMPLE_BITS_16 = 0x1 << 0, 124 A2DP_SAMPLE_BITS_24 = 0x1 << 1, 125 A2DP_SAMPLE_BITS_32 = 0x1 << 2, 126 A2DP_SAMPLE_BITS_MSK = 0x06, 127 A2DP_AAC_SAMPLE_BITS_OCTET3_BIT0 = 0x01 << 16, /* octet3 b0 */ 128 A2DP_AAC_SAMPLE_BITS_OCTET3_BIT1 = 0x01 << 17, /* octet3 b1 */ 129 A2DP_AAC_SAMPLE_BITS_OCTET3_BIT2 = 0x01 << 18, /* octet3 b2 */ 130 A2DP_AAC_SAMPLE_BITS_OCTET3_BIT3 = 0x01 << 19, /* octet3 b3 */ 131 A2DP_AAC_SAMPLE_BITS_OCTET3_BIT4 = 0x01 << 20, /* octet3 b4 */ 132 A2DP_AAC_SAMPLE_BITS_OCTET3_BIT5 = 0x01 << 21, /* octet3 b5 */ 133 A2DP_AAC_SAMPLE_BITS_OCTET3_BIT6 = 0x01 << 22, /* octet3 b6 */ 134 A2DP_AAC_SAMPLE_BITS_OCTET4_BIT0 = 0x01 << 8, /* octet4 b0 */ 135 A2DP_AAC_SAMPLE_BITS_OCTET4_BIT1 = 0x01 << 9, /* octet4 b1 */ 136 A2DP_AAC_SAMPLE_BITS_OCTET4_BIT2 = 0x01 << 10, /* octet4 b2 */ 137 A2DP_AAC_SAMPLE_BITS_OCTET4_BIT3 = 0x01 << 11, /* octet4 b3 */ 138 A2DP_AAC_SAMPLE_BITS_OCTET4_BIT4 = 0x01 << 12, /* octet4 b4 */ 139 A2DP_AAC_SAMPLE_BITS_OCTET4_BIT5 = 0x01 << 13, /* octet4 b5 */ 140 A2DP_AAC_SAMPLE_BITS_OCTET4_BIT6 = 0x01 << 14, /* octet4 b6 */ 141 A2DP_AAC_SAMPLE_BITS_OCTET4_BIT7 = 0x01 << 15, /* octet4 b6 */ 142 A2DP_AAC_SAMPLE_BITS_OCTET5_BIT0 = 0x01, /* octet5 b0 */ 143 A2DP_AAC_SAMPLE_BITS_OCTET5_BIT1 = 0x01 << 1, /* octet5 b1 */ 144 A2DP_AAC_SAMPLE_BITS_OCTET5_BIT2 = 0x01 << 2, /* octet5 b2 */ 145 A2DP_AAC_SAMPLE_BITS_OCTET5_BIT3 = 0x01 << 3, /* octet5 b3 */ 146 A2DP_AAC_SAMPLE_BITS_OCTET5_BIT4 = 0x01 << 4, /* octet5 b4 */ 147 A2DP_AAC_SAMPLE_BITS_OCTET5_BIT5 = 0x01 << 5, /* octet5 b5 */ 148 A2DP_AAC_SAMPLE_BITS_OCTET5_BIT6 = 0x01 << 6, /* octet5 b6 */ 149 A2DP_AAC_SAMPLE_BITS_OCTET5_BIT7 = 0x01 << 7, /* octet5 b6 */ 150 }; 151 152 enum A2dpCodecObjectType : uint8_t { 153 A2DP_AAC_MPEG4_SCALABLE_OBJECT_TYPE = 0x01 << 4, /* octet0 b4 */ 154 A2DP_AAC_MPEG4_LTP_OBJECT_TYPE = 0x01 << 5, /* octet0 b5 */ 155 A2DP_AAC_MPEG4_LC_OBJECT_TYPE = 0x01 << 6, /* octet0 b6 */ 156 A2DP_AAC_MPEG2_OBJECT_TYPE = 0x01 << 7, /* octet0 b7s */ 157 }; 158 159 enum A2dpCodecVBR : uint8_t { 160 A2DP_AAC_VARIABLE_BIT_RATE_DISABLED = 0, 161 A2DP_AAC_VARIABLE_BIT_RATE_ENABLED = 0x80, /* octet3 b7 */ 162 }; 163 164 /* data type for the SBC Codec Information Element */ 165 struct A2dpSBCCapability { 166 uint32_t sampleFreq; /* Sampling frequency */ 167 uint8_t channelMode; /* Channel mode */ 168 uint8_t blockLen; /* Block length */ 169 uint8_t numSubbands; /* Number of subbands */ 170 uint8_t allocatedMethod; /* Allocation method */ 171 uint8_t minBitpool; /* Minimum bitpool */ 172 uint8_t maxBitpool; /* Maximum bitpool */ 173 uint8_t bitsPerSample; 174 }; 175 176 /* SBC Source codec capabilities */ 177 static const A2dpSBCCapability A2DP_SBC_SOURCE_CAPS = { 178 (A2DP_SBC_SAMPLE_RATE_48000 | A2DP_SBC_SAMPLE_RATE_44100), /* sampleFreq */ 179 (A2DP_SBC_CHANNEL_MODE_MONO | A2DP_SBC_CHANNEL_MODE_STEREO), /* channelMode */ 180 (A2DP_SBC_BLOCKS_16 | A2DP_SBC_BLOCKS_12 | A2DP_SBC_BLOCKS_8 | A2DP_SBC_BLOCKS_4), /* blockLen */ 181 (A2DP_SBC_SUBBAND_4 | A2DP_SBC_SUBBAND_8), /* numSubbands */ 182 (A2DP_SBC_ALLOC_MODE_L | A2DP_SBC_ALLOC_MODE_S), /* allocatedMethod */ 183 A2DP_SBC_MIN_BITPOOL, /* minBitpool */ 184 A2DP_SBC_MAX_BITPOOL, /* maxBitpool */ 185 A2DP_SAMPLE_BITS_16 /* bitsPerSample */ 186 }; 187 188 /* SBC Sink codec capabilities */ 189 static const A2dpSBCCapability A2DP_SBC_SINK_CAPS = { 190 (A2DP_SBC_SAMPLE_RATE_48000 | A2DP_SBC_SAMPLE_RATE_44100), /* sampleFreq */ 191 (A2DP_SBC_CHANNEL_MODE_MONO | A2DP_SBC_CHANNEL_MODE_STEREO), /* channelMode */ 192 (A2DP_SBC_BLOCKS_16 | A2DP_SBC_BLOCKS_12 | A2DP_SBC_BLOCKS_8 | A2DP_SBC_BLOCKS_4), /* blockLen */ 193 (A2DP_SBC_SUBBAND_4 | A2DP_SBC_SUBBAND_8), /* numSubbands */ 194 (A2DP_SBC_ALLOC_MODE_L | A2DP_SBC_ALLOC_MODE_S), /* allocatedMethod */ 195 A2DP_SBC_MIN_BITPOOL, /* minBitpool */ 196 A2DP_SBC_MAX_BITPOOL, /* maxBitpool */ 197 A2DP_SAMPLE_BITS_16 /* bitsPerSample */ 198 }; 199 200 /* Default SBC codec configuration */ 201 const A2dpSBCCapability A2DP_SBC_DEFAULT_CONFIG = { 202 A2DP_SBC_SAMPLE_RATE_44100, /* sampleFreq */ 203 A2DP_SBC_CHANNEL_MODE_STEREO, /* channelMode */ 204 A2DP_SBC_BLOCKS_16, /* blockLen */ 205 A2DP_SBC_SUBBAND_8, /* numSubbands */ 206 A2DP_SBC_ALLOC_MODE_L, /* allocatedMethod */ 207 A2DP_SBC_MIN_BITPOOL, /* minBitpool */ 208 A2DP_SBC_MAX_BITPOOL, /* maxBitpool */ 209 A2DP_SAMPLE_BITS_16 /* bitsPerSample */ 210 }; 211 212 struct A2dpEncoderInitPeerParams { 213 bool isPeerEdr; 214 bool peerSupports3mbps; 215 uint16_t peermtu; 216 }; 217 218 /* data type for the AAC Codec Information Element */ 219 struct A2dpAACCapability { 220 uint8_t objectType; 221 uint32_t sampleFreq; 222 uint8_t channelMode; 223 uint8_t variableBitRateSupport; 224 uint32_t bitRate; 225 uint8_t bitsPerSample; 226 }; 227 228 /* AAC Source codec capabilities */ 229 const A2dpAACCapability A2DP_AAC_SOURCE_CAPS = { 230 A2DP_AAC_MPEG2_OBJECT_TYPE, 231 A2DP_AAC_SAMPLE_RATE_OCTET1_44100 | A2DP_AAC_SAMPLE_RATE_OCTET2_48000, 232 A2DP_AAC_CHANNEL_MODE_OCTET2_SINGLE | A2DP_AAC_CHANNEL_MODE_OCTET2_DOUBLE, 233 A2DP_AAC_VARIABLE_BIT_RATE_DISABLED, 234 A2DP_AAC_DEFAULT_BITRATE, 235 A2DP_SAMPLE_BITS_16 236 }; 237 238 /* SBC Sink codec capabilities */ 239 const A2dpAACCapability A2DP_AAC_SINK_CAPS = { 240 A2DP_AAC_MPEG2_OBJECT_TYPE, 241 (A2DP_AAC_SAMPLE_RATE_OCTET1_44100 | A2DP_AAC_SAMPLE_RATE_OCTET2_48000), 242 (A2DP_AAC_CHANNEL_MODE_OCTET2_SINGLE | A2DP_AAC_CHANNEL_MODE_OCTET2_DOUBLE), 243 A2DP_AAC_VARIABLE_BIT_RATE_ENABLED, 244 A2DP_AAC_DEFAULT_BITRATE, 245 A2DP_SAMPLE_BITS_16 246 }; 247 248 /* Default SBC codec configuration */ 249 const A2dpAACCapability A2DP_AAC_DEFAULT_CONFIG = { 250 A2DP_AAC_MPEG2_OBJECT_TYPE, 251 A2DP_AAC_SAMPLE_RATE_OCTET1_44100, 252 A2DP_AAC_CHANNEL_MODE_OCTET2_SINGLE, 253 A2DP_AAC_VARIABLE_BIT_RATE_DISABLED, 254 A2DP_AAC_DEFAULT_BITRATE, 255 A2DP_SAMPLE_BITS_16 256 }; 257 #endif // ! A2DP_CODEC_CONSTANT_H