• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 //
18 // A2DP Codecs API
19 //
20 
21 #ifndef A2DP_CODEC_API_H
22 #define A2DP_CODEC_API_H
23 
24 #include <hardware/bt_av.h>
25 #include <stddef.h>
26 #include <stdint.h>
27 #include <string.h>
28 
29 #include <functional>
30 #include <list>
31 #include <map>
32 #include <mutex>
33 #include <string>
34 
35 #include "a2dp_api.h"
36 #include "audio_a2dp_hw/include/audio_a2dp_hw.h"
37 #include "avdt_api.h"
38 #include "stack/include/bt_hdr.h"
39 #include "types/raw_address.h"
40 
41 class tBT_A2DP_OFFLOAD;
42 
43 /**
44  * Structure used to initialize the A2DP encoder with A2DP peer information
45  */
46 typedef struct {
47   bool is_peer_edr;          // True if the A2DP peer supports EDR
48   bool peer_supports_3mbps;  // True if the A2DP peer supports 3 Mbps EDR
49   uint16_t peer_mtu;         // MTU of the A2DP peer
50 } tA2DP_ENCODER_INIT_PEER_PARAMS;
51 
52 class A2dpCodecConfig {
53   friend class A2dpCodecs;
54 
55  public:
56   // Creates a codec entry. The selected codec is defined by |codec_index|,
57   // Returns the codec entry on success, otherwise nullptr.
58   static A2dpCodecConfig* createCodec(
59       btav_a2dp_codec_index_t codec_index,
60       btav_a2dp_codec_priority_t codec_priority =
61           BTAV_A2DP_CODEC_PRIORITY_DEFAULT);
62 
63   virtual ~A2dpCodecConfig() = 0;
64 
65   // Gets the pre-defined codec index.
codecIndex()66   btav_a2dp_codec_index_t codecIndex() const { return codec_index_; }
67 
68   // Gets the codec name.
name()69   const std::string& name() const { return name_; }
70 
71   // Gets the current priority of the codec.
codecPriority()72   btav_a2dp_codec_priority_t codecPriority() const { return codec_priority_; }
73 
74   // gets current OTA codec specific config to |p_a2dp_offload->codec_info|.
75   // Returns true if the current codec config is valid and copied,
76   // otherwise false.
77   bool getCodecSpecificConfig(tBT_A2DP_OFFLOAD* p_a2dp_offload);
78 
79   // Gets the bitRate for the A2DP codec.
80   // Returns the bitrate of current codec configuration, or 0 if not configured
81   int getTrackBitRate() const;
82 
83   // Copies out the current OTA codec config to |p_codec_info|.
84   // Returns true if the current codec config is valid and copied,
85   // otherwise false.
86   bool copyOutOtaCodecConfig(uint8_t* p_codec_info);
87 
88   // Gets the current codec configuration.
89   // Returns a copy of the current codec configuration.
90   btav_a2dp_codec_config_t getCodecConfig();
91 
92   // Gets the current codec capability.
93   // The capability is computed by intersecting the local codec's capability
94   // and the peer's codec capability. However, if there is an explicit user
95   // configuration for some of the parameters, the result codec configuration
96   // and capability is restricted to the user's configuration choice.
97   // Returns a copy of the current codec capability.
98   btav_a2dp_codec_config_t getCodecCapability();
99 
100   // Gets the codec local capability.
101   // Returns a copy of the codec local capability.
102   btav_a2dp_codec_config_t getCodecLocalCapability();
103 
104   // Gets the codec selectable capability.
105   // The capability is computed by intersecting the local codec's capability
106   // and the peer's codec capability. Any explicit user configuration is
107   // not included in the result.
108   // Returns a copy of the codec selectable capability.
109   btav_a2dp_codec_config_t getCodecSelectableCapability();
110 
111   // Gets the current codec user configuration.
112   // Returns a copy of the current codec user configuration.
113   btav_a2dp_codec_config_t getCodecUserConfig();
114 
115   // Gets the current codec audio configuration.
116   // Returns a copy of the current codec audio configuration.
117   btav_a2dp_codec_config_t getCodecAudioConfig();
118 
119   // Gets the number of bits per sample of the current codec configuration,
120   // or 0 if not configured.
121   uint8_t getAudioBitsPerSample();
122 
123   // Checks whether the codec uses the RTP Header Marker bit (see RFC 6416).
124   // NOTE: Even if the encoded data uses RTP headers, some codecs do not use
125   // the Marker bit - that bit is expected to be set to 0.
126   // Returns true if the encoded data packets have RTP headers, and
127   // the Marker bit in the header is set according to RFC 6416.
128   virtual bool useRtpHeaderMarkerBit() const = 0;
129 
130   // Checks whether |codec_config| is empty and contains no configuration.
131   // Returns true if |codec_config| is empty, otherwise false.
132   static bool isCodecConfigEmpty(const btav_a2dp_codec_config_t& codec_config);
133 
134  protected:
135   // Sets the current priority of the codec to |codec_priority|.
136   // If |codec_priority| is BTAV_A2DP_CODEC_PRIORITY_DEFAULT, the priority is
137   // reset to its default value.
138   void setCodecPriority(btav_a2dp_codec_priority_t codec_priority);
139 
140   // Sets the current priority of the codec to its default value.
141   void setDefaultCodecPriority();
142 
143   // Sets the A2DP Source-to-Sink codec configuration to be used
144   // with a peer Sink device.
145   // |p_peer_codec_info| is the peer's A2DP Sink codec information
146   // to use. If |is_capability| is true, then |p_peer_codec_info| contains the
147   // peer's A2DP Sink codec capability, otherwise it contains the peer's
148   // preferred A2DP codec configuration to use.
149   // The result codec configuration is stored in |p_result_codec_config|.
150   // See |A2dpCodecs.setCodecConfig| for detailed description of
151   // the actual mechanism used to compute the configuration.
152   // Returns true on success, othewise false.
153   virtual bool setCodecConfig(const uint8_t* p_peer_codec_info,
154                               bool is_capability,
155                               uint8_t* p_result_codec_config) = 0;
156 
157   // Sets the user prefered codec configuration.
158   // |codec_user_config| contains the preferred codec user configuration.
159   // |codec_audio_config| contains the selected audio feeding configuration.
160   // |p_peer_params| contains the A2DP peer information.
161   // |p_peer_codec_info| is the peer's A2DP Sink codec information
162   // to use. If |is_capability| is true, then |p_peer_codec_info| contains the
163   // peer's A2DP Sink codec capability, otherwise it contains the peer's
164   // preferred A2DP codec configuration to use.
165   // If there is a change in the codec configuration that requires restarting
166   // if the audio input stream, flag |p_restart_input| is set to true.
167   // If there is a change in the encoder configuration that requires restarting
168   // of the A2DP connection, the new codec configuration is stored in
169   // |p_result_codec_config|, and flag |p_restart_output| is set to true.
170   // If there is any change in the codec configuration, flag |p_config_updated|
171   // is set to true.
172   // Returns true on success, otherwise false.
173   virtual bool setCodecUserConfig(
174       const btav_a2dp_codec_config_t& codec_user_config,
175       const btav_a2dp_codec_config_t& codec_audio_config,
176       const tA2DP_ENCODER_INIT_PEER_PARAMS* p_peer_params,
177       const uint8_t* p_peer_codec_info, bool is_capability,
178       uint8_t* p_result_codec_config, bool* p_restart_input,
179       bool* p_restart_output, bool* p_config_updated);
180 
181   // Sets the codec capabilities for a peer.
182   // |p_peer_codec_capabiltities| is the peer codec capabilities to set.
183   // Returns true on success, otherwise false.
184   virtual bool setPeerCodecCapabilities(
185       const uint8_t* p_peer_codec_capabilities) = 0;
186 
187   // Constructor where |codec_index| is the unique index that identifies the
188   // codec. The user-friendly name is |name|.
189   // The default codec priority is |codec_priority|. If the value is
190   // |BTAV_A2DP_CODEC_PRIORITY_DEFAULT|, the codec priority is computed
191   // internally.
192   A2dpCodecConfig(btav_a2dp_codec_index_t codec_index, const std::string& name,
193                   btav_a2dp_codec_priority_t codec_priority);
194 
195   // Initializes the codec entry.
196   // Returns true on success, otherwise false.
197   virtual bool init() = 0;
198 
199   // Checks whether the internal state is valid
200   virtual bool isValid() const;
201 
202   // Checks whether the A2DP Codec Configuration is valid.
203   // Returns true if A2DP Codec Configuration stored in |codec_config|
204   // is valid, otherwise false.
205   static bool codecConfigIsValid(const btav_a2dp_codec_config_t& codec_config);
206 
207   // Gets the string representation of A2DP Codec Configuration.
208   // Returns the string representation of A2DP Codec Configuration stored
209   // in |codec_config|. The format is:
210   // "Rate=44100|48000 Bits=16|24 Mode=MONO|STEREO"
211   static std::string codecConfig2Str(
212       const btav_a2dp_codec_config_t& codec_config);
213 
214   // Gets the string representation of A2DP Codec Sample Rate.
215   // Returns the string representation of A2DP Codec Sample Rate stored
216   // in |codec_sample_rate|. If there are multiple values stored in
217   // |codec_sample_rate|, the return string format is "rate1|rate2|rate3".
218   static std::string codecSampleRate2Str(
219       btav_a2dp_codec_sample_rate_t codec_sample_rate);
220 
221   // Gets the string representation of A2DP Codec Bits Per Sample.
222   // Returns the string representation of A2DP Codec Bits Per Sample stored
223   // in |codec_bits_per_sample|. If there are multiple values stored in
224   // |codec_bits_per_sample|, the return string format is "bits1|bits2|bits3".
225   static std::string codecBitsPerSample2Str(
226       btav_a2dp_codec_bits_per_sample_t codec_bits_per_sample);
227 
228   // Gets the string representation of A2DP Codec Channel Mode.
229   // Returns the string representation of A2DP Channel Mode stored
230   // in |codec_channel_mode|. If there are multiple values stored in
231   // |codec_channel_mode|, the return string format is "mode1|mode2|mode3".
232   static std::string codecChannelMode2Str(
233       btav_a2dp_codec_channel_mode_t codec_channel_mode);
234 
235   // Dumps codec-related information.
236   // The information is written in user-friendly form to file descriptor |fd|.
237   virtual void debug_codec_dump(int fd);
238 
239   std::recursive_mutex codec_mutex_;
240   const btav_a2dp_codec_index_t codec_index_;  // The unique codec index
241   const std::string name_;                     // The codec name
242   btav_a2dp_codec_priority_t codec_priority_;  // Codec priority: must be unique
243   btav_a2dp_codec_priority_t default_codec_priority_;
244 
245   btav_a2dp_codec_config_t codec_config_;
246   btav_a2dp_codec_config_t codec_capability_;
247   btav_a2dp_codec_config_t codec_local_capability_;
248   btav_a2dp_codec_config_t codec_selectable_capability_;
249 
250   // The optional user configuration. The values (if set) are used
251   // as a preference when there is a choice. If a particular value
252   // is not supported by the local or remote device, it is ignored.
253   btav_a2dp_codec_config_t codec_user_config_;
254 
255   // The selected audio feeding configuration.
256   btav_a2dp_codec_config_t codec_audio_config_;
257 
258   uint8_t ota_codec_config_[AVDT_CODEC_SIZE];
259   uint8_t ota_codec_peer_capability_[AVDT_CODEC_SIZE];
260   uint8_t ota_codec_peer_config_[AVDT_CODEC_SIZE];
261 };
262 
263 class A2dpCodecs {
264  public:
265   // Constructor for class |A2dpCodecs|.
266   // |codec_priorities| contains the codec priorities to use.
267   A2dpCodecs(const std::vector<btav_a2dp_codec_config_t>& codec_priorities);
268   ~A2dpCodecs();
269 
270   // Initializes all supported codecs.
271   // Returns true if at least one Source codec and one Sink codec were
272   // initialized, otherwise false.
273   bool init();
274 
275   // Finds the Source codec that corresponds to the A2DP over-the-air
276   // |p_codec_info| information.
277   // Returns the Source codec if found, otherwise nullptr.
278   A2dpCodecConfig* findSourceCodecConfig(const uint8_t* p_codec_info);
279 
280   // Finds the Sink codec that corresponds to the A2DP over-the-air
281   // |p_codec_info| information.
282   // Returns the Sink codec if found, otherwise nullptr.
283   A2dpCodecConfig* findSinkCodecConfig(const uint8_t* p_codec_info);
284 
285   // Checks whether the codec for |codec_index| is supported.
286   // Returns true if the codec is supported, otherwise false.
287   bool isSupportedCodec(btav_a2dp_codec_index_t codec_index);
288 
289   // Gets the codec config that is currently selected.
290   // Returns the codec config that is currently selected, or nullptr if
291   // no codec is selected.
getCurrentCodecConfig()292   A2dpCodecConfig* getCurrentCodecConfig() const {
293     return current_codec_config_;
294   }
295 
296   // Gets the list of Source codecs ordered by priority: higher priority first.
orderedSourceCodecs()297   const std::list<A2dpCodecConfig*> orderedSourceCodecs() const {
298     return ordered_source_codecs_;
299   }
300 
301   // Gets the list of Sink codecs ordered by priority: higher priority first.
orderedSinkCodecs()302   const std::list<A2dpCodecConfig*> orderedSinkCodecs() const {
303     return ordered_sink_codecs_;
304   }
305 
306   // Sets the A2DP Source-to-Sink codec configuration to be used
307   // with a peer Sink device.
308   // |p_peer_codec_info| is the peer's A2DP Sink codec information
309   // to use. If |is_capability| is true, then |p_peer_codec_info| contains the
310   // peer's A2DP Sink codec capability, otherwise it contains the peer's
311   // preferred A2DP codec configuration to use.
312   // If the codec can be used and |select_current_codec| is true, then
313   // this codec is selected as the current one.
314   //
315   // The codec configuration is built by considering the optional user
316   // configuration, the local codec capabilities, the peer's codec
317   // capabilities, and the codec's locally-defined default values.
318   // For each codec parameter:
319   //
320   // 1. If it is user-configurable parameter (sample rate, bits per sample,
321   //    channel mode, and some codec-specific parameters),
322   //    if the user has an explicit preference, and that preference
323   //    is supported by both the local and remote device, this is the
324   //    parameter value that is used.
325   // 2. Otherwise, if the explicit internal default value is supported
326   //    by both the local and remote device, this is the parameter value
327   //    that is used.
328   // 3. Otherwise, the best match is chosen among all values supported by
329   //    the local and remote device.
330   //
331   // In addition, the codec's internal state is updated to reflect
332   // the capabilities that are advertised to the upstream audio source
333   // (Media Framework) to make run-time audio parameter choices:
334   // 4. If the user-configurable parameter was selected, this is the
335   //    only parameter value that is advertised to the Media Framework.
336   // 5. Otherwise, all values supported by both the local and remote
337   //    devices are advertised to the Media Framework.
338   //
339   // The result codec configuration is stored in |p_result_codec_config|.
340   // Returns true on success, othewise false.
341   bool setCodecConfig(const uint8_t* p_peer_codec_info, bool is_capability,
342                       uint8_t* p_result_codec_config,
343                       bool select_current_codec);
344 
345   // Sets the A2DP Sink codec configuration to be used with a peer Source
346   // device.
347   // [See setCodecConfig() for description]
348   bool setSinkCodecConfig(const uint8_t* p_peer_codec_info, bool is_capability,
349                           uint8_t* p_result_codec_config,
350                           bool select_current_codec);
351 
352   // Sets the user prefered codec configuration.
353   // |codec_user_config| contains the preferred codec configuration.
354   // |p_peer_params| contains the A2DP peer information.
355   // |p_peer_sink_capabilities| is the peer's A2DP Sink codec capabilities
356   // to use.
357   // If there is a change in the encoder configuration that requires restarting
358   // the audio input stream, flag |p_restart_input| is set to true.
359   // If there is a change in the encoder configuration that requires restarting
360   // of the A2DP connection, flag |p_restart_output| is set to true, and the
361   // new codec is stored in |p_result_codec_config|.
362   // If there is any change in the codec configuration, flag |p_config_updated|
363   // is set to true.
364   // Returns true on success, otherwise false.
365   bool setCodecUserConfig(const btav_a2dp_codec_config_t& codec_user_config,
366                           const tA2DP_ENCODER_INIT_PEER_PARAMS* p_peer_params,
367                           const uint8_t* p_peer_sink_capabilities,
368                           uint8_t* p_result_codec_config, bool* p_restart_input,
369                           bool* p_restart_output, bool* p_config_updated);
370 
371   // Sets the Audio HAL selected audio feeding parameters.
372   // Those parameters are applied only to the currently selected codec.
373   // |codec_audio_config| contains the selected audio feeding configuration.
374   // |p_peer_params| contains the A2DP peer information.
375   // |p_peer_sink_capabilities| is the peer's A2DP Sink codec capabilities
376   // to use.
377   // If there is a change in the encoder configuration that requires restarting
378   // of the A2DP connection, flag |p_restart_output| is set to true, and the
379   // new codec is stored in |p_result_codec_config|.
380   // If there is any change in the codec configuration, flag |p_config_updated|
381   // is set to true.
382   // Returns true on success, otherwise false.
383   bool setCodecAudioConfig(const btav_a2dp_codec_config_t& codec_audio_config,
384                            const tA2DP_ENCODER_INIT_PEER_PARAMS* p_peer_params,
385                            const uint8_t* p_peer_sink_capabilities,
386                            uint8_t* p_result_codec_config,
387                            bool* p_restart_output, bool* p_config_updated);
388 
389   // Sets the Over-The-Air preferred codec configuration.
390   // The OTA prefered codec configuration is ignored if the current
391   // codec configuration contains explicit user configuration, or if the
392   // codec configuration for the same codec contains explicit user
393   // configuration.
394   // |p_ota_codec_config| contains the received OTA A2DP codec configuration
395   // from the remote peer. Note: this is not the peer codec capability,
396   // but the codec configuration that the peer would like to use.
397   // |p_peer_params| contains the A2DP peer information.
398   // If there is a change in the encoder configuration that requires restarting
399   // the audio input stream, flag |p_restart_input| is set to true.
400   // If there is a change in the encoder configuration that requires restarting
401   // of the A2DP connection, flag |p_restart_output| is set to true, and the
402   // new codec is stored in |p_result_codec_config|.
403   // If there is any change in the codec configuration, flag |p_config_updated|
404   // is set to true.
405   // Returns true on success, otherwise false.
406   bool setCodecOtaConfig(const uint8_t* p_ota_codec_config,
407                          const tA2DP_ENCODER_INIT_PEER_PARAMS* p_peer_params,
408                          uint8_t* p_result_codec_config, bool* p_restart_input,
409                          bool* p_restart_output, bool* p_config_updated);
410 
411   // Sets the codec capabilities for a Sink peer.
412   // |p_peer_codec_capabiltities| is the peer codec capabilities to set.
413   // Returns true on success, otherwise false.
414   bool setPeerSinkCodecCapabilities(const uint8_t* p_peer_codec_capabilities);
415 
416   // Sets the codec capabilities for a Source peer.
417   // |p_peer_codec_capabiltities| is the peer codec capabilities to set.
418   // Returns true on success, otherwise false.
419   bool setPeerSourceCodecCapabilities(const uint8_t* p_peer_codec_capabilities);
420 
421   // Gets the current codec configuration and the capabilities of
422   // all configured codecs.
423   // The current codec configuration is stored in |p_codec_config|.
424   // Local device's codecs capabilities are stored in
425   // |p_codecs_local_capabilities|.
426   // The codecs capabilities that can be used between the local device
427   // and the remote device are stored in |p_codecs_selectable_capabilities|.
428   // Returns true on success, otherwise false.
429   bool getCodecConfigAndCapabilities(
430       btav_a2dp_codec_config_t* p_codec_config,
431       std::vector<btav_a2dp_codec_config_t>* p_codecs_local_capabilities,
432       std::vector<btav_a2dp_codec_config_t>* p_codecs_selectable_capabilities);
433 
434   // Dumps codec-related information.
435   // The information is written in user-friendly form to file descriptor |fd|.
436   void debug_codec_dump(int fd);
437 
438  private:
439   struct CompareBtBdaddr {
operatorCompareBtBdaddr440     bool operator()(const RawAddress& lhs, const RawAddress& rhs) const {
441       return (memcmp(&lhs, &rhs, sizeof(lhs)) < 0);
442     }
443   };
444   typedef std::map<btav_a2dp_codec_index_t, A2dpCodecConfig*> IndexedCodecs;
445 
446   std::recursive_mutex codec_mutex_;
447   A2dpCodecConfig* current_codec_config_;  // Currently selected codec
448   std::map<btav_a2dp_codec_index_t, btav_a2dp_codec_priority_t>
449       codec_priorities_;
450 
451   IndexedCodecs indexed_codecs_;           // The codecs indexed by codec index
452   IndexedCodecs disabled_codecs_;          // The disabled codecs
453 
454   // A2DP Source codecs ordered by priority
455   std::list<A2dpCodecConfig*> ordered_source_codecs_;
456 
457   // A2DP Sink codecs ordered by priority
458   std::list<A2dpCodecConfig*> ordered_sink_codecs_;
459 
460   std::map<RawAddress, IndexedCodecs*, CompareBtBdaddr> peer_codecs_;
461 };
462 
463 /**
464  * Structure used to configure the A2DP feeding.
465  */
466 typedef struct {
467   tA2DP_SAMPLE_RATE sample_rate;          // 44100, 48000, etc
468   tA2DP_BITS_PER_SAMPLE bits_per_sample;  // 8, 16, 24, 32
469   tA2DP_CHANNEL_COUNT channel_count;      // 1 for mono or 2 for stereo
470 } tA2DP_FEEDING_PARAMS;
471 
472 // Prototype for a callback to read audio data for encoding.
473 // |p_buf| is the buffer to store the data. |len| is the number of octets to
474 // read.
475 // Returns the number of octets read.
476 typedef uint32_t (*a2dp_source_read_callback_t)(uint8_t* p_buf, uint32_t len);
477 
478 // Prototype for a callback to enqueue A2DP Source packets for transmission.
479 // |p_buf| is the buffer with the audio data to enqueue. The callback is
480 // responsible for freeing |p_buf|.
481 // |frames_n| is the number of audio frames in |p_buf| - it is used for
482 // statistics purpose.
483 // |num_bytes| is the number of audio bytes in |p_buf| - it is used for
484 // delay reporting.
485 // Returns true if the packet was enqueued, otherwise false.
486 typedef bool (*a2dp_source_enqueue_callback_t)(BT_HDR* p_buf, size_t frames_n,
487                                                uint32_t num_bytes);
488 
489 //
490 // A2DP encoder callbacks interface.
491 //
492 typedef struct {
493   // Initialize the A2DP encoder.
494   // |p_peer_params| contains the A2DP peer information
495   // The current A2DP codec config is in |a2dp_codec_config|.
496   // |read_callback| is the callback for reading the input audio data.
497   // |enqueue_callback| is the callback for enqueueing the encoded audio data.
498   void (*encoder_init)(const tA2DP_ENCODER_INIT_PEER_PARAMS* p_peer_params,
499                        A2dpCodecConfig* a2dp_codec_config,
500                        a2dp_source_read_callback_t read_callback,
501                        a2dp_source_enqueue_callback_t enqueue_callback);
502 
503   // Cleanup the A2DP encoder.
504   void (*encoder_cleanup)(void);
505 
506   // Reset the feeding for the A2DP encoder.
507   void (*feeding_reset)(void);
508 
509   // Flush the feeding for the A2DP encoder.
510   void (*feeding_flush)(void);
511 
512   // Get the A2DP encoder interval (in milliseconds).
513   uint64_t (*get_encoder_interval_ms)(void);
514 
515   // Get the A2DP encoded maximum frame size (similar to MTU).
516   int (*get_effective_frame_size)(void);
517 
518   // Prepare and send A2DP encoded frames.
519   // |timestamp_us| is the current timestamp (in microseconds).
520   void (*send_frames)(uint64_t timestamp_us);
521 
522   // Set transmit queue length for the A2DP encoder.
523   void (*set_transmit_queue_length)(size_t transmit_queue_length);
524 } tA2DP_ENCODER_INTERFACE;
525 
526 // Prototype for a callback to receive decoded audio data from a
527 // tA2DP_DECODER_INTERFACE|.
528 // |buf| is a pointer to the data.
529 // |len| is the number of octets pointed to by |buf|.
530 typedef void (*decoded_data_callback_t)(uint8_t* buf, uint32_t len);
531 
532 //
533 // A2DP decoder callbacks interface.
534 //
535 typedef struct {
536   // Initialize the decoder. Can be called multiple times, will reinitalize.
537   bool (*decoder_init)(decoded_data_callback_t decode_callback);
538 
539   // Cleanup the A2DP decoder.
540   void (*decoder_cleanup)();
541 
542   // Decodes |p_buf| and calls |decode_callback| passed into init for the
543   // decoded data.
544   bool (*decode_packet)(BT_HDR* p_buf);
545 
546   // Start the A2DP decoder.
547   void (*decoder_start)();
548 
549   // Suspend the A2DP decoder.
550   void (*decoder_suspend)();
551 
552   // A2DP decoder configuration.
553   void (*decoder_configure)(const uint8_t* p_codec_info);
554 } tA2DP_DECODER_INTERFACE;
555 
556 // Gets the A2DP codec type.
557 // |p_codec_info| contains information about the codec capabilities.
558 tA2DP_CODEC_TYPE A2DP_GetCodecType(const uint8_t* p_codec_info);
559 
560 // Checks whether the codec capabilities contain a valid A2DP Source codec.
561 // NOTE: only codecs that are implemented are considered valid.
562 // Returns true if |p_codec_info| contains information about a valid codec,
563 // otherwise false.
564 bool A2DP_IsSourceCodecValid(const uint8_t* p_codec_info);
565 
566 // Checks whether the codec capabilities contain a valid A2DP Sink codec.
567 // NOTE: only codecs that are implemented are considered valid.
568 // Returns true if |p_codec_info| contains information about a valid codec,
569 // otherwise false.
570 bool A2DP_IsSinkCodecValid(const uint8_t* p_codec_info);
571 
572 // Checks whether the codec capabilities contain a valid peer A2DP Source
573 // codec.
574 // NOTE: only codecs that are implemented are considered valid.
575 // Returns true if |p_codec_info| contains information about a valid codec,
576 // otherwise false.
577 bool A2DP_IsPeerSourceCodecValid(const uint8_t* p_codec_info);
578 
579 // Checks whether the codec capabilities contain a valid peer A2DP Sink codec.
580 // NOTE: only codecs that are implemented are considered valid.
581 // Returns true if |p_codec_info| contains information about a valid codec,
582 // otherwise false.
583 bool A2DP_IsPeerSinkCodecValid(const uint8_t* p_codec_info);
584 
585 // Checks whether an A2DP Sink codec is supported.
586 // |p_codec_info| contains information about the codec capabilities.
587 // Returns true if the A2DP Sink codec is supported, otherwise false.
588 bool A2DP_IsSinkCodecSupported(const uint8_t* p_codec_info);
589 
590 // Gets peer sink endpoint codec type.
591 // |p_codec_info| contains information about the codec capabilities.
592 int A2DP_IotGetPeerSinkCodecType(const uint8_t* p_codec_info);
593 
594 // Checks whether an A2DP Source codec for a peer Source device is supported.
595 // |p_codec_info| contains information about the codec capabilities of the
596 // peer device.
597 // Returns true if the A2DP Source codec for a peer Source device is supported,
598 // otherwise false.
599 bool A2DP_IsPeerSourceCodecSupported(const uint8_t* p_codec_info);
600 
601 // Initialize state with the default A2DP codec.
602 // The initialized state with the codec capabilities is stored in
603 // |p_codec_info|.
604 void A2DP_InitDefaultCodec(uint8_t* p_codec_info);
605 
606 // Checks whether the A2DP data packets should contain RTP header.
607 // |content_protection_enabled| is true if Content Protection is
608 // enabled. |p_codec_info| contains information about the codec capabilities.
609 // Returns true if the A2DP data packets should contain RTP header, otherwise
610 // false.
611 bool A2DP_UsesRtpHeader(bool content_protection_enabled,
612                         const uint8_t* p_codec_info);
613 
614 // Gets the |AVDT_MEDIA_TYPE_*| media type from the codec capability
615 // in |p_codec_info|.
616 uint8_t A2DP_GetMediaType(const uint8_t* p_codec_info);
617 
618 // Gets the A2DP codec name for a given |p_codec_info|.
619 const char* A2DP_CodecName(const uint8_t* p_codec_info);
620 
621 // Checks whether two A2DP codecs |p_codec_info_a| and |p_codec_info_b| have
622 // the same type.
623 // Returns true if the two codecs have the same type, otherwise false.
624 // If the codec type is not recognized, the return value is false.
625 bool A2DP_CodecTypeEquals(const uint8_t* p_codec_info_a,
626                           const uint8_t* p_codec_info_b);
627 
628 // Checks whether two A2DP codecs p_codec_info_a| and |p_codec_info_b| are
629 // exactly the same.
630 // Returns true if the two codecs are exactly the same, otherwise false.
631 // If the codec type is not recognized, the return value is false.
632 bool A2DP_CodecEquals(const uint8_t* p_codec_info_a,
633                       const uint8_t* p_codec_info_b);
634 
635 // Gets the track sample rate value for the A2DP codec.
636 // |p_codec_info| is a pointer to the codec_info to decode.
637 // Returns the track sample rate on success, or -1 if |p_codec_info|
638 // contains invalid codec information.
639 int A2DP_GetTrackSampleRate(const uint8_t* p_codec_info);
640 
641 // Gets the track bits per sample value for the A2DP codec.
642 // |p_codec_info| is a pointer to the codec_info to decode.
643 // Returns the track bits per sample on success, or -1 if |p_codec_info|
644 // contains invalid codec information.
645 int A2DP_GetTrackBitsPerSample(const uint8_t* p_codec_info);
646 
647 // Gets the channel count for the A2DP codec.
648 // |p_codec_info| is a pointer to the codec_info to decode.
649 // Returns the channel count on success, or -1 if |p_codec_info|
650 // contains invalid codec information.
651 int A2DP_GetTrackChannelCount(const uint8_t* p_codec_info);
652 
653 // Gets the channel type for the A2DP Sink codec:
654 // 1 for mono, or 3 for dual/stereo/joint.
655 // |p_codec_info| is a pointer to the codec_info to decode.
656 // Returns the channel type on success, or -1 if |p_codec_info|
657 // contains invalid codec information.
658 int A2DP_GetSinkTrackChannelType(const uint8_t* p_codec_info);
659 
660 // Gets the A2DP audio data timestamp from an audio packet.
661 // |p_codec_info| contains the codec information.
662 // |p_data| contains the audio data.
663 // The timestamp is stored in |p_timestamp|.
664 // Returns true on success, otherwise false.
665 bool A2DP_GetPacketTimestamp(const uint8_t* p_codec_info, const uint8_t* p_data,
666                              uint32_t* p_timestamp);
667 
668 // Builds A2DP codec header for audio data.
669 // |p_codec_info| contains the codec information.
670 // |p_buf| contains the audio data.
671 // |frames_per_packet| is the number of frames in this packet.
672 // Returns true on success, otherwise false.
673 bool A2DP_BuildCodecHeader(const uint8_t* p_codec_info, BT_HDR* p_buf,
674                            uint16_t frames_per_packet);
675 
676 // Gets the A2DP encoder interface that can be used to encode and prepare
677 // A2DP packets for transmission - see |tA2DP_ENCODER_INTERFACE|.
678 // |p_codec_info| contains the codec information.
679 // Returns the A2DP encoder interface if the |p_codec_info| is valid and
680 // supported, otherwise NULL.
681 const tA2DP_ENCODER_INTERFACE* A2DP_GetEncoderInterface(
682     const uint8_t* p_codec_info);
683 
684 // Gets the A2DP decoder interface that can be used to decode received A2DP
685 // packets - see |tA2DP_DECODER_INTERFACE|.
686 // |p_codec_info| contains the codec information.
687 // Returns the A2DP decoder interface if the |p_codec_info| is valid and
688 // supported, otherwise NULL.
689 const tA2DP_DECODER_INTERFACE* A2DP_GetDecoderInterface(
690     const uint8_t* p_codec_info);
691 
692 // Adjusts the A2DP codec, based on local support and Bluetooth specification.
693 // |p_codec_info| contains the codec information to adjust.
694 // Returns true if |p_codec_info| is valid and supported, otherwise false.
695 bool A2DP_AdjustCodec(uint8_t* p_codec_info);
696 
697 // Gets the A2DP Source codec index for a given |p_codec_info|.
698 // Returns the corresponding |btav_a2dp_codec_index_t| on success,
699 // otherwise |BTAV_A2DP_CODEC_INDEX_MAX|.
700 btav_a2dp_codec_index_t A2DP_SourceCodecIndex(const uint8_t* p_codec_info);
701 
702 // Gets the A2DP Sink codec index for a given |p_codec_info|.
703 // Returns the corresponding |btav_a2dp_codec_index_t| on success,
704 // otherwise |BTAV_A2DP_CODEC_INDEX_MAX|.
705 btav_a2dp_codec_index_t A2DP_SinkCodecIndex(const uint8_t* p_codec_info);
706 
707 // Gets the A2DP codec name for a given |codec_index|.
708 const char* A2DP_CodecIndexStr(btav_a2dp_codec_index_t codec_index);
709 
710 // Initializes A2DP codec-specific information into |AvdtpSepConfig|
711 // configuration entry pointed by |p_cfg|. The selected codec is defined
712 // by |codec_index|.
713 // Returns true on success, otherwise false.
714 bool A2DP_InitCodecConfig(btav_a2dp_codec_index_t codec_index,
715                           AvdtpSepConfig* p_cfg);
716 
717 // Gets the A2DP effective frame size that each encoded media frame should not
718 // exceed this value.
719 // |p_codec_info| contains the codec information.
720 // Returns the effective frame size if the encoder is configured with this
721 // |p_codec_info|, otherwise 0.
722 int A2DP_GetEecoderEffectiveFrameSize(const uint8_t* p_codec_info);
723 
724 // Decodes A2DP codec info into a human readable string.
725 // |p_codec_info| is a pointer to the codec_info to decode.
726 // Returns a string describing the codec information.
727 std::string A2DP_CodecInfoString(const uint8_t* p_codec_info);
728 
729 // Add enum-based flag operators to the btav_a2dp_codec_config_t fields
730 #ifndef DEFINE_ENUM_FLAG_OPERATORS
731 // Use NOLINT to suppress missing parentheses warnings around bitmask.
732 #define DEFINE_ENUM_FLAG_OPERATORS(bitmask)                                 \
733   extern "C++" {                                                            \
734   inline constexpr bitmask operator&(bitmask X, bitmask Y) {  /* NOLINT */  \
735     return static_cast<bitmask>(static_cast<int>(X) & static_cast<int>(Y)); \
736   }                                                                         \
737   inline constexpr bitmask operator|(bitmask X, bitmask Y) {  /* NOLINT */  \
738     return static_cast<bitmask>(static_cast<int>(X) | static_cast<int>(Y)); \
739   }                                                                         \
740   inline constexpr bitmask operator^(bitmask X, bitmask Y) {  /* NOLINT */  \
741     return static_cast<bitmask>(static_cast<int>(X) ^ static_cast<int>(Y)); \
742   }                                                                         \
743   inline constexpr bitmask operator~(bitmask X) {             /* NOLINT */  \
744     return static_cast<bitmask>(~static_cast<int>(X));                      \
745   }                                                                         \
746   inline bitmask& operator&=(bitmask& X, bitmask Y) {         /* NOLINT */  \
747     X = X & Y;                                                              \
748     return X;                                                               \
749   }                                                                         \
750   inline bitmask& operator|=(bitmask& X, bitmask Y) {         /* NOLINT */  \
751     X = X | Y;                                                              \
752     return X;                                                               \
753   }                                                                         \
754   inline bitmask& operator^=(bitmask& X, bitmask Y) {         /* NOLINT */  \
755     X = X ^ Y;                                                              \
756     return X;                                                               \
757   }                                                                         \
758   }
759 #endif  // DEFINE_ENUM_FLAG_OPERATORS
760 DEFINE_ENUM_FLAG_OPERATORS(btav_a2dp_codec_sample_rate_t);
761 DEFINE_ENUM_FLAG_OPERATORS(btav_a2dp_codec_bits_per_sample_t);
762 DEFINE_ENUM_FLAG_OPERATORS(btav_a2dp_codec_channel_mode_t);
763 
764 #endif  // A2DP_CODEC_API_H
765