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

Commit fcefe95f authored by Pavlin Radoslavov's avatar Pavlin Radoslavov
Browse files

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
parent ed951e16
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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;
        }
+23 −4
Original line number Diff line number Diff line
@@ -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,6 +533,7 @@ 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_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);
@@ -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);
    }
  }
@@ -753,7 +763,16 @@ void A2dpCodecConfigLdac::debug_codec_dump(int fd) {
      fd, "  LDAC quality mode                                       : %s\n",
      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);
  }
}