OSDN Git Service

Fix/update the computation of the total dropped packets for LDAC and AAC
authorPavlin Radoslavov <pavlin@google.com>
Wed, 19 Apr 2017 03:05:39 +0000 (20:05 -0700)
committerPavlin Radoslavov <pavlin@google.com>
Wed, 19 Apr 2017 10:39:48 +0000 (03:39 -0700)
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
stack/a2dp/a2dp_vendor_ldac_encoder.cc

index 4bfe031..9c69588 100644 (file)
@@ -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;
         }
index 9011118..f124da9 100644 (file)
@@ -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);
+  }
 }