[packages/pipewire] - added lc3plus bcond
qboosh
qboosh at pld-linux.org
Sat Mar 23 19:04:51 CET 2024
commit 0a4d92741b52be3d5db07f1e551da4d03d8f6651
Author: Jakub Bogusz <qboosh at pld-linux.org>
Date: Sat Mar 23 18:43:15 2024 +0100
- added lc3plus bcond
pipewire-lc3plus.patch | 169 +++++++++++++++++++++++++++++++++++++++++++++++++
pipewire.spec | 10 ++-
2 files changed, 178 insertions(+), 1 deletion(-)
---
diff --git a/pipewire.spec b/pipewire.spec
index e9285f0..2f4c06b 100644
--- a/pipewire.spec
+++ b/pipewire.spec
@@ -1,5 +1,4 @@
# TODO: evl support (BR: libevl-devel, https://evlproject.org/)
-# - enable bluez5-codec-lc3plus
#
# Conditional build:
%bcond_without apidocs # Doxygen based API documentation
@@ -7,6 +6,7 @@
%bcond_without ffmpeg # ffmpeg spa plugin integration
%bcond_without gstreamer # GStreamer module
%bcond_without jack # pipewire-jack and jack spa plugin integration
+%bcond_with lc3plus # Bluez lc3plus codec
%bcond_with libcamera # libcamera plugin
%bcond_without libmysofa # libmysofa filter chain support
%bcond_without lv2 # LV2 plugins support
@@ -23,6 +23,7 @@ Group: Libraries
Source0: https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/%{version}/%{name}-%{version}.tar.bz2
# Source0-md5: d6b9ba58751c70a8d6b134cad89b33b3
Patch0: %{name}-gcc.patch
+Patch1: %{name}-lc3plus.patch
URL: https://pipewire.org/
BuildRequires: ModemManager-devel >= 1.10.0
%if %{with jack}
@@ -49,6 +50,7 @@ BuildRequires: gstreamer-plugins-base-devel >= 1.10
%endif
%{?with_jack:BuildRequires: jack-audio-connection-kit-devel >= 1.9.17}
BuildRequires: ldacBT-devel
+%{?with_lc3plus:BuildRequires: libLC3plus-devel >= 1.4.1}
%ifarch i386 i486 %{armv4} %{armv5} %{armv6}
# possibly more 32-bit archs (where 8-byte __atomic_store_n require libatomic)
BuildRequires: libatomic-devel
@@ -368,12 +370,14 @@ Wtyczka udostępniająca źródło i cel obrazu PipeWire dla GStreamera.
%prep
%setup -q
%patch0 -p1
+%patch1 -p1
%build
%meson build \
-Daudiotestsrc=enabled \
-Dbluez5-backend-hsphfpd=enabled \
-Dbluez5-backend-native-mm=enabled \
+ %{!?with_lc3plus:-Dbluez5-codec-lc3plus=disabled} \
-Dcompress-offload=enabled \
%{?with_apidocs:-Ddocs=enabled} \
%{?with_ffmpeg:-Dffmpeg=enabled} \
@@ -697,6 +701,10 @@ rm -rf $RPM_BUILD_ROOT
%attr(755,root,root) %{_libdir}/spa-0.2/bluez5/libspa-codec-bluez5-faststream.so
# R: liblc3
%attr(755,root,root) %{_libdir}/spa-0.2/bluez5/libspa-codec-bluez5-lc3.so
+%if %{with lc3plus}
+# R: libLC3plus
+%attr(755,root,root) %{_libdir}/spa-0.2/bluez5/libspa-codec-bluez5-lc3plus.so
+%endif
# R: ldacBT
%attr(755,root,root) %{_libdir}/spa-0.2/bluez5/libspa-codec-bluez5-ldac.so
# R: opus
diff --git a/pipewire-lc3plus.patch b/pipewire-lc3plus.patch
new file mode 100644
index 0000000..44ec914
--- /dev/null
+++ b/pipewire-lc3plus.patch
@@ -0,0 +1,169 @@
+Adjust for LC3plus 1.4.1
+--- pipewire-1.0.4/spa/plugins/bluez5/a2dp-codec-lc3plus.c.orig 2024-03-13 09:22:08.000000000 +0100
++++ pipewire-1.0.4/spa/plugins/bluez5/a2dp-codec-lc3plus.c 2024-03-23 16:29:16.174945983 +0100
+@@ -331,7 +331,9 @@ static void *codec_init(const struct med
+ struct spa_audio_info config_info;
+ int size;
+ int res;
++ int32_t lfe[LC3PLUS_MAX_CHANNELS];
+
++ memset(lfe, 0, sizeof(lfe));
+ if (info->media_type != SPA_MEDIA_TYPE_audio ||
+ info->media_subtype != SPA_MEDIA_SUBTYPE_raw ||
+ info->info.raw.format != SPA_AUDIO_FORMAT_S24_32) {
+@@ -371,15 +373,11 @@ static void *codec_init(const struct med
+ }
+ if ((this->enc = calloc(1, size)) == NULL)
+ goto error_errno;
+- if (lc3plus_enc_init(this->enc, this->samplerate, this->channels) != LC3PLUS_OK) {
++ if (lc3plus_enc_init(this->enc, this->samplerate, this->channels, 1, lfe) != LC3PLUS_OK) {
+ res = -EINVAL;
+ goto error;
+ }
+- if (lc3plus_enc_set_frame_ms(this->enc, this->frame_dms/10.0f) != LC3PLUS_OK) {
+- res = -EINVAL;
+- goto error;
+- }
+- if (lc3plus_enc_set_hrmode(this->enc, 1) != LC3PLUS_OK) {
++ if (lc3plus_enc_set_frame_dms(this->enc, this->frame_dms) != LC3PLUS_OK) {
+ res = -EINVAL;
+ goto error;
+ }
+@@ -400,15 +398,11 @@ static void *codec_init(const struct med
+ }
+ if ((this->dec = calloc(1, size)) == NULL)
+ goto error_errno;
+- if (lc3plus_dec_init(this->dec, this->samplerate, this->channels, LC3PLUS_PLC_ADVANCED) != LC3PLUS_OK) {
++ if (lc3plus_dec_init(this->dec, this->samplerate, this->channels, LC3PLUS_PLC_ADVANCED, 1) != LC3PLUS_OK) {
+ res = -EINVAL;
+ goto error;
+ }
+- if (lc3plus_dec_set_frame_ms(this->dec, this->frame_dms/10.0f) != LC3PLUS_OK) {
+- res = -EINVAL;
+- goto error;
+- }
+- if (lc3plus_dec_set_hrmode(this->dec, 1) != LC3PLUS_OK) {
++ if (lc3plus_dec_set_frame_dms(this->dec, this->frame_dms) != LC3PLUS_OK) {
+ res = -EINVAL;
+ goto error;
+ }
+@@ -533,6 +527,13 @@ static int codec_encode(void *data,
+ int size, processed;
+ int header_size = sizeof(struct rtp_header) + sizeof(struct rtp_payload);
+ int32_t *inputs[2];
++ void *scratch = NULL;
++
++#ifdef LC3PLUS_ENC_MAX_SCRATCH_SIZE
++ scratch = malloc(LC3PLUS_ENC_MAX_SCRATCH_SIZE);
++ if (scratch == NULL)
++ return -ENOMEM;
++#endif
+
+ if (src == NULL) {
+ /* Produce fragment packets.
+@@ -545,6 +546,9 @@ static int codec_encode(void *data,
+ this->e.fragment < dst ||
+ SPA_PTROFF(this->e.fragment, this->e.fragment_size, void) > SPA_PTROFF(dst, dst_size, void)) {
+ this->e.fragment = NULL;
++#ifdef LC3PLUS_ENC_MAX_SCRATCH_SIZE
++ free(scratch);
++#endif
+ return -EINVAL;
+ }
+
+@@ -564,6 +568,9 @@ static int codec_encode(void *data,
+ this->e.fragment = NULL;
+ *need_flush = NEED_FLUSH_ALL;
+ }
++#ifdef LC3PLUS_ENC_MAX_SCRATCH_SIZE
++ free(scratch);
++#endif
+ return 0;
+ }
+
+@@ -580,15 +587,19 @@ static int codec_encode(void *data,
+
+ if (this->channels == 1) {
+ inputs[0] = (int32_t *)src;
+- res = lc3plus_enc24(this->enc, inputs, dst, &size);
++ res = lc3plus_enc24(this->enc, inputs, dst, &size, scratch);
+ } else {
+ inputs[0] = this->buf[0];
+ inputs[1] = this->buf[1];
+ deinterleave_32_c2(inputs, src, this->e.samples);
+- res = lc3plus_enc24(this->enc, inputs, dst, &size);
++ res = lc3plus_enc24(this->enc, inputs, dst, &size, scratch);
+ }
+- if (SPA_UNLIKELY(res != LC3PLUS_OK))
++ if (SPA_UNLIKELY(res != LC3PLUS_OK)) {
++#ifdef LC3PLUS_ENC_MAX_SCRATCH_SIZE
++ free(scratch);
++#endif
+ return -EINVAL;
++ }
+ *dst_out = size;
+
+ processed += this->e.codesize;
+@@ -596,6 +607,9 @@ static int codec_encode(void *data,
+ this->e.payload->frame_count++;
+
+ done:
++#ifdef LC3PLUS_ENC_MAX_SCRATCH_SIZE
++ free(scratch);
++#endif
+ if (this->e.payload->frame_count == 0)
+ return processed;
+ if (this->e.payload->frame_count < 0xf &&
+@@ -678,7 +692,13 @@ static SPA_UNUSED int codec_decode(void
+ int32_t *outputs[2];
+ int consumed;
+ int samples;
++ void *scratch = NULL;
+
++#ifdef LC3PLUS_DEC_MAX_SCRATCH_SIZE
++ scratch = malloc(LC3PLUS_DEC_MAX_SCRATCH_SIZE);
++ if (scratch == NULL)
++ return -ENOMEM;
++#endif
+ if (this->d.fragment_count > 0) {
+ /* Fragmented frame */
+ size_t avail;
+@@ -691,6 +711,9 @@ static SPA_UNUSED int codec_decode(void
+ if (this->d.fragment_count > 1) {
+ /* More fragments to come */
+ *dst_out = 0;
++#ifdef LC3PLUS_DEC_MAX_SCRATCH_SIZE
++ free(scratch);
++#endif
+ return consumed;
+ }
+
+@@ -706,18 +729,25 @@ static SPA_UNUSED int codec_decode(void
+
+ samples = lc3plus_dec_get_output_samples(this->dec);
+ *dst_out = samples * this->channels * sizeof(int32_t);
+- if (dst_size < *dst_out)
++ if (dst_size < *dst_out) {
++#ifdef LC3PLUS_DEC_MAX_SCRATCH_SIZE
++ free(scratch);
++#endif
+ return -EINVAL;
++ }
+
+ if (this->channels == 1) {
+ outputs[0] = (int32_t *)dst;
+- res = lc3plus_dec24(this->dec, (void *)src, src_size, outputs, 0);
++ res = lc3plus_dec24(this->dec, (void *)src, src_size, outputs, scratch, 0);
+ } else {
+ outputs[0] = this->buf[0];
+ outputs[1] = this->buf[1];
+- res = lc3plus_dec24(this->dec, (void *)src, src_size, outputs, 0);
++ res = lc3plus_dec24(this->dec, (void *)src, src_size, outputs, scratch, 0);
+ interleave_32_c2(dst, (const int32_t**)outputs, samples);
+ }
++#ifdef LC3PLUS_DEC_MAX_SCRATCH_SIZE
++ free(scratch);
++#endif
+ if (SPA_UNLIKELY(res != LC3PLUS_OK && res != LC3PLUS_DECODE_ERROR))
+ return -EINVAL;
+
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/pipewire.git/commitdiff/0a4d92741b52be3d5db07f1e551da4d03d8f6651
More information about the pld-cvs-commit
mailing list