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

Commit 437d95c3 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "A2DP: Use codec_specific_1 to report AAC bitrate mode to upper layer"

parents 642b6304 145043f1
Loading
Loading
Loading
Loading
+57 −7
Original line number Diff line number Diff line
@@ -1056,6 +1056,14 @@ bool A2dpCodecConfigAacBase::setCodecConfig(const uint8_t* p_peer_codec_info,
  result_config_cie.variableBitRateSupport =
      p_a2dp_aac_caps->variableBitRateSupport &
      peer_info_cie.variableBitRateSupport;
  if (result_config_cie.variableBitRateSupport !=
      A2DP_AAC_VARIABLE_BIT_RATE_DISABLED) {
    codec_config_.codec_specific_1 =
        static_cast<int64_t>(AacEncoderBitrateMode::AACENC_BR_MODE_VBR_5);
  } else {
    codec_config_.codec_specific_1 =
        static_cast<int64_t>(AacEncoderBitrateMode::AACENC_BR_MODE_CBR);
  }

  // Set the bit rate as follows:
  // 1. If the remote device reports a bogus bit rate
@@ -1327,16 +1335,41 @@ bool A2dpCodecConfigAacBase::setCodecConfig(const uint8_t* p_peer_codec_info,
    goto fail;
  }

  if (A2DP_BuildInfoAac(AVDT_MEDIA_TYPE_AUDIO, &result_config_cie,
                        p_result_codec_config) != A2DP_SUCCESS) {
    goto fail;
  }

  //
  // Copy the codec-specific fields if they are not zero
  //
  if (codec_user_config_.codec_specific_1 != 0)
  if (codec_user_config_.codec_specific_1 != 0) {
    if (result_config_cie.variableBitRateSupport !=
        A2DP_AAC_VARIABLE_BIT_RATE_DISABLED) {
      auto user_bitrate_mode = codec_user_config_.codec_specific_1;
      switch (static_cast<AacEncoderBitrateMode>(user_bitrate_mode)) {
        case AacEncoderBitrateMode::AACENC_BR_MODE_VBR_C:
          // VBR is supported, and is disabled by the user preference
          result_config_cie.variableBitRateSupport =
              A2DP_AAC_VARIABLE_BIT_RATE_DISABLED;
          [[fallthrough]];
        case AacEncoderBitrateMode::AACENC_BR_MODE_VBR_1:
          [[fallthrough]];
        case AacEncoderBitrateMode::AACENC_BR_MODE_VBR_2:
          [[fallthrough]];
        case AacEncoderBitrateMode::AACENC_BR_MODE_VBR_3:
          [[fallthrough]];
        case AacEncoderBitrateMode::AACENC_BR_MODE_VBR_4:
          [[fallthrough]];
        case AacEncoderBitrateMode::AACENC_BR_MODE_VBR_5:
          codec_config_.codec_specific_1 = codec_user_config_.codec_specific_1;
          break;
        default:
          codec_config_.codec_specific_1 =
              static_cast<int64_t>(AacEncoderBitrateMode::AACENC_BR_MODE_VBR_5);
      }
    } else {
      // It is no needed to check the user preference when Variable Bitrate
      // unsupported by one of source or sink
      codec_config_.codec_specific_1 =
          static_cast<int64_t>(AacEncoderBitrateMode::AACENC_BR_MODE_CBR);
    }
  }
  if (codec_user_config_.codec_specific_2 != 0)
    codec_config_.codec_specific_2 = codec_user_config_.codec_specific_2;
  if (codec_user_config_.codec_specific_3 != 0)
@@ -1344,6 +1377,11 @@ bool A2dpCodecConfigAacBase::setCodecConfig(const uint8_t* p_peer_codec_info,
  if (codec_user_config_.codec_specific_4 != 0)
    codec_config_.codec_specific_4 = codec_user_config_.codec_specific_4;

  if (A2DP_BuildInfoAac(AVDT_MEDIA_TYPE_AUDIO, &result_config_cie,
                        p_result_codec_config) != A2DP_SUCCESS) {
    goto fail;
  }

  // Create a local copy of the peer codec capability/config, and the
  // result codec config.
  if (is_capability) {
@@ -1380,6 +1418,7 @@ bool A2dpCodecConfigAacBase::setPeerCodecCapabilities(
  tA2DP_AAC_CIE peer_info_cie;
  uint8_t channelMode;
  uint16_t sampleRate;
  uint8_t variableBitRateSupport;
  const tA2DP_AAC_CIE* p_a2dp_aac_caps =
      (is_source_) ? &a2dp_aac_source_caps : &a2dp_aac_sink_caps;

@@ -1432,6 +1471,17 @@ bool A2dpCodecConfigAacBase::setPeerCodecCapabilities(
        BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;
  }

  // Compute the selectable capability - variable bitrate mode
  variableBitRateSupport = p_a2dp_aac_caps->variableBitRateSupport &
                           peer_info_cie.variableBitRateSupport;
  if (variableBitRateSupport != A2DP_AAC_VARIABLE_BIT_RATE_DISABLED) {
    codec_selectable_capability_.codec_specific_1 =
        static_cast<int64_t>(AacEncoderBitrateMode::AACENC_BR_MODE_VBR_5);
  } else {
    codec_selectable_capability_.codec_specific_1 =
        static_cast<int64_t>(AacEncoderBitrateMode::AACENC_BR_MODE_CBR);
  }

  status = A2DP_BuildInfoAac(AVDT_MEDIA_TYPE_AUDIO, &peer_info_cie,
                             ota_codec_peer_capability_);
  CHECK(status == A2DP_SUCCESS);
+30 −0
Original line number Diff line number Diff line
@@ -413,7 +413,29 @@ static void a2dp_aac_encoder_update(uint16_t peer_mtu,
        "invalid codec bit rate mode",
        __func__);
    return;  // TODO: Return an error?
  } else if (aac_param_value == A2DP_AAC_VARIABLE_BIT_RATE_ENABLED) {
    // VBR has 5 modes defined in external/aac/libAACenc/src/aacenc.h
    // A2DP_AAC_VARIABLE_BIT_RATE_DISABLED is equal to AACENC_BR_MODE_CBR
    auto bitrate_mode = a2dp_codec_config->getCodecConfig().codec_specific_1;
    switch (static_cast<AacEncoderBitrateMode>(bitrate_mode)) {
      case AacEncoderBitrateMode::AACENC_BR_MODE_VBR_1:
        [[fallthrough]];
      case AacEncoderBitrateMode::AACENC_BR_MODE_VBR_2:
        [[fallthrough]];
      case AacEncoderBitrateMode::AACENC_BR_MODE_VBR_3:
        [[fallthrough]];
      case AacEncoderBitrateMode::AACENC_BR_MODE_VBR_4:
        [[fallthrough]];
      case AacEncoderBitrateMode::AACENC_BR_MODE_VBR_5:
        break;
      default:
        bitrate_mode =
            static_cast<int64_t>(AacEncoderBitrateMode::AACENC_BR_MODE_VBR_5);
    }
    aac_param_value =
        static_cast<uint8_t>(bitrate_mode) & ~A2DP_AAC_VARIABLE_BIT_RATE_MASK;
  }
  LOG_INFO("%s: AACENC_BITRATEMODE: %d", __func__, aac_param_value);
  aac_error = aacEncoder_SetParam(a2dp_aac_encoder_cb.aac_handle,
                                  AACENC_BITRATEMODE, aac_param_value);
  if (aac_error != AACENC_OK) {
@@ -734,6 +756,14 @@ void A2dpCodecConfigAacSource::debug_codec_dump(int fd) {

  A2dpCodecConfig::debug_codec_dump(fd);

  auto codec_specific_1 = getCodecConfig().codec_specific_1;
  dprintf(
      fd,
      "  AAC bitrate mode                                        : %s "
      "(0x%" PRIx64 ")\n",
      ((codec_specific_1 & ~A2DP_AAC_VARIABLE_BIT_RATE_MASK) == 0 ? "Constant"
                                                                  : "Variable"),
      codec_specific_1);
  dprintf(fd,
          "  Packet counts (expected/dropped)                        : %zu / "
          "%zu\n",
+21 −0
Original line number Diff line number Diff line
@@ -21,8 +21,29 @@
#ifndef A2DP_AAC_ENCODER_H
#define A2DP_AAC_ENCODER_H

#include "a2dp_aac_constants.h"
#include "a2dp_codec_api.h"

// Is used in btav_a2dp_codec_config_t.codec_specific_1 when codec is AAC
enum class AacEncoderBitrateMode : int64_t {
  // Variable bitrate mode unsupported when used in a codec report, and upper
  // layer can use this value as system default (keep current settings)
  AACENC_BR_MODE_CBR = A2DP_AAC_VARIABLE_BIT_RATE_DISABLED,
  // Constant bitrate mode when Variable bitrate mode is supported. This can
  // also be used to disable Variable bitrate mode by upper layer
  AACENC_BR_MODE_VBR_C = (A2DP_AAC_VARIABLE_BIT_RATE_ENABLED | 0x00),
  // Variable bitrate mode (very low bitrate for software encoding).
  AACENC_BR_MODE_VBR_1 = (A2DP_AAC_VARIABLE_BIT_RATE_ENABLED | 0x01),
  // Variable bitrate mode (low bitrate for software encoding).
  AACENC_BR_MODE_VBR_2 = (A2DP_AAC_VARIABLE_BIT_RATE_ENABLED | 0x02),
  // Variable bitrate mode (medium bitrate for software encoding).
  AACENC_BR_MODE_VBR_3 = (A2DP_AAC_VARIABLE_BIT_RATE_ENABLED | 0x03),
  // Variable bitrate mode (high bitrate for software encoding).
  AACENC_BR_MODE_VBR_4 = (A2DP_AAC_VARIABLE_BIT_RATE_ENABLED | 0x04),
  // Variable bitrate mode (very high bitrate for software encoding).
  AACENC_BR_MODE_VBR_5 = (A2DP_AAC_VARIABLE_BIT_RATE_ENABLED | 0x05),
};

// Loads the A2DP AAC encoder.
// Return true on success, otherwise false.
bool A2DP_LoadEncoderAac(void);