From 5af2afba85b8cc33b12189a8b0d40cfc4477ed89 Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Thu, 21 Oct 2021 09:29:19 +0200 Subject: bluetooth/gst: Timestamp encoding buffers according to PA clock Commit c6d6ca541 ("bluetooth/gst: Replace buffer accumulation in adapter with direct pull") removed the `timestamp` parameter from GStreamer transcoders due to being unused, but these should instead be propagated to the GStreamer encoding buffers. Part-of: --- src/modules/bluetooth/a2dp-codec-aptx-gst.c | 4 ++-- src/modules/bluetooth/a2dp-codec-gst.c | 11 ++++++++++- src/modules/bluetooth/a2dp-codec-gst.h | 2 +- src/modules/bluetooth/a2dp-codec-ldac-gst.c | 2 +- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/modules/bluetooth/a2dp-codec-aptx-gst.c b/src/modules/bluetooth/a2dp-codec-aptx-gst.c index 93130e4a2..61b995b25 100644 --- a/src/modules/bluetooth/a2dp-codec-aptx-gst.c +++ b/src/modules/bluetooth/a2dp-codec-aptx-gst.c @@ -490,7 +490,7 @@ static size_t reduce_encoder_bitrate(void *codec_info, size_t write_link_mtu) { static size_t encode_buffer(void *codec_info, uint32_t timestamp, const uint8_t *input_buffer, size_t input_size, uint8_t *output_buffer, size_t output_size, size_t *processed) { size_t written; - written = gst_transcode_buffer(codec_info, input_buffer, input_size, output_buffer, output_size, processed); + written = gst_transcode_buffer(codec_info, timestamp, input_buffer, input_size, output_buffer, output_size, processed); if (PA_UNLIKELY(*processed == 0 || *processed != input_size)) pa_log_error("aptX encoding error"); @@ -526,7 +526,7 @@ static size_t encode_buffer_hd(void *codec_info, uint32_t timestamp, const uint8 static size_t decode_buffer(void *codec_info, const uint8_t *input_buffer, size_t input_size, uint8_t *output_buffer, size_t output_size, size_t *processed) { size_t written; - written = gst_transcode_buffer(codec_info, input_buffer, input_size, output_buffer, output_size, processed); + written = gst_transcode_buffer(codec_info, -1, input_buffer, input_size, output_buffer, output_size, processed); /* Due to aptX latency, aptx_decode starts filling output buffer after 90 input samples. * If input buffer contains less than 90 samples, aptx_decode returns zero (=no output) diff --git a/src/modules/bluetooth/a2dp-codec-gst.c b/src/modules/bluetooth/a2dp-codec-gst.c index 30a3d52f8..8ef74be9c 100644 --- a/src/modules/bluetooth/a2dp-codec-gst.c +++ b/src/modules/bluetooth/a2dp-codec-gst.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include "a2dp-codecs.h" @@ -206,7 +207,7 @@ common_fail: return false; } -size_t gst_transcode_buffer(void *codec_info, const uint8_t *input_buffer, size_t input_size, uint8_t *output_buffer, size_t output_size, size_t *processed) { +size_t gst_transcode_buffer(void *codec_info, uint32_t timestamp, const uint8_t *input_buffer, size_t input_size, uint8_t *output_buffer, size_t output_size, size_t *processed) { struct gst_info *info = (struct gst_info *) codec_info; gsize transcoded; GstBuffer *in_buf; @@ -223,6 +224,14 @@ size_t gst_transcode_buffer(void *codec_info, const uint8_t *input_buffer, size_ gst_mini_object_ref(GST_MINI_OBJECT_CAST(in_buf)); pa_assert(GST_MINI_OBJECT_REFCOUNT_VALUE(in_buf) == 2); + if (timestamp == -1) + GST_BUFFER_TIMESTAMP(in_buf) = GST_CLOCK_TIME_NONE; + else { + // Timestamp is monotonically increasing with samplerate/packets-per-second; + // convert it to a timestamp in nanoseconds: + GST_BUFFER_TIMESTAMP(in_buf) = timestamp * PA_USEC_PER_SEC / info->ss->rate; + } + ret = gst_pad_chain(info->pad_sink, in_buf); /** * Ensure we're the only one holding a reference to this buffer after gst_pad_chain, diff --git a/src/modules/bluetooth/a2dp-codec-gst.h b/src/modules/bluetooth/a2dp-codec-gst.h index 0928a8432..6e490aa11 100644 --- a/src/modules/bluetooth/a2dp-codec-gst.h +++ b/src/modules/bluetooth/a2dp-codec-gst.h @@ -53,5 +53,5 @@ struct gst_info { }; bool gst_codec_init(struct gst_info *info, bool for_encoding, GstElement *transcoder); -size_t gst_transcode_buffer(void *codec_info, const uint8_t *input_buffer, size_t input_size, uint8_t *output_buffer, size_t output_size, size_t *processed); +size_t gst_transcode_buffer(void *codec_info, uint32_t timestamp, const uint8_t *input_buffer, size_t input_size, uint8_t *output_buffer, size_t output_size, size_t *processed); void gst_codec_deinit(void *codec_info); diff --git a/src/modules/bluetooth/a2dp-codec-ldac-gst.c b/src/modules/bluetooth/a2dp-codec-ldac-gst.c index a5e937aa9..c0bcc6668 100644 --- a/src/modules/bluetooth/a2dp-codec-ldac-gst.c +++ b/src/modules/bluetooth/a2dp-codec-ldac-gst.c @@ -411,7 +411,7 @@ static size_t encode_buffer(void *codec_info, uint32_t timestamp, const uint8_t return 0; } - written = gst_transcode_buffer(codec_info, input_buffer, input_size, output_buffer + sizeof(*header) + sizeof(*payload), output_size - sizeof(*header) - sizeof(*payload), processed); + written = gst_transcode_buffer(codec_info, timestamp, input_buffer, input_size, output_buffer + sizeof(*header) + sizeof(*payload), output_size - sizeof(*header) - sizeof(*payload), processed); if (PA_UNLIKELY(*processed != input_size)) pa_log_error("LDAC encoding error"); -- cgit v1.2.3