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