Home | History | Annotate | Download | only in a2dp
      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  *
     19  *  Utility functions to help build and parse the LDAC Codec Information
     20  *  Element and Media Payload.
     21  *
     22  ******************************************************************************/
     23 
     24 #define LOG_TAG "a2dp_vendor_ldac"
     25 
     26 #include "bt_target.h"
     27 
     28 #include "a2dp_vendor_ldac.h"
     29 
     30 #include <string.h>
     31 
     32 #include <base/logging.h>
     33 #include "a2dp_vendor.h"
     34 #include "a2dp_vendor_ldac_encoder.h"
     35 #include "bt_utils.h"
     36 #include "btif_av_co.h"
     37 #include "osi/include/log.h"
     38 #include "osi/include/osi.h"
     39 
     40 // data type for the LDAC Codec Information Element */
     41 // NOTE: bits_per_sample is needed only for LDAC encoder initialization.
     42 typedef struct {
     43   uint32_t vendorId;
     44   uint16_t codecId;    /* Codec ID for LDAC */
     45   uint8_t sampleRate;  /* Sampling Frequency */
     46   uint8_t channelMode; /* STEREO/DUAL/MONO */
     47   btav_a2dp_codec_bits_per_sample_t bits_per_sample;
     48 } tA2DP_LDAC_CIE;
     49 
     50 /* LDAC Source codec capabilities */
     51 static const tA2DP_LDAC_CIE a2dp_ldac_source_caps = {
     52     A2DP_LDAC_VENDOR_ID,  // vendorId
     53     A2DP_LDAC_CODEC_ID,   // codecId
     54     // sampleRate
     55     (A2DP_LDAC_SAMPLING_FREQ_44100 | A2DP_LDAC_SAMPLING_FREQ_48000 |
     56      A2DP_LDAC_SAMPLING_FREQ_88200 | A2DP_LDAC_SAMPLING_FREQ_96000),
     57     // channelMode
     58     (A2DP_LDAC_CHANNEL_MODE_DUAL | A2DP_LDAC_CHANNEL_MODE_STEREO),
     59     // bits_per_sample
     60     (BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16 | BTAV_A2DP_CODEC_BITS_PER_SAMPLE_24 |
     61      BTAV_A2DP_CODEC_BITS_PER_SAMPLE_32)};
     62 
     63 /* Default LDAC codec configuration */
     64 static const tA2DP_LDAC_CIE a2dp_ldac_default_config = {
     65     A2DP_LDAC_VENDOR_ID,                // vendorId
     66     A2DP_LDAC_CODEC_ID,                 // codecId
     67     A2DP_LDAC_SAMPLING_FREQ_96000,      // sampleRate
     68     A2DP_LDAC_CHANNEL_MODE_STEREO,      // channelMode
     69     BTAV_A2DP_CODEC_BITS_PER_SAMPLE_32  // bits_per_sample
     70 };
     71 
     72 static const tA2DP_ENCODER_INTERFACE a2dp_encoder_interface_ldac = {
     73     a2dp_vendor_ldac_encoder_init,
     74     a2dp_vendor_ldac_encoder_cleanup,
     75     a2dp_vendor_ldac_feeding_reset,
     76     a2dp_vendor_ldac_feeding_flush,
     77     a2dp_vendor_ldac_get_encoder_interval_ms,
     78     a2dp_vendor_ldac_send_frames,
     79     a2dp_vendor_ldac_set_transmit_queue_length};
     80 
     81 UNUSED_ATTR static tA2DP_STATUS A2DP_CodecInfoMatchesCapabilityLdac(
     82     const tA2DP_LDAC_CIE* p_cap, const uint8_t* p_codec_info,
     83     bool is_peer_codec_info);
     84 
     85 // Builds the LDAC Media Codec Capabilities byte sequence beginning from the
     86 // LOSC octet. |media_type| is the media type |AVDT_MEDIA_TYPE_*|.
     87 // |p_ie| is a pointer to the LDAC Codec Information Element information.
     88 // The result is stored in |p_result|. Returns A2DP_SUCCESS on success,
     89 // otherwise the corresponding A2DP error status code.
     90 static tA2DP_STATUS A2DP_BuildInfoLdac(uint8_t media_type,
     91                                        const tA2DP_LDAC_CIE* p_ie,
     92                                        uint8_t* p_result) {
     93   if (p_ie == NULL || p_result == NULL) {
     94     return A2DP_INVALID_PARAMS;
     95   }
     96 
     97   *p_result++ = A2DP_LDAC_CODEC_LEN;
     98   *p_result++ = (media_type << 4);
     99   *p_result++ = A2DP_MEDIA_CT_NON_A2DP;
    100 
    101   // Vendor ID and Codec ID
    102   *p_result++ = (uint8_t)(p_ie->vendorId & 0x000000FF);
    103   *p_result++ = (uint8_t)((p_ie->vendorId & 0x0000FF00) >> 8);
    104   *p_result++ = (uint8_t)((p_ie->vendorId & 0x00FF0000) >> 16);
    105   *p_result++ = (uint8_t)((p_ie->vendorId & 0xFF000000) >> 24);
    106   *p_result++ = (uint8_t)(p_ie->codecId & 0x00FF);
    107   *p_result++ = (uint8_t)((p_ie->codecId & 0xFF00) >> 8);
    108 
    109   // Sampling Frequency
    110   *p_result = (uint8_t)(p_ie->sampleRate & A2DP_LDAC_SAMPLING_FREQ_MASK);
    111   if (*p_result == 0) return A2DP_INVALID_PARAMS;
    112   p_result++;
    113 
    114   // Channel Mode
    115   *p_result = (uint8_t)(p_ie->channelMode & A2DP_LDAC_CHANNEL_MODE_MASK);
    116   if (*p_result == 0) return A2DP_INVALID_PARAMS;
    117 
    118   return A2DP_SUCCESS;
    119 }
    120 
    121 // Parses the LDAC Media Codec Capabilities byte sequence beginning from the
    122 // LOSC octet. The result is stored in |p_ie|. The byte sequence to parse is
    123 // |p_codec_info|. If |is_capability| is true, the byte sequence is
    124 // codec capabilities, otherwise is codec configuration.
    125 // Returns A2DP_SUCCESS on success, otherwise the corresponding A2DP error
    126 // status code.
    127 static tA2DP_STATUS A2DP_ParseInfoLdac(tA2DP_LDAC_CIE* p_ie,
    128                                        const uint8_t* p_codec_info,
    129                                        bool is_capability) {
    130   uint8_t losc;
    131   uint8_t media_type;
    132   tA2DP_CODEC_TYPE codec_type;
    133 
    134   if (p_ie == NULL || p_codec_info == NULL) return A2DP_INVALID_PARAMS;
    135 
    136   // Check the codec capability length
    137   losc = *p_codec_info++;
    138   if (losc != A2DP_LDAC_CODEC_LEN) return A2DP_WRONG_CODEC;
    139 
    140   media_type = (*p_codec_info++) >> 4;
    141   codec_type = *p_codec_info++;
    142   /* Check the Media Type and Media Codec Type */
    143   if (media_type != AVDT_MEDIA_TYPE_AUDIO ||
    144       codec_type != A2DP_MEDIA_CT_NON_A2DP) {
    145     return A2DP_WRONG_CODEC;
    146   }
    147 
    148   // Check the Vendor ID and Codec ID */
    149   p_ie->vendorId = (*p_codec_info & 0x000000FF) |
    150                    (*(p_codec_info + 1) << 8 & 0x0000FF00) |
    151                    (*(p_codec_info + 2) << 16 & 0x00FF0000) |
    152                    (*(p_codec_info + 3) << 24 & 0xFF000000);
    153   p_codec_info += 4;
    154   p_ie->codecId =
    155       (*p_codec_info & 0x00FF) | (*(p_codec_info + 1) << 8 & 0xFF00);
    156   p_codec_info += 2;
    157   if (p_ie->vendorId != A2DP_LDAC_VENDOR_ID ||
    158       p_ie->codecId != A2DP_LDAC_CODEC_ID) {
    159     return A2DP_WRONG_CODEC;
    160   }
    161 
    162   p_ie->sampleRate = *p_codec_info++ & A2DP_LDAC_SAMPLING_FREQ_MASK;
    163   p_ie->channelMode = *p_codec_info++ & A2DP_LDAC_CHANNEL_MODE_MASK;
    164 
    165   if (is_capability) return A2DP_SUCCESS;
    166 
    167   if (A2DP_BitsSet(p_ie->sampleRate) != A2DP_SET_ONE_BIT)
    168     return A2DP_BAD_SAMP_FREQ;
    169   if (A2DP_BitsSet(p_ie->channelMode) != A2DP_SET_ONE_BIT)
    170     return A2DP_BAD_CH_MODE;
    171 
    172   return A2DP_SUCCESS;
    173 }
    174 
    175 // Build the LDAC Media Payload Header.
    176 // |p_dst| points to the location where the header should be written to.
    177 // If |frag| is true, the media payload frame is fragmented.
    178 // |start| is true for the first packet of a fragmented frame.
    179 // |last| is true for the last packet of a fragmented frame.
    180 // If |frag| is false, |num| is the number of number of frames in the packet,
    181 // otherwise is the number of remaining fragments (including this one).
    182 static void A2DP_BuildMediaPayloadHeaderLdac(uint8_t* p_dst, bool frag,
    183                                              bool start, bool last,
    184                                              uint8_t num) {
    185   if (p_dst == NULL) return;
    186 
    187   *p_dst = 0;
    188   if (frag) *p_dst |= A2DP_LDAC_HDR_F_MSK;
    189   if (start) *p_dst |= A2DP_LDAC_HDR_S_MSK;
    190   if (last) *p_dst |= A2DP_LDAC_HDR_L_MSK;
    191   *p_dst |= (A2DP_LDAC_HDR_NUM_MSK & num);
    192 }
    193 
    194 bool A2DP_IsVendorSourceCodecValidLdac(const uint8_t* p_codec_info) {
    195   tA2DP_LDAC_CIE cfg_cie;
    196 
    197   /* Use a liberal check when parsing the codec info */
    198   return (A2DP_ParseInfoLdac(&cfg_cie, p_codec_info, false) == A2DP_SUCCESS) ||
    199          (A2DP_ParseInfoLdac(&cfg_cie, p_codec_info, true) == A2DP_SUCCESS);
    200 }
    201 
    202 bool A2DP_IsVendorPeerSinkCodecValidLdac(const uint8_t* p_codec_info) {
    203   tA2DP_LDAC_CIE cfg_cie;
    204 
    205   /* Use a liberal check when parsing the codec info */
    206   return (A2DP_ParseInfoLdac(&cfg_cie, p_codec_info, false) == A2DP_SUCCESS) ||
    207          (A2DP_ParseInfoLdac(&cfg_cie, p_codec_info, true) == A2DP_SUCCESS);
    208 }
    209 
    210 // Checks whether A2DP LDAC codec configuration matches with a device's codec
    211 // capabilities. |p_cap| is the LDAC codec configuration. |p_codec_info| is
    212 // the device's codec capabilities.
    213 // If |is_capability| is true, the byte sequence is codec capabilities,
    214 // otherwise is codec configuration.
    215 // |p_codec_info| contains the codec capabilities for a peer device that
    216 // is acting as an A2DP source.
    217 // Returns A2DP_SUCCESS if the codec configuration matches with capabilities,
    218 // otherwise the corresponding A2DP error status code.
    219 static tA2DP_STATUS A2DP_CodecInfoMatchesCapabilityLdac(
    220     const tA2DP_LDAC_CIE* p_cap, const uint8_t* p_codec_info,
    221     bool is_capability) {
    222   tA2DP_STATUS status;
    223   tA2DP_LDAC_CIE cfg_cie;
    224 
    225   /* parse configuration */
    226   status = A2DP_ParseInfoLdac(&cfg_cie, p_codec_info, is_capability);
    227   if (status != A2DP_SUCCESS) {
    228     LOG_ERROR(LOG_TAG, "%s: parsing failed %d", __func__, status);
    229     return status;
    230   }
    231 
    232   /* verify that each parameter is in range */
    233 
    234   LOG_VERBOSE(LOG_TAG, "%s: FREQ peer: 0x%x, capability 0x%x", __func__,
    235               cfg_cie.sampleRate, p_cap->sampleRate);
    236   LOG_VERBOSE(LOG_TAG, "%s: CH_MODE peer: 0x%x, capability 0x%x", __func__,
    237               cfg_cie.channelMode, p_cap->channelMode);
    238 
    239   /* sampling frequency */
    240   if ((cfg_cie.sampleRate & p_cap->sampleRate) == 0) return A2DP_NS_SAMP_FREQ;
    241 
    242   /* channel mode */
    243   if ((cfg_cie.channelMode & p_cap->channelMode) == 0) return A2DP_NS_CH_MODE;
    244 
    245   return A2DP_SUCCESS;
    246 }
    247 
    248 bool A2DP_VendorUsesRtpHeaderLdac(UNUSED_ATTR bool content_protection_enabled,
    249                                   UNUSED_ATTR const uint8_t* p_codec_info) {
    250   // TODO: Is this correct? The RTP header is always included?
    251   return true;
    252 }
    253 
    254 const char* A2DP_VendorCodecNameLdac(UNUSED_ATTR const uint8_t* p_codec_info) {
    255   return "LDAC";
    256 }
    257 
    258 bool A2DP_VendorCodecTypeEqualsLdac(const uint8_t* p_codec_info_a,
    259                                     const uint8_t* p_codec_info_b) {
    260   tA2DP_LDAC_CIE ldac_cie_a;
    261   tA2DP_LDAC_CIE ldac_cie_b;
    262 
    263   // Check whether the codec info contains valid data
    264   tA2DP_STATUS a2dp_status =
    265       A2DP_ParseInfoLdac(&ldac_cie_a, p_codec_info_a, true);
    266   if (a2dp_status != A2DP_SUCCESS) {
    267     LOG_ERROR(LOG_TAG, "%s: cannot decode codec information: %d", __func__,
    268               a2dp_status);
    269     return false;
    270   }
    271   a2dp_status = A2DP_ParseInfoLdac(&ldac_cie_b, p_codec_info_b, true);
    272   if (a2dp_status != A2DP_SUCCESS) {
    273     LOG_ERROR(LOG_TAG, "%s: cannot decode codec information: %d", __func__,
    274               a2dp_status);
    275     return false;
    276   }
    277 
    278   return true;
    279 }
    280 
    281 bool A2DP_VendorCodecEqualsLdac(const uint8_t* p_codec_info_a,
    282                                 const uint8_t* p_codec_info_b) {
    283   tA2DP_LDAC_CIE ldac_cie_a;
    284   tA2DP_LDAC_CIE ldac_cie_b;
    285 
    286   // Check whether the codec info contains valid data
    287   tA2DP_STATUS a2dp_status =
    288       A2DP_ParseInfoLdac(&ldac_cie_a, p_codec_info_a, true);
    289   if (a2dp_status != A2DP_SUCCESS) {
    290     LOG_ERROR(LOG_TAG, "%s: cannot decode codec information: %d", __func__,
    291               a2dp_status);
    292     return false;
    293   }
    294   a2dp_status = A2DP_ParseInfoLdac(&ldac_cie_b, p_codec_info_b, true);
    295   if (a2dp_status != A2DP_SUCCESS) {
    296     LOG_ERROR(LOG_TAG, "%s: cannot decode codec information: %d", __func__,
    297               a2dp_status);
    298     return false;
    299   }
    300 
    301   return (ldac_cie_a.sampleRate == ldac_cie_b.sampleRate) &&
    302          (ldac_cie_a.channelMode == ldac_cie_b.channelMode);
    303 }
    304 
    305 int A2DP_VendorGetBitRateLdac(const uint8_t* p_codec_info) {
    306   A2dpCodecConfig* current_codec = bta_av_get_a2dp_current_codec();
    307   btav_a2dp_codec_config_t codec_config_ = current_codec->getCodecConfig();
    308   int samplerate = A2DP_GetTrackSampleRate(p_codec_info);
    309   switch (codec_config_.codec_specific_1 % 10) {
    310     case 0:
    311       if (samplerate == 44100 || samplerate == 88200)
    312         return 909000;
    313       else
    314         return 990000;
    315     case 1:
    316       if (samplerate == 44100 || samplerate == 88200)
    317         return 606000;
    318       else
    319         return 660000;
    320     case 2:
    321       if (samplerate == 44100 || samplerate == 88200)
    322         return 303000;
    323       else
    324         return 330000;
    325     case 3:
    326     default:
    327       if (samplerate == 44100 || samplerate == 88200)
    328         return 909000;
    329       else
    330         return 990000;
    331   }
    332   return 0;
    333 }
    334 
    335 int A2DP_VendorGetTrackSampleRateLdac(const uint8_t* p_codec_info) {
    336   tA2DP_LDAC_CIE ldac_cie;
    337 
    338   // Check whether the codec info contains valid data
    339   tA2DP_STATUS a2dp_status = A2DP_ParseInfoLdac(&ldac_cie, p_codec_info, false);
    340   if (a2dp_status != A2DP_SUCCESS) {
    341     LOG_ERROR(LOG_TAG, "%s: cannot decode codec information: %d", __func__,
    342               a2dp_status);
    343     return -1;
    344   }
    345 
    346   switch (ldac_cie.sampleRate) {
    347     case A2DP_LDAC_SAMPLING_FREQ_44100:
    348       return 44100;
    349     case A2DP_LDAC_SAMPLING_FREQ_48000:
    350       return 48000;
    351     case A2DP_LDAC_SAMPLING_FREQ_88200:
    352       return 88200;
    353     case A2DP_LDAC_SAMPLING_FREQ_96000:
    354       return 96000;
    355     case A2DP_LDAC_SAMPLING_FREQ_176400:
    356       return 176400;
    357     case A2DP_LDAC_SAMPLING_FREQ_192000:
    358       return 192000;
    359   }
    360 
    361   return -1;
    362 }
    363 
    364 int A2DP_VendorGetTrackChannelCountLdac(const uint8_t* p_codec_info) {
    365   tA2DP_LDAC_CIE ldac_cie;
    366 
    367   // Check whether the codec info contains valid data
    368   tA2DP_STATUS a2dp_status = A2DP_ParseInfoLdac(&ldac_cie, p_codec_info, false);
    369   if (a2dp_status != A2DP_SUCCESS) {
    370     LOG_ERROR(LOG_TAG, "%s: cannot decode codec information: %d", __func__,
    371               a2dp_status);
    372     return -1;
    373   }
    374 
    375   switch (ldac_cie.channelMode) {
    376     case A2DP_LDAC_CHANNEL_MODE_MONO:
    377       return 1;
    378     case A2DP_LDAC_CHANNEL_MODE_DUAL:
    379       return 2;
    380     case A2DP_LDAC_CHANNEL_MODE_STEREO:
    381       return 2;
    382   }
    383 
    384   return -1;
    385 }
    386 
    387 int A2DP_VendorGetChannelModeCodeLdac(const uint8_t* p_codec_info) {
    388   tA2DP_LDAC_CIE ldac_cie;
    389 
    390   // Check whether the codec info contains valid data
    391   tA2DP_STATUS a2dp_status = A2DP_ParseInfoLdac(&ldac_cie, p_codec_info, false);
    392   if (a2dp_status != A2DP_SUCCESS) {
    393     LOG_ERROR(LOG_TAG, "%s: cannot decode codec information: %d", __func__,
    394               a2dp_status);
    395     return -1;
    396   }
    397 
    398   switch (ldac_cie.channelMode) {
    399     case A2DP_LDAC_CHANNEL_MODE_MONO:
    400     case A2DP_LDAC_CHANNEL_MODE_DUAL:
    401     case A2DP_LDAC_CHANNEL_MODE_STEREO:
    402       return ldac_cie.channelMode;
    403     default:
    404       break;
    405   }
    406 
    407   return -1;
    408 }
    409 
    410 bool A2DP_VendorGetPacketTimestampLdac(UNUSED_ATTR const uint8_t* p_codec_info,
    411                                        const uint8_t* p_data,
    412                                        uint32_t* p_timestamp) {
    413   // TODO: Is this function really codec-specific?
    414   *p_timestamp = *(const uint32_t*)p_data;
    415   return true;
    416 }
    417 
    418 bool A2DP_VendorBuildCodecHeaderLdac(UNUSED_ATTR const uint8_t* p_codec_info,
    419                                      BT_HDR* p_buf,
    420                                      uint16_t frames_per_packet) {
    421   uint8_t* p;
    422 
    423   p_buf->offset -= A2DP_LDAC_MPL_HDR_LEN;
    424   p = (uint8_t*)(p_buf + 1) + p_buf->offset;
    425   p_buf->len += A2DP_LDAC_MPL_HDR_LEN;
    426   A2DP_BuildMediaPayloadHeaderLdac(p, false, false, false,
    427                                    (uint8_t)frames_per_packet);
    428 
    429   return true;
    430 }
    431 
    432 std::string A2DP_VendorCodecInfoStringLdac(const uint8_t* p_codec_info) {
    433   std::stringstream res;
    434   std::string field;
    435   tA2DP_STATUS a2dp_status;
    436   tA2DP_LDAC_CIE ldac_cie;
    437 
    438   a2dp_status = A2DP_ParseInfoLdac(&ldac_cie, p_codec_info, true);
    439   if (a2dp_status != A2DP_SUCCESS) {
    440     res << "A2DP_ParseInfoLdac fail: " << loghex(a2dp_status);
    441     return res.str();
    442   }
    443 
    444   res << "\tname: LDAC\n";
    445 
    446   // Sample frequency
    447   field.clear();
    448   AppendField(&field, (ldac_cie.sampleRate == 0), "NONE");
    449   AppendField(&field, (ldac_cie.sampleRate & A2DP_LDAC_SAMPLING_FREQ_44100),
    450               "44100");
    451   AppendField(&field, (ldac_cie.sampleRate & A2DP_LDAC_SAMPLING_FREQ_48000),
    452               "48000");
    453   AppendField(&field, (ldac_cie.sampleRate & A2DP_LDAC_SAMPLING_FREQ_88200),
    454               "88200");
    455   AppendField(&field, (ldac_cie.sampleRate & A2DP_LDAC_SAMPLING_FREQ_96000),
    456               "96000");
    457   AppendField(&field, (ldac_cie.sampleRate & A2DP_LDAC_SAMPLING_FREQ_176400),
    458               "176400");
    459   AppendField(&field, (ldac_cie.sampleRate & A2DP_LDAC_SAMPLING_FREQ_192000),
    460               "192000");
    461   res << "\tsamp_freq: " << field << " (" << loghex(ldac_cie.sampleRate)
    462       << ")\n";
    463 
    464   // Channel mode
    465   field.clear();
    466   AppendField(&field, (ldac_cie.channelMode == 0), "NONE");
    467   AppendField(&field, (ldac_cie.channelMode & A2DP_LDAC_CHANNEL_MODE_MONO),
    468               "Mono");
    469   AppendField(&field, (ldac_cie.channelMode & A2DP_LDAC_CHANNEL_MODE_DUAL),
    470               "Dual");
    471   AppendField(&field, (ldac_cie.channelMode & A2DP_LDAC_CHANNEL_MODE_STEREO),
    472               "Stereo");
    473   res << "\tch_mode: " << field << " (" << loghex(ldac_cie.channelMode)
    474       << ")\n";
    475 
    476   return res.str();
    477 }
    478 
    479 const tA2DP_ENCODER_INTERFACE* A2DP_VendorGetEncoderInterfaceLdac(
    480     const uint8_t* p_codec_info) {
    481   if (!A2DP_IsVendorSourceCodecValidLdac(p_codec_info)) return NULL;
    482 
    483   return &a2dp_encoder_interface_ldac;
    484 }
    485 
    486 bool A2DP_VendorAdjustCodecLdac(uint8_t* p_codec_info) {
    487   tA2DP_LDAC_CIE cfg_cie;
    488 
    489   // Nothing to do: just verify the codec info is valid
    490   if (A2DP_ParseInfoLdac(&cfg_cie, p_codec_info, true) != A2DP_SUCCESS)
    491     return false;
    492 
    493   return true;
    494 }
    495 
    496 btav_a2dp_codec_index_t A2DP_VendorSourceCodecIndexLdac(
    497     UNUSED_ATTR const uint8_t* p_codec_info) {
    498   return BTAV_A2DP_CODEC_INDEX_SOURCE_LDAC;
    499 }
    500 
    501 const char* A2DP_VendorCodecIndexStrLdac(void) { return "LDAC"; }
    502 
    503 bool A2DP_VendorInitCodecConfigLdac(AvdtpSepConfig* p_cfg) {
    504   if (A2DP_BuildInfoLdac(AVDT_MEDIA_TYPE_AUDIO, &a2dp_ldac_source_caps,
    505                          p_cfg->codec_info) != A2DP_SUCCESS) {
    506     return false;
    507   }
    508 
    509 #if (BTA_AV_CO_CP_SCMS_T == TRUE)
    510   /* Content protection info - support SCMS-T */
    511   uint8_t* p = p_cfg->protect_info;
    512   *p++ = AVDT_CP_LOSC;
    513   UINT16_TO_STREAM(p, AVDT_CP_SCMS_T_ID);
    514   p_cfg->num_protect = 1;
    515 #endif
    516 
    517   return true;
    518 }
    519 
    520 UNUSED_ATTR static void build_codec_config(const tA2DP_LDAC_CIE& config_cie,
    521                                            btav_a2dp_codec_config_t* result) {
    522   if (config_cie.sampleRate & A2DP_LDAC_SAMPLING_FREQ_44100)
    523     result->sample_rate |= BTAV_A2DP_CODEC_SAMPLE_RATE_44100;
    524   if (config_cie.sampleRate & A2DP_LDAC_SAMPLING_FREQ_48000)
    525     result->sample_rate |= BTAV_A2DP_CODEC_SAMPLE_RATE_48000;
    526   if (config_cie.sampleRate & A2DP_LDAC_SAMPLING_FREQ_88200)
    527     result->sample_rate |= BTAV_A2DP_CODEC_SAMPLE_RATE_88200;
    528   if (config_cie.sampleRate & A2DP_LDAC_SAMPLING_FREQ_96000)
    529     result->sample_rate |= BTAV_A2DP_CODEC_SAMPLE_RATE_96000;
    530   if (config_cie.sampleRate & A2DP_LDAC_SAMPLING_FREQ_176400)
    531     result->sample_rate |= BTAV_A2DP_CODEC_SAMPLE_RATE_176400;
    532   if (config_cie.sampleRate & A2DP_LDAC_SAMPLING_FREQ_192000)
    533     result->sample_rate |= BTAV_A2DP_CODEC_SAMPLE_RATE_192000;
    534 
    535   result->bits_per_sample = config_cie.bits_per_sample;
    536 
    537   if (config_cie.channelMode & A2DP_LDAC_CHANNEL_MODE_MONO)
    538     result->channel_mode |= BTAV_A2DP_CODEC_CHANNEL_MODE_MONO;
    539   if (config_cie.channelMode &
    540       (A2DP_LDAC_CHANNEL_MODE_DUAL | A2DP_LDAC_CHANNEL_MODE_STEREO)) {
    541     result->channel_mode |= BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;
    542   }
    543 }
    544 
    545 A2dpCodecConfigLdac::A2dpCodecConfigLdac(
    546     btav_a2dp_codec_priority_t codec_priority)
    547     : A2dpCodecConfig(BTAV_A2DP_CODEC_INDEX_SOURCE_LDAC, "LDAC",
    548                       codec_priority) {
    549   // Compute the local capability
    550   if (a2dp_ldac_source_caps.sampleRate & A2DP_LDAC_SAMPLING_FREQ_44100) {
    551     codec_local_capability_.sample_rate |= BTAV_A2DP_CODEC_SAMPLE_RATE_44100;
    552   }
    553   if (a2dp_ldac_source_caps.sampleRate & A2DP_LDAC_SAMPLING_FREQ_48000) {
    554     codec_local_capability_.sample_rate |= BTAV_A2DP_CODEC_SAMPLE_RATE_48000;
    555   }
    556   if (a2dp_ldac_source_caps.sampleRate & A2DP_LDAC_SAMPLING_FREQ_88200) {
    557     codec_local_capability_.sample_rate |= BTAV_A2DP_CODEC_SAMPLE_RATE_88200;
    558   }
    559   if (a2dp_ldac_source_caps.sampleRate & A2DP_LDAC_SAMPLING_FREQ_96000) {
    560     codec_local_capability_.sample_rate |= BTAV_A2DP_CODEC_SAMPLE_RATE_96000;
    561   }
    562   if (a2dp_ldac_source_caps.sampleRate & A2DP_LDAC_SAMPLING_FREQ_176400) {
    563     codec_local_capability_.sample_rate |= BTAV_A2DP_CODEC_SAMPLE_RATE_176400;
    564   }
    565   if (a2dp_ldac_source_caps.sampleRate & A2DP_LDAC_SAMPLING_FREQ_192000) {
    566     codec_local_capability_.sample_rate |= BTAV_A2DP_CODEC_SAMPLE_RATE_192000;
    567   }
    568   codec_local_capability_.bits_per_sample =
    569       a2dp_ldac_source_caps.bits_per_sample;
    570   if (a2dp_ldac_source_caps.channelMode & A2DP_LDAC_CHANNEL_MODE_MONO) {
    571     codec_local_capability_.channel_mode |= BTAV_A2DP_CODEC_CHANNEL_MODE_MONO;
    572   }
    573   if (a2dp_ldac_source_caps.channelMode & A2DP_LDAC_CHANNEL_MODE_STEREO) {
    574     codec_local_capability_.channel_mode |= BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;
    575   }
    576   if (a2dp_ldac_source_caps.channelMode & A2DP_LDAC_CHANNEL_MODE_DUAL) {
    577     codec_local_capability_.channel_mode |= BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;
    578   }
    579 }
    580 
    581 A2dpCodecConfigLdac::~A2dpCodecConfigLdac() {}
    582 
    583 bool A2dpCodecConfigLdac::init() {
    584   if (!isValid()) return false;
    585 
    586   // Load the encoder
    587   if (!A2DP_VendorLoadEncoderLdac()) {
    588     LOG_ERROR(LOG_TAG, "%s: cannot load the encoder", __func__);
    589     return false;
    590   }
    591 
    592   return true;
    593 }
    594 
    595 bool A2dpCodecConfigLdac::useRtpHeaderMarkerBit() const { return false; }
    596 
    597 //
    598 // Selects the best sample rate from |sampleRate|.
    599 // The result is stored in |p_result| and |p_codec_config|.
    600 // Returns true if a selection was made, otherwise false.
    601 //
    602 static bool select_best_sample_rate(uint8_t sampleRate,
    603                                     tA2DP_LDAC_CIE* p_result,
    604                                     btav_a2dp_codec_config_t* p_codec_config) {
    605   if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_192000) {
    606     p_result->sampleRate = A2DP_LDAC_SAMPLING_FREQ_192000;
    607     p_codec_config->sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_192000;
    608     return true;
    609   }
    610   if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_176400) {
    611     p_result->sampleRate = A2DP_LDAC_SAMPLING_FREQ_176400;
    612     p_codec_config->sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_176400;
    613     return true;
    614   }
    615   if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_96000) {
    616     p_result->sampleRate = A2DP_LDAC_SAMPLING_FREQ_96000;
    617     p_codec_config->sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_96000;
    618     return true;
    619   }
    620   if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_88200) {
    621     p_result->sampleRate = A2DP_LDAC_SAMPLING_FREQ_88200;
    622     p_codec_config->sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_88200;
    623     return true;
    624   }
    625   if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_48000) {
    626     p_result->sampleRate = A2DP_LDAC_SAMPLING_FREQ_48000;
    627     p_codec_config->sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_48000;
    628     return true;
    629   }
    630   if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_44100) {
    631     p_result->sampleRate = A2DP_LDAC_SAMPLING_FREQ_44100;
    632     p_codec_config->sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_44100;
    633     return true;
    634   }
    635   return false;
    636 }
    637 
    638 //
    639 // Selects the audio sample rate from |p_codec_audio_config|.
    640 // |sampleRate| contains the capability.
    641 // The result is stored in |p_result| and |p_codec_config|.
    642 // Returns true if a selection was made, otherwise false.
    643 //
    644 static bool select_audio_sample_rate(
    645     const btav_a2dp_codec_config_t* p_codec_audio_config, uint8_t sampleRate,
    646     tA2DP_LDAC_CIE* p_result, btav_a2dp_codec_config_t* p_codec_config) {
    647   switch (p_codec_audio_config->sample_rate) {
    648     case BTAV_A2DP_CODEC_SAMPLE_RATE_44100:
    649       if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_44100) {
    650         p_result->sampleRate = A2DP_LDAC_SAMPLING_FREQ_44100;
    651         p_codec_config->sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_44100;
    652         return true;
    653       }
    654       break;
    655     case BTAV_A2DP_CODEC_SAMPLE_RATE_48000:
    656       if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_48000) {
    657         p_result->sampleRate = A2DP_LDAC_SAMPLING_FREQ_48000;
    658         p_codec_config->sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_48000;
    659         return true;
    660       }
    661       break;
    662     case BTAV_A2DP_CODEC_SAMPLE_RATE_88200:
    663       if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_88200) {
    664         p_result->sampleRate = A2DP_LDAC_SAMPLING_FREQ_88200;
    665         p_codec_config->sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_88200;
    666         return true;
    667       }
    668       break;
    669     case BTAV_A2DP_CODEC_SAMPLE_RATE_96000:
    670       if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_96000) {
    671         p_result->sampleRate = A2DP_LDAC_SAMPLING_FREQ_96000;
    672         p_codec_config->sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_96000;
    673         return true;
    674       }
    675       break;
    676     case BTAV_A2DP_CODEC_SAMPLE_RATE_176400:
    677       if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_176400) {
    678         p_result->sampleRate = A2DP_LDAC_SAMPLING_FREQ_176400;
    679         p_codec_config->sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_176400;
    680         return true;
    681       }
    682       break;
    683     case BTAV_A2DP_CODEC_SAMPLE_RATE_192000:
    684       if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_192000) {
    685         p_result->sampleRate = A2DP_LDAC_SAMPLING_FREQ_192000;
    686         p_codec_config->sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_192000;
    687         return true;
    688       }
    689       break;
    690     case BTAV_A2DP_CODEC_SAMPLE_RATE_16000:
    691     case BTAV_A2DP_CODEC_SAMPLE_RATE_24000:
    692     case BTAV_A2DP_CODEC_SAMPLE_RATE_NONE:
    693       break;
    694   }
    695   return false;
    696 }
    697 
    698 //
    699 // Selects the best bits per sample from |bits_per_sample|.
    700 // |bits_per_sample| contains the capability.
    701 // The result is stored in |p_result| and |p_codec_config|.
    702 // Returns true if a selection was made, otherwise false.
    703 //
    704 static bool select_best_bits_per_sample(
    705     btav_a2dp_codec_bits_per_sample_t bits_per_sample, tA2DP_LDAC_CIE* p_result,
    706     btav_a2dp_codec_config_t* p_codec_config) {
    707   if (bits_per_sample & BTAV_A2DP_CODEC_BITS_PER_SAMPLE_32) {
    708     p_codec_config->bits_per_sample = BTAV_A2DP_CODEC_BITS_PER_SAMPLE_32;
    709     p_result->bits_per_sample = BTAV_A2DP_CODEC_BITS_PER_SAMPLE_32;
    710     return true;
    711   }
    712   if (bits_per_sample & BTAV_A2DP_CODEC_BITS_PER_SAMPLE_24) {
    713     p_codec_config->bits_per_sample = BTAV_A2DP_CODEC_BITS_PER_SAMPLE_24;
    714     p_result->bits_per_sample = BTAV_A2DP_CODEC_BITS_PER_SAMPLE_24;
    715     return true;
    716   }
    717   if (bits_per_sample & BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16) {
    718     p_codec_config->bits_per_sample = BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16;
    719     p_result->bits_per_sample = BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16;
    720     return true;
    721   }
    722   return false;
    723 }
    724 
    725 //
    726 // Selects the audio bits per sample from |p_codec_audio_config|.
    727 // |bits_per_sample| contains the capability.
    728 // The result is stored in |p_result| and |p_codec_config|.
    729 // Returns true if a selection was made, otherwise false.
    730 //
    731 static bool select_audio_bits_per_sample(
    732     const btav_a2dp_codec_config_t* p_codec_audio_config,
    733     btav_a2dp_codec_bits_per_sample_t bits_per_sample, tA2DP_LDAC_CIE* p_result,
    734     btav_a2dp_codec_config_t* p_codec_config) {
    735   switch (p_codec_audio_config->bits_per_sample) {
    736     case BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16:
    737       if (bits_per_sample & BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16) {
    738         p_codec_config->bits_per_sample = BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16;
    739         p_result->bits_per_sample = BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16;
    740         return true;
    741       }
    742       break;
    743     case BTAV_A2DP_CODEC_BITS_PER_SAMPLE_24:
    744       if (bits_per_sample & BTAV_A2DP_CODEC_BITS_PER_SAMPLE_24) {
    745         p_codec_config->bits_per_sample = BTAV_A2DP_CODEC_BITS_PER_SAMPLE_24;
    746         p_result->bits_per_sample = BTAV_A2DP_CODEC_BITS_PER_SAMPLE_24;
    747         return true;
    748       }
    749       break;
    750     case BTAV_A2DP_CODEC_BITS_PER_SAMPLE_32:
    751       if (bits_per_sample & BTAV_A2DP_CODEC_BITS_PER_SAMPLE_32) {
    752         p_codec_config->bits_per_sample = BTAV_A2DP_CODEC_BITS_PER_SAMPLE_32;
    753         p_result->bits_per_sample = BTAV_A2DP_CODEC_BITS_PER_SAMPLE_32;
    754         return true;
    755       }
    756       break;
    757     case BTAV_A2DP_CODEC_BITS_PER_SAMPLE_NONE:
    758       break;
    759   }
    760   return false;
    761 }
    762 
    763 //
    764 // Selects the best channel mode from |channelMode|.
    765 // The result is stored in |p_result| and |p_codec_config|.
    766 // Returns true if a selection was made, otherwise false.
    767 //
    768 static bool select_best_channel_mode(uint8_t channelMode,
    769                                      tA2DP_LDAC_CIE* p_result,
    770                                      btav_a2dp_codec_config_t* p_codec_config) {
    771   if (channelMode & A2DP_LDAC_CHANNEL_MODE_STEREO) {
    772     p_result->channelMode = A2DP_LDAC_CHANNEL_MODE_STEREO;
    773     p_codec_config->channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;
    774     return true;
    775   }
    776   if (channelMode & A2DP_LDAC_CHANNEL_MODE_DUAL) {
    777     p_result->channelMode = A2DP_LDAC_CHANNEL_MODE_DUAL;
    778     p_codec_config->channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;
    779     return true;
    780   }
    781   if (channelMode & A2DP_LDAC_CHANNEL_MODE_MONO) {
    782     p_result->channelMode = A2DP_LDAC_CHANNEL_MODE_MONO;
    783     p_codec_config->channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_MONO;
    784     return true;
    785   }
    786   return false;
    787 }
    788 
    789 //
    790 // Selects the audio channel mode from |p_codec_audio_config|.
    791 // |channelMode| contains the capability.
    792 // The result is stored in |p_result| and |p_codec_config|.
    793 // Returns true if a selection was made, otherwise false.
    794 //
    795 static bool select_audio_channel_mode(
    796     const btav_a2dp_codec_config_t* p_codec_audio_config, uint8_t channelMode,
    797     tA2DP_LDAC_CIE* p_result, btav_a2dp_codec_config_t* p_codec_config) {
    798   switch (p_codec_audio_config->channel_mode) {
    799     case BTAV_A2DP_CODEC_CHANNEL_MODE_MONO:
    800       if (channelMode & A2DP_LDAC_CHANNEL_MODE_MONO) {
    801         p_result->channelMode = A2DP_LDAC_CHANNEL_MODE_MONO;
    802         p_codec_config->channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_MONO;
    803         return true;
    804       }
    805       break;
    806     case BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO:
    807       if (channelMode & A2DP_LDAC_CHANNEL_MODE_STEREO) {
    808         p_result->channelMode = A2DP_LDAC_CHANNEL_MODE_STEREO;
    809         p_codec_config->channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;
    810         return true;
    811       }
    812       if (channelMode & A2DP_LDAC_CHANNEL_MODE_DUAL) {
    813         p_result->channelMode = A2DP_LDAC_CHANNEL_MODE_DUAL;
    814         p_codec_config->channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;
    815         return true;
    816       }
    817       break;
    818     case BTAV_A2DP_CODEC_CHANNEL_MODE_NONE:
    819       break;
    820   }
    821 
    822   return false;
    823 }
    824 
    825 bool A2dpCodecConfigLdac::setCodecConfig(const uint8_t* p_peer_codec_info,
    826                                          bool is_capability,
    827                                          uint8_t* p_result_codec_config) {
    828   std::lock_guard<std::recursive_mutex> lock(codec_mutex_);
    829   tA2DP_LDAC_CIE peer_info_cie;
    830   tA2DP_LDAC_CIE result_config_cie;
    831   uint8_t channelMode;
    832   uint8_t sampleRate;
    833   btav_a2dp_codec_bits_per_sample_t bits_per_sample;
    834 
    835   // Save the internal state
    836   btav_a2dp_codec_config_t saved_codec_config = codec_config_;
    837   btav_a2dp_codec_config_t saved_codec_capability = codec_capability_;
    838   btav_a2dp_codec_config_t saved_codec_selectable_capability =
    839       codec_selectable_capability_;
    840   btav_a2dp_codec_config_t saved_codec_user_config = codec_user_config_;
    841   btav_a2dp_codec_config_t saved_codec_audio_config = codec_audio_config_;
    842   uint8_t saved_ota_codec_config[AVDT_CODEC_SIZE];
    843   uint8_t saved_ota_codec_peer_capability[AVDT_CODEC_SIZE];
    844   uint8_t saved_ota_codec_peer_config[AVDT_CODEC_SIZE];
    845   memcpy(saved_ota_codec_config, ota_codec_config_, sizeof(ota_codec_config_));
    846   memcpy(saved_ota_codec_peer_capability, ota_codec_peer_capability_,
    847          sizeof(ota_codec_peer_capability_));
    848   memcpy(saved_ota_codec_peer_config, ota_codec_peer_config_,
    849          sizeof(ota_codec_peer_config_));
    850 
    851   tA2DP_STATUS status =
    852       A2DP_ParseInfoLdac(&peer_info_cie, p_peer_codec_info, is_capability);
    853   if (status != A2DP_SUCCESS) {
    854     LOG_ERROR(LOG_TAG, "%s: can't parse peer's capabilities: error = %d",
    855               __func__, status);
    856     goto fail;
    857   }
    858 
    859   //
    860   // Build the preferred configuration
    861   //
    862   memset(&result_config_cie, 0, sizeof(result_config_cie));
    863   result_config_cie.vendorId = a2dp_ldac_source_caps.vendorId;
    864   result_config_cie.codecId = a2dp_ldac_source_caps.codecId;
    865 
    866   //
    867   // Select the sample frequency
    868   //
    869   sampleRate = a2dp_ldac_source_caps.sampleRate & peer_info_cie.sampleRate;
    870   codec_config_.sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_NONE;
    871   switch (codec_user_config_.sample_rate) {
    872     case BTAV_A2DP_CODEC_SAMPLE_RATE_44100:
    873       if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_44100) {
    874         result_config_cie.sampleRate = A2DP_LDAC_SAMPLING_FREQ_44100;
    875         codec_capability_.sample_rate = codec_user_config_.sample_rate;
    876         codec_config_.sample_rate = codec_user_config_.sample_rate;
    877       }
    878       break;
    879     case BTAV_A2DP_CODEC_SAMPLE_RATE_48000:
    880       if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_48000) {
    881         result_config_cie.sampleRate = A2DP_LDAC_SAMPLING_FREQ_48000;
    882         codec_capability_.sample_rate = codec_user_config_.sample_rate;
    883         codec_config_.sample_rate = codec_user_config_.sample_rate;
    884       }
    885       break;
    886     case BTAV_A2DP_CODEC_SAMPLE_RATE_88200:
    887       if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_88200) {
    888         result_config_cie.sampleRate = A2DP_LDAC_SAMPLING_FREQ_88200;
    889         codec_capability_.sample_rate = codec_user_config_.sample_rate;
    890         codec_config_.sample_rate = codec_user_config_.sample_rate;
    891       }
    892       break;
    893     case BTAV_A2DP_CODEC_SAMPLE_RATE_96000:
    894       if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_96000) {
    895         result_config_cie.sampleRate = A2DP_LDAC_SAMPLING_FREQ_96000;
    896         codec_capability_.sample_rate = codec_user_config_.sample_rate;
    897         codec_config_.sample_rate = codec_user_config_.sample_rate;
    898       }
    899       break;
    900     case BTAV_A2DP_CODEC_SAMPLE_RATE_176400:
    901       if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_176400) {
    902         result_config_cie.sampleRate = A2DP_LDAC_SAMPLING_FREQ_176400;
    903         codec_capability_.sample_rate = codec_user_config_.sample_rate;
    904         codec_config_.sample_rate = codec_user_config_.sample_rate;
    905       }
    906       break;
    907     case BTAV_A2DP_CODEC_SAMPLE_RATE_192000:
    908       if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_192000) {
    909         result_config_cie.sampleRate = A2DP_LDAC_SAMPLING_FREQ_192000;
    910         codec_capability_.sample_rate = codec_user_config_.sample_rate;
    911         codec_config_.sample_rate = codec_user_config_.sample_rate;
    912       }
    913     case BTAV_A2DP_CODEC_SAMPLE_RATE_16000:
    914     case BTAV_A2DP_CODEC_SAMPLE_RATE_24000:
    915     case BTAV_A2DP_CODEC_SAMPLE_RATE_NONE:
    916       codec_capability_.sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_NONE;
    917       codec_config_.sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_NONE;
    918       break;
    919   }
    920 
    921   // Select the sample frequency if there is no user preference
    922   do {
    923     // Compute the selectable capability
    924     if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_44100) {
    925       codec_selectable_capability_.sample_rate |=
    926           BTAV_A2DP_CODEC_SAMPLE_RATE_44100;
    927     }
    928     if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_48000) {
    929       codec_selectable_capability_.sample_rate |=
    930           BTAV_A2DP_CODEC_SAMPLE_RATE_48000;
    931     }
    932     if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_88200) {
    933       codec_selectable_capability_.sample_rate |=
    934           BTAV_A2DP_CODEC_SAMPLE_RATE_88200;
    935     }
    936     if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_96000) {
    937       codec_selectable_capability_.sample_rate |=
    938           BTAV_A2DP_CODEC_SAMPLE_RATE_96000;
    939     }
    940     if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_176400) {
    941       codec_selectable_capability_.sample_rate |=
    942           BTAV_A2DP_CODEC_SAMPLE_RATE_176400;
    943     }
    944     if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_192000) {
    945       codec_selectable_capability_.sample_rate |=
    946           BTAV_A2DP_CODEC_SAMPLE_RATE_192000;
    947     }
    948 
    949     if (codec_config_.sample_rate != BTAV_A2DP_CODEC_SAMPLE_RATE_NONE) break;
    950 
    951     // Compute the common capability
    952     if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_44100)
    953       codec_capability_.sample_rate |= BTAV_A2DP_CODEC_SAMPLE_RATE_44100;
    954     if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_48000)
    955       codec_capability_.sample_rate |= BTAV_A2DP_CODEC_SAMPLE_RATE_48000;
    956     if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_88200)
    957       codec_capability_.sample_rate |= BTAV_A2DP_CODEC_SAMPLE_RATE_88200;
    958     if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_96000)
    959       codec_capability_.sample_rate |= BTAV_A2DP_CODEC_SAMPLE_RATE_96000;
    960     if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_176400)
    961       codec_capability_.sample_rate |= BTAV_A2DP_CODEC_SAMPLE_RATE_176400;
    962     if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_192000)
    963       codec_capability_.sample_rate |= BTAV_A2DP_CODEC_SAMPLE_RATE_192000;
    964 
    965     // No user preference - try the codec audio config
    966     if (select_audio_sample_rate(&codec_audio_config_, sampleRate,
    967                                  &result_config_cie, &codec_config_)) {
    968       break;
    969     }
    970 
    971     // No user preference - try the default config
    972     if (select_best_sample_rate(
    973             a2dp_ldac_default_config.sampleRate & peer_info_cie.sampleRate,
    974             &result_config_cie, &codec_config_)) {
    975       break;
    976     }
    977 
    978     // No user preference - use the best match
    979     if (select_best_sample_rate(sampleRate, &result_config_cie,
    980                                 &codec_config_)) {
    981       break;
    982     }
    983   } while (false);
    984   if (codec_config_.sample_rate == BTAV_A2DP_CODEC_SAMPLE_RATE_NONE) {
    985     LOG_ERROR(LOG_TAG,
    986               "%s: cannot match sample frequency: local caps = 0x%x "
    987               "peer info = 0x%x",
    988               __func__, a2dp_ldac_source_caps.sampleRate,
    989               peer_info_cie.sampleRate);
    990     goto fail;
    991   }
    992 
    993   //
    994   // Select the bits per sample
    995   //
    996   // NOTE: this information is NOT included in the LDAC A2DP codec description
    997   // that is sent OTA.
    998   bits_per_sample = a2dp_ldac_source_caps.bits_per_sample;
    999   codec_config_.bits_per_sample = BTAV_A2DP_CODEC_BITS_PER_SAMPLE_NONE;
   1000   switch (codec_user_config_.bits_per_sample) {
   1001     case BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16:
   1002       if (bits_per_sample & BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16) {
   1003         result_config_cie.bits_per_sample = codec_user_config_.bits_per_sample;
   1004         codec_capability_.bits_per_sample = codec_user_config_.bits_per_sample;
   1005         codec_config_.bits_per_sample = codec_user_config_.bits_per_sample;
   1006       }
   1007       break;
   1008     case BTAV_A2DP_CODEC_BITS_PER_SAMPLE_24:
   1009       if (bits_per_sample & BTAV_A2DP_CODEC_BITS_PER_SAMPLE_24) {
   1010         result_config_cie.bits_per_sample = codec_user_config_.bits_per_sample;
   1011         codec_capability_.bits_per_sample = codec_user_config_.bits_per_sample;
   1012         codec_config_.bits_per_sample = codec_user_config_.bits_per_sample;
   1013       }
   1014       break;
   1015     case BTAV_A2DP_CODEC_BITS_PER_SAMPLE_32:
   1016       if (bits_per_sample & BTAV_A2DP_CODEC_BITS_PER_SAMPLE_32) {
   1017         result_config_cie.bits_per_sample = codec_user_config_.bits_per_sample;
   1018         codec_capability_.bits_per_sample = codec_user_config_.bits_per_sample;
   1019         codec_config_.bits_per_sample = codec_user_config_.bits_per_sample;
   1020       }
   1021       break;
   1022     case BTAV_A2DP_CODEC_BITS_PER_SAMPLE_NONE:
   1023       result_config_cie.bits_per_sample = BTAV_A2DP_CODEC_BITS_PER_SAMPLE_NONE;
   1024       codec_capability_.bits_per_sample = BTAV_A2DP_CODEC_BITS_PER_SAMPLE_NONE;
   1025       codec_config_.bits_per_sample = BTAV_A2DP_CODEC_BITS_PER_SAMPLE_NONE;
   1026       break;
   1027   }
   1028 
   1029   // Select the bits per sample if there is no user preference
   1030   do {
   1031     // Compute the selectable capability
   1032     codec_selectable_capability_.bits_per_sample =
   1033         a2dp_ldac_source_caps.bits_per_sample;
   1034 
   1035     if (codec_config_.bits_per_sample != BTAV_A2DP_CODEC_BITS_PER_SAMPLE_NONE)
   1036       break;
   1037 
   1038     // Compute the common capability
   1039     codec_capability_.bits_per_sample = bits_per_sample;
   1040 
   1041     // No user preference - the the codec audio config
   1042     if (select_audio_bits_per_sample(&codec_audio_config_,
   1043                                      a2dp_ldac_source_caps.bits_per_sample,
   1044                                      &result_config_cie, &codec_config_)) {
   1045       break;
   1046     }
   1047 
   1048     // No user preference - try the default config
   1049     if (select_best_bits_per_sample(a2dp_ldac_default_config.bits_per_sample,
   1050                                     &result_config_cie, &codec_config_)) {
   1051       break;
   1052     }
   1053 
   1054     // No user preference - use the best match
   1055     if (select_best_bits_per_sample(a2dp_ldac_source_caps.bits_per_sample,
   1056                                     &result_config_cie, &codec_config_)) {
   1057       break;
   1058     }
   1059   } while (false);
   1060   if (codec_config_.bits_per_sample == BTAV_A2DP_CODEC_BITS_PER_SAMPLE_NONE) {
   1061     LOG_ERROR(LOG_TAG,
   1062               "%s: cannot match bits per sample: default = 0x%x "
   1063               "user preference = 0x%x",
   1064               __func__, a2dp_ldac_default_config.bits_per_sample,
   1065               codec_user_config_.bits_per_sample);
   1066     goto fail;
   1067   }
   1068 
   1069   //
   1070   // Select the channel mode
   1071   //
   1072   channelMode = a2dp_ldac_source_caps.channelMode & peer_info_cie.channelMode;
   1073   codec_config_.channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_NONE;
   1074   switch (codec_user_config_.channel_mode) {
   1075     case BTAV_A2DP_CODEC_CHANNEL_MODE_MONO:
   1076       if (channelMode & A2DP_LDAC_CHANNEL_MODE_MONO) {
   1077         result_config_cie.channelMode = A2DP_LDAC_CHANNEL_MODE_MONO;
   1078         codec_capability_.channel_mode = codec_user_config_.channel_mode;
   1079         codec_config_.channel_mode = codec_user_config_.channel_mode;
   1080       }
   1081       break;
   1082     case BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO:
   1083       if (channelMode & A2DP_LDAC_CHANNEL_MODE_STEREO) {
   1084         result_config_cie.channelMode = A2DP_LDAC_CHANNEL_MODE_STEREO;
   1085         codec_capability_.channel_mode = codec_user_config_.channel_mode;
   1086         codec_config_.channel_mode = codec_user_config_.channel_mode;
   1087         break;
   1088       }
   1089       if (channelMode & A2DP_LDAC_CHANNEL_MODE_DUAL) {
   1090         result_config_cie.channelMode = A2DP_LDAC_CHANNEL_MODE_DUAL;
   1091         codec_capability_.channel_mode = codec_user_config_.channel_mode;
   1092         codec_config_.channel_mode = codec_user_config_.channel_mode;
   1093         break;
   1094       }
   1095       break;
   1096     case BTAV_A2DP_CODEC_CHANNEL_MODE_NONE:
   1097       codec_capability_.channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_NONE;
   1098       codec_config_.channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_NONE;
   1099       break;
   1100   }
   1101 
   1102   // Select the channel mode if there is no user preference
   1103   do {
   1104     // Compute the selectable capability
   1105     if (channelMode & A2DP_LDAC_CHANNEL_MODE_MONO) {
   1106       codec_selectable_capability_.channel_mode |=
   1107           BTAV_A2DP_CODEC_CHANNEL_MODE_MONO;
   1108     }
   1109     if (channelMode & A2DP_LDAC_CHANNEL_MODE_STEREO) {
   1110       codec_selectable_capability_.channel_mode |=
   1111           BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;
   1112     }
   1113     if (channelMode & A2DP_LDAC_CHANNEL_MODE_DUAL) {
   1114       codec_selectable_capability_.channel_mode |=
   1115           BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;
   1116     }
   1117 
   1118     if (codec_config_.channel_mode != BTAV_A2DP_CODEC_CHANNEL_MODE_NONE) break;
   1119 
   1120     // Compute the common capability
   1121     if (channelMode & A2DP_LDAC_CHANNEL_MODE_MONO)
   1122       codec_capability_.channel_mode |= BTAV_A2DP_CODEC_CHANNEL_MODE_MONO;
   1123     if (channelMode &
   1124         (A2DP_LDAC_CHANNEL_MODE_STEREO | A2DP_LDAC_CHANNEL_MODE_DUAL)) {
   1125       codec_capability_.channel_mode |= BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;
   1126     }
   1127 
   1128     // No user preference - try the codec audio config
   1129     if (select_audio_channel_mode(&codec_audio_config_, channelMode,
   1130                                   &result_config_cie, &codec_config_)) {
   1131       break;
   1132     }
   1133 
   1134     // No user preference - try the default config
   1135     if (select_best_channel_mode(
   1136             a2dp_ldac_default_config.channelMode & peer_info_cie.channelMode,
   1137             &result_config_cie, &codec_config_)) {
   1138       break;
   1139     }
   1140 
   1141     // No user preference - use the best match
   1142     if (select_best_channel_mode(channelMode, &result_config_cie,
   1143                                  &codec_config_)) {
   1144       break;
   1145     }
   1146   } while (false);
   1147   if (codec_config_.channel_mode == BTAV_A2DP_CODEC_CHANNEL_MODE_NONE) {
   1148     LOG_ERROR(LOG_TAG,
   1149               "%s: cannot match channel mode: local caps = 0x%x "
   1150               "peer info = 0x%x",
   1151               __func__, a2dp_ldac_source_caps.channelMode,
   1152               peer_info_cie.channelMode);
   1153     goto fail;
   1154   }
   1155 
   1156   if (A2DP_BuildInfoLdac(AVDT_MEDIA_TYPE_AUDIO, &result_config_cie,
   1157                          p_result_codec_config) != A2DP_SUCCESS) {
   1158     goto fail;
   1159   }
   1160 
   1161   //
   1162   // Copy the codec-specific fields if they are not zero
   1163   //
   1164   if (codec_user_config_.codec_specific_1 != 0)
   1165     codec_config_.codec_specific_1 = codec_user_config_.codec_specific_1;
   1166   if (codec_user_config_.codec_specific_2 != 0)
   1167     codec_config_.codec_specific_2 = codec_user_config_.codec_specific_2;
   1168   if (codec_user_config_.codec_specific_3 != 0)
   1169     codec_config_.codec_specific_3 = codec_user_config_.codec_specific_3;
   1170   if (codec_user_config_.codec_specific_4 != 0)
   1171     codec_config_.codec_specific_4 = codec_user_config_.codec_specific_4;
   1172 
   1173   // Create a local copy of the peer codec capability, and the
   1174   // result codec config.
   1175   if (is_capability) {
   1176     status = A2DP_BuildInfoLdac(AVDT_MEDIA_TYPE_AUDIO, &peer_info_cie,
   1177                                 ota_codec_peer_capability_);
   1178   } else {
   1179     status = A2DP_BuildInfoLdac(AVDT_MEDIA_TYPE_AUDIO, &peer_info_cie,
   1180                                 ota_codec_peer_config_);
   1181   }
   1182   CHECK(status == A2DP_SUCCESS);
   1183   status = A2DP_BuildInfoLdac(AVDT_MEDIA_TYPE_AUDIO, &result_config_cie,
   1184                               ota_codec_config_);
   1185   CHECK(status == A2DP_SUCCESS);
   1186   return true;
   1187 
   1188 fail:
   1189   // Restore the internal state
   1190   codec_config_ = saved_codec_config;
   1191   codec_capability_ = saved_codec_capability;
   1192   codec_selectable_capability_ = saved_codec_selectable_capability;
   1193   codec_user_config_ = saved_codec_user_config;
   1194   codec_audio_config_ = saved_codec_audio_config;
   1195   memcpy(ota_codec_config_, saved_ota_codec_config, sizeof(ota_codec_config_));
   1196   memcpy(ota_codec_peer_capability_, saved_ota_codec_peer_capability,
   1197          sizeof(ota_codec_peer_capability_));
   1198   memcpy(ota_codec_peer_config_, saved_ota_codec_peer_config,
   1199          sizeof(ota_codec_peer_config_));
   1200   return false;
   1201 }
   1202 
   1203 bool A2dpCodecConfigLdac::setPeerCodecCapabilities(
   1204     const uint8_t* p_peer_codec_capabilities) {
   1205   std::lock_guard<std::recursive_mutex> lock(codec_mutex_);
   1206   tA2DP_LDAC_CIE peer_info_cie;
   1207   uint8_t channelMode;
   1208   uint8_t sampleRate;
   1209 
   1210   // Save the internal state
   1211   btav_a2dp_codec_config_t saved_codec_selectable_capability =
   1212       codec_selectable_capability_;
   1213   uint8_t saved_ota_codec_peer_capability[AVDT_CODEC_SIZE];
   1214   memcpy(saved_ota_codec_peer_capability, ota_codec_peer_capability_,
   1215          sizeof(ota_codec_peer_capability_));
   1216 
   1217   tA2DP_STATUS status =
   1218       A2DP_ParseInfoLdac(&peer_info_cie, p_peer_codec_capabilities, true);
   1219   if (status != A2DP_SUCCESS) {
   1220     LOG_ERROR(LOG_TAG, "%s: can't parse peer's capabilities: error = %d",
   1221               __func__, status);
   1222     goto fail;
   1223   }
   1224 
   1225   // Compute the selectable capability - sample rate
   1226   sampleRate = a2dp_ldac_source_caps.sampleRate & peer_info_cie.sampleRate;
   1227   if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_44100) {
   1228     codec_selectable_capability_.sample_rate |=
   1229         BTAV_A2DP_CODEC_SAMPLE_RATE_44100;
   1230   }
   1231   if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_48000) {
   1232     codec_selectable_capability_.sample_rate |=
   1233         BTAV_A2DP_CODEC_SAMPLE_RATE_48000;
   1234   }
   1235   if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_88200) {
   1236     codec_selectable_capability_.sample_rate |=
   1237         BTAV_A2DP_CODEC_SAMPLE_RATE_88200;
   1238   }
   1239   if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_96000) {
   1240     codec_selectable_capability_.sample_rate |=
   1241         BTAV_A2DP_CODEC_SAMPLE_RATE_96000;
   1242   }
   1243   if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_176400) {
   1244     codec_selectable_capability_.sample_rate |=
   1245         BTAV_A2DP_CODEC_SAMPLE_RATE_176400;
   1246   }
   1247   if (sampleRate & A2DP_LDAC_SAMPLING_FREQ_192000) {
   1248     codec_selectable_capability_.sample_rate |=
   1249         BTAV_A2DP_CODEC_SAMPLE_RATE_192000;
   1250   }
   1251 
   1252   // Compute the selectable capability - bits per sample
   1253   codec_selectable_capability_.bits_per_sample =
   1254       a2dp_ldac_source_caps.bits_per_sample;
   1255 
   1256   // Compute the selectable capability - channel mode
   1257   channelMode = a2dp_ldac_source_caps.channelMode & peer_info_cie.channelMode;
   1258   if (channelMode & A2DP_LDAC_CHANNEL_MODE_MONO) {
   1259     codec_selectable_capability_.channel_mode |=
   1260         BTAV_A2DP_CODEC_CHANNEL_MODE_MONO;
   1261   }
   1262   if (channelMode & A2DP_LDAC_CHANNEL_MODE_STEREO) {
   1263     codec_selectable_capability_.channel_mode |=
   1264         BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;
   1265   }
   1266   if (channelMode & A2DP_LDAC_CHANNEL_MODE_DUAL) {
   1267     codec_selectable_capability_.channel_mode |=
   1268         BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;
   1269   }
   1270 
   1271   status = A2DP_BuildInfoLdac(AVDT_MEDIA_TYPE_AUDIO, &peer_info_cie,
   1272                               ota_codec_peer_capability_);
   1273   CHECK(status == A2DP_SUCCESS);
   1274   return true;
   1275 
   1276 fail:
   1277   // Restore the internal state
   1278   codec_selectable_capability_ = saved_codec_selectable_capability;
   1279   memcpy(ota_codec_peer_capability_, saved_ota_codec_peer_capability,
   1280          sizeof(ota_codec_peer_capability_));
   1281   return false;
   1282 }
   1283