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