Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package re for openSUSE:Factory checked in at 2026-09-04 12:38:37 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/re (Old) and /work/SRC/openSUSE:Factory/.re.new.1265 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "re" Fri Sep 4 12:38:37 2026 rev:24 rq:1375427 version:4.11.0 Changes: -------- --- /work/SRC/openSUSE:Factory/re/re.changes 2026-07-23 23:14:14.712499308 +0200 +++ /work/SRC/openSUSE:Factory/.re.new.1265/re.changes 2026-09-04 12:39:07.963892668 +0200 @@ -1,0 +2,18 @@ +Wed Sep 2 13:48:24 UTC 2026 - Martin Hauke <[email protected]> + +- Update to version 4.11.0 + Security Fixes + * libre's HTTP Basic auth verifier accept empty or prefix + credential blindly fixed by #1601. + * libre allows one spoofed UDP packet forges RTCP control + messages fixed by #1600. + Changes + * btrace: optimize addr2line handling. + * aubuf: remove adaptive mode. + * httpauth/basic: fix mem_seccmp cmp length. + * srtcp: fix/add AES-GCM no encryption flag auth. + * mem_pool: fix mem_pool_flush free list handling. + * mem/mem_pool: check mem_pool_borrow_extend empty pool param. + * json/decode_odict: fix possible container dangling pointer. + +------------------------------------------------------------------- Old: ---- re-4.10.0.tar.gz New: ---- re-4.11.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ re.spec ++++++ --- /var/tmp/diff_new_pack.vITCwO/_old 2026-09-04 12:39:08.742920035 +0200 +++ /var/tmp/diff_new_pack.vITCwO/_new 2026-09-04 12:39:08.744920105 +0200 @@ -17,10 +17,10 @@ # -%global sover 44 +%global sover 45 %global libname lib%{name}%{sover} Name: re -Version: 4.10.0 +Version: 4.11.0 Release: 0 Summary: Library for real-time communications with async I/O support License: BSD-3-Clause ++++++ re-4.10.0.tar.gz -> re-4.11.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/re-4.10.0/CHANGELOG.md new/re-4.11.0/CHANGELOG.md --- old/re-4.10.0/CHANGELOG.md 2026-07-22 11:43:10.000000000 +0200 +++ new/re-4.11.0/CHANGELOG.md 2026-08-24 13:03:29.000000000 +0200 @@ -5,6 +5,21 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## v4.11.0 - 2026-08-25 + +## What's Changed +* btrace: optimize addr2line handling by @sreimers in https://github.com/baresip/re/pull/1598 +* aubuf: remove adaptive mode by @cspiel1 in https://github.com/baresip/re/pull/1597 +* httpauth/basic: fix mem_seccmp cmp length by @sreimers in https://github.com/baresip/re/pull/1601 +* srtcp: fix/add AES-GCM no encryption flag auth by @sreimers in https://github.com/baresip/re/pull/1600 +* mem_pool: fix mem_pool_flush free list handling by @sreimers in https://github.com/baresip/re/pull/1604 +* mem/mem_pool: check mem_pool_borrow_extend empty pool param by @sreimers in https://github.com/baresip/re/pull/1606 +* json/decode_odict: fix possible container dangling pointer by @sreimers in https://github.com/baresip/re/pull/1605 + + +**Full Changelog**: https://github.com/baresip/re/compare/v4.10.0...v4.11.0 + + ## v4.10.0 - 2026-07-22 ### What's Changed diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/re-4.10.0/CMakeLists.txt new/re-4.11.0/CMakeLists.txt --- old/re-4.10.0/CMakeLists.txt 2026-07-22 11:43:10.000000000 +0200 +++ new/re-4.11.0/CMakeLists.txt 2026-08-24 13:03:29.000000000 +0200 @@ -14,13 +14,13 @@ cmake_minimum_required(VERSION 3.18...4.0) project(re - VERSION 4.10.0 + VERSION 4.11.0 LANGUAGES C HOMEPAGE_URL https://github.com/baresip/re DESCRIPTION "Generic library for real-time communications" ) -set(PROJECT_SOVERSION 44) # bump if ABI breaks +set(PROJECT_SOVERSION 45) # bump if ABI breaks # Pre-release identifier, comment out on a release # Increment for breaking changes (dev2, dev3...) @@ -416,7 +416,6 @@ rem/au/fmt.c rem/au/util.c rem/aubuf/aubuf.c - rem/aubuf/ajb.c rem/auconv/auconv.c rem/aufile/aufile.c rem/aufile/wave.c diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/re-4.10.0/include/rem_aubuf.h new/re-4.11.0/include/rem_aubuf.h --- old/re-4.10.0/include/rem_aubuf.h 2026-07-22 11:43:10.000000000 +0200 +++ new/re-4.11.0/include/rem_aubuf.h 2026-08-24 13:03:29.000000000 +0200 @@ -5,16 +5,9 @@ */ struct aubuf; -enum aubuf_mode { - AUBUF_FIXED, - AUBUF_ADAPTIVE -}; - int aubuf_alloc(struct aubuf **abp, size_t min_sz, size_t max_sz); void aubuf_set_id(struct aubuf *ab, struct pl *id); void aubuf_set_live(struct aubuf *ab, bool live); -void aubuf_set_mode(struct aubuf *ab, enum aubuf_mode mode); -void aubuf_set_silence(struct aubuf *ab, double silence); int aubuf_resize(struct aubuf *ab, size_t min_sz, size_t max_sz); int aubuf_write_auframe(struct aubuf *ab, const struct auframe *af); int aubuf_append_auframe(struct aubuf *ab, struct mbuf *mb, @@ -27,7 +20,6 @@ size_t aubuf_cur_size(const struct aubuf *ab); size_t aubuf_maxsz(const struct aubuf *ab); bool aubuf_started(const struct aubuf *ab); -void aubuf_drop_auframe(struct aubuf *ab, const struct auframe *af); static inline int aubuf_append(struct aubuf *ab, struct mbuf *mb) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/re-4.10.0/mk/Doxyfile new/re-4.11.0/mk/Doxyfile --- old/re-4.10.0/mk/Doxyfile 2026-07-22 11:43:10.000000000 +0200 +++ new/re-4.11.0/mk/Doxyfile 2026-08-24 13:03:29.000000000 +0200 @@ -4,7 +4,7 @@ # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = libre -PROJECT_NUMBER = 4.10.0 +PROJECT_NUMBER = 4.11.0 OUTPUT_DIRECTORY = ../re-dox CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/re-4.10.0/rem/aubuf/ajb.c new/re-4.11.0/rem/aubuf/ajb.c --- old/re-4.10.0/rem/aubuf/ajb.c 2026-07-22 11:43:10.000000000 +0200 +++ new/re-4.11.0/rem/aubuf/ajb.c 1970-01-01 01:00:00.000000000 +0100 @@ -1,447 +0,0 @@ -/** - * @file ajb.c Adaptive Jitter Buffer algorithm - * - * Copyright (C) 2022 Commend.com - [email protected] - * - * The adaptive jitter buffer algorithm (ajb) for audio buffer can be activated - * by invoking `aubuf_set_mode(ab, AUBUF_ADAPTIVE)`. The ajb algorithm - * increases the number of packets in the audio buffer during periods of high - * network jitter. It reduces the number of packets if the network condition - * improves. - * - * @section jitter Computing the jitter - * - * The jitter \f$j\f$ is the moving mean absolute deviation (MAD) of the - * time period buffered in `aubuf` \f$D\f$. It is estimated by the iterative - * formula - * - * \f$j_n = j_{n-1} + (|D - \overline{D}| - j_{n-1})\kappa\f$ - * - * where \f$\kappa\f$ is the weight that influences how fast the jitter value - * changes. - * - * We choose a higher value for the weight \f$\kappa\f$ if - * \f$|D - \overline{D}| > j_{n-1}\f$. Thus the jitter rises fast if e.g. - * suddenly a network jitter appears. In contrast when the network condition - * improves the jitter value slowly shrinks. The reason for different - * rising and falling speed is that we have to react fast to avoid buffer - * under-runs, whereas reducing of the latency is not so time-critical. - * - * In the following sections we will describe how the computed jitter is used - * to detect situations where the buffered packets should be increased due to - * a high jitter. We call this situation **Low** situation. When the jitter - * shrinks below some specific value it is a good idea to reduce the buffer in - * order to reduce the audio latency. We call this situation **High** - * situation. Surely, the Low/High situations have to be decided somehow. - * - * @section reduce_increase Reduce/Increase buffered packets - * - * When a Low situation is detected we increase the number of packets in - * `aubuf` by holding back a packet during one call to function - * `aubuf_read_auframe()`. While when a High situation is detected we reduce - * the number of packets by reading another audio frame. This overwrites one - * frame. By means of a silence detection `aubuf` is able to drop frames that - * are not important for the speech quality. This reduces the audio latency - * down to the value before the High situation. - * - * @section smooth_latency Computing a smooth latency - * - * The audio frames that are buffered at a concrete point in time in `aubuf` - * lead to a temporary latency value \f$D\f$. Let \f$f_0, ..., f_m\f$ be the - * audio frames currently stored in `aubuf`. Then - * - * \f$D = t_m - t_0 + D_p\f$ - * - * where \f$t_i\f$ is the timestamp of frame \f$f_i\f$ and \f$D_p\f$ is the - * packet time `ptime`. The packet time is a constant that is specified at the - * beginning of a SIP call. - * - * The temporary latency \f$D\f$ is discontinuous over time and not adequate - * for deciding or detecting Low or High situations. Therefore we again use an - * exponential moving average (EMA) to smooth \f$D\f$. Let \f$\kappa\f$ be an - * adequate moving average speed factor, then the smoothed latency - * - * \f$l_n = l_{n-1} + (D - l_{n-1})\kappa\f$. - * - * We use \f$l_n\f$ to estimate the average buffer time \f$\overline{D}\f$. - * Low/High situations are decided when the smoothed latency \f$l_n\f$ runs out - * of some boundaries that are computed from the jitter. - * - * @section low_high Deciding Low/High situations - * - * During each iteration (each call to `aubuf_write_frame()`) the jitter and - * the latency are computed. Additionally we compute the bottom boundary - * \f$D_b\f$ and the top boundary \f$D_t\f$ with - * - * \f$D_b = max(m . l_n, \frac{2}{3} D_p)\f$ and - * - * \f$D_t = max(M . l_n, D_b + D_p)\f$, - * - * where \f$1 < m < M\f$. - * - * Finally we have everything for deciding Low and High situations. That is if - * \f$l_n\f$ moves out of the boundaries - * - * \f$D_b < l_n < D_t\f$, - * - * then we fire a Low/High. - * - * @section early_adjustment Early adjustment of the latency - * - * If we detect a Low/High situation we increase/reduce the number of packets. - * Now we immediately increment/decrement the smoothed latency \f$l_n\f$ by - * \f$D_p\f$. - * Thus early adjustment for a Low situation is - * - * \f$l_{n+1} = l_n + D_p\f$ - * - * and for a High situation - * - * \f$l_{n+1} = l_n - D_p\f$. - * - * This avoids multiple Low/High detections in a row. - * - * @section silence Silence detection - * - * It is preferable to drop an audio frame only if it contains nearly silence. - * - * @section symbols Math symbols vs. C-variables - * - * In order to avoid float computation we use micro seconds to measure the time - * differences, the jitter and buffer time. Symbols used in this document are - * mapped to the C-variables in `src/aubuf/ajb.c` like this table shows: - * - * Symbol |Variable - * --------|-------- - * \f$j_n\f$ | `jitter` - * \f$D\f$ | `buftime` - * \f$l_n\f$ | `avbuftime` - * \f$D_b\f$ | `bufmin` - * \f$D_t\f$ | `bufmax` - * \f$D_p\f$ | `ptime` - */ - -#include <stdlib.h> -#include <re.h> -#include <rem_au.h> -#include <rem_aulevel.h> -#include <rem_auframe.h> -#include <rem_aubuf.h> -#include "ajb.h" - -#define DEBUG_LEVEL 5 - -/** - * @defgroup The adaptive jitter computation is done by means of an exponential - * moving average (EMA). - *j_i = j_{i-1} + a (c - j_{i-1}) - * - * Where $a$ ist the EMA coefficient and $c$ is the current value. - */ - -enum { - JITTER_EMA_COEFF = 512, /* Divisor for jitter EMA coefficient */ - JITTER_UP_SPEED = 64, /* 64 times faster up than down */ - BUFTIME_EMA_COEFF = 128, /* Divisor for Buftime EMA coeff. */ - BUFTIME_LO = 125, /* 125% of jitter */ - BUFTIME_HI = 175, /* 175% of jitter */ - SKEW_MAX = 10, /* Max skew in [ms] */ -}; - - -/** Adaptive jitter buffer statistics */ -struct ajb { - int32_t jitter; /**< Jitter in [us] */ - mtx_t *lock; - - uint64_t ts; /**< previous timestamp */ - uint64_t ts0; /**< reference timestamp */ - uint64_t tr0; /**< reference time of arrival */ - uint64_t tr00; /**< arrival of first packet */ -#ifdef RE_AUBUF_TRACE - struct { - int32_t d; - uint32_t buftime; - uint32_t bufmin; - uint32_t bufmax; - enum ajb_state as; - } plot; - - char buf[136]; /**< Buffer for trace */ -#endif - - enum ajb_state as; /**< computed jitter buffer state */ - - int32_t avbuftime; /**< average buffered time [us] */ - bool started; /**< Started flag */ - size_t wish_sz; /**< Wish size of buffer [Bytes] */ - uint32_t dropped; /**< Dropped audio frames counter */ - double silence; /**< Silence audio level */ -}; - - -static void destructor(void *arg) -{ - struct ajb *ajb = arg; - - mem_deref(ajb->lock); -} - - -#ifdef RE_AUBUF_TRACE -static void plot_ajb(struct ajb *ajb, uint64_t tr) -{ - uint32_t treal; - - if (!ajb->tr00) - ajb->tr00 = tr; - - treal = (uint32_t) (tr - ajb->tr00); - re_snprintf(ajb->buf, sizeof(ajb->buf), - "%s, 0x%p, %u, %i, %u, %u, %u, %i, %i, %u", - __func__, /* row 1 - grep */ - ajb, /* row 2 - grep optional */ - treal, /* row 3 - plot x-axis */ - ajb->plot.d, /* row 4 - plot */ - ajb->jitter, /* row 5 - plot */ - ajb->plot.buftime, /* row 6 - plot */ - ajb->avbuftime, /* row 7 - plot */ - ajb->plot.bufmin, /* row 8 - plot */ - ajb->plot.bufmax, /* row 9 - plot */ - ajb->plot.as); /* row 10 - plot */ - re_trace_event("ajb", "plot", 'P', NULL, RE_TRACE_ARG_STRING_COPY, - "line", ajb->buf); -} -#endif - - -/** - * Initializes the adaptive jitter buffer statistics - * - * @param silence Silence audio level - * @param wish_sz Wish size of buffer [Bytes] - * - * @return ajb Adaptive jitter buffer statistics - */ -struct ajb *ajb_alloc(double silence, size_t wish_sz) -{ - struct ajb *ajb; - int err; - - ajb = mem_zalloc(sizeof(*ajb), destructor); - if (!ajb) - return NULL; - - err = mutex_alloc(&ajb->lock); - if (err) - goto out; - - ajb->ts0 = 0; - ajb->tr0 = 0; - ajb->as = AJB_GOOD; - ajb->silence = silence; - ajb->wish_sz = wish_sz; - -out: - if (err) - ajb = mem_deref(ajb); - - return ajb; -} - - -void ajb_reset(struct ajb *ajb) -{ - if (!ajb) - return; - - mtx_lock(ajb->lock); - ajb->ts = 0; - ajb->ts0 = 0; - ajb->tr0 = 0; - - /* We start with wish size. */ - ajb->started = false; - ajb->as = AJB_GOOD; - mtx_unlock(ajb->lock); -} - - -/** - * Computes the jitter for audio frame arrival. - * - * @param ajb Adaptive jitter buffer statistics - * @param af Audio frame - * @param cur_sz Current aubuf size - */ -void ajb_calc(struct ajb *ajb, const struct auframe *af, size_t cur_sz) -{ - uint64_t tr; /**< Real time in [us] */ - uint32_t buftime, bufmax, bufmin; /**< Buffer time in [us] */ - uint32_t bufwish; /**< Buffer wish time in [us] */ - int32_t d; /**< Time shift in [us] */ - int32_t da; /**< Absolut time shift in [us] */ - int32_t s; /**< EMA coefficient */ - uint64_t ts; /**< Time stamp */ - uint64_t ds; /**< Time stamp duration */ - uint32_t ptime; /**< Packet time [us] */ - size_t szdiv; - - if (!ajb || !af || !af->srate) - return; - - mtx_lock(ajb->lock); - ts = af->timestamp; - tr = tmr_jiffies_usec(); - if (!ajb->ts0) - goto out; - - ds = ts - ajb->ts0; - d = (int32_t) (int64_t) ( (tr - ajb->tr0) - ds ); - da = abs(d); - - szdiv = af->srate * af->ch * aufmt_sample_size(af->fmt) / 1000; - buftime = (uint32_t) (cur_sz * 1000 / szdiv); - bufwish = (uint32_t) (ajb->wish_sz * 1000 / szdiv); - if (ajb->started) { - ajb->avbuftime += ((int32_t) buftime - ajb->avbuftime) / - BUFTIME_EMA_COEFF; - if (ajb->avbuftime < 0) - ajb->avbuftime = 0; - } - else { - /* Directly after "filling" of aubuf compute a good start value - * fitting to wish size. */ - ajb->avbuftime = buftime; - ajb->jitter = ajb->avbuftime * 100 * 2 / - (BUFTIME_LO + BUFTIME_HI); - ajb->started = true; - } - - s = da > ajb->jitter ? JITTER_UP_SPEED : 1; - - ajb->jitter += (da - ajb->jitter) * s / JITTER_EMA_COEFF; - if (ajb->jitter < 0) - ajb->jitter = 0; - - bufmin = (uint32_t) ajb->jitter * BUFTIME_LO / 100; - bufmax = (uint32_t) ajb->jitter * BUFTIME_HI / 100; - - ptime = (uint32_t) (af->sampc * AUDIO_TIMEBASE / (af->srate * af->ch)); - bufmin = MAX(bufmin, ptime * 2 / 3); - if (bufwish >= ptime) - bufmin = MAX(bufmin, bufwish - ptime / 3); - - bufmax = MAX(bufmax, bufmin + 7 * ptime / 6); - - /* reset time base if a frame is missing or skew is too high */ - if (ts - ajb->ts > ptime || da > SKEW_MAX * 1000) - ajb->ts0 = 0; - - if ((uint32_t) ajb->avbuftime < bufmin) - ajb->as = AJB_LOW; - else if ((uint32_t) ajb->avbuftime > bufmax) - ajb->as = AJB_HIGH; - else - ajb->as = AJB_GOOD; - -#ifdef RE_AUBUF_TRACE - ajb->plot.d = d; - ajb->plot.buftime = buftime; - ajb->plot.bufmin = bufmin; - ajb->plot.bufmax = bufmax; - plot_ajb(ajb, tr / 1000); -#endif -out: - ajb->ts = ts; - if (!ajb->ts0) { - ajb->ts0 = ts; - ajb->tr0 = tr; - } - mtx_unlock(ajb->lock); -} - - -void ajb_set_ts0(struct ajb *ajb, uint64_t timestamp) -{ - if (!ajb) - return; - - mtx_lock(ajb->lock); - ajb->ts = timestamp; - ajb->ts0 = timestamp; - ajb->tr0 = tmr_jiffies_usec(); - mtx_unlock(ajb->lock); -} - - -/** - * Get the state of the Adaptive Jitter Buffer - * - * @param ajb Adaptive Jitter Buffer state - * @param af Audio frame - * - * @return Computed jitter buffer state - */ -enum ajb_state ajb_get(struct ajb *ajb, struct auframe *af) -{ - enum ajb_state as = AJB_GOOD; - uint32_t ptime; /**< Packet time [us] */ - - if (!ajb || !af || !af->srate || !af->sampc) - return AJB_GOOD; - - mtx_lock(ajb->lock); - - /* ptime in [us] */ - ptime = (uint32_t) (af->sampc * AUDIO_TIMEBASE / (af->srate * af->ch)); - if (!ajb->avbuftime) - goto out; - - if (ajb->as == AJB_GOOD || - (ajb->silence < 0. && auframe_level(af) > ajb->silence)) - goto out; - - as = ajb->as; - if (as == AJB_HIGH) { - /* early adjustment of avbuftime */ - ajb->avbuftime -= ptime; - ajb->as = AJB_GOOD; -#ifdef RE_AUBUF_TRACE - ajb->plot.as = AJB_HIGH; - plot_ajb(ajb, tmr_jiffies()); - ajb->plot.as = AJB_GOOD; -#endif - } - else if (as == AJB_LOW) { - /* early adjustment */ - ajb->avbuftime += ptime; - ajb->as = AJB_GOOD; -#ifdef RE_AUBUF_TRACE - ajb->plot.as = AJB_LOW; - plot_ajb(ajb, tmr_jiffies()); - ajb->plot.as = AJB_GOOD; -#endif - } - -out: - mtx_unlock(ajb->lock); - return as; -} - - -int32_t ajb_debug(const struct ajb *ajb) -{ - int32_t jitter; - - if (!ajb) - return 0; - - mtx_lock(ajb->lock); - jitter = ajb->jitter; - mtx_unlock(ajb->lock); - re_printf(" ajb jitter: %d, ajb avbuftime: %d\n", jitter / 1000, - ajb->avbuftime); - - return jitter; -} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/re-4.10.0/rem/aubuf/ajb.h new/re-4.11.0/rem/aubuf/ajb.h --- old/re-4.10.0/rem/aubuf/ajb.h 2026-07-22 11:43:10.000000000 +0200 +++ new/re-4.11.0/rem/aubuf/ajb.h 1970-01-01 01:00:00.000000000 +0100 @@ -1,20 +0,0 @@ -/** - * @file ajb.h Adaptive Jitter Buffer interface - * - * Copyright (C) 2022 Commend.com - [email protected] - */ - -enum ajb_state { - AJB_GOOD = 0, - AJB_LOW, - AJB_HIGH, -}; - -struct ajb; - -struct ajb *ajb_alloc(double silence, size_t wish_sz); -void ajb_reset(struct ajb *ajb); -void ajb_calc(struct ajb *ajb, const struct auframe *af, size_t sampc); -enum ajb_state ajb_get(struct ajb *ajb, struct auframe *af); -int32_t ajb_debug(const struct ajb *ajb); -void ajb_set_ts0(struct ajb *ajb, uint64_t timestamp); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/re-4.10.0/rem/aubuf/aubuf.c new/re-4.11.0/rem/aubuf/aubuf.c --- old/re-4.10.0/rem/aubuf/aubuf.c 2026-07-22 11:43:10.000000000 +0200 +++ new/re-4.11.0/rem/aubuf/aubuf.c 2026-08-24 13:03:29.000000000 +0200 @@ -13,7 +13,6 @@ #include <rem_aulevel.h> #include <rem_auframe.h> #include <rem_aubuf.h> -#include "ajb.h" #define AUBUF_DEBUG 0 @@ -40,9 +39,6 @@ size_t ur; } stats; - enum aubuf_mode mode; - struct ajb *ajb; /**< Adaptive jitter buffer statistics */ - double silence; /**< Silence volume in negative [dB] */ bool live; /**< Live stream switch */ }; @@ -68,7 +64,6 @@ struct aubuf *ab = arg; mem_deref(ab->lock); - mem_deref(ab->ajb); mem_deref(ab->id); mem_deref(ab->pool); } @@ -199,30 +194,6 @@ } -void aubuf_set_mode(struct aubuf *ab, enum aubuf_mode mode) -{ - if (!ab) - return; - - ab->mode = mode; -} - - -/** - * Sets the volume level for silence - * - * @param ab Audio buffer - * @param silence Volume level in negative [dB] - */ -void aubuf_set_silence(struct aubuf *ab, double silence) -{ - if (!ab) - return; - - ab->silence = silence; -} - - /** * Resize audio buffer (flushes aubuf) * @@ -331,7 +302,6 @@ struct mbuf *mb; size_t sz; size_t sample_size; - bool ajb; int err; if (!ab || !af) @@ -354,12 +324,8 @@ mtx_lock(ab->lock); mem_deref(mb); - ajb = !ab->fill_sz && ab->ajb; mtx_unlock(ab->lock); - if (ajb) - ajb_calc(ab->ajb, af, ab->cur_sz); - return err; } @@ -375,7 +341,6 @@ { size_t sz; bool filling; - enum ajb_state as; bool drop; if (!ab || !af) @@ -385,18 +350,6 @@ mtx_lock(ab->lock); - if (!ab->ajb && ab->mode == AUBUF_ADAPTIVE) - ab->ajb = ajb_alloc(ab->silence, ab->wish_sz); - - as = ajb_get(ab->ajb, af); - if (as == AJB_LOW) { -#if AUBUF_DEBUG - (void)re_printf("aubuf: inc buffer due to high jitter\n"); - ajb_debug(ab->ajb); -#endif - goto out; - } - RE_TRACE_ID_INSTANT_I("aubuf", "cur_sz_ms", auframe_bytes_to_ms(af, ab->cur_sz), ab->id); @@ -406,9 +359,6 @@ RE_TRACE_ID_INSTANT("aubuf", "underrun", ab->id); } - if (!ab->fill_sz) - ajb_set_ts0(ab->ajb, 0); - filling = ab->fill_sz > 0; memset(af->sampv, 0, sz); if (filling) { @@ -431,13 +381,6 @@ ab->started = true; read_auframe(ab, af); - if (as == AJB_HIGH) { -#if AUBUF_DEBUG - (void)re_printf("aubuf: drop a frame to reduce latency\n"); - ajb_debug(ab->ajb); -#endif - read_auframe(ab, af); - } out: @@ -517,7 +460,6 @@ ab->ts = 0; mtx_unlock(ab->lock); - ajb_reset(ab->ajb); } @@ -627,20 +569,3 @@ list_sort(&ab->afl, frame_less_equal, NULL); } - - -/** - * This function is for reporting that the given audio frame was dropped. Its - * timestamp is used to reset the ajb structure to avoid a jump of the computed - * jitter value - * - * @param ab Audio buffer - * @param af Audio frame - */ -void aubuf_drop_auframe(struct aubuf *ab, const struct auframe *af) -{ - if (!ab) - return; - - ajb_set_ts0(ab->ajb, af->timestamp); -} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/re-4.10.0/src/btrace/btrace.c new/re-4.11.0/src/btrace/btrace.c --- old/re-4.10.0/src/btrace/btrace.c 2026-07-22 11:43:10.000000000 +0200 +++ new/re-4.11.0/src/btrace/btrace.c 2026-08-24 13:03:29.000000000 +0200 @@ -93,21 +93,54 @@ ((j + 1) < bt->len) ? ", " : ""); } break; - case BTRACE_NEWLINE: + case BTRACE_NEWLINE: { + struct pl files[BTRACE_SZ]; + struct pl addrs[BTRACE_SZ]; + char addr2l[512] = {0}; + char addr2l_out[256] = {0}; + + for (size_t j = 0; j < bt->len; j++) { + files[j] = pl_null; + addrs[j] = pl_null; + re_regex(symbols[j], str_len(symbols[j]), + "[^(]+([^)]+", &files[j], &addrs[j]); + } + for (size_t j = 0; j < bt->len; j++) { re_hprintf(pf, "%s\n", symbols[j]); -#ifdef LINUX - struct pl file = PL_INIT; - struct pl addr = PL_INIT; - char addr2l[512] = {0}; - char addr2l_out[256] = {0}; FILE *pipe; + int off = 0; - re_regex(symbols[j], str_len(symbols[j]), - "[^(]+([^)]+", &file, &addr); + /* check already handled as part of a group */ + if (!files[j].l) + continue; - (void)re_snprintf(addr2l, sizeof(addr2l), - "addr2line -p -f -e %r %r", &file, &addr); +#ifdef __clang__ + off = re_snprintf(addr2l, sizeof(addr2l), + "llvm-addr2line -p -f -e %r %r", + &files[j], &addrs[j]); +#else + off = re_snprintf(addr2l, sizeof(addr2l), + "addr2line -p -f -e %r %r", + &files[j], &addrs[j]); +#endif + if (off < 0) + break; + + /* group addresses */ + for (size_t next = j + 1; next < bt->len; next++) { + if (pl_cmp(&files[j], &files[next]) != 0) + break; + + int n = re_snprintf(addr2l + off, + sizeof(addr2l) - off, + " %r", &addrs[next]); + if (n < 0) + break; + + off += n; + files[next] = pl_null; + } pipe = popen(addr2l, "r"); if (!pipe) @@ -118,9 +151,9 @@ } pclose(pipe); -#endif } break; + } case BTRACE_JSON: re_hprintf(pf, "["); for (size_t j = 0; j < bt->len; j++) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/re-4.10.0/src/httpauth/basic.c new/re-4.11.0/src/httpauth/basic.c --- old/re-4.10.0/src/httpauth/basic.c 2026-07-22 11:43:10.000000000 +0200 +++ new/re-4.11.0/src/httpauth/basic.c 2026-08-24 13:03:29.000000000 +0200 @@ -197,7 +197,7 @@ if (err) goto out; - if (mem_seccmp(mb->buf, (uint8_t *)c, clen) != 0) + if (clen != mb->end || mem_seccmp(mb->buf, (uint8_t *)c, clen) != 0) err = EACCES; out: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/re-4.10.0/src/json/decode_odict.c new/re-4.11.0/src/json/decode_odict.c --- old/re-4.10.0/src/json/decode_odict.c 2026-07-22 11:43:10.000000000 +0200 +++ new/re-4.11.0/src/json/decode_odict.c 2026-08-24 13:03:29.000000000 +0200 @@ -32,8 +32,10 @@ return err; err = odict_entry_add(o, name, type, oc); + if (!err) + h->arg = oc; + mem_deref(oc); - h->arg = oc; return err; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/re-4.10.0/src/mem/mem_pool.c new/re-4.11.0/src/mem/mem_pool.c --- old/re-4.10.0/src/mem/mem_pool.c 2026-07-22 11:43:10.000000000 +0200 +++ new/re-4.11.0/src/mem/mem_pool.c 2026-08-24 13:03:29.000000000 +0200 @@ -215,6 +215,9 @@ */ struct mem_pool_entry *mem_pool_borrow_extend(struct mem_pool *pool) { + if (!pool) + return NULL; + struct mem_pool_entry *e = mem_pool_borrow(pool); if (e) return e; @@ -265,7 +268,11 @@ */ void mem_pool_flush(struct mem_pool *pool) { + if (!pool) + return; + mtx_lock(pool->lock); + pool->freel = NULL; for (size_t i = 0; i < pool->nmemb; i++) { struct mem_pool_entry *e = pool->objs[i]; if (pool->membdh) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/re-4.10.0/src/srtp/srtcp.c new/re-4.11.0/src/srtp/srtcp.c --- old/re-4.10.0/src/srtp/srtcp.c 2026-07-22 11:43:10.000000000 +0200 +++ new/re-4.11.0/src/srtp/srtcp.c 2026-08-24 13:03:29.000000000 +0200 @@ -71,7 +71,8 @@ union vect128 iv; uint8_t *p = mbuf_buf(mb); uint8_t tag[GCM_TAGLEN]; - const uint32_t ix_be = htonl(1L<<31 | strm->rtcp_index); + ep = rtcp->encrypted; + const uint32_t ix_be = htonl(ep << 31 | strm->rtcp_index); srtp_iv_calc_gcm(&iv, &rtcp->k_s, ssrc, strm->rtcp_index); @@ -80,15 +81,25 @@ /* The RTCP Header and Index is Associated Data */ err = aes_encr(rtcp->aes, NULL, &mb->buf[start], mb->pos - start); - err |= aes_encr(rtcp->aes, NULL, - (void *)&ix_be, sizeof(ix_be)); - if (err) - return err; - - err = aes_encr(rtcp->aes, p, p, mbuf_get_left(mb)); if (err) return err; + if (rtcp->encrypted) { + /* RFC 7714 9.2 (encrypted) */ + err = aes_encr(rtcp->aes, NULL, (void *)&ix_be, + sizeof(ix_be)); + err |= aes_encr(rtcp->aes, p, p, mbuf_get_left(mb)); + if (err) + return err; + } + else { + /* RFC 7714 9.3 (unencrypted) */ + err = aes_encr(rtcp->aes, NULL, p, mbuf_get_left(mb)); + err |= aes_encr(rtcp->aes, NULL, (void *)&ix_be, + sizeof(ix_be)); + if (err) + return err; + } err = aes_get_authtag(rtcp->aes, tag, sizeof(tag)); if (err) return err; @@ -98,7 +109,6 @@ if (err) return err; - ep = 1; } /* append E-bit and SRTCP-index */ @@ -215,7 +225,7 @@ if (err) return err; } - else if (rtcp->aes && ep && rtcp->mode == AES_MODE_GCM) { + else if (rtcp->aes && rtcp->mode == AES_MODE_GCM) { union vect128 iv; size_t tag_start; @@ -226,9 +236,8 @@ aes_set_iv(rtcp->aes, iv.u8); /* The RTP Header is Associated Data */ - err = aes_decr(rtcp->aes, NULL, &mb->buf[start], + err = aes_decr(rtcp->aes, NULL, &mb->buf[start], pld_start - start); - err |= aes_decr(rtcp->aes, NULL, &mb->buf[eix_start], 4); if (err) return err; @@ -240,9 +249,29 @@ tag_start = mb->end - GCM_TAGLEN; - err = aes_decr(rtcp->aes, p, p, tag_start - pld_start); - if (err) - return err; + /* + * RFC 7714 section 9: "All SRTCP compound packets MUST be + * authenticated, but unlike SRTP, SRTCP packet encryption + * is optional." + */ + if (ep) { + /* RFC 7714 9.2 (encrypted) */ + err = aes_decr(rtcp->aes, NULL, &mb->buf[eix_start], + 4); + err |= aes_decr(rtcp->aes, p, p, + tag_start - pld_start); + if (err) + return err; + } + else { + /* RFC 7714 9.3 (unencrypted) */ + err = aes_decr(rtcp->aes, NULL, p, + tag_start - pld_start); + err |= aes_decr(rtcp->aes, NULL, &mb->buf[eix_start], + 4); + if (err) + return err; + } err = aes_authenticate(rtcp->aes, &mb->buf[tag_start], GCM_TAGLEN); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/re-4.10.0/src/srtp/srtp.c new/re-4.11.0/src/srtp/srtp.c --- old/re-4.10.0/src/srtp/srtp.c 2026-07-22 11:43:10.000000000 +0200 +++ new/re-4.11.0/src/srtp/srtp.c 2026-08-24 13:03:29.000000000 +0200 @@ -47,6 +47,7 @@ c->tag_len = tag_len; c->mode = mode; + c->encrypted = encrypted; err |= srtp_derive(k_e, key_b, 0x00+offs, key, key_b, s, s_b); err |= srtp_derive(k_a, sizeof(k_a), 0x01+offs, key, key_b, s, s_b); @@ -54,7 +55,8 @@ if (err) return err; - if (encrypted) { + /* AES-GCM always needs aes_alloc for Associated Data authentication */ + if (encrypted || mode == AES_MODE_GCM) { err = aes_alloc(&c->aes, mode, k_e, key_b*8, NULL); if (err) return err; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/re-4.10.0/src/srtp/srtp.h new/re-4.11.0/src/srtp/srtp.h --- old/re-4.10.0/src/srtp/srtp.h 2026-07-22 11:43:10.000000000 +0200 +++ new/re-4.11.0/src/srtp/srtp.h 2026-08-24 13:03:29.000000000 +0200 @@ -45,6 +45,7 @@ struct hmac *hmac; /**< HMAC Context */ union vect128 k_s; /**< Derived salting key (14 bytes) */ size_t tag_len; /**< CTR Auth. tag length [bytes] */ + bool encrypted; /**< Enable/Disable Encryption (RTCP) */ } rtp, rtcp; struct list streaml; /**< SRTP-streams (struct srtp_stream) */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/re-4.10.0/test/httpauth.c new/re-4.11.0/test/httpauth.c --- old/re-4.10.0/test/httpauth.c 2026-07-22 11:43:10.000000000 +0200 +++ new/re-4.11.0/test/httpauth.c 2026-08-24 13:03:29.000000000 +0200 @@ -256,86 +256,67 @@ PL("Basic d3Jvbmc6Y3JlZGVudGlhbHM=="), "/my/home", NULL, "retest", "retestpasswd", 0, EACCES }, + { + "Basic realm=\"/my/home\"", + PL("Basic "), + "/my/home", NULL, "retest", "retestpasswd", 0, EBADMSG + }, + { + "Basic realm=\"/my/home\"", + PL("Basic ~"), + "/my/home", NULL, "retest", "retestpasswd", 0, EACCES + } }; unsigned int i; int err = 0; + struct httpauth_basic_req *req = NULL; + struct mbuf *mb = NULL; for (i = 0; i < RE_ARRAY_SIZE(testv); ++i) { - struct httpauth_basic_req *req = NULL; - struct mbuf *mb = NULL; - int terr = 0; int tauth_err = 0; - terr = httpauth_basic_request(&req, + err = httpauth_basic_request(&req, testv[i].realm, testv[i].charset); - if (terr == ENOMEM) { - err = ENOMEM; - break; - } - else if (terr != testv[i].err) { - DEBUG_WARNING("basic req: expected error %d, got %m\n", - testv[i].err, terr); - err = terr; - break; - } - - if (str_casecmp(req->realm, testv[i].realm) != 0) { - DEBUG_WARNING("basic req: expected realm %s, got %s\n", - testv[i].realm, req->realm); - err = EBADMSG; - mem_deref(req); - break; - } + TEST_ERR(err); + TEST_EQUALS(err, testv[i].err); + TEST_STRCMP(req->realm, str_len(req->realm), testv[i].realm, + str_len(testv[i].realm)); if (testv[i].charset) { - if (str_casecmp(req->charset, testv[i].charset) != 0) { - DEBUG_WARNING("basic req: expected charset" - "%s, got %s\n", testv[i].charset, - req->charset); - err = EBADMSG; - mem_deref(req); - break; - } + TEST_STRCMP(req->charset, str_len(req->charset), + testv[i].charset, + str_len(testv[i].charset)); } mb = mbuf_alloc(512); if (!mb) { err = ENOMEM; - mem_deref(req); - break; + TEST_ERR(err); } err = mbuf_printf(mb, "%H", httpauth_basic_request_print, req); - if (err) { - mem_deref(mb); - mem_deref(req); - break; - } + TEST_ERR(err); - if (memcmp(testv[i].hval, mb->buf, - str_len(testv[i].hval)) != 0) { - DEBUG_WARNING("basic req: expected hval %s, got %s\n", - testv[i].hval, mb->buf); - err = EBADMSG; - mem_deref(mb); - mem_deref(req); - break; - } + TEST_MEMCMP(testv[i].hval, str_len(testv[i].hval), mb->buf, + str_len(testv[i].hval)); + + mb = mem_deref(mb); - mem_deref(mb); tauth_err = httpauth_basic_verify(&testv[i].hval_response, testv[i].user, testv[i].passwd); - if (tauth_err != testv[i].auth_err) { - DEBUG_WARNING("basic req:" - "authentication expected %d, got %d\n", - testv[i].auth_err, tauth_err); - mem_deref(req); - break; + if (tauth_err == ENOMEM) { + err = ENOMEM; + goto out; } + TEST_EQUALS(testv[i].auth_err, tauth_err); - mem_deref(req); + req = mem_deref(req); } +out: + mem_deref(req); + mem_deref(mb); + return err; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/re-4.10.0/test/mem_pool.c new/re-4.11.0/test/mem_pool.c --- old/re-4.10.0/test/mem_pool.c 2026-07-22 11:43:10.000000000 +0200 +++ new/re-4.11.0/test/mem_pool.c 2026-08-24 13:03:29.000000000 +0200 @@ -51,6 +51,9 @@ TEST_ASSERT(!mem_pool_borrow(pool)); + e = mem_pool_release(pool, e); + TEST_ASSERT(!e); + mem_pool_flush(pool); for (int i = 0; i < NUM_OBJECTS; i++) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/re-4.10.0/test/srtp.c new/re-4.11.0/test/srtp.c --- old/re-4.10.0/test/srtp.c 2026-07-22 11:43:10.000000000 +0200 +++ new/re-4.11.0/test/srtp.c 2026-08-24 13:03:29.000000000 +0200 @@ -410,7 +410,7 @@ static int test_srtcp_loop(size_t offset, enum srtp_suite suite, - enum rtcp_type type) + enum rtcp_type type, enum srtp_flags flags) { struct srtp *ctx_tx = NULL, *ctx_rx = NULL; struct mbuf *mb1 = NULL, *mb2 = NULL; @@ -436,10 +436,10 @@ goto out; } - err = srtp_alloc(&ctx_tx, suite, master_key, key_len + salt_len, 0); + err = srtp_alloc(&ctx_tx, suite, master_key, key_len + salt_len, + flags); err |= srtp_alloc(&ctx_rx, suite, master_key, key_len + salt_len, 0); - if (err) - goto out; + TEST_ERR(err); for (i=0; i<10; i++) { @@ -461,9 +461,7 @@ err = EINVAL; break; } - - if (err) - break; + TEST_ERR(err); end = mb1->end; @@ -474,8 +472,7 @@ /* tx */ mb1->pos = offset; err = srtcp_encrypt(ctx_tx, mb1); - if (err) - break; + TEST_ERR(err); TEST_EQUALS(offset, mb1->pos); TEST_ASSERT(mb1->end != end); @@ -485,8 +482,7 @@ /* rx */ mb1->pos = offset; err = srtcp_decrypt(ctx_rx, mb1); - if (err) - break; + TEST_ERR(err); TEST_EQUALS(offset, mb1->pos); TEST_EQUALS(end, mb1->end); @@ -929,7 +925,7 @@ } -static int test_srtp_unauth(enum srtp_suite suite) +static int test_srtp_unauth(enum srtp_suite suite, enum srtp_flags flags) { struct srtp *srtp_tx, *srtp_rx; struct mbuf *mb = NULL; @@ -950,7 +946,8 @@ if (!mb) return ENOMEM; - err = srtp_alloc(&srtp_tx, suite, master_key, key_len+salt_len, 0); + err = srtp_alloc(&srtp_tx, suite, master_key, key_len + salt_len, + flags); err |= srtp_alloc(&srtp_rx, suite, master_key, key_len+salt_len, 0); if (err) goto out; @@ -1122,7 +1119,11 @@ err = test_srtp_reordering_and_wrap(); TEST_ERR(err); - err = test_srtp_unauth(SRTP_AES_CM_128_HMAC_SHA1_32); + err = test_srtp_unauth(SRTP_AES_CM_128_HMAC_SHA1_32, 0); + TEST_ERR(err); + + err = test_srtp_unauth(SRTP_AES_CM_128_HMAC_SHA1_32, + SRTP_UNENCRYPTED_SRTCP); TEST_ERR(err); err = test_srtp_random(SRTP_AES_CM_128_HMAC_SHA1_32); @@ -1142,25 +1143,25 @@ return ESKIPPED; } - err = test_srtcp_loop(0, SRTP_AES_CM_128_HMAC_SHA1_32, RTCP_BYE); + err = test_srtcp_loop(0, SRTP_AES_CM_128_HMAC_SHA1_32, RTCP_BYE, 0); TEST_ERR(err); - err = test_srtcp_loop(0, SRTP_AES_CM_128_HMAC_SHA1_80, RTCP_BYE); + err = test_srtcp_loop(0, SRTP_AES_CM_128_HMAC_SHA1_80, RTCP_BYE, 0); TEST_ERR(err); - err = test_srtcp_loop(0, SRTP_AES_256_CM_HMAC_SHA1_32, RTCP_BYE); + err = test_srtcp_loop(0, SRTP_AES_256_CM_HMAC_SHA1_32, RTCP_BYE, 0); TEST_ERR(err); - err = test_srtcp_loop(0, SRTP_AES_256_CM_HMAC_SHA1_80, RTCP_BYE); + err = test_srtcp_loop(0, SRTP_AES_256_CM_HMAC_SHA1_80, RTCP_BYE, 0); TEST_ERR(err); - err = test_srtcp_loop(4, SRTP_AES_CM_128_HMAC_SHA1_32, RTCP_BYE); + err = test_srtcp_loop(4, SRTP_AES_CM_128_HMAC_SHA1_32, RTCP_BYE, 0); TEST_ERR(err); - err = test_srtcp_loop(4, SRTP_AES_CM_128_HMAC_SHA1_80, RTCP_BYE); + err = test_srtcp_loop(4, SRTP_AES_CM_128_HMAC_SHA1_80, RTCP_BYE, 0); TEST_ERR(err); - err = test_srtcp_loop(0, SRTP_AES_CM_128_HMAC_SHA1_32, RTCP_RR); + err = test_srtcp_loop(0, SRTP_AES_CM_128_HMAC_SHA1_32, RTCP_RR, 0); TEST_ERR(err); err = test_srtcp_libsrtp(); @@ -1195,7 +1196,10 @@ err = test_srtp_loop(0, SRTP_AES_256_GCM, 65530); TEST_ERR(err); - err = test_srtp_unauth(SRTP_AES_256_GCM); + err = test_srtp_unauth(SRTP_AES_256_GCM, 0); + TEST_ERR(err); + + err = test_srtp_unauth(SRTP_AES_256_GCM, SRTP_UNENCRYPTED_SRTCP); TEST_ERR(err); err = test_srtp_replay(SRTP_AES_128_GCM); @@ -1218,16 +1222,20 @@ return ESKIPPED; } - err = test_srtcp_loop(0, SRTP_AES_128_GCM, RTCP_BYE); + err = test_srtcp_loop(0, SRTP_AES_128_GCM, RTCP_BYE, 0); + TEST_ERR(err); + + err = test_srtcp_loop(0, SRTP_AES_256_GCM, RTCP_BYE, 0); TEST_ERR(err); - err = test_srtcp_loop(0, SRTP_AES_256_GCM, RTCP_BYE); + err = test_srtcp_loop(4, SRTP_AES_128_GCM, RTCP_BYE, 0); TEST_ERR(err); - err = test_srtcp_loop(4, SRTP_AES_128_GCM, RTCP_BYE); + err = test_srtcp_loop(0, SRTP_AES_128_GCM, RTCP_RR, 0); TEST_ERR(err); - err = test_srtcp_loop(0, SRTP_AES_128_GCM, RTCP_RR); + err = test_srtcp_loop(0, SRTP_AES_128_GCM, RTCP_RR, + SRTP_UNENCRYPTED_SRTCP); TEST_ERR(err); err = test_srtcp_random(SRTP_AES_128_GCM);
