From 6965388866f7046c96cddbb1fc34c573d944d19c Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin Date: Thu, 21 Apr 2011 10:41:13 -0400 Subject: Implements CELT_SET_LOSS_PERC --- libcelt/celt.c | 15 +++++++++++++++ libcelt/celt.h | 3 +++ 2 files changed, 18 insertions(+) diff --git a/libcelt/celt.c b/libcelt/celt.c index d6c2b4d..37f3d7c 100644 --- a/libcelt/celt.c +++ b/libcelt/celt.c @@ -144,6 +144,7 @@ struct CELTEncoder { int vbr; int signalling; int constrained_vbr; /* If zero, VBR can do whatever it likes with the rate */ + int loss_rate; /* Everything beyond this point gets cleared on a reset */ #define ENCODER_RESET_START rng @@ -1142,6 +1143,12 @@ int celt_encode_with_ec_float(CELTEncoder * restrict st, const celt_sig * pcm, i if (pitch_index > COMBFILTER_MAXPERIOD-2) pitch_index = COMBFILTER_MAXPERIOD-2; gain1 = MULT16_16_Q15(QCONST16(.7f,15),gain1); + if (st->loss_rate>2) + gain1 = HALF32(gain1); + if (st->loss_rate>4) + gain1 = HALF32(gain1); + if (st->loss_rate>8) + gain1 = 0; prefilter_tapset = st->tapset_decision; } else { gain1 = 0; @@ -1787,6 +1794,14 @@ int celt_encoder_ctl(CELTEncoder * restrict st, int request, ...) st->force_intra = value==0; } break; + case CELT_SET_LOSS_PERC_REQUEST: + { + int value = va_arg(ap, celt_int32); + if (value<0 || value>100) + goto bad_arg; + st->loss_rate = value; + } + break; case CELT_SET_VBR_CONSTRAINT_REQUEST: { celt_int32 value = va_arg(ap, celt_int32); diff --git a/libcelt/celt.h b/libcelt/celt.h index 11eb425..2bbf506 100644 --- a/libcelt/celt.h +++ b/libcelt/celt.h @@ -112,6 +112,9 @@ extern "C" { #define CELT_SET_CHANNELS_REQUEST 18 #define CELT_SET_CHANNELS(x) CELT_SET_CHANNELS_REQUEST, _celt_check_int(x) +#define CELT_SET_LOSS_PERC_REQUEST 20 +#define CELT_SET_LOSS_PERC(x) CELT_SET_LOSS_PERC_REQUEST, _celt_check_int(x) + /* Internal */ #define CELT_SET_START_BAND_REQUEST 10000 #define CELT_SET_START_BAND(x) CELT_SET_START_BAND_REQUEST, _celt_check_int(x) -- cgit v1.2.3