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;
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)
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;
}
}
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);
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;
}
"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;
}
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);
}
}
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);
+ }
}