Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3e00585b authored by Cheney Ni's avatar Cheney Ni
Browse files

A2DP: Restrict MTU while using SBC middle quality

When SBC headsets report middle quality bitpool under a larger MTU, we
reduce the packet size to prevent the hardware encoder from putting too
many frames in one packet.

Bug: 188020925
Tag: #compatibility
Test: A2DP playback with SBC manually
Change-Id: I164c0c1fe37d6852718889e2946207471b26e5bd
Merged-In: I164c0c1fe37d6852718889e2946207471b26e5bd
(cherry picked from commit 805ca9ca336db6ac6df1ba74dbc74cb7868bf4d6)
parent 039a371a
Loading
Loading
Loading
Loading
+6 −1
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@
#include "client_interface.h"
#include "client_interface.h"
#include "codec_status.h"
#include "codec_status.h"


#include "a2dp_sbc_constants.h"
#include "btif_a2dp_source.h"
#include "btif_a2dp_source.h"
#include "btif_av.h"
#include "btif_av.h"
#include "btif_av_co.h"
#include "btif_av_co.h"
@@ -282,7 +283,11 @@ bool a2dp_get_selected_hal_codec_config(CodecConfiguration* codec_config) {
  } else {
  } else {
    codec_config->peerMtu = peer_param.peer_mtu;
    codec_config->peerMtu = peer_param.peer_mtu;
  }
  }
  if (codec_config->peerMtu > MAX_3MBPS_AVDTP_MTU) {
  if (current_codec.codec_type == BTAV_A2DP_CODEC_INDEX_SOURCE_SBC &&
      codec_config->config.sbcConfig().maxBitpool <=
          A2DP_SBC_BITPOOL_MIDDLE_QUALITY) {
    codec_config->peerMtu = MAX_2MBPS_AVDTP_MTU;
  } else if (codec_config->peerMtu > MAX_3MBPS_AVDTP_MTU) {
    codec_config->peerMtu = MAX_3MBPS_AVDTP_MTU;
    codec_config->peerMtu = MAX_3MBPS_AVDTP_MTU;
  }
  }
  LOG(INFO) << __func__ << ": CodecConfiguration=" << toString(*codec_config);
  LOG(INFO) << __func__ << ": CodecConfiguration=" << toString(*codec_config);
+1 −3
Original line number Original line Diff line number Diff line
@@ -82,8 +82,6 @@ constexpr char kBtmLogTag[] = "A2DP";
/* ACL quota we are letting FW use for A2DP Offload Tx. */
/* ACL quota we are letting FW use for A2DP Offload Tx. */
#define BTA_AV_A2DP_OFFLOAD_XMIT_QUOTA 4
#define BTA_AV_A2DP_OFFLOAD_XMIT_QUOTA 4


#define BTIF_A2DP_MAX_BITPOOL_MQ 35

static void bta_av_offload_codec_builder(tBTA_AV_SCB* p_scb,
static void bta_av_offload_codec_builder(tBTA_AV_SCB* p_scb,
                                         tBT_A2DP_OFFLOAD* p_a2dp_offload);
                                         tBT_A2DP_OFFLOAD* p_a2dp_offload);


@@ -3156,7 +3154,7 @@ static void bta_av_offload_codec_builder(tBTA_AV_SCB* p_scb,
    case BTAV_A2DP_CODEC_INDEX_SOURCE_SBC:
    case BTAV_A2DP_CODEC_INDEX_SOURCE_SBC:
      codec_type = BTA_AV_CODEC_TYPE_SBC;
      codec_type = BTA_AV_CODEC_TYPE_SBC;
      if (A2DP_GetMaxBitpoolSbc(p_scb->cfg.codec_info) <=
      if (A2DP_GetMaxBitpoolSbc(p_scb->cfg.codec_info) <=
          BTIF_A2DP_MAX_BITPOOL_MQ) {
          A2DP_SBC_BITPOOL_MIDDLE_QUALITY) {
        APPL_TRACE_WARNING("%s: Restricting streaming MTU size for MQ Bitpool",
        APPL_TRACE_WARNING("%s: Restricting streaming MTU size for MQ Bitpool",
                           __func__);
                           __func__);
        mtu = MAX_2MBPS_AVDTP_MTU;
        mtu = MAX_2MBPS_AVDTP_MTU;
+17 −0
Original line number Original line Diff line number Diff line
@@ -903,6 +903,23 @@ void A2dpCodecConfigSbcSource::debug_codec_dump(int fd) {


  A2dpCodecConfig::debug_codec_dump(fd);
  A2dpCodecConfig::debug_codec_dump(fd);


  uint8_t codec_info[AVDT_CODEC_SIZE];
  if (copyOutOtaCodecConfig(codec_info)) {
    dprintf(fd,
            "  Block length                                            : %d\n",
            A2DP_GetNumberOfBlocksSbc(codec_info));
    dprintf(fd,
            "  Number of subbands                                      : %d\n",
            A2DP_GetNumberOfSubbandsSbc(codec_info));
    dprintf(fd,
            "  Allocation method                                       : %d\n",
            A2DP_GetAllocationMethodCodeSbc(codec_info));
    dprintf(
        fd,
        "  Bitpool (min/max)                                       : %d / %d\n",
        A2DP_GetMinBitpoolSbc(codec_info), A2DP_GetMaxBitpoolSbc(codec_info));
  }

  dprintf(fd,
  dprintf(fd,
          "  Packet counts (expected/dropped)                        : %zu / "
          "  Packet counts (expected/dropped)                        : %zu / "
          "%zu\n",
          "%zu\n",
+1 −0
Original line number Original line Diff line number Diff line
@@ -61,6 +61,7 @@


#define A2DP_SBC_IE_MIN_BITPOOL 2
#define A2DP_SBC_IE_MIN_BITPOOL 2
#define A2DP_SBC_IE_MAX_BITPOOL 250
#define A2DP_SBC_IE_MAX_BITPOOL 250
#define A2DP_SBC_BITPOOL_MIDDLE_QUALITY 35


/* for media payload header */
/* for media payload header */
#define A2DP_SBC_HDR_F_MSK 0x80
#define A2DP_SBC_HDR_F_MSK 0x80