[packages/mediastreamer-plugin-mswebrtc] - added cmake,b64-refactor patches from git; release 2 (mediastreamer 5.3.x)

qboosh qboosh at pld-linux.org
Sun Apr 7 16:03:38 CEST 2024


commit 41e110f6da51acf50f60cd2edb39e98b73152d5a
Author: Jakub Bogusz <qboosh at pld-linux.org>
Date:   Sun Apr 7 15:23:25 2024 +0200

    - added cmake,b64-refactor patches from git; release 2 (mediastreamer 5.3.x)

 mediastreamer-plugin-mswebrtc.spec |   6 +-
 mswebrtc-b64-refactor.patch        | 949 +++++++++++++++++++++++++++++++++++++
 mswebrtc-cmake.patch               | 626 ++++++++++++++++++++++++
 3 files changed, 1580 insertions(+), 1 deletion(-)
---
diff --git a/mediastreamer-plugin-mswebrtc.spec b/mediastreamer-plugin-mswebrtc.spec
index 5e0281d..73b1fe8 100644
--- a/mediastreamer-plugin-mswebrtc.spec
+++ b/mediastreamer-plugin-mswebrtc.spec
@@ -3,7 +3,7 @@ Summary:	WebRTC plugin for mediastreamer
 Summary(pl.UTF-8):	Wtyczka WebRTC dla mediastreamera
 Name:		mediastreamer-plugin-mswebrtc
 Version:	1.1.2
-Release:	1
+Release:	2
 License:	GPL v2
 Group:		Libraries
 #Source0Download: https://gitlab.linphone.org/BC/public/mswebrtc/-/tags
@@ -15,6 +15,8 @@ Source1:	https://gitlab.linphone.org/BC/public/external/webrtc/-/archive/%{webrt
 Patch0:		%{name}-make.patch
 Patch1:		%{name}-link.patch
 Patch2:		mswebrtc-sse2.patch
+Patch3:		mswebrtc-cmake.patch
+Patch4:		mswebrtc-b64-refactor.patch
 URL:		https://gitlab.linphone.org/BC/public/mswebrtc
 BuildRequires:	cmake >= 3.1
 BuildRequires:	libstdc++-devel >= 6:4.7
@@ -38,6 +40,8 @@ iSAC, AECM...).
 %patch0 -p1
 %patch1 -p1
 %patch2 -p1
+%patch3 -p1
+%patch4 -p1
 
 %build
 # autotools suite is more outdated, doesn't have VAD support
diff --git a/mswebrtc-b64-refactor.patch b/mswebrtc-b64-refactor.patch
new file mode 100644
index 0000000..af4a1e1
--- /dev/null
+++ b/mswebrtc-b64-refactor.patch
@@ -0,0 +1,949 @@
+From 17e72f00831a36da387ceafe7f3076ffa8f66aba Mon Sep 17 00:00:00 2001
+From: Clemence Him <clemence.him at belledonne-communications.com>
+Date: Fri, 22 Sep 2023 14:28:02 +0200
+Subject: [PATCH] Base64 functions refactoring
+
+---
+ aec.c | 781 +++++++++++++++++++++++++++++-----------------------------
+ 1 file changed, 394 insertions(+), 387 deletions(-)
+
+diff --git a/aec.c b/aec.c
+index 271f370..995f655 100644
+--- a/aec.c
++++ b/aec.c
+@@ -24,19 +24,18 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ #include "mediastreamer2/msfilter.h"
+ #include "mediastreamer2/msticker.h"
+ #ifdef BUILD_AEC
+-#include "echo_cancellation.h"
+ #include "aec_splitting_filter.h"
++#include "echo_cancellation.h"
+ #endif
+ #ifdef BUILD_AECM
+ #include "echo_control_mobile.h"
+ #endif
+-#include "ortp/b64.h"
+ 
+ #ifdef _WIN32
+ #include <malloc.h> /* for alloca */
+ #endif
+ 
+-//#define EC_DUMP 1
++// #define EC_DUMP 1
+ #ifdef ANDROID
+ #define EC_DUMP_PREFIX "/sdcard"
+ #else
+@@ -48,466 +47,485 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ static const float smooth_factor = 0.05f;
+ static const int framesize = 80;
+ 
+-
+ typedef enum _WebRTCAECType {
+-	WebRTCAECTypeNormal,
+-	WebRTCAECTypeMobile
++  WebRTCAECTypeNormal,
++  WebRTCAECTypeMobile
+ } WebRTCAECType;
+ 
+ typedef struct WebRTCAECState {
+-	void *aecInst;
+-	MSBufferizer delayed_ref;
+-	MSFlowControlledBufferizer ref;
+-	MSBufferizer echo;
+-	int framesize;
+-	int samplerate;
+-	int delay_ms;
+-	int nominal_ref_samples;
+-	char *state_str;
++  void *aecInst;
++  MSBufferizer delayed_ref;
++  MSFlowControlledBufferizer ref;
++  MSBufferizer echo;
++  int framesize;
++  int samplerate;
++  int delay_ms;
++  int nominal_ref_samples;
++  char *state_str;
+ #ifdef EC_DUMP
+-	FILE *echofile;
+-	FILE *reffile;
+-	FILE *cleanfile;
++  FILE *echofile;
++  FILE *reffile;
++  FILE *cleanfile;
+ #endif
+-	bool_t echostarted;
+-	bool_t bypass_mode;
+-	bool_t using_zeroes;
+-	WebRTCAECType aec_type;
++  bool_t echostarted;
++  bool_t bypass_mode;
++  bool_t using_zeroes;
++  WebRTCAECType aec_type;
+ #ifdef BUILD_AEC
+-	MSWebRtcAecSplittingFilter *splitting_filter;
++  MSWebRtcAecSplittingFilter *splitting_filter;
+ #endif
+ } WebRTCAECState;
+ 
+ static void webrtc_aecgeneric_init(MSFilter *f, WebRTCAECType aec_type) {
+-	WebRTCAECState *s = (WebRTCAECState *) ms_new0(WebRTCAECState, 1);
+-
+-	s->samplerate = 8000;
+-	ms_bufferizer_init(&s->delayed_ref);
+-	ms_bufferizer_init(&s->echo);
+-	ms_flow_controlled_bufferizer_init(&s->ref, f, s->samplerate, 1);
+-	s->delay_ms = 0;
+-	s->aecInst = NULL;
+-	s->framesize = framesize;
+-	s->state_str = NULL;
+-	s->using_zeroes = FALSE;
+-	s->echostarted = FALSE;
+-	s->bypass_mode = FALSE;
+-	s->aec_type = aec_type;
++  WebRTCAECState *s = (WebRTCAECState *)ms_new0(WebRTCAECState, 1);
++
++  s->samplerate = 8000;
++  ms_bufferizer_init(&s->delayed_ref);
++  ms_bufferizer_init(&s->echo);
++  ms_flow_controlled_bufferizer_init(&s->ref, f, s->samplerate, 1);
++  s->delay_ms = 0;
++  s->aecInst = NULL;
++  s->framesize = framesize;
++  s->state_str = NULL;
++  s->using_zeroes = FALSE;
++  s->echostarted = FALSE;
++  s->bypass_mode = FALSE;
++  s->aec_type = aec_type;
+ 
+ #ifdef EC_DUMP
+-	{
+-		char *fname = ms_strdup_printf("%s/mswebrtcaec-%p-echo.raw", EC_DUMP_PREFIX, f);
+-		s->echofile = fopen(fname, "w");
+-		ms_free(fname);
+-		fname = ms_strdup_printf("%s/mswebrtcaec-%p-ref.raw", EC_DUMP_PREFIX, f);
+-		s->reffile = fopen(fname, "w");
+-		ms_free(fname);
+-		fname = ms_strdup_printf("%s/mswebrtcaec-%p-clean.raw", EC_DUMP_PREFIX, f);
+-		s->cleanfile = fopen(fname, "w");
+-		ms_free(fname);
+-	}
++  {
++    char *fname =
++        ms_strdup_printf("%s/mswebrtcaec-%p-echo.raw", EC_DUMP_PREFIX, f);
++    s->echofile = fopen(fname, "w");
++    ms_free(fname);
++    fname = ms_strdup_printf("%s/mswebrtcaec-%p-ref.raw", EC_DUMP_PREFIX, f);
++    s->reffile = fopen(fname, "w");
++    ms_free(fname);
++    fname = ms_strdup_printf("%s/mswebrtcaec-%p-clean.raw", EC_DUMP_PREFIX, f);
++    s->cleanfile = fopen(fname, "w");
++    ms_free(fname);
++  }
+ #endif
+ 
+-	f->data = s;
++  f->data = s;
+ }
+ 
+ #ifdef BUILD_AEC
+ static void webrtc_aec_init(MSFilter *f) {
+-	webrtc_aecgeneric_init(f, WebRTCAECTypeNormal);
++  webrtc_aecgeneric_init(f, WebRTCAECTypeNormal);
+ }
+ #endif
+ 
+ #ifdef BUILD_AECM
+ static void webrtc_aecm_init(MSFilter *f) {
+-	webrtc_aecgeneric_init(f, WebRTCAECTypeMobile);
++  webrtc_aecgeneric_init(f, WebRTCAECTypeMobile);
+ }
+ #endif
+ 
+ static void webrtc_aec_uninit(MSFilter *f) {
+-	WebRTCAECState *s = (WebRTCAECState *) f->data;
+-	if (s->state_str) ms_free(s->state_str);
+-	ms_bufferizer_uninit(&s->delayed_ref);
++  WebRTCAECState *s = (WebRTCAECState *)f->data;
++  if (s->state_str)
++    ms_free(s->state_str);
++  ms_bufferizer_uninit(&s->delayed_ref);
+ #ifdef EC_DUMP
+-	if (s->echofile)
+-		fclose(s->echofile);
+-	if (s->reffile)
+-		fclose(s->reffile);
++  if (s->echofile)
++    fclose(s->echofile);
++  if (s->reffile)
++    fclose(s->reffile);
+ #endif
+-	ms_free(s);
++  ms_free(s);
+ }
+ 
+ static void configure_flow_controlled_bufferizer(WebRTCAECState *s) {
+-	ms_flow_controlled_bufferizer_set_samplerate(&s->ref, s->samplerate);
+-	ms_flow_controlled_bufferizer_set_max_size_ms(&s->ref, s->delay_ms);
+-	ms_flow_controlled_bufferizer_set_granularity_ms(&s->ref, (s->framesize * 1000) / s->samplerate);
++  ms_flow_controlled_bufferizer_set_samplerate(&s->ref, s->samplerate);
++  ms_flow_controlled_bufferizer_set_max_size_ms(&s->ref, s->delay_ms);
++  ms_flow_controlled_bufferizer_set_granularity_ms(
++      &s->ref, (s->framesize * 1000) / s->samplerate);
+ }
+ 
+ static void webrtc_aec_preprocess(MSFilter *f) {
+-	WebRTCAECState *s = (WebRTCAECState *) f->data;
++  WebRTCAECState *s = (WebRTCAECState *)f->data;
+ #ifdef BUILD_AEC
+-	AecConfig aec_config;
++  AecConfig aec_config;
+ #endif
+ #ifdef BUILD_AECM
+-	AecmConfig aecm_config;
+-	int error_code;
++  AecmConfig aecm_config;
++  int error_code;
+ #endif
+-	int delay_samples = 0;
+-	mblk_t *m;
++  int delay_samples = 0;
++  mblk_t *m;
+ 
+-	s->echostarted = FALSE;
+-	delay_samples = s->delay_ms * s->samplerate / 1000;
+-	s->framesize=(framesize*s->samplerate)/8000;
+-	ms_message("Initializing WebRTC echo canceler with framesize=%i, delay_ms=%i, delay_samples=%i", s->framesize, s->delay_ms, delay_samples);
+-	configure_flow_controlled_bufferizer(s);
++  s->echostarted = FALSE;
++  delay_samples = s->delay_ms * s->samplerate / 1000;
++  s->framesize = (framesize * s->samplerate) / 8000;
++  ms_message("Initializing WebRTC echo canceler with framesize=%i, "
++             "delay_ms=%i, delay_samples=%i",
++             s->framesize, s->delay_ms, delay_samples);
++  configure_flow_controlled_bufferizer(s);
+ 
+ #ifdef BUILD_AEC
+-	if (s->aec_type == WebRTCAECTypeNormal) {
+-		if ((s->aecInst = WebRtcAec_Create()) == NULL) {
+-			s->bypass_mode = TRUE;
+-			ms_error("WebRtcAec_Create(): error, entering bypass mode");
+-			return;
+-		}
+-		if ((WebRtcAec_Init(s->aecInst, MIN(48000, s->samplerate), s->samplerate)) < 0) {
+-			ms_error("WebRtcAec_Init(): WebRTC echo canceller does not support %d samplerate", s->samplerate);
+-			s->bypass_mode = TRUE;
+-			ms_error("Entering bypass mode");
+-			return;
+-		}
+-		aec_config.nlpMode = kAecNlpAggressive;
+-		aec_config.skewMode = kAecFalse;
+-		aec_config.metricsMode = kAecFalse;
+-		aec_config.delay_logging = kAecFalse;
+-		if (WebRtcAec_set_config(s->aecInst, aec_config) != 0) {
+-			ms_error("WebRtcAec_set_config(): failed.");
+-		}
+-	}
++  if (s->aec_type == WebRTCAECTypeNormal) {
++    if ((s->aecInst = WebRtcAec_Create()) == NULL) {
++      s->bypass_mode = TRUE;
++      ms_error("WebRtcAec_Create(): error, entering bypass mode");
++      return;
++    }
++    if ((WebRtcAec_Init(s->aecInst, MIN(48000, s->samplerate), s->samplerate)) <
++        0) {
++      ms_error("WebRtcAec_Init(): WebRTC echo canceller does not support %d "
++               "samplerate",
++               s->samplerate);
++      s->bypass_mode = TRUE;
++      ms_error("Entering bypass mode");
++      return;
++    }
++    aec_config.nlpMode = kAecNlpAggressive;
++    aec_config.skewMode = kAecFalse;
++    aec_config.metricsMode = kAecFalse;
++    aec_config.delay_logging = kAecFalse;
++    if (WebRtcAec_set_config(s->aecInst, aec_config) != 0) {
++      ms_error("WebRtcAec_set_config(): failed.");
++    }
++  }
+ #endif
+ #ifdef BUILD_AECM
+-	if (s->aec_type == WebRTCAECTypeMobile) {
+-		if ((s->aecInst = WebRtcAecm_Create()) == NULL) {
+-			s->bypass_mode = TRUE;
+-			ms_error("WebRtcAecm_Create(): error, entering bypass mode");
+-			return;
+-		}
+-		if ((error_code = WebRtcAecm_Init(s->aecInst, s->samplerate)) < 0) {
+-			if (error_code == AECM_BAD_PARAMETER_ERROR) {
+-				ms_error("WebRtcAecm_Init(): WebRTC echo canceller does not support %d samplerate", s->samplerate);
+-			}
+-			s->bypass_mode = TRUE;
+-			ms_error("Entering bypass mode");
+-			return;
+-		}
+-		aecm_config.cngMode = TRUE;
+-		aecm_config.echoMode = 3;
+-		if (WebRtcAecm_set_config(s->aecInst, aecm_config)!=0){
+-			ms_error("WebRtcAecm_set_config(): failed.");
+-		}
+-	}
++  if (s->aec_type == WebRTCAECTypeMobile) {
++    if ((s->aecInst = WebRtcAecm_Create()) == NULL) {
++      s->bypass_mode = TRUE;
++      ms_error("WebRtcAecm_Create(): error, entering bypass mode");
++      return;
++    }
++    if ((error_code = WebRtcAecm_Init(s->aecInst, s->samplerate)) < 0) {
++      if (error_code == AECM_BAD_PARAMETER_ERROR) {
++        ms_error("WebRtcAecm_Init(): WebRTC echo canceller does not support %d "
++                 "samplerate",
++                 s->samplerate);
++      }
++      s->bypass_mode = TRUE;
++      ms_error("Entering bypass mode");
++      return;
++    }
++    aecm_config.cngMode = TRUE;
++    aecm_config.echoMode = 3;
++    if (WebRtcAecm_set_config(s->aecInst, aecm_config) != 0) {
++      ms_error("WebRtcAecm_set_config(): failed.");
++    }
++  }
+ #endif
+ 
+-	/* fill with zeroes for the time of the delay*/
+-	m = allocb(delay_samples * 2, 0);
+-	m->b_wptr += delay_samples * 2;
+-	ms_bufferizer_put(&s->delayed_ref, m);
+-	s->nominal_ref_samples = delay_samples;
++  /* fill with zeroes for the time of the delay*/
++  m = allocb(delay_samples * 2, 0);
++  m->b_wptr += delay_samples * 2;
++  ms_bufferizer_put(&s->delayed_ref, m);
++  s->nominal_ref_samples = delay_samples;
+ }
+ 
+ /*	inputs[0]= reference signal from far end (sent to soundcard)
+  *	inputs[1]= near speech & echo signal (read from soundcard)
+  *	outputs[0]=  is a copy of inputs[0] to be sent to soundcard
+  *	outputs[1]=  near end speech, echo removed - towards far end
+-*/
++ */
+ static void webrtc_aec_process(MSFilter *f) {
+-	WebRTCAECState *s = (WebRTCAECState *) f->data;
+-	int nbytes = s->framesize * sizeof(int16_t);
+-	mblk_t *refm;
+-	int16_t *ref, *echo;
+-	int nbands = 1;
+-	int bandsize = s->framesize;
+-
+-	if (s->bypass_mode) {
+-		while ((refm = ms_queue_get(f->inputs[0])) != NULL) {
+-			ms_queue_put(f->outputs[0], refm);
+-		}
+-		while ((refm = ms_queue_get(f->inputs[1])) != NULL) {
+-			ms_queue_put(f->outputs[1], refm);
+-		}
+-		return;
+-	}
+-
+-	if (f->inputs[0] != NULL) {
+-		if (s->echostarted) {
+-			while ((refm = ms_queue_get(f->inputs[0])) != NULL) {
+-				mblk_t *cp=dupmsg(refm);
+-				ms_bufferizer_put(&s->delayed_ref,cp);
+-				ms_flow_controlled_bufferizer_put(&s->ref,refm);
+-			}
+-		} else {
+-			ms_warning("Getting reference signal but no echo to synchronize on.");
+-			ms_queue_flush(f->inputs[0]);
+-		}
+-	}
+-
+-	ms_bufferizer_put_from_queue(&s->echo, f->inputs[1]);
+-
+-	ref = (int16_t *) alloca(nbytes);
+-	echo = (int16_t *) alloca(nbytes);
++  WebRTCAECState *s = (WebRTCAECState *)f->data;
++  int nbytes = s->framesize * sizeof(int16_t);
++  mblk_t *refm;
++  int16_t *ref, *echo;
++  int nbands = 1;
++  int bandsize = s->framesize;
++
++  if (s->bypass_mode) {
++    while ((refm = ms_queue_get(f->inputs[0])) != NULL) {
++      ms_queue_put(f->outputs[0], refm);
++    }
++    while ((refm = ms_queue_get(f->inputs[1])) != NULL) {
++      ms_queue_put(f->outputs[1], refm);
++    }
++    return;
++  }
++
++  if (f->inputs[0] != NULL) {
++    if (s->echostarted) {
++      while ((refm = ms_queue_get(f->inputs[0])) != NULL) {
++        mblk_t *cp = dupmsg(refm);
++        ms_bufferizer_put(&s->delayed_ref, cp);
++        ms_flow_controlled_bufferizer_put(&s->ref, refm);
++      }
++    } else {
++      ms_warning("Getting reference signal but no echo to synchronize on.");
++      ms_queue_flush(f->inputs[0]);
++    }
++  }
++
++  ms_bufferizer_put_from_queue(&s->echo, f->inputs[1]);
++
++  ref = (int16_t *)alloca(nbytes);
++  echo = (int16_t *)alloca(nbytes);
+ #ifdef BUILD_AEC
+-	if (s->aec_type == WebRTCAECTypeNormal) {
+-		if (s->samplerate > 16000) {
+-			nbands = s->samplerate / 16000;
+-			bandsize = 160;
+-		}
+-		if (!s->splitting_filter) {
+-			s->splitting_filter = mswebrtc_aec_splitting_filter_create(nbands, bandsize);
+-		}
+-	}
++  if (s->aec_type == WebRTCAECTypeNormal) {
++    if (s->samplerate > 16000) {
++      nbands = s->samplerate / 16000;
++      bandsize = 160;
++    }
++    if (!s->splitting_filter) {
++      s->splitting_filter =
++          mswebrtc_aec_splitting_filter_create(nbands, bandsize);
++    }
++  }
+ #endif
+-	while (ms_bufferizer_read(&s->echo, (uint8_t *)echo, (size_t)nbytes) >= (size_t)nbytes) {
+-		mblk_t *oecho = allocb(nbytes, 0);
+-		int avail;
+-		int avail_samples;
+-
+-		if (!s->echostarted) s->echostarted = TRUE;
+-		if ((avail = ms_bufferizer_get_avail(&s->delayed_ref)) < ((s->nominal_ref_samples * 2) + nbytes)) {
+-			/*we don't have enough to read in a reference signal buffer, inject silence instead*/
+-			refm = allocb(nbytes, 0);
+-			memset(refm->b_wptr, 0, nbytes);
+-			refm->b_wptr += nbytes;
+-			ms_bufferizer_put(&s->delayed_ref, refm);
+-			/*
+-			 * However, we don't inject this silence buffer to the sound card, in order to break the following bad loop:
+-			 * - the sound playback filter detects it has too many pending samples, then triggers an event to request samples to be dropped upstream.
+-			 * - the upstream MSFlowControl filter is requested to drop samples, which it starts to do.
+-			 * - necessarily shortly after the AEC goes into a situation where it has not enough reference samples while processing an audio buffer from mic.
+-			 * - if the AEC injects a silence buffer as output, then it will RECREATE a situation where the sound playback filter has too many pending samples.
+-			 * That's why we should not do this.
+-			 * By not doing this, we will create a discrepancy between what we really injected to the soundcard, and what we told to the 
+-			 * echo canceller about the samples we injected. This shifts the echo. The echo canceller will re-converge quickly to take into
+-			 * account the situation.
+-			 * 
+-			*/
+-			//ms_queue_put(f->outputs[0], dupmsg(refm));
+-			if (!s->using_zeroes) {
+-				ms_warning("Not enough ref samples, using zeroes");
+-				s->using_zeroes = TRUE;
+-			}
+-		} else {
+-			if (s->using_zeroes) {
+-				ms_message("Samples are back.");
+-				s->using_zeroes = FALSE;
+-			}
+-			/* read from our no-delay buffer and output */
+-			refm = allocb(nbytes, 0);
+-			if (ms_flow_controlled_bufferizer_read(&s->ref, refm->b_wptr, nbytes) == 0) {
+-				ms_fatal("Should never happen");
+-			}
+-			refm->b_wptr += nbytes;
+-			ms_queue_put(f->outputs[0], refm);
+-		}
+-
+-		/*now read a valid buffer of delayed ref samples*/
+-		if (ms_bufferizer_read(&s->delayed_ref, (uint8_t *)ref, nbytes) == 0) {
+-			ms_fatal("Should never happen");
+-		}
+-		avail -= nbytes;
+-		avail_samples = avail / 2;
++  while (ms_bufferizer_read(&s->echo, (uint8_t *)echo, (size_t)nbytes) >=
++         (size_t)nbytes) {
++    mblk_t *oecho = allocb(nbytes, 0);
++    int avail;
++    int avail_samples;
++
++    if (!s->echostarted)
++      s->echostarted = TRUE;
++    if ((avail = ms_bufferizer_get_avail(&s->delayed_ref)) <
++        ((s->nominal_ref_samples * 2) + nbytes)) {
++      /*we don't have enough to read in a reference signal buffer, inject
++       * silence instead*/
++      refm = allocb(nbytes, 0);
++      memset(refm->b_wptr, 0, nbytes);
++      refm->b_wptr += nbytes;
++      ms_bufferizer_put(&s->delayed_ref, refm);
++      /*
++       * However, we don't inject this silence buffer to the sound card, in
++       * order to break the following bad loop:
++       * - the sound playback filter detects it has too many pending samples,
++       * then triggers an event to request samples to be dropped upstream.
++       * - the upstream MSFlowControl filter is requested to drop samples, which
++       * it starts to do.
++       * - necessarily shortly after the AEC goes into a situation where it has
++       * not enough reference samples while processing an audio buffer from mic.
++       * - if the AEC injects a silence buffer as output, then it will RECREATE
++       * a situation where the sound playback filter has too many pending
++       * samples. That's why we should not do this. By not doing this, we will
++       * create a discrepancy between what we really injected to the soundcard,
++       * and what we told to the echo canceller about the samples we injected.
++       * This shifts the echo. The echo canceller will re-converge quickly to
++       * take into account the situation.
++       *
++       */
++      // ms_queue_put(f->outputs[0], dupmsg(refm));
++      if (!s->using_zeroes) {
++        ms_warning("Not enough ref samples, using zeroes");
++        s->using_zeroes = TRUE;
++      }
++    } else {
++      if (s->using_zeroes) {
++        ms_message("Samples are back.");
++        s->using_zeroes = FALSE;
++      }
++      /* read from our no-delay buffer and output */
++      refm = allocb(nbytes, 0);
++      if (ms_flow_controlled_bufferizer_read(&s->ref, refm->b_wptr, nbytes) ==
++          0) {
++        ms_fatal("Should never happen");
++      }
++      refm->b_wptr += nbytes;
++      ms_queue_put(f->outputs[0], refm);
++    }
++
++    /*now read a valid buffer of delayed ref samples*/
++    if (ms_bufferizer_read(&s->delayed_ref, (uint8_t *)ref, nbytes) == 0) {
++      ms_fatal("Should never happen");
++    }
++    avail -= nbytes;
++    avail_samples = avail / 2;
+ 
+ #ifdef EC_DUMP
+-		if (s->reffile)
+-			fwrite(ref, nbytes, 1, s->reffile);
+-		if (s->echofile)
+-			fwrite(echo, nbytes, 1, s->echofile);
++    if (s->reffile)
++      fwrite(ref, nbytes, 1, s->reffile);
++    if (s->echofile)
++      fwrite(echo, nbytes, 1, s->echofile);
+ #endif
+ #ifdef BUILD_AEC
+-		if (s->aec_type == WebRTCAECTypeNormal) {
+-			mswebrtc_aec_splitting_filter_analysis(s->splitting_filter, ref, echo);
+-			if (WebRtcAec_BufferFarend(s->aecInst,
+-					mswebrtc_aec_splitting_filter_get_ref(s->splitting_filter),
+-					(size_t)mswebrtc_aec_splitting_filter_get_bandsize(s->splitting_filter)) != 0)
+-				ms_error("WebRtcAec_BufferFarend() failed.");
+-			if (WebRtcAec_Process(s->aecInst,
+-					mswebrtc_aec_splitting_filter_get_echo_bands(s->splitting_filter),
+-					mswebrtc_aec_splitting_filter_get_number_of_bands(s->splitting_filter),
+-					mswebrtc_aec_splitting_filter_get_output_bands(s->splitting_filter),
+-					(size_t)mswebrtc_aec_splitting_filter_get_bandsize(s->splitting_filter), 0, 0) != 0)
+-				ms_error("WebRtcAec_Process() failed.");
+-			mswebrtc_aec_splitting_filter_synthesis(s->splitting_filter, (int16_t *)oecho->b_wptr);
+-		}
++    if (s->aec_type == WebRTCAECTypeNormal) {
++      mswebrtc_aec_splitting_filter_analysis(s->splitting_filter, ref, echo);
++      if (WebRtcAec_BufferFarend(
++              s->aecInst,
++              mswebrtc_aec_splitting_filter_get_ref(s->splitting_filter),
++              (size_t)mswebrtc_aec_splitting_filter_get_bandsize(
++                  s->splitting_filter)) != 0)
++        ms_error("WebRtcAec_BufferFarend() failed.");
++      if (WebRtcAec_Process(
++              s->aecInst,
++              mswebrtc_aec_splitting_filter_get_echo_bands(s->splitting_filter),
++              mswebrtc_aec_splitting_filter_get_number_of_bands(
++                  s->splitting_filter),
++              mswebrtc_aec_splitting_filter_get_output_bands(
++                  s->splitting_filter),
++              (size_t)mswebrtc_aec_splitting_filter_get_bandsize(
++                  s->splitting_filter),
++              0, 0) != 0)
++        ms_error("WebRtcAec_Process() failed.");
++      mswebrtc_aec_splitting_filter_synthesis(s->splitting_filter,
++                                              (int16_t *)oecho->b_wptr);
++    }
+ #endif
+ #ifdef BUILD_AECM
+-		if (s->aec_type == WebRTCAECTypeMobile) {
+-			if (WebRtcAecm_BufferFarend(s->aecInst, ref, (size_t)s->framesize) != 0)
+-				ms_error("WebRtcAecm_BufferFarend() failed.");
+-			if (WebRtcAecm_Process(s->aecInst, echo, NULL, (int16_t *)oecho->b_wptr, (size_t)s->framesize, 0) != 0)
+-				ms_error("WebRtcAecm_Process() failed.");
+-		}
++    if (s->aec_type == WebRTCAECTypeMobile) {
++      if (WebRtcAecm_BufferFarend(s->aecInst, ref, (size_t)s->framesize) != 0)
++        ms_error("WebRtcAecm_BufferFarend() failed.");
++      if (WebRtcAecm_Process(s->aecInst, echo, NULL, (int16_t *)oecho->b_wptr,
++                             (size_t)s->framesize, 0) != 0)
++        ms_error("WebRtcAecm_Process() failed.");
++    }
+ #endif
+ #ifdef EC_DUMP
+-		if (s->cleanfile)
+-			fwrite(oecho->b_wptr, nbytes, 1, s->cleanfile);
++    if (s->cleanfile)
++      fwrite(oecho->b_wptr, nbytes, 1, s->cleanfile);
+ #endif
+-		oecho->b_wptr += nbytes;
+-		ms_queue_put(f->outputs[1], oecho);
+-	}
++    oecho->b_wptr += nbytes;
++    ms_queue_put(f->outputs[1], oecho);
++  }
+ }
+ 
+ static void webrtc_aec_postprocess(MSFilter *f) {
+-	WebRTCAECState *s = (WebRTCAECState *) f->data;
++  WebRTCAECState *s = (WebRTCAECState *)f->data;
+ 
+-	ms_bufferizer_flush(&s->delayed_ref);
+-	ms_bufferizer_flush(&s->echo);
+-	ms_flow_controlled_bufferizer_flush(&s->ref);
++  ms_bufferizer_flush(&s->delayed_ref);
++  ms_bufferizer_flush(&s->echo);
++  ms_flow_controlled_bufferizer_flush(&s->ref);
+ #ifdef BUILD_AEC
+-	if (s->splitting_filter) {
+-		mswebrtc_aec_splitting_filter_destroy(s->splitting_filter);
+-		s->splitting_filter = NULL;
+-	}
++  if (s->splitting_filter) {
++    mswebrtc_aec_splitting_filter_destroy(s->splitting_filter);
++    s->splitting_filter = NULL;
++  }
+ #endif
+-	if (s->aecInst != NULL) {
++  if (s->aecInst != NULL) {
+ #ifdef BUILD_AEC
+-		if (s->aec_type == WebRTCAECTypeNormal) {
+-			WebRtcAec_Free(s->aecInst);
+-		}
++    if (s->aec_type == WebRTCAECTypeNormal) {
++      WebRtcAec_Free(s->aecInst);
++    }
+ #endif
+ #ifdef BUILD_AECM
+-		if (s->aec_type == WebRTCAECTypeMobile) {
+-			WebRtcAecm_Free(s->aecInst);
+-		}
++    if (s->aec_type == WebRTCAECTypeMobile) {
++      WebRtcAecm_Free(s->aecInst);
++    }
+ #endif
+-		s->aecInst = NULL;
+-	}
++    s->aecInst = NULL;
++  }
+ }
+ 
+ static int webrtc_aec_set_sr(MSFilter *f, void *arg) {
+-	WebRTCAECState *s = (WebRTCAECState *) f->data;
+-	int requested_sr = *(int *) arg;
+-	int sr = requested_sr;
+-
+-	if ((s->aec_type == WebRTCAECTypeNormal) && (requested_sr >= 48000)) {
+-		sr = 48000;
+-	} else if ((s->aec_type == WebRTCAECTypeNormal) && (requested_sr >= 32000)) {
+-		sr = 32000;
+-	} else if (requested_sr >= 16000) {
+-		sr = 16000;
+-	} else {
+-		sr = 8000;
+-	}
+-	if (sr != requested_sr)
+-		ms_message("Webrtc %s does not support sampling rate %i, using %i instead", ((s->aec_type == WebRTCAECTypeNormal)?"aec":"aecm"),requested_sr, sr);
+-
+-	s->samplerate = sr;
+-	configure_flow_controlled_bufferizer(s);
+-	return 0;
++  WebRTCAECState *s = (WebRTCAECState *)f->data;
++  int requested_sr = *(int *)arg;
++  int sr = requested_sr;
++
++  if ((s->aec_type == WebRTCAECTypeNormal) && (requested_sr >= 48000)) {
++    sr = 48000;
++  } else if ((s->aec_type == WebRTCAECTypeNormal) && (requested_sr >= 32000)) {
++    sr = 32000;
++  } else if (requested_sr >= 16000) {
++    sr = 16000;
++  } else {
++    sr = 8000;
++  }
++  if (sr != requested_sr)
++    ms_message("Webrtc %s does not support sampling rate %i, using %i instead",
++               ((s->aec_type == WebRTCAECTypeNormal) ? "aec" : "aecm"),
++               requested_sr, sr);
++
++  s->samplerate = sr;
++  configure_flow_controlled_bufferizer(s);
++  return 0;
+ }
+ 
+ static int webrtc_aec_get_sr(MSFilter *f, void *arg) {
+-	WebRTCAECState *s = (WebRTCAECState *) f->data;
+-	*(int *) arg=s->samplerate;
+-	return 0;
++  WebRTCAECState *s = (WebRTCAECState *)f->data;
++  *(int *)arg = s->samplerate;
++  return 0;
+ }
+ 
+ static int webrtc_aec_set_framesize(MSFilter *f, void *arg) {
+-	/* Do nothing because the WebRTC echo canceller only accept specific values: 80 and 160. We use 80 at 8khz, and 160 at 16khz */
+-	return 0;
++  /* Do nothing because the WebRTC echo canceller only accept specific values:
++   * 80 and 160. We use 80 at 8khz, and 160 at 16khz */
++  return 0;
+ }
+ 
+ static int webrtc_aec_set_delay(MSFilter *f, void *arg) {
+-	WebRTCAECState *s = (WebRTCAECState *) f->data;
+-	s->delay_ms = *(int *) arg;
+-	configure_flow_controlled_bufferizer(s);
+-	return 0;
++  WebRTCAECState *s = (WebRTCAECState *)f->data;
++  s->delay_ms = *(int *)arg;
++  configure_flow_controlled_bufferizer(s);
++  return 0;
+ }
+ 
+ static int webrtc_aec_set_tail_length(MSFilter *f, void *arg) {
+-	/* Do nothing because this is not needed by the WebRTC echo canceller. */
+-	return 0;
++  /* Do nothing because this is not needed by the WebRTC echo canceller. */
++  return 0;
+ }
+ static int webrtc_aec_set_bypass_mode(MSFilter *f, void *arg) {
+-	WebRTCAECState *s = (WebRTCAECState *) f->data;
+-	s->bypass_mode = *(bool_t *) arg;
+-	ms_message("set EC bypass mode to [%i]", s->bypass_mode);
+-	return 0;
++  WebRTCAECState *s = (WebRTCAECState *)f->data;
++  s->bypass_mode = *(bool_t *)arg;
++  ms_message("set EC bypass mode to [%i]", s->bypass_mode);
++  return 0;
+ }
+ static int webrtc_aec_get_bypass_mode(MSFilter *f, void *arg) {
+-	WebRTCAECState *s = (WebRTCAECState *) f->data;
+-	*(bool_t *) arg = s->bypass_mode;
+-	return 0;
++  WebRTCAECState *s = (WebRTCAECState *)f->data;
++  *(bool_t *)arg = s->bypass_mode;
++  return 0;
+ }
+ 
+ static int webrtc_aec_set_state(MSFilter *f, void *arg) {
+-	WebRTCAECState *s = (WebRTCAECState *) f->data;
+-	s->state_str = ms_strdup((const char *) arg);
+-	return 0;
++  WebRTCAECState *s = (WebRTCAECState *)f->data;
++  s->state_str = ms_strdup((const char *)arg);
++  return 0;
+ }
+ 
+ static int webrtc_aec_get_state(MSFilter *f, void *arg) {
+-	WebRTCAECState *s = (WebRTCAECState *) f->data;
+-	*(char **) arg = s->state_str;
+-	return 0;
++  WebRTCAECState *s = (WebRTCAECState *)f->data;
++  *(char **)arg = s->state_str;
++  return 0;
+ }
+ 
+ static MSFilterMethod webrtc_aec_methods[] = {
+-	{	MS_FILTER_SET_SAMPLE_RATE		,	webrtc_aec_set_sr 		},
+-	{	MS_FILTER_GET_SAMPLE_RATE		,	webrtc_aec_get_sr 		},
+-	{	MS_ECHO_CANCELLER_SET_TAIL_LENGTH	,	webrtc_aec_set_tail_length	},
+-	{	MS_ECHO_CANCELLER_SET_DELAY		,	webrtc_aec_set_delay		},
+-	{	MS_ECHO_CANCELLER_SET_FRAMESIZE		,	webrtc_aec_set_framesize	},
+-	{	MS_ECHO_CANCELLER_SET_BYPASS_MODE	,	webrtc_aec_set_bypass_mode	},
+-	{	MS_ECHO_CANCELLER_GET_BYPASS_MODE	,	webrtc_aec_get_bypass_mode	},
+-	{	MS_ECHO_CANCELLER_GET_STATE_STRING	,	webrtc_aec_get_state		},
+-	{	MS_ECHO_CANCELLER_SET_STATE_STRING	,	webrtc_aec_set_state		},
+-	{	0,	NULL }
+-};
+-
++    {MS_FILTER_SET_SAMPLE_RATE, webrtc_aec_set_sr},
++    {MS_FILTER_GET_SAMPLE_RATE, webrtc_aec_get_sr},
++    {MS_ECHO_CANCELLER_SET_TAIL_LENGTH, webrtc_aec_set_tail_length},
++    {MS_ECHO_CANCELLER_SET_DELAY, webrtc_aec_set_delay},
++    {MS_ECHO_CANCELLER_SET_FRAMESIZE, webrtc_aec_set_framesize},
++    {MS_ECHO_CANCELLER_SET_BYPASS_MODE, webrtc_aec_set_bypass_mode},
++    {MS_ECHO_CANCELLER_GET_BYPASS_MODE, webrtc_aec_get_bypass_mode},
++    {MS_ECHO_CANCELLER_GET_STATE_STRING, webrtc_aec_get_state},
++    {MS_ECHO_CANCELLER_SET_STATE_STRING, webrtc_aec_set_state},
++    {0, NULL}};
+ 
+ #ifdef BUILD_AEC
+ 
+-#define MS_WEBRTC_AEC_NAME        "MSWebRTCAEC"
++#define MS_WEBRTC_AEC_NAME "MSWebRTCAEC"
+ #define MS_WEBRTC_AEC_DESCRIPTION "Echo canceller using WebRTC library."
+-#define MS_WEBRTC_AEC_CATEGORY    MS_FILTER_OTHER
+-#define MS_WEBRTC_AEC_ENC_FMT     NULL
+-#define MS_WEBRTC_AEC_NINPUTS     2
+-#define MS_WEBRTC_AEC_NOUTPUTS    2
+-#define MS_WEBRTC_AEC_FLAGS       0
++#define MS_WEBRTC_AEC_CATEGORY MS_FILTER_OTHER
++#define MS_WEBRTC_AEC_ENC_FMT NULL
++#define MS_WEBRTC_AEC_NINPUTS 2
++#define MS_WEBRTC_AEC_NOUTPUTS 2
++#define MS_WEBRTC_AEC_FLAGS 0
+ 
+ #ifdef _MSC_VER
+ 
+ MSFilterDesc ms_webrtc_aec_desc = {
+-	MS_FILTER_PLUGIN_ID,
+-	MS_WEBRTC_AEC_NAME,
+-	MS_WEBRTC_AEC_DESCRIPTION,
+-	MS_WEBRTC_AEC_CATEGORY,
+-	MS_WEBRTC_AEC_ENC_FMT,
+-	MS_WEBRTC_AEC_NINPUTS,
+-	MS_WEBRTC_AEC_NOUTPUTS,
+-	webrtc_aec_init,
+-	webrtc_aec_preprocess,
+-	webrtc_aec_process,
+-	webrtc_aec_postprocess,
+-	webrtc_aec_uninit,
+-	webrtc_aec_methods,
+-	MS_WEBRTC_AEC_FLAGS
+-};
++    MS_FILTER_PLUGIN_ID,    MS_WEBRTC_AEC_NAME,     MS_WEBRTC_AEC_DESCRIPTION,
++    MS_WEBRTC_AEC_CATEGORY, MS_WEBRTC_AEC_ENC_FMT,  MS_WEBRTC_AEC_NINPUTS,
++    MS_WEBRTC_AEC_NOUTPUTS, webrtc_aec_init,        webrtc_aec_preprocess,
++    webrtc_aec_process,     webrtc_aec_postprocess, webrtc_aec_uninit,
++    webrtc_aec_methods,     MS_WEBRTC_AEC_FLAGS};
+ 
+ #else
+ 
+-MSFilterDesc ms_webrtc_aec_desc = {
+-	.id = MS_FILTER_PLUGIN_ID,
+-	.name = MS_WEBRTC_AEC_NAME,
+-	.text = MS_WEBRTC_AEC_DESCRIPTION,
+-	.category = MS_WEBRTC_AEC_CATEGORY,
+-	.enc_fmt = MS_WEBRTC_AEC_ENC_FMT,
+-	.ninputs = MS_WEBRTC_AEC_NINPUTS,
+-	.noutputs = MS_WEBRTC_AEC_NOUTPUTS,
+-	.init = webrtc_aec_init,
+-	.preprocess = webrtc_aec_preprocess,
+-	.process = webrtc_aec_process,
+-	.postprocess = webrtc_aec_postprocess,
+-	.uninit = webrtc_aec_uninit,
+-	.methods = webrtc_aec_methods,
+-	.flags = MS_WEBRTC_AEC_FLAGS
+-};
++MSFilterDesc ms_webrtc_aec_desc = {.id = MS_FILTER_PLUGIN_ID,
++                                   .name = MS_WEBRTC_AEC_NAME,
++                                   .text = MS_WEBRTC_AEC_DESCRIPTION,
++                                   .category = MS_WEBRTC_AEC_CATEGORY,
++                                   .enc_fmt = MS_WEBRTC_AEC_ENC_FMT,
++                                   .ninputs = MS_WEBRTC_AEC_NINPUTS,
++                                   .noutputs = MS_WEBRTC_AEC_NOUTPUTS,
++                                   .init = webrtc_aec_init,
++                                   .preprocess = webrtc_aec_preprocess,
++                                   .process = webrtc_aec_process,
++                                   .postprocess = webrtc_aec_postprocess,
++                                   .uninit = webrtc_aec_uninit,
++                                   .methods = webrtc_aec_methods,
++                                   .flags = MS_WEBRTC_AEC_FLAGS};
+ 
+ #endif
+ 
+@@ -517,51 +535,40 @@ MS_FILTER_DESC_EXPORT(ms_webrtc_aec_desc)
+ 
+ #ifdef BUILD_AECM
+ 
+-#define MS_WEBRTC_AECM_NAME        "MSWebRTCAECM"
+-#define MS_WEBRTC_AECM_DESCRIPTION "Echo canceller for mobile using WebRTC library."
+-#define MS_WEBRTC_AECM_CATEGORY    MS_FILTER_OTHER
+-#define MS_WEBRTC_AECM_ENC_FMT     NULL
+-#define MS_WEBRTC_AECM_NINPUTS     2
+-#define MS_WEBRTC_AECM_NOUTPUTS    2
+-#define MS_WEBRTC_AECM_FLAGS       0
++#define MS_WEBRTC_AECM_NAME "MSWebRTCAECM"
++#define MS_WEBRTC_AECM_DESCRIPTION                                             \
++  "Echo canceller for mobile using WebRTC library."
++#define MS_WEBRTC_AECM_CATEGORY MS_FILTER_OTHER
++#define MS_WEBRTC_AECM_ENC_FMT NULL
++#define MS_WEBRTC_AECM_NINPUTS 2
++#define MS_WEBRTC_AECM_NOUTPUTS 2
++#define MS_WEBRTC_AECM_FLAGS 0
+ 
+ #ifdef _MSC_VER
+ 
+ MSFilterDesc ms_webrtc_aecm_desc = {
+-	MS_FILTER_PLUGIN_ID,
+-	MS_WEBRTC_AECM_NAME,
+-	MS_WEBRTC_AECM_DESCRIPTION,
+-	MS_WEBRTC_AECM_CATEGORY,
+-	MS_WEBRTC_AECM_ENC_FMT,
+-	MS_WEBRTC_AECM_NINPUTS,
+-	MS_WEBRTC_AECM_NOUTPUTS,
+-	webrtc_aecm_init,
+-	webrtc_aec_preprocess,
+-	webrtc_aec_process,
+-	webrtc_aec_postprocess,
+-	webrtc_aec_uninit,
+-	webrtc_aec_methods,
+-	MS_WEBRTC_AECM_FLAGS
+-};
++    MS_FILTER_PLUGIN_ID,     MS_WEBRTC_AECM_NAME,    MS_WEBRTC_AECM_DESCRIPTION,
++    MS_WEBRTC_AECM_CATEGORY, MS_WEBRTC_AECM_ENC_FMT, MS_WEBRTC_AECM_NINPUTS,
++    MS_WEBRTC_AECM_NOUTPUTS, webrtc_aecm_init,       webrtc_aec_preprocess,
++    webrtc_aec_process,      webrtc_aec_postprocess, webrtc_aec_uninit,
++    webrtc_aec_methods,      MS_WEBRTC_AECM_FLAGS};
+ 
+ #else
+ 
+-MSFilterDesc ms_webrtc_aecm_desc = {
+-	.id = MS_FILTER_PLUGIN_ID,
+-	.name = MS_WEBRTC_AECM_NAME,
+-	.text = MS_WEBRTC_AECM_DESCRIPTION,
+-	.category = MS_WEBRTC_AECM_CATEGORY,
+-	.enc_fmt = MS_WEBRTC_AECM_ENC_FMT,
+-	.ninputs = MS_WEBRTC_AECM_NINPUTS,
+-	.noutputs = MS_WEBRTC_AECM_NOUTPUTS,
+-	.init = webrtc_aecm_init,
+-	.preprocess = webrtc_aec_preprocess,
+-	.process = webrtc_aec_process,
+-	.postprocess = webrtc_aec_postprocess,
+-	.uninit = webrtc_aec_uninit,
+-	.methods = webrtc_aec_methods,
+-	.flags = MS_WEBRTC_AECM_FLAGS
+-};
++MSFilterDesc ms_webrtc_aecm_desc = {.id = MS_FILTER_PLUGIN_ID,
++                                    .name = MS_WEBRTC_AECM_NAME,
++                                    .text = MS_WEBRTC_AECM_DESCRIPTION,
++                                    .category = MS_WEBRTC_AECM_CATEGORY,
++                                    .enc_fmt = MS_WEBRTC_AECM_ENC_FMT,
++                                    .ninputs = MS_WEBRTC_AECM_NINPUTS,
++                                    .noutputs = MS_WEBRTC_AECM_NOUTPUTS,
++                                    .init = webrtc_aecm_init,
++                                    .preprocess = webrtc_aec_preprocess,
++                                    .process = webrtc_aec_process,
++                                    .postprocess = webrtc_aec_postprocess,
++                                    .uninit = webrtc_aec_uninit,
++                                    .methods = webrtc_aec_methods,
++                                    .flags = MS_WEBRTC_AECM_FLAGS};
+ 
+ #endif
+ 
+-- 
+GitLab
+
diff --git a/mswebrtc-cmake.patch b/mswebrtc-cmake.patch
new file mode 100644
index 0000000..19d0c31
--- /dev/null
+++ b/mswebrtc-cmake.patch
@@ -0,0 +1,626 @@
+From e52911c291e5ebe16da764e53cb740b7deb77e75 Mon Sep 17 00:00:00 2001
+From: Ghislain MARY <ghislain.mary at belledonne-communications.com>
+Date: Mon, 13 Mar 2023 19:05:30 +0100
+Subject: [PATCH] Update CMakeLists.txt so that the project can be added as a
+ subdirectory of linphone-sdk.
+
+Rename CMake targets for uniform naming.
+---
+ CMakeLists.txt                 | 68 ++++++++++++++++++----------------
+ cmake/FindBcToolbox.cmake      | 67 +++++++++++++++++++++++++++++++++
+ cmake/FindMediastreamer2.cmake | 46 +++++++++++++++++++++++
+ cmake/FindOrtp.cmake           | 43 +++++++++++++++++++++
+ 4 files changed, 193 insertions(+), 31 deletions(-)
+ create mode 100644 cmake/FindBcToolbox.cmake
+ create mode 100644 cmake/FindMediastreamer2.cmake
+ create mode 100644 cmake/FindOrtp.cmake
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 0f26f4f..fd5b52e 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -1,6 +1,6 @@
+ ############################################################################
+ # CMakeLists.txt
+-# Copyright (C) 2014  Belledonne Communications, Grenoble France
++# Copyright (C) 2014-2023  Belledonne Communications, Grenoble France
+ #
+ ############################################################################
+ #
+@@ -20,7 +20,8 @@
+ #
+ ############################################################################
+ 
+-cmake_minimum_required(VERSION 3.1)
++cmake_minimum_required(VERSION 3.22)
++
+ project(mswebrtc VERSION 1.1.1 LANGUAGES C CXX)
+ 
+ 
+@@ -34,8 +35,6 @@ set(PACKAGE_URL "")
+ set(VERSION "${PACKAGE_VERSION}")
+ 
+ 
+-option(ENABLE_SHARED "Build shared library." YES)
+-option(ENABLE_STATIC "Build static library." YES)
+ option(ENABLE_AEC "Enable the WebRTC echo canceller support." YES)
+ option(ENABLE_AECM "Enable the WebRTC echo canceller for mobile support." YES)
+ option(ENABLE_ISAC "Enable the ISAC audio codec support." YES)
+@@ -60,9 +59,20 @@ if(NOT CMAKE_INSTALL_RPATH AND CMAKE_INSTALL_PREFIX)
+ 	message(STATUS "Setting install rpath to ${CMAKE_INSTALL_RPATH}")
+ endif()
+ 
+-find_package(Mediastreamer2 REQUIRED CONFIG)
+-find_package(ortp REQUIRED CONFIG)
+-find_package(bctoolbox REQUIRED CONFIG)
++list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
++
++find_package(BcToolbox)
++if(NOT BCTOOLBOX_FOUND)
++	find_package(bctoolbox REQUIRED CONFIG)
++endif()
++find_package(Ortp)
++if(NOT ORTP_FOUND)
++	find_package(ortp REQUIRED CONFIG)
++endif()
++find_package(Mediastreamer2)
++if(NOT MEDIASTREAMER2_FOUND)
++	find_package(Mediastreamer2 REQUIRED CONFIG)
++endif()
+ 
+ find_library(LIBM NAMES m)
+ 
+@@ -410,24 +420,18 @@ endif()
+ 
+ set(MS2_PLUGINS_DIR "${MEDIASTREAMER2_PLUGINS_LOCATION}")
+ 
+-if(ENABLE_STATIC)
+-	add_library(mswebrtc-static STATIC ${SOURCE_FILES})
+-	set_target_properties(mswebrtc-static PROPERTIES OUTPUT_NAME mswebrtc)
+-	set_target_properties(mswebrtc-static PROPERTIES LINKER_LANGUAGE CXX)
+-	target_link_libraries(mswebrtc-static ${LIBS})
+-	install(TARGETS mswebrtc-static
+-		ARCHIVE DESTINATION "${MS2_PLUGINS_DIR}"
+-		PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
+-	)
+-endif()
+-if(ENABLE_SHARED)
+-	if(NOT IOS)
+-		add_library(mswebrtc MODULE ${SOURCE_FILES})
+-	else()
++if(BUILD_SHARED_LIBS)
++	if(IOS)
+ 		add_library(mswebrtc SHARED ${SOURCE_FILES})
++	else()
++		add_library(mswebrtc MODULE ${SOURCE_FILES})
+ 	endif()
+-	target_link_libraries(mswebrtc PRIVATE mediastreamer ortp bctoolbox ${LIBS})
+-	set_target_properties(mswebrtc PROPERTIES LINKER_LANGUAGE CXX)
++else()
++	add_library(mswebrtc STATIC ${SOURCE_FILES})
++endif()
++target_link_libraries(mswebrtc PRIVATE mediastreamer2 ortp bctoolbox ${LIBS})
++set_target_properties(mswebrtc PROPERTIES LINKER_LANGUAGE CXX)
++if(BUILD_SHARED_LIBS)
+ 	if(APPLE)
+ 		if(IOS)
+ 			set(MIN_OS ${LINPHONE_IOS_DEPLOYMENT_TARGET})
+@@ -441,7 +445,7 @@ if(ENABLE_SHARED)
+ 			set(MIN_OS ${CMAKE_OSX_DEPLOYMENT_TARGET})
+ 		endif()
+ 
+-		set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/build/osx/")
++		set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/build/osx/")
+ 	endif()
+ 	if(MSVC)
+ 		if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
+@@ -454,14 +458,16 @@ if(ENABLE_SHARED)
+ 			set_target_properties(mswebrtc PROPERTIES PREFIX "lib")
+ 		endif()
+ 	endif()
+-	install(TARGETS mswebrtc
+-			RUNTIME DESTINATION ${MS2_PLUGINS_DIR}
+-			LIBRARY DESTINATION ${MS2_PLUGINS_DIR}
+-			ARCHIVE DESTINATION ${MS2_PLUGINS_DIR}
+-			FRAMEWORK DESTINATION Frameworks
+-			PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
+-	)
+ endif()
+ 
++install(TARGETS mswebrtc
++		RUNTIME DESTINATION ${MS2_PLUGINS_DIR}
++		LIBRARY DESTINATION ${MS2_PLUGINS_DIR}
++		ARCHIVE DESTINATION ${MS2_PLUGINS_DIR}
++		FRAMEWORK DESTINATION Frameworks
++		PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
++)
++
++
+ add_subdirectory(build)
+ 
+diff --git a/cmake/FindBcToolbox.cmake b/cmake/FindBcToolbox.cmake
+new file mode 100644
+index 0000000..5766478
+--- /dev/null
++++ b/cmake/FindBcToolbox.cmake
+@@ -0,0 +1,67 @@
++############################################################################
++# FindBctoolbox.cmake
++# Copyright (C) 2023  Belledonne Communications, Grenoble France
++#
++############################################################################
++#
++# This program is free software; you can redistribute it and/or
++# modify it under the terms of the GNU General Public License
++# as published by the Free Software Foundation; either version 2
++# of the License, or (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program; if not, write to the Free Software
++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
++#
++############################################################################
++#
++# - Find the bctoolbox include files and library
++#
++#  BCTOOLBOX_FOUND - System has lib bctoolbox
++#  BCTOOLBOX_INCLUDE_DIRS - The bctoolbox include directories
++#  BCTOOLBOX_LIBRARIES - The libraries needed to use bctoolbox
++#  BCTOOLBOX_CMAKE_DIR - The bctoolbox cmake directory
++#  BCTOOLBOX_CORE_FOUND - System has core bctoolbox
++#  BCTOOLBOX_CORE_INCLUDE_DIRS - The core bctoolbox include directories
++#  BCTOOLBOX_CORE_LIBRARIES - The core bctoolbox libraries
++#  BCTOOLBOX_TESTER_FOUND - System has bctoolbox tester
++#  BCTOOLBOX_TESTER_INCLUDE_DIRS - The bctoolbox tester include directories
++#  BCTOOLBOX_TESTER_LIBRARIES - The bctoolbox tester libraries 
++
++if(TARGET bctoolbox)
++
++	set(BCTOOLBOX_CORE_LIBRARIES bctoolbox)
++	get_target_property(BCTOOLBOX_CORE_INCLUDE_DIRS bctoolbox INTERFACE_INCLUDE_DIRECTORIES)
++	set(BCTOOLBOX_CORE_FOUND TRUE)
++	get_target_property(BCTOOLBOX_SOURCE_DIR bctoolbox SOURCE_DIR)
++	set(BCTOOLBOX_CMAKE_DIR "${BCTOOLBOX_SOURCE_DIR}/../cmake")
++	if(TARGET bctoolbox-tester)
++		set(BCTOOLBOX_TESTER_LIBRARIES bctoolbox-tester)
++		get_target_property(BCTOOLBOX_TESTER_INCLUDE_DIRS bctoolbox-tester INTERFACE_INCLUDE_DIRECTORIES)
++		set(BCTOOLBOX_TESTER_FOUND TRUE)
++		set(BCTOOLBOX_TESTER_COMPONENT_VARIABLES BCTOOLBOX_TESTER_FOUND BCTOOLBOX_TESTER_INCLUDE_DIRS BCTOOLBOX_TESTER_LIBRARIES)
++	endif()
++	set(BCTOOLBOX_LIBRARIES ${BCTOOLBOX_CORE_LIBRARIES} ${BCTOOLBOX_TESTER_LIBRARIES})
++	set(BCTOOLBOX_INCLUDE_DIRS ${BCTOOLBOX_CORE_INCLUDE_DIRS} ${BCTOOLBOX_TESTER_INCLUDE_DIRS})
++
++
++	include(FindPackageHandleStandardArgs)
++	find_package_handle_standard_args(BcToolbox
++		DEFAULT_MSG
++		BCTOOLBOX_INCLUDE_DIRS BCTOOLBOX_LIBRARIES BCTOOLBOX_CMAKE_DIR
++		BCTOOLBOX_CORE_FOUND BCTOOLBOX_CORE_INCLUDE_DIRS BCTOOLBOX_CORE_LIBRARIES
++		${BCTOOLBOX_TESTER_COMPONENT_VARIABLES}
++	)
++
++	mark_as_advanced(
++		BCTOOLBOX_INCLUDE_DIRS BCTOOLBOX_LIBRARIES BCTOOLBOX_CMAKE_DIR
++		BCTOOLBOX_CORE_FOUND BCTOOLBOX_CORE_INCLUDE_DIRS BCTOOLBOX_CORE_LIBRARIES
++		${BCTOOLBOX_TESTER_COMPONENT_VARIABLES}
++	)
++
++endif()
+diff --git a/cmake/FindMediastreamer2.cmake b/cmake/FindMediastreamer2.cmake
+new file mode 100644
+index 0000000..64ac8f2
+--- /dev/null
++++ b/cmake/FindMediastreamer2.cmake
+@@ -0,0 +1,46 @@
++############################################################################
++# FindMediastreamer2.cmake
++# Copyright (C) 2023  Belledonne Communications, Grenoble France
++#
++############################################################################
++#
++# This program is free software; you can redistribute it and/or
++# modify it under the terms of the GNU General Public License
++# as published by the Free Software Foundation; either version 2
++# of the License, or (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program; if not, write to the Free Software
++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
++#
++############################################################################
++#
++# - Find the mediastreamer2 include files and library
++#
++#  MEDIASTREAMER2_FOUND - system has lib mediastreamer2
++#  MEDIASTREAMER2_INCLUDE_DIRS - the mediasteamer2 include directory
++#  MEDIASTREAMER2_LIBRARIES - The library needed to use mediasteamer2
++#  MEDIASTREAMER2_PLUGINS_LOCATION - The location of the mediastreamer2 plugins
++
++if(TARGET mediastreamer2)
++
++	set(MEDIASTREAMER2_LIBRARIES mediastreamer2)
++	get_target_property(MEDIASTREAMER2_INCLUDE_DIRS mediastreamer2 INTERFACE_INCLUDE_DIRECTORIES)
++	define_property(TARGET PROPERTY "MS2_PLUGINS" BRIEF_DOCS "Stores the location of mediastreamer2 plugins" FULL_DOCS "Stores the location of mediastreamer2 plugins")
++	get_target_property(MEDIASTREAMER2_PLUGINS_LOCATION mediastreamer2 MS2_PLUGINS)
++
++
++	include(FindPackageHandleStandardArgs)
++	find_package_handle_standard_args(Mediastreamer2
++		DEFAULT_MSG
++		MEDIASTREAMER2_INCLUDE_DIRS MEDIASTREAMER2_LIBRARIES
++	)
++
++	mark_as_advanced(MEDIASTREAMER2_INCLUDE_DIRS MEDIASTREAMER2_LIBRARIES)
++
++endif()
+diff --git a/cmake/FindOrtp.cmake b/cmake/FindOrtp.cmake
+new file mode 100644
+index 0000000..13121fb
+--- /dev/null
++++ b/cmake/FindOrtp.cmake
+@@ -0,0 +1,43 @@
++############################################################################
++# FindOrtp.cmake
++# Copyright (C) 2023  Belledonne Communications, Grenoble France
++#
++############################################################################
++#
++# This program is free software; you can redistribute it and/or
++# modify it under the terms of the GNU General Public License
++# as published by the Free Software Foundation; either version 2
++# of the License, or (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program; if not, write to the Free Software
++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
++#
++############################################################################
++#
++# - Find the ortp include files and library
++#
++#  ORTP_FOUND - system has lib ortp
++#  ORTP_INCLUDE_DIRS - the ortp include directory
++#  ORTP_LIBRARIES - The library needed to use ortp
++
++if(TARGET ortp)
++
++	set(ORTP_LIBRARIES ortp)
++	get_target_property(ORTP_INCLUDE_DIRS ortp INTERFACE_INCLUDE_DIRECTORIES)
++
++
++	include(FindPackageHandleStandardArgs)
++	find_package_handle_standard_args(Ortp
++		DEFAULT_MSG
++		ORTP_INCLUDE_DIRS ORTP_LIBRARIES
++	)
++
++	mark_as_advanced(ORTP_INCLUDE_DIRS ORTP_LIBRARIES)
++
++endif()
+-- 
+GitLab
+
+From b5aea9bdaeecd99f6fc5601bfb88541d4e55841b Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Micka=C3=ABl=20Turnel?=
+ <mickael.turnel at belledonne-communications.com>
+Date: Fri, 23 Jun 2023 11:05:24 +0200
+Subject: [PATCH] Change the library path in the binary dir so it can be
+ retrieved easily by testers
+
+---
+ CMakeLists.txt | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index fd5b52e..ab3e651 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -24,6 +24,7 @@ cmake_minimum_required(VERSION 3.22)
+ 
+ project(mswebrtc VERSION 1.1.1 LANGUAGES C CXX)
+ 
++set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/mediastreamer2/plugins")
+ 
+ set(PACKAGE "${PROJECT_NAME}")
+ set(PACKAGE_NAME "${PROJECT_NAME}")
+-- 
+GitLab
+
+From 1809337d6191ec40f88191b5ce07cfb01ed07b20 Mon Sep 17 00:00:00 2001
+From: Ghislain MARY <ghislain.mary at belledonne-communications.com>
+Date: Tue, 20 Jun 2023 11:47:00 +0200
+Subject: [PATCH] Improve CMake find_package functionality.
+
+---
+ CMakeLists.txt                 | 30 ++++-----------
+ build/CMakeLists.txt           |  3 +-
+ cmake/FindBcToolbox.cmake      | 67 ----------------------------------
+ cmake/FindMediastreamer2.cmake | 46 -----------------------
+ cmake/FindOrtp.cmake           | 43 ----------------------
+ 5 files changed, 10 insertions(+), 179 deletions(-)
+ delete mode 100644 cmake/FindBcToolbox.cmake
+ delete mode 100644 cmake/FindMediastreamer2.cmake
+ delete mode 100644 cmake/FindOrtp.cmake
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index ab3e651..a869908 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -22,7 +22,7 @@
+ 
+ cmake_minimum_required(VERSION 3.22)
+ 
+-project(mswebrtc VERSION 1.1.1 LANGUAGES C CXX)
++project(MSWebRTC VERSION 1.1.1 LANGUAGES C CXX)
+ 
+ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/mediastreamer2/plugins")
+ 
+@@ -60,20 +60,8 @@ if(NOT CMAKE_INSTALL_RPATH AND CMAKE_INSTALL_PREFIX)
+ 	message(STATUS "Setting install rpath to ${CMAKE_INSTALL_RPATH}")
+ endif()
+ 
+-list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
+-
+-find_package(BcToolbox)
+-if(NOT BCTOOLBOX_FOUND)
+-	find_package(bctoolbox REQUIRED CONFIG)
+-endif()
+-find_package(Ortp)
+-if(NOT ORTP_FOUND)
+-	find_package(ortp REQUIRED CONFIG)
+-endif()
+-find_package(Mediastreamer2)
+-if(NOT MEDIASTREAMER2_FOUND)
+-	find_package(Mediastreamer2 REQUIRED CONFIG)
+-endif()
++find_package(BCToolbox 5.3.0 REQUIRED)
++find_package(Mediastreamer2 5.3.0 REQUIRED)
+ 
+ find_library(LIBM NAMES m)
+ 
+@@ -92,7 +80,7 @@ endif()
+ if(ENABLE_VAD)
+ 	set(BUILD_VAD 1)
+ endif()
+-configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
++configure_file("${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake" "${CMAKE_CURRENT_BINARY_DIR}/config.h")
+ 
+ set(WEBRTC_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/webrtc")
+ set(WEBRTC_SRC_DIR "${WEBRTC_ROOT_DIR}/webrtc")
+@@ -419,8 +407,6 @@ if(LIBM)
+ 	list(APPEND LIBS ${LIBM})
+ endif()
+ 
+-set(MS2_PLUGINS_DIR "${MEDIASTREAMER2_PLUGINS_LOCATION}")
+-
+ if(BUILD_SHARED_LIBS)
+ 	if(IOS)
+ 		add_library(mswebrtc SHARED ${SOURCE_FILES})
+@@ -430,7 +416,7 @@ if(BUILD_SHARED_LIBS)
+ else()
+ 	add_library(mswebrtc STATIC ${SOURCE_FILES})
+ endif()
+-target_link_libraries(mswebrtc PRIVATE mediastreamer2 ortp bctoolbox ${LIBS})
++target_link_libraries(mswebrtc PRIVATE ${Mediastreamer2_TARGET} ${LIBS})
+ set_target_properties(mswebrtc PROPERTIES LINKER_LANGUAGE CXX)
+ if(BUILD_SHARED_LIBS)
+ 	if(APPLE)
+@@ -462,9 +448,9 @@ if(BUILD_SHARED_LIBS)
+ endif()
+ 
+ install(TARGETS mswebrtc
+-		RUNTIME DESTINATION ${MS2_PLUGINS_DIR}
+-		LIBRARY DESTINATION ${MS2_PLUGINS_DIR}
+-		ARCHIVE DESTINATION ${MS2_PLUGINS_DIR}
++		RUNTIME DESTINATION ${Mediastreamer2_PLUGINS_DIR}
++		LIBRARY DESTINATION ${Mediastreamer2_PLUGINS_DIR}
++		ARCHIVE DESTINATION ${Mediastreamer2_PLUGINS_DIR}
+ 		FRAMEWORK DESTINATION Frameworks
+ 		PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
+ )
+diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt
+index 82694c6..8f9108b 100755
+--- a/build/CMakeLists.txt
++++ b/build/CMakeLists.txt
+@@ -21,7 +21,8 @@
+ ############################################################################
+ 
+ if(NOT CPACK_PACKAGE_NAME)
+-	set(CPACK_PACKAGE_NAME "${PROJECT_NAME}")
++	string(TOLOWER "${PROJECT_NAME}" LOWERCASE_PROJECT_NAME)
++	set(CPACK_PACKAGE_NAME "${LOWERCASE_PROJECT_NAME}")
+ endif()
+ 
+ set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/../COPYING")
+diff --git a/cmake/FindBcToolbox.cmake b/cmake/FindBcToolbox.cmake
+deleted file mode 100644
+index 5766478..0000000
+--- a/cmake/FindBcToolbox.cmake
++++ /dev/null
+@@ -1,67 +0,0 @@
+-############################################################################
+-# FindBctoolbox.cmake
+-# Copyright (C) 2023  Belledonne Communications, Grenoble France
+-#
+-############################################################################
+-#
+-# This program is free software; you can redistribute it and/or
+-# modify it under the terms of the GNU General Public License
+-# as published by the Free Software Foundation; either version 2
+-# of the License, or (at your option) any later version.
+-#
+-# This program is distributed in the hope that it will be useful,
+-# but WITHOUT ANY WARRANTY; without even the implied warranty of
+-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-# GNU General Public License for more details.
+-#
+-# You should have received a copy of the GNU General Public License
+-# along with this program; if not, write to the Free Software
+-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+-#
+-############################################################################
+-#
+-# - Find the bctoolbox include files and library
+-#
+-#  BCTOOLBOX_FOUND - System has lib bctoolbox
+-#  BCTOOLBOX_INCLUDE_DIRS - The bctoolbox include directories
+-#  BCTOOLBOX_LIBRARIES - The libraries needed to use bctoolbox
+-#  BCTOOLBOX_CMAKE_DIR - The bctoolbox cmake directory
+-#  BCTOOLBOX_CORE_FOUND - System has core bctoolbox
+-#  BCTOOLBOX_CORE_INCLUDE_DIRS - The core bctoolbox include directories
+-#  BCTOOLBOX_CORE_LIBRARIES - The core bctoolbox libraries
+-#  BCTOOLBOX_TESTER_FOUND - System has bctoolbox tester
+-#  BCTOOLBOX_TESTER_INCLUDE_DIRS - The bctoolbox tester include directories
+-#  BCTOOLBOX_TESTER_LIBRARIES - The bctoolbox tester libraries 
+-
+-if(TARGET bctoolbox)
+-
+-	set(BCTOOLBOX_CORE_LIBRARIES bctoolbox)
+-	get_target_property(BCTOOLBOX_CORE_INCLUDE_DIRS bctoolbox INTERFACE_INCLUDE_DIRECTORIES)
+-	set(BCTOOLBOX_CORE_FOUND TRUE)
+-	get_target_property(BCTOOLBOX_SOURCE_DIR bctoolbox SOURCE_DIR)
+-	set(BCTOOLBOX_CMAKE_DIR "${BCTOOLBOX_SOURCE_DIR}/../cmake")
+-	if(TARGET bctoolbox-tester)
+-		set(BCTOOLBOX_TESTER_LIBRARIES bctoolbox-tester)
+-		get_target_property(BCTOOLBOX_TESTER_INCLUDE_DIRS bctoolbox-tester INTERFACE_INCLUDE_DIRECTORIES)
+-		set(BCTOOLBOX_TESTER_FOUND TRUE)
+-		set(BCTOOLBOX_TESTER_COMPONENT_VARIABLES BCTOOLBOX_TESTER_FOUND BCTOOLBOX_TESTER_INCLUDE_DIRS BCTOOLBOX_TESTER_LIBRARIES)
+-	endif()
+-	set(BCTOOLBOX_LIBRARIES ${BCTOOLBOX_CORE_LIBRARIES} ${BCTOOLBOX_TESTER_LIBRARIES})
+-	set(BCTOOLBOX_INCLUDE_DIRS ${BCTOOLBOX_CORE_INCLUDE_DIRS} ${BCTOOLBOX_TESTER_INCLUDE_DIRS})
+-
+-
+-	include(FindPackageHandleStandardArgs)
+-	find_package_handle_standard_args(BcToolbox
+-		DEFAULT_MSG
+-		BCTOOLBOX_INCLUDE_DIRS BCTOOLBOX_LIBRARIES BCTOOLBOX_CMAKE_DIR
+-		BCTOOLBOX_CORE_FOUND BCTOOLBOX_CORE_INCLUDE_DIRS BCTOOLBOX_CORE_LIBRARIES
+-		${BCTOOLBOX_TESTER_COMPONENT_VARIABLES}
+-	)
+-
+-	mark_as_advanced(
+-		BCTOOLBOX_INCLUDE_DIRS BCTOOLBOX_LIBRARIES BCTOOLBOX_CMAKE_DIR
+-		BCTOOLBOX_CORE_FOUND BCTOOLBOX_CORE_INCLUDE_DIRS BCTOOLBOX_CORE_LIBRARIES
+-		${BCTOOLBOX_TESTER_COMPONENT_VARIABLES}
+-	)
+-
+-endif()
+diff --git a/cmake/FindMediastreamer2.cmake b/cmake/FindMediastreamer2.cmake
+deleted file mode 100644
+index 64ac8f2..0000000
+--- a/cmake/FindMediastreamer2.cmake
++++ /dev/null
+@@ -1,46 +0,0 @@
+-############################################################################
+-# FindMediastreamer2.cmake
+-# Copyright (C) 2023  Belledonne Communications, Grenoble France
+-#
+-############################################################################
+-#
+-# This program is free software; you can redistribute it and/or
+-# modify it under the terms of the GNU General Public License
+-# as published by the Free Software Foundation; either version 2
+-# of the License, or (at your option) any later version.
+-#
+-# This program is distributed in the hope that it will be useful,
+-# but WITHOUT ANY WARRANTY; without even the implied warranty of
+-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-# GNU General Public License for more details.
+-#
+-# You should have received a copy of the GNU General Public License
+-# along with this program; if not, write to the Free Software
+-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+-#
+-############################################################################
+-#
+-# - Find the mediastreamer2 include files and library
+-#
+-#  MEDIASTREAMER2_FOUND - system has lib mediastreamer2
+-#  MEDIASTREAMER2_INCLUDE_DIRS - the mediasteamer2 include directory
+-#  MEDIASTREAMER2_LIBRARIES - The library needed to use mediasteamer2
+-#  MEDIASTREAMER2_PLUGINS_LOCATION - The location of the mediastreamer2 plugins
+-
+-if(TARGET mediastreamer2)
+-
+-	set(MEDIASTREAMER2_LIBRARIES mediastreamer2)
+-	get_target_property(MEDIASTREAMER2_INCLUDE_DIRS mediastreamer2 INTERFACE_INCLUDE_DIRECTORIES)
+-	define_property(TARGET PROPERTY "MS2_PLUGINS" BRIEF_DOCS "Stores the location of mediastreamer2 plugins" FULL_DOCS "Stores the location of mediastreamer2 plugins")
+-	get_target_property(MEDIASTREAMER2_PLUGINS_LOCATION mediastreamer2 MS2_PLUGINS)
+-
+-
+-	include(FindPackageHandleStandardArgs)
+-	find_package_handle_standard_args(Mediastreamer2
+-		DEFAULT_MSG
+-		MEDIASTREAMER2_INCLUDE_DIRS MEDIASTREAMER2_LIBRARIES
+-	)
+-
+-	mark_as_advanced(MEDIASTREAMER2_INCLUDE_DIRS MEDIASTREAMER2_LIBRARIES)
+-
+-endif()
+diff --git a/cmake/FindOrtp.cmake b/cmake/FindOrtp.cmake
+deleted file mode 100644
+index 13121fb..0000000
+--- a/cmake/FindOrtp.cmake
++++ /dev/null
+@@ -1,43 +0,0 @@
+-############################################################################
+-# FindOrtp.cmake
+-# Copyright (C) 2023  Belledonne Communications, Grenoble France
+-#
+-############################################################################
+-#
+-# This program is free software; you can redistribute it and/or
+-# modify it under the terms of the GNU General Public License
+-# as published by the Free Software Foundation; either version 2
+-# of the License, or (at your option) any later version.
+-#
+-# This program is distributed in the hope that it will be useful,
+-# but WITHOUT ANY WARRANTY; without even the implied warranty of
+-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-# GNU General Public License for more details.
+-#
+-# You should have received a copy of the GNU General Public License
+-# along with this program; if not, write to the Free Software
+-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+-#
+-############################################################################
+-#
+-# - Find the ortp include files and library
+-#
+-#  ORTP_FOUND - system has lib ortp
+-#  ORTP_INCLUDE_DIRS - the ortp include directory
+-#  ORTP_LIBRARIES - The library needed to use ortp
+-
+-if(TARGET ortp)
+-
+-	set(ORTP_LIBRARIES ortp)
+-	get_target_property(ORTP_INCLUDE_DIRS ortp INTERFACE_INCLUDE_DIRECTORIES)
+-
+-
+-	include(FindPackageHandleStandardArgs)
+-	find_package_handle_standard_args(Ortp
+-		DEFAULT_MSG
+-		ORTP_INCLUDE_DIRS ORTP_LIBRARIES
+-	)
+-
+-	mark_as_advanced(ORTP_INCLUDE_DIRS ORTP_LIBRARIES)
+-
+-endif()
+-- 
+GitLab
+
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/mediastreamer-plugin-mswebrtc.git/commitdiff/41e110f6da51acf50f60cd2edb39e98b73152d5a



More information about the pld-cvs-commit mailing list