Loading system/stack/a2dp/a2dp_aac.cc +57 −7 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) Loading @@ -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) { Loading Loading @@ -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; Loading Loading @@ -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); Loading system/stack/a2dp/a2dp_aac_encoder.cc +30 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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", Loading system/stack/include/a2dp_aac_encoder.h +21 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading
system/stack/a2dp/a2dp_aac.cc +57 −7 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) Loading @@ -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) { Loading Loading @@ -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; Loading Loading @@ -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); Loading
system/stack/a2dp/a2dp_aac_encoder.cc +30 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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", Loading
system/stack/include/a2dp_aac_encoder.h +21 −0 Original line number Diff line number Diff line Loading @@ -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); Loading