[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