From 9434886ffbb5ce552d1172d98743323fa34e81f9 Mon Sep 17 00:00:00 2001 From: Pavlin Radoslavov Date: Tue, 18 Apr 2017 20:05:39 -0700 Subject: [PATCH] Fix/update the computation of the total dropped packets for LDAC and AAC Also: * Print the "LDAC transmission bitrate (Kbps)" * Print the "LDAC adaptive bit rate encode quality mode index" when the LDAC quality mode is ABR A2DP LDAC State: ... LDAC quality mode : ABR LDAC transmission bitrate (Kbps) : 990 LDAC saved transmit queue length : 0 LDAC adaptive bit rate encode quality mode index : 0 Test: A2DP streaming to headsets that support LDAC Bug: 37287785 Change-Id: I83b22090b087eb8a1e49d1853468b7dbbf9d9ad3 (cherry picked from commit 648ea508c95ade2d8cb8b2928c70ae123fab8334) --- stack/a2dp/a2dp_aac_encoder.cc | 2 ++ stack/a2dp/a2dp_vendor_ldac_encoder.cc | 27 +++++++++++++++++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/stack/a2dp/a2dp_aac_encoder.cc b/stack/a2dp/a2dp_aac_encoder.cc index 4bfe03164..9c695885e 100644 --- a/stack/a2dp/a2dp_aac_encoder.cc +++ b/stack/a2dp/a2dp_aac_encoder.cc @@ -583,6 +583,7 @@ static void a2dp_aac_encode_frames(uint8_t nb_frame) { uint8_t* packet = (uint8_t*)(p_buf + 1) + p_buf->offset + p_buf->len; if (!a2dp_aac_encoder_cb.has_aac_handle) { LOG_ERROR(LOG_TAG, "%s: invalid AAC handle", __func__); + a2dp_aac_encoder_cb.stats.media_read_total_dropped_packets++; osi_free(p_buf); return; } @@ -594,6 +595,7 @@ static void a2dp_aac_encode_frames(uint8_t nb_frame) { if (aac_error != AACENC_OK) { LOG_ERROR(LOG_TAG, "%s: AAC encoding error: 0x%x", __func__, aac_error); + a2dp_aac_encoder_cb.stats.media_read_total_dropped_packets++; osi_free(p_buf); return; } diff --git a/stack/a2dp/a2dp_vendor_ldac_encoder.cc b/stack/a2dp/a2dp_vendor_ldac_encoder.cc index 9011118e5..f124da966 100644 --- a/stack/a2dp/a2dp_vendor_ldac_encoder.cc +++ b/stack/a2dp/a2dp_vendor_ldac_encoder.cc @@ -153,6 +153,7 @@ typedef struct { HANDLE_LDAC_ABR ldac_abr_handle; bool has_ldac_abr_handle; + int last_ldac_abr_eqmid; tA2DP_FEEDING_PARAMS feeding_params; tA2DP_LDAC_ENCODER_PARAMS ldac_encoder_params; @@ -289,6 +290,7 @@ void a2dp_vendor_ldac_encoder_init( a2dp_ldac_encoder_cb.timestamp = 0; a2dp_ldac_encoder_cb.ldac_abr_handle = NULL; a2dp_ldac_encoder_cb.has_ldac_abr_handle = false; + a2dp_ldac_encoder_cb.last_ldac_abr_eqmid = -1; a2dp_ldac_encoder_cb.use_SCMS_T = false; // TODO: should be a parameter #if (BTA_AV_CO_CP_SCMS_T == TRUE) @@ -446,6 +448,7 @@ static void a2dp_vendor_ldac_encoder_update(uint16_t peer_mtu, a2dp_ldac_abr_free_handle(a2dp_ldac_encoder_cb.ldac_abr_handle); a2dp_ldac_encoder_cb.ldac_abr_handle = NULL; a2dp_ldac_encoder_cb.has_ldac_abr_handle = false; + a2dp_ldac_encoder_cb.last_ldac_abr_eqmid = -1; } } @@ -530,9 +533,10 @@ void a2dp_vendor_ldac_send_frames(uint64_t timestamp_us) { for (uint8_t counter = 0; counter < nb_iterations; counter++) { if (a2dp_ldac_encoder_cb.has_ldac_abr_handle) { int flag_enable = 1; - a2dp_ldac_abr_proc(a2dp_ldac_encoder_cb.ldac_handle, - a2dp_ldac_encoder_cb.ldac_abr_handle, - a2dp_ldac_encoder_cb.TxQueueLength, flag_enable); + a2dp_ldac_encoder_cb.last_ldac_abr_eqmid = + a2dp_ldac_abr_proc(a2dp_ldac_encoder_cb.ldac_handle, + a2dp_ldac_encoder_cb.ldac_abr_handle, + a2dp_ldac_encoder_cb.TxQueueLength, flag_enable); } // Transcode frame and enqueue a2dp_ldac_encode_frames(nb_frame); @@ -624,6 +628,7 @@ static void a2dp_ldac_encode_frames(uint8_t nb_frame) { uint8_t* packet = (uint8_t*)(p_buf + 1) + p_buf->offset + p_buf->len; if (a2dp_ldac_encoder_cb.ldac_handle == NULL) { LOG_ERROR(LOG_TAG, "%s: invalid LDAC handle", __func__); + a2dp_ldac_encoder_cb.stats.media_read_total_dropped_packets++; osi_free(p_buf); return; } @@ -638,6 +643,7 @@ static void a2dp_ldac_encode_frames(uint8_t nb_frame) { "handle_error = %d block_error = %d", __func__, result, LDACBT_API_ERR(err_code), LDACBT_HANDLE_ERR(err_code), LDACBT_BLOCK_ERR(err_code)); + a2dp_ldac_encoder_cb.stats.media_read_total_dropped_packets++; osi_free(p_buf); return; } @@ -670,7 +676,11 @@ static void a2dp_ldac_encode_frames(uint8_t nb_frame) { remain_nb_frame = nb_frame; if (!a2dp_ldac_encoder_cb.enqueue_callback(p_buf, done_nb_frame)) return; } else { - a2dp_ldac_encoder_cb.stats.media_read_total_dropped_packets++; + // NOTE: Unlike the execution path for other codecs, it is normal for + // LDAC to NOT write encoded data to the last buffer if there wasn't + // enough data to write to. That data is accumulated internally by + // the codec and included in the next iteration. Therefore, here we + // don't increment the "media_read_total_dropped_packets" counter. osi_free(p_buf); } } @@ -754,6 +764,15 @@ void A2dpCodecConfigLdac::debug_codec_dump(int fd) { quality_mode_index_to_name(p_encoder_params->quality_mode_index).c_str()); dprintf(fd, + " LDAC transmission bitrate (Kbps) : %d\n", + ldac_get_bitrate_func(a2dp_ldac_encoder_cb.ldac_handle)); + + dprintf(fd, " LDAC saved transmit queue length : %zu\n", a2dp_ldac_encoder_cb.TxQueueLength); + if (a2dp_ldac_encoder_cb.has_ldac_abr_handle) { + dprintf(fd, + " LDAC adaptive bit rate encode quality mode index : %d\n", + a2dp_ldac_encoder_cb.last_ldac_abr_eqmid); + } } -- 2.11.0