summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarijn Suijten <marijns95@gmail.com>2021-10-21 09:29:19 +0200
committerArun Raghavan <arun@asymptotic.io>2022-02-21 12:33:18 -0500
commit5af2afba85b8cc33b12189a8b0d40cfc4477ed89 (patch)
tree6186b3180d0f38573d529f842997d4d0d4e2fea1
parent5f37914eb808d5e201530927fee3b42a2ece8a41 (diff)
bluetooth/gst: Timestamp encoding buffers according to PA clockv15.99.1
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: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/494>
-rw-r--r--src/modules/bluetooth/a2dp-codec-aptx-gst.c4
-rw-r--r--src/modules/bluetooth/a2dp-codec-gst.c11
-rw-r--r--src/modules/bluetooth/a2dp-codec-gst.h2
-rw-r--r--src/modules/bluetooth/a2dp-codec-ldac-gst.c2
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 <pulsecore/once.h>
#include <pulsecore/core-util.h>
#include <pulse/sample.h>
+#include <pulse/timeval.h>
#include <pulse/util.h>
#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");