13a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov/*
23a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov * Copyright (C) 2016 The Android Open Source Project
33a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov *
43a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov * Licensed under the Apache License, Version 2.0 (the "License");
53a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov * you may not use this file except in compliance with the License.
63a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov * You may obtain a copy of the License at
73a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov *
83a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov *      http://www.apache.org/licenses/LICENSE-2.0
93a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov *
103a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov * Unless required by applicable law or agreed to in writing, software
113a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov * distributed under the License is distributed on an "AS IS" BASIS,
123a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov * See the License for the specific language governing permissions and
143a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov * limitations under the License.
153a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov */
163a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov
173a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov//
183a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// A2DP Codec API for aptX-HD
193a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov//
203a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov
213a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov#ifndef A2DP_VENDOR_APTX_HD_H
223a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov#define A2DP_VENDOR_APTX_HD_H
233a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov
243a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov#include "a2dp_codec_api.h"
253a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov#include "a2dp_vendor_aptx_hd_constants.h"
263a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov#include "avdt_api.h"
273a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov
283a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavovclass A2dpCodecConfigAptxHd : public A2dpCodecConfig {
293a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov public:
30a6ba5aca4e8c1a200b8cc29fb60d390a7196416aPavlin Radoslavov  A2dpCodecConfigAptxHd(btav_a2dp_codec_priority_t codec_priority);
313a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov  virtual ~A2dpCodecConfigAptxHd();
323a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov
333a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov  bool init() override;
34302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov  period_ms_t encoderIntervalMs() const override;
353a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov  bool setCodecConfig(const uint8_t* p_peer_codec_info, bool is_capability,
363a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov                      uint8_t* p_result_codec_config) override;
373a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov
383a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov private:
393b8391cd47dd0ea3e399f99a888f029de8c7d8c8Pavlin Radoslavov  bool useRtpHeaderMarkerBit() const override;
403a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov  bool updateEncoderUserConfig(
413a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov      const tA2DP_ENCODER_INIT_PEER_PARAMS* p_peer_params,
423a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov      bool* p_restart_input, bool* p_restart_output,
433a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov      bool* p_config_updated) override;
44302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov  void debug_codec_dump(int fd) override;
453a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov};
463a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov
473a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Checks whether the codec capabilities contain a valid A2DP aptX-HD Source
483a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// codec.
493a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// NOTE: only codecs that are implemented are considered valid.
503a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Returns true if |p_codec_info| contains information about a valid aptX-HD
513a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// codec, otherwise false.
523a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavovbool A2DP_IsVendorSourceCodecValidAptxHd(const uint8_t* p_codec_info);
533a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov
543a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Checks whether the codec capabilities contain a valid peer A2DP aptX-HD Sink
553a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// codec.
563a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// NOTE: only codecs that are implemented are considered valid.
573a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Returns true if |p_codec_info| contains information about a valid aptX-HD
583a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// codec, otherwise false.
593a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavovbool A2DP_IsVendorPeerSinkCodecValidAptxHd(const uint8_t* p_codec_info);
603a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov
613a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Checks whether the A2DP data packets should contain RTP header.
623a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// |content_protection_enabled| is true if Content Protection is
633a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// enabled. |p_codec_info| contains information about the codec capabilities.
643a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Returns true if the A2DP data packets should contain RTP header, otherwise
653a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// false.
663a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavovbool A2DP_VendorUsesRtpHeaderAptxHd(bool content_protection_enabled,
673a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov                                    const uint8_t* p_codec_info);
683a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov
693a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Gets the A2DP aptX-HD codec name for a given |p_codec_info|.
703a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavovconst char* A2DP_VendorCodecNameAptxHd(const uint8_t* p_codec_info);
713a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov
723a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Checks whether two A2DP aptX-HD codecs |p_codec_info_a| and |p_codec_info_b|
733a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// have the same type.
743a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Returns true if the two codecs have the same type, otherwise false.
753a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavovbool A2DP_VendorCodecTypeEqualsAptxHd(const uint8_t* p_codec_info_a,
763a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov                                      const uint8_t* p_codec_info_b);
773a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov
783a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Checks whether two A2DP aptX-HD codecs |p_codec_info_a| and |p_codec_info_b|
793a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// are exactly the same.
803a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Returns true if the two codecs are exactly the same, otherwise false.
813a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// If the codec type is not aptX-HD, the return value is false.
823a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavovbool A2DP_VendorCodecEqualsAptxHd(const uint8_t* p_codec_info_a,
833a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov                                  const uint8_t* p_codec_info_b);
843a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov
853a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Gets the track sample rate value for the A2DP aptX-HD codec.
863a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// |p_codec_info| is a pointer to the aptX-HD codec_info to decode.
873a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Returns the track sample rate on success, or -1 if |p_codec_info|
883a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// contains invalid codec information.
893a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavovint A2DP_VendorGetTrackSampleRateAptxHd(const uint8_t* p_codec_info);
903a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov
913a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Gets the channel count for the A2DP aptX-HD codec.
923a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// |p_codec_info| is a pointer to the aptX-HD codec_info to decode.
933a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Returns the channel count on success, or -1 if |p_codec_info|
943a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// contains invalid codec information.
953a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavovint A2DP_VendorGetTrackChannelCountAptxHd(const uint8_t* p_codec_info);
963a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov
973a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Gets the A2DP aptX-HD audio data timestamp from an audio packet.
983a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// |p_codec_info| contains the codec information.
993a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// |p_data| contains the audio data.
1003a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// The timestamp is stored in |p_timestamp|.
1013a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Returns true on success, otherwise false.
1023a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavovbool A2DP_VendorGetPacketTimestampAptxHd(const uint8_t* p_codec_info,
1033a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov                                         const uint8_t* p_data,
1043a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov                                         uint32_t* p_timestamp);
1053a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov
1063a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Builds A2DP aptX-HD codec header for audio data.
1073a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// |p_codec_info| contains the codec information.
1083a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// |p_buf| contains the audio data.
1093a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// |frames_per_packet| is the number of frames in this packet.
1103a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Returns true on success, otherwise false.
1113a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavovbool A2DP_VendorBuildCodecHeaderAptxHd(const uint8_t* p_codec_info,
1123a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov                                       BT_HDR* p_buf,
1133a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov                                       uint16_t frames_per_packet);
1143a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov
11581c2234305d4c84eb38f0d5a92605e3b42366f84Pavlin Radoslavov// Decodes and displays A2DP aptX-HD codec info when using |LOG_DEBUG|.
1163a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// |p_codec_info| is a pointer to the aptX-HD codec_info to decode and display.
11781c2234305d4c84eb38f0d5a92605e3b42366f84Pavlin Radoslavov// Returns true if the codec information is valid, otherwise false.
11881c2234305d4c84eb38f0d5a92605e3b42366f84Pavlin Radoslavovbool A2DP_VendorDumpCodecInfoAptxHd(const uint8_t* p_codec_info);
1193a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov
1203a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Gets the A2DP aptX-HD encoder interface that can be used to encode and
1213a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// prepare A2DP packets for transmission - see |tA2DP_ENCODER_INTERFACE|.
1223a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// |p_codec_info| contains the codec information.
1233a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Returns the A2DP aptX-HD encoder interface if the |p_codec_info| is valid
1243a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// and supported, otherwise NULL.
1253a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavovconst tA2DP_ENCODER_INTERFACE* A2DP_VendorGetEncoderInterfaceAptxHd(
1263a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov    const uint8_t* p_codec_info);
1273a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov
1283a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Adjusts the A2DP aptX-HD codec, based on local support and Bluetooth
1293a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// specification.
1303a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// |p_codec_info| contains the codec information to adjust.
1313a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Returns true if |p_codec_info| is valid and supported, otherwise false.
1323a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavovbool A2DP_VendorAdjustCodecAptxHd(uint8_t* p_codec_info);
1333a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov
1343a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Gets the A2DP aptX-HD Source codec index for a given |p_codec_info|.
1353a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Returns the corresponding |btav_a2dp_codec_index_t| on success,
1363a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// otherwise |BTAV_A2DP_CODEC_INDEX_MAX|.
1373a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavovbtav_a2dp_codec_index_t A2DP_VendorSourceCodecIndexAptxHd(
1383a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov    const uint8_t* p_codec_info);
1393a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov
1403a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Gets the A2DP aptX-HD Source codec name.
1413a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavovconst char* A2DP_VendorCodecIndexStrAptxHd(void);
1423a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov
1433a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// Initializes A2DP aptX-HD Source codec information into |tAVDT_CFG|
1443a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov// configuration entry pointed by |p_cfg|.
1453a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavovbool A2DP_VendorInitCodecConfigAptxHd(tAVDT_CFG* p_cfg);
1463a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov
1473a3ec66a1bb7f5c99b17239021d6d184a3abd4eePavlin Radoslavov#endif  // A2DP_VENDOR_APTX_HD_H
148