12bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian/* Copyright (c) 2007-2008 CSIRO 22bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian Copyright (c) 2007-2010 Xiph.Org Foundation 32bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian Copyright (c) 2008 Gregory Maxwell 42bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian Written by Jean-Marc Valin and Gregory Maxwell */ 52bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian/* 62bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian Redistribution and use in source and binary forms, with or without 72bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian modification, are permitted provided that the following conditions 82bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian are met: 92bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian - Redistributions of source code must retain the above copyright 112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian notice, this list of conditions and the following disclaimer. 122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian - Redistributions in binary form must reproduce the above copyright 142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian notice, this list of conditions and the following disclaimer in the 152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian documentation and/or other materials provided with the distribution. 162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian*/ 292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef HAVE_CONFIG_H 312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#include "config.h" 322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 332bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 342bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#define CELT_ENCODER_C 352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#include "cpu_support.h" 372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#include "os_support.h" 382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#include "mdct.h" 392bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#include <math.h> 402bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#include "celt.h" 412bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#include "pitch.h" 422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#include "bands.h" 432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#include "modes.h" 442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#include "entcode.h" 452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#include "quant_bands.h" 462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#include "rate.h" 472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#include "stack_alloc.h" 482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#include "mathops.h" 492bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#include "float_cast.h" 502bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#include <stdarg.h> 512bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#include "celt_lpc.h" 522bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#include "vq.h" 532bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 542bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 552bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian/** Encoder state 562bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian @brief Encoder state 572bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian */ 582bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianstruct OpusCustomEncoder { 592bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian const OpusCustomMode *mode; /**< Mode used by the encoder */ 602bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int overlap; 612bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int channels; 622bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int stream_channels; 632bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 642bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int force_intra; 652bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int clip; 662bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int disable_pf; 672bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int complexity; 682bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int upsample; 692bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int start, end; 702bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 712bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 bitrate; 722bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int vbr; 732bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int signalling; 742bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int constrained_vbr; /* If zero, VBR can do whatever it likes with the rate */ 752bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int loss_rate; 762bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int lsb_depth; 772bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int variable_duration; 782bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int lfe; 792bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int arch; 802bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 812bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Everything beyond this point gets cleared on a reset */ 822bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#define ENCODER_RESET_START rng 832bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 842bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_uint32 rng; 852bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int spread_decision; 862bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val32 delayedIntra; 872bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int tonal_average; 882bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int lastCodedBands; 892bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int hf_average; 902bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int tapset_decision; 912bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 922bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int prefilter_period; 932bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 prefilter_gain; 942bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int prefilter_tapset; 952bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef RESYNTH 962bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int prefilter_period_old; 972bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 prefilter_gain_old; 982bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int prefilter_tapset_old; 992bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 1002bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int consec_transient; 1012bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian AnalysisInfo analysis; 1022bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 1032bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val32 preemph_memE[2]; 1042bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val32 preemph_memD[2]; 1052bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 1062bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* VBR-related parameters */ 1072bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 vbr_reservoir; 1082bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 vbr_drift; 1092bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 vbr_offset; 1102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 vbr_count; 1112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val32 overlap_max; 1122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 stereo_saving; 1132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int intensity; 1142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 *energy_mask; 1152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 spec_avg; 1162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 1172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef RESYNTH 1182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* +MAX_PERIOD/2 to make space for overlap */ 1192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian celt_sig syn_mem[2][2*MAX_PERIOD+MAX_PERIOD/2]; 1202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 1212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 1222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian celt_sig in_mem[1]; /* Size = channels*mode->overlap */ 1232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* celt_sig prefilter_mem[], Size = channels*COMBFILTER_MAXPERIOD */ 1242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* opus_val16 oldBandE[], Size = channels*mode->nbEBands */ 1252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* opus_val16 oldLogE[], Size = channels*mode->nbEBands */ 1262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* opus_val16 oldLogE2[], Size = channels*mode->nbEBands */ 1272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian}; 1282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 1292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianint celt_encoder_get_size(int channels) 1302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 1312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian CELTMode *mode = opus_custom_mode_create(48000, 960, NULL); 1322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return opus_custom_encoder_get_size(mode, channels); 1332bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 1342bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 1352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh VenkatasubramanianOPUS_CUSTOM_NOSTATIC int opus_custom_encoder_get_size(const CELTMode *mode, int channels) 1362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 1372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int size = sizeof(struct CELTEncoder) 1382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian + (channels*mode->overlap-1)*sizeof(celt_sig) /* celt_sig in_mem[channels*mode->overlap]; */ 1392bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian + channels*COMBFILTER_MAXPERIOD*sizeof(celt_sig) /* celt_sig prefilter_mem[channels*COMBFILTER_MAXPERIOD]; */ 1402bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian + 3*channels*mode->nbEBands*sizeof(opus_val16); /* opus_val16 oldBandE[channels*mode->nbEBands]; */ 1412bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* opus_val16 oldLogE[channels*mode->nbEBands]; */ 1422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* opus_val16 oldLogE2[channels*mode->nbEBands]; */ 1432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return size; 1442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 1452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 1462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef CUSTOM_MODES 1472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh VenkatasubramanianCELTEncoder *opus_custom_encoder_create(const CELTMode *mode, int channels, int *error) 1482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 1492bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int ret; 1502bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian CELTEncoder *st = (CELTEncoder *)opus_alloc(opus_custom_encoder_get_size(mode, channels)); 1512bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* init will handle the NULL case */ 1522bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ret = opus_custom_encoder_init(st, mode, channels); 1532bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (ret != OPUS_OK) 1542bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 1552bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_custom_encoder_destroy(st); 1562bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st = NULL; 1572bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 1582bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (error) 1592bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian *error = ret; 1602bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return st; 1612bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 1622bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif /* CUSTOM_MODES */ 1632bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 1642bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianstatic int opus_custom_encoder_init_arch(CELTEncoder *st, const CELTMode *mode, 1652bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int channels, int arch) 1662bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 1672bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (channels < 0 || channels > 2) 1682bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return OPUS_BAD_ARG; 1692bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 1702bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st==NULL || mode==NULL) 1712bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return OPUS_ALLOC_FAIL; 1722bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 1732bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian OPUS_CLEAR((char*)st, opus_custom_encoder_get_size(mode, channels)); 1742bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 1752bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->mode = mode; 1762bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->overlap = mode->overlap; 1772bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->stream_channels = st->channels = channels; 1782bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 1792bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->upsample = 1; 1802bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->start = 0; 1812bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->end = st->mode->effEBands; 1822bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->signalling = 1; 1832bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 1842bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->arch = arch; 1852bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 1862bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->constrained_vbr = 1; 1872bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->clip = 1; 1882bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 1892bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->bitrate = OPUS_BITRATE_MAX; 1902bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->vbr = 0; 1912bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->force_intra = 0; 1922bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->complexity = 5; 1932bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->lsb_depth=24; 1942bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 1952bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_custom_encoder_ctl(st, OPUS_RESET_STATE); 1962bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 1972bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return OPUS_OK; 1982bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 1992bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 2002bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef CUSTOM_MODES 2012bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianint opus_custom_encoder_init(CELTEncoder *st, const CELTMode *mode, int channels) 2022bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 2032bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return opus_custom_encoder_init_arch(st, mode, channels, opus_select_arch()); 2042bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 2052bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 2062bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 2072bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianint celt_encoder_init(CELTEncoder *st, opus_int32 sampling_rate, int channels, 2082bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int arch) 2092bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 2102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int ret; 2112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ret = opus_custom_encoder_init_arch(st, 2122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_custom_mode_create(48000, 960, NULL), channels, arch); 2132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (ret != OPUS_OK) 2142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return ret; 2152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->upsample = resampling_factor(sampling_rate); 2162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return OPUS_OK; 2172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 2182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 2192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef CUSTOM_MODES 2202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianvoid opus_custom_encoder_destroy(CELTEncoder *st) 2212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 2222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_free(st); 2232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 2242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif /* CUSTOM_MODES */ 2252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 2262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 2272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianstatic int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int C, 2282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 *tf_estimate, int *tf_chan) 2292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 2302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int i; 2312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(opus_val16, tmp); 2322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val32 mem0,mem1; 2332bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int is_transient = 0; 2342bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 mask_metric = 0; 2352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int c; 2362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 tf_max; 2372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int len2; 2382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Table of 6*64/x, trained on real data to minimize the average error */ 2392bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian static const unsigned char inv_table[128] = { 2402bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 255,255,156,110, 86, 70, 59, 51, 45, 40, 37, 33, 31, 28, 26, 25, 2412bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 23, 22, 21, 20, 19, 18, 17, 16, 16, 15, 15, 14, 13, 13, 12, 12, 2422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 12, 12, 11, 11, 11, 10, 10, 10, 9, 9, 9, 9, 9, 9, 8, 8, 2432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 8, 8, 8, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 2442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 2452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 2472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian }; 2492bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian SAVE_STACK; 2502bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(tmp, len, opus_val16); 2512bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 2522bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian len2=len/2; 2532bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (c=0;c<C;c++) 2542bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 2552bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val32 mean; 2562bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 unmask=0; 2572bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val32 norm; 2582bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 maxE; 2592bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mem0=0; 2602bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mem1=0; 2612bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* High-pass filter: (1 - 2*z^-1 + z^-2) / (1 - z^-1 + .5*z^-2) */ 2622bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<len;i++) 2632bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 2642bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val32 x,y; 2652bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian x = SHR32(in[i+c*len],SIG_SHIFT); 2662bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian y = ADD32(mem0, x); 2672bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef FIXED_POINT 2682bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mem0 = mem1 + y - SHL32(x,1); 2692bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mem1 = x - SHR32(y,1); 2702bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#else 2712bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mem0 = mem1 + y - 2*x; 2722bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mem1 = x - .5f*y; 2732bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 2742bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tmp[i] = EXTRACT16(SHR32(y,2)); 2752bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf("%f ", tmp[i]);*/ 2762bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 2772bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf("\n");*/ 2782bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* First few samples are bad because we don't propagate the memory */ 2792bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<12;i++) 2802bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tmp[i] = 0; 2812bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 2822bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef FIXED_POINT 2832bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Normalize tmp to max range */ 2842bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 2852bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int shift=0; 2862bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian shift = 14-celt_ilog2(1+celt_maxabs16(tmp, len)); 2872bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (shift!=0) 2882bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 2892bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<len;i++) 2902bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tmp[i] = SHL16(tmp[i], shift); 2912bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 2922bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 2932bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 2942bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 2952bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mean=0; 2962bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mem0=0; 2972bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Grouping by two to reduce complexity */ 2982bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Forward pass to compute the post-echo threshold*/ 2992bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<len2;i++) 3002bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 3012bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 x2 = PSHR32(MULT16_16(tmp[2*i],tmp[2*i]) + MULT16_16(tmp[2*i+1],tmp[2*i+1]),16); 3022bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mean += x2; 3032bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef FIXED_POINT 3042bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* FIXME: Use PSHR16() instead */ 3052bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tmp[i] = mem0 + PSHR32(x2-mem0,4); 3062bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#else 3072bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tmp[i] = mem0 + MULT16_16_P15(QCONST16(.0625f,15),x2-mem0); 3082bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 3092bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mem0 = tmp[i]; 3102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 3112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 3122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mem0=0; 3132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian maxE=0; 3142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Backward pass to compute the pre-echo threshold */ 3152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=len2-1;i>=0;i--) 3162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 3172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef FIXED_POINT 3182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* FIXME: Use PSHR16() instead */ 3192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tmp[i] = mem0 + PSHR32(tmp[i]-mem0,3); 3202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#else 3212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tmp[i] = mem0 + MULT16_16_P15(QCONST16(0.125f,15),tmp[i]-mem0); 3222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 3232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mem0 = tmp[i]; 3242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian maxE = MAX16(maxE, mem0); 3252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 3262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*for (i=0;i<len2;i++)printf("%f ", tmp[i]/mean);printf("\n");*/ 3272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 3282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Compute the ratio of the "frame energy" over the harmonic mean of the energy. 3292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian This essentially corresponds to a bitrate-normalized temporal noise-to-mask 3302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ratio */ 3312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 3322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* As a compromise with the old transient detector, frame energy is the 3332bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian geometric mean of the energy and half the max */ 3342bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef FIXED_POINT 3352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Costs two sqrt() to avoid overflows */ 3362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mean = MULT16_16(celt_sqrt(mean), celt_sqrt(MULT16_16(maxE,len2>>1))); 3372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#else 3382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mean = celt_sqrt(mean * maxE*.5*len2); 3392bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 3402bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Inverse of the mean energy in Q15+6 */ 3412bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian norm = SHL32(EXTEND32(len2),6+14)/ADD32(EPSILON,SHR32(mean,1)); 3422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Compute harmonic mean discarding the unreliable boundaries 3432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian The data is smooth, so we only take 1/4th of the samples */ 3442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian unmask=0; 3452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=12;i<len2-5;i+=4) 3462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 3472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int id; 3482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef FIXED_POINT 3492bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian id = IMAX(0,IMIN(127,MULT16_32_Q15(tmp[i],norm))); /* Do not round to nearest */ 3502bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#else 3512bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian id = IMAX(0,IMIN(127,(int)floor(64*norm*tmp[i]))); /* Do not round to nearest */ 3522bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 3532bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian unmask += inv_table[id]; 3542bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 3552bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf("%d\n", unmask);*/ 3562bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Normalize, compensate for the 1/4th of the sample and the factor of 6 in the inverse table */ 3572bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian unmask = 64*unmask*4/(6*(len2-17)); 3582bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (unmask>mask_metric) 3592bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 3602bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian *tf_chan = c; 3612bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mask_metric = unmask; 3622bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 3632bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 3642bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian is_transient = mask_metric>200; 3652bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 3662bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Arbitrary metric for VBR boost */ 3672bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_max = MAX16(0,celt_sqrt(27*mask_metric)-42); 3682bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* *tf_estimate = 1 + MIN16(1, sqrt(MAX16(0, tf_max-30))/20); */ 3692bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian *tf_estimate = celt_sqrt(MAX16(0, SHL32(MULT16_16(QCONST16(0.0069,14),MIN16(163,tf_max)),14)-QCONST32(0.139,28))); 3702bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf("%d %f\n", tf_max, mask_metric);*/ 3712bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian RESTORE_STACK; 3722bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef FUZZING 3732bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian is_transient = rand()&0x1; 3742bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 3752bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf("%d %f %d\n", is_transient, (float)*tf_estimate, tf_max);*/ 3762bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return is_transient; 3772bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 3782bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 3792bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian/* Looks for sudden increases of energy to decide whether we need to patch 3802bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian the transient decision */ 3812bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianint patch_transient_decision(opus_val16 *newE, opus_val16 *oldE, int nbEBands, 3822bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int end, int C) 3832bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 3842bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int i, c; 3852bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val32 mean_diff=0; 3862bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 spread_old[26]; 3872bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Apply an aggressive (-6 dB/Bark) spreading function to the old frame to 3882bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian avoid false detection caused by irrelevant bands */ 3892bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (C==1) 3902bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 3912bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian spread_old[0] = oldE[0]; 3922bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=1;i<end;i++) 3932bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian spread_old[i] = MAX16(spread_old[i-1]-QCONST16(1.0f, DB_SHIFT), oldE[i]); 3942bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } else { 3952bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian spread_old[0] = MAX16(oldE[0],oldE[nbEBands]); 3962bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=1;i<end;i++) 3972bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian spread_old[i] = MAX16(spread_old[i-1]-QCONST16(1.0f, DB_SHIFT), 3982bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian MAX16(oldE[i],oldE[i+nbEBands])); 3992bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 4002bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=end-2;i>=0;i--) 4012bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian spread_old[i] = MAX16(spread_old[i], spread_old[i+1]-QCONST16(1.0f, DB_SHIFT)); 4022bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Compute mean increase */ 4032bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian c=0; do { 4042bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=2;i<end-1;i++) 4052bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 4062bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 x1, x2; 4072bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian x1 = MAX16(0, newE[i]); 4082bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian x2 = MAX16(0, spread_old[i]); 4092bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mean_diff = ADD32(mean_diff, EXTEND32(MAX16(0, SUB16(x1, x2)))); 4102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 4112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } while (++c<C); 4122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mean_diff = DIV32(mean_diff, C*(end-3)); 4132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf("%f %f %d\n", mean_diff, max_diff, count);*/ 4142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return mean_diff > QCONST16(1.f, DB_SHIFT); 4152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 4162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 4172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian/** Apply window and compute the MDCT for all sub-frames and 4182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian all channels in a frame */ 4192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianstatic void compute_mdcts(const CELTMode *mode, int shortBlocks, celt_sig * OPUS_RESTRICT in, 4202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian celt_sig * OPUS_RESTRICT out, int C, int CC, int LM, int upsample) 4212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 4222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian const int overlap = OVERLAP(mode); 4232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int N; 4242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int B; 4252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int shift; 4262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int i, b, c; 4272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (shortBlocks) 4282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 4292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian B = shortBlocks; 4302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian N = mode->shortMdctSize; 4312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian shift = mode->maxLM; 4322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } else { 4332bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian B = 1; 4342bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian N = mode->shortMdctSize<<LM; 4352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian shift = mode->maxLM-LM; 4362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 4372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian c=0; do { 4382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (b=0;b<B;b++) 4392bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 4402bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Interleaving the sub-frames while doing the MDCTs */ 4412bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian clt_mdct_forward(&mode->mdct, in+c*(B*N+overlap)+b*N, &out[b+c*N*B], mode->window, overlap, shift, B); 4422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 4432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } while (++c<CC); 4442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (CC==2&&C==1) 4452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 4462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<B*N;i++) 4472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian out[i] = ADD32(HALF32(out[i]), HALF32(out[B*N+i])); 4482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 4492bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (upsample != 1) 4502bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 4512bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian c=0; do 4522bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 4532bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int bound = B*N/upsample; 4542bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<bound;i++) 4552bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian out[c*B*N+i] *= upsample; 4562bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (;i<B*N;i++) 4572bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian out[c*B*N+i] = 0; 4582bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } while (++c<C); 4592bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 4602bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 4612bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 4622bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 4632bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianvoid celt_preemphasis(const opus_val16 * OPUS_RESTRICT pcmp, celt_sig * OPUS_RESTRICT inp, 4642bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int N, int CC, int upsample, const opus_val16 *coef, celt_sig *mem, int clip) 4652bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 4662bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int i; 4672bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 coef0; 4682bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian celt_sig m; 4692bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int Nu; 4702bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 4712bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian coef0 = coef[0]; 4722bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 4732bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 4742bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian Nu = N/upsample; 4752bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (upsample!=1) 4762bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 4772bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<N;i++) 4782bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian inp[i] = 0; 4792bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 4802bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<Nu;i++) 4812bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 4822bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian celt_sig x; 4832bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 4842bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian x = SCALEIN(pcmp[CC*i]); 4852bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifndef FIXED_POINT 4862bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Replace NaNs with zeros */ 4872bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (!(x==x)) 4882bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian x = 0; 4892bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 4902bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian inp[i*upsample] = x; 4912bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 4922bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 4932bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifndef FIXED_POINT 4942bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (clip) 4952bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 4962bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Clip input to avoid encoding non-portable files */ 4972bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<Nu;i++) 4982bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian inp[i*upsample] = MAX32(-65536.f, MIN32(65536.f,inp[i*upsample])); 4992bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 5002bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#else 5012bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian (void)clip; /* Avoids a warning about clip being unused. */ 5022bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 5032bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian m = *mem; 5042bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef CUSTOM_MODES 5052bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (coef[1] != 0) 5062bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 5072bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 coef1 = coef[1]; 5082bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 coef2 = coef[2]; 5092bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<N;i++) 5102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 5112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian celt_sig x, tmp; 5122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian x = inp[i]; 5132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Apply pre-emphasis */ 5142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tmp = MULT16_16(coef2, x); 5152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian inp[i] = tmp + m; 5162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian m = MULT16_32_Q15(coef1, inp[i]) - MULT16_32_Q15(coef0, tmp); 5172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 5182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } else 5192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 5202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 5212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<N;i++) 5222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 5232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian celt_sig x; 5242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian x = SHL32(inp[i], SIG_SHIFT); 5252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Apply pre-emphasis */ 5262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian inp[i] = x + m; 5272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian m = - MULT16_32_Q15(coef0, x); 5282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 5292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 5302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian *mem = m; 5312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 5322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 5332bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 5342bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 5352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianstatic opus_val32 l1_metric(const celt_norm *tmp, int N, int LM, opus_val16 bias) 5362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 5372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int i; 5382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val32 L1; 5392bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian L1 = 0; 5402bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<N;i++) 5412bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian L1 += EXTEND32(ABS16(tmp[i])); 5422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* When in doubt, prefer good freq resolution */ 5432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian L1 = MAC16_32_Q15(L1, LM*bias, L1); 5442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return L1; 5452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 5462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 5472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 5482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianstatic int tf_analysis(const CELTMode *m, int len, int isTransient, 5492bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int *tf_res, int lambda, celt_norm *X, int N0, int LM, 5502bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int *tf_sum, opus_val16 tf_estimate, int tf_chan) 5512bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 5522bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int i; 5532bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(int, metric); 5542bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int cost0; 5552bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int cost1; 5562bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(int, path0); 5572bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(int, path1); 5582bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(celt_norm, tmp); 5592bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(celt_norm, tmp_1); 5602bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int sel; 5612bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int selcost[2]; 5622bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int tf_select=0; 5632bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 bias; 5642bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 5652bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian SAVE_STACK; 5662bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian bias = MULT16_16_Q14(QCONST16(.04f,15), MAX16(-QCONST16(.25f,14), QCONST16(.5f,14)-tf_estimate)); 5672bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf("%f ", bias);*/ 5682bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 5692bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(metric, len, int); 5702bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(tmp, (m->eBands[len]-m->eBands[len-1])<<LM, celt_norm); 5712bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(tmp_1, (m->eBands[len]-m->eBands[len-1])<<LM, celt_norm); 5722bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(path0, len, int); 5732bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(path1, len, int); 5742bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 5752bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian *tf_sum = 0; 5762bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<len;i++) 5772bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 5782bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int j, k, N; 5792bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int narrow; 5802bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val32 L1, best_L1; 5812bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int best_level=0; 5822bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian N = (m->eBands[i+1]-m->eBands[i])<<LM; 5832bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* band is too narrow to be split down to LM=-1 */ 5842bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian narrow = (m->eBands[i+1]-m->eBands[i])==1; 5852bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (j=0;j<N;j++) 5862bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tmp[j] = X[tf_chan*N0 + j+(m->eBands[i]<<LM)]; 5872bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Just add the right channel if we're in stereo */ 5882bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*if (C==2) 5892bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (j=0;j<N;j++) 5902bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tmp[j] = ADD16(SHR16(tmp[j], 1),SHR16(X[N0+j+(m->eBands[i]<<LM)], 1));*/ 5912bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian L1 = l1_metric(tmp, N, isTransient ? LM : 0, bias); 5922bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian best_L1 = L1; 5932bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Check the -1 case for transients */ 5942bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (isTransient && !narrow) 5952bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 5962bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (j=0;j<N;j++) 5972bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tmp_1[j] = tmp[j]; 5982bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian haar1(tmp_1, N>>LM, 1<<LM); 5992bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian L1 = l1_metric(tmp_1, N, LM+1, bias); 6002bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (L1<best_L1) 6012bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 6022bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian best_L1 = L1; 6032bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian best_level = -1; 6042bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 6052bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 6062bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf ("%f ", L1);*/ 6072bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (k=0;k<LM+!(isTransient||narrow);k++) 6082bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 6092bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int B; 6102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 6112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (isTransient) 6122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian B = (LM-k-1); 6132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian else 6142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian B = k+1; 6152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 6162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian haar1(tmp, N>>k, 1<<k); 6172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 6182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian L1 = l1_metric(tmp, N, B, bias); 6192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 6202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (L1 < best_L1) 6212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 6222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian best_L1 = L1; 6232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian best_level = k+1; 6242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 6252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 6262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf ("%d ", isTransient ? LM-best_level : best_level);*/ 6272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* metric is in Q1 to be able to select the mid-point (-0.5) for narrower bands */ 6282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (isTransient) 6292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian metric[i] = 2*best_level; 6302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian else 6312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian metric[i] = -2*best_level; 6322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian *tf_sum += (isTransient ? LM : 0) - metric[i]/2; 6332bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* For bands that can't be split to -1, set the metric to the half-way point to avoid 6342bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian biasing the decision */ 6352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (narrow && (metric[i]==0 || metric[i]==-2*LM)) 6362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian metric[i]-=1; 6372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf("%d ", metric[i]);*/ 6382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 6392bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf("\n");*/ 6402bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Search for the optimal tf resolution, including tf_select */ 6412bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_select = 0; 6422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (sel=0;sel<2;sel++) 6432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 6442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian cost0 = 0; 6452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian cost1 = isTransient ? 0 : lambda; 6462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=1;i<len;i++) 6472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 6482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int curr0, curr1; 6492bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian curr0 = IMIN(cost0, cost1 + lambda); 6502bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian curr1 = IMIN(cost0 + lambda, cost1); 6512bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian cost0 = curr0 + abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*sel+0]); 6522bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian cost1 = curr1 + abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*sel+1]); 6532bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 6542bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian cost0 = IMIN(cost0, cost1); 6552bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian selcost[sel]=cost0; 6562bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 6572bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* For now, we're conservative and only allow tf_select=1 for transients. 6582bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian * If tests confirm it's useful for non-transients, we could allow it. */ 6592bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (selcost[1]<selcost[0] && isTransient) 6602bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_select=1; 6612bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian cost0 = 0; 6622bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian cost1 = isTransient ? 0 : lambda; 6632bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Viterbi forward pass */ 6642bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=1;i<len;i++) 6652bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 6662bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int curr0, curr1; 6672bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int from0, from1; 6682bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 6692bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian from0 = cost0; 6702bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian from1 = cost1 + lambda; 6712bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (from0 < from1) 6722bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 6732bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian curr0 = from0; 6742bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian path0[i]= 0; 6752bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } else { 6762bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian curr0 = from1; 6772bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian path0[i]= 1; 6782bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 6792bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 6802bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian from0 = cost0 + lambda; 6812bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian from1 = cost1; 6822bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (from0 < from1) 6832bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 6842bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian curr1 = from0; 6852bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian path1[i]= 0; 6862bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } else { 6872bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian curr1 = from1; 6882bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian path1[i]= 1; 6892bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 6902bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian cost0 = curr0 + abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*tf_select+0]); 6912bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian cost1 = curr1 + abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*tf_select+1]); 6922bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 6932bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_res[len-1] = cost0 < cost1 ? 0 : 1; 6942bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Viterbi backward pass to check the decisions */ 6952bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=len-2;i>=0;i--) 6962bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 6972bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (tf_res[i+1] == 1) 6982bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_res[i] = path1[i+1]; 6992bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian else 7002bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_res[i] = path0[i+1]; 7012bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 7022bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf("%d %f\n", *tf_sum, tf_estimate);*/ 7032bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian RESTORE_STACK; 7042bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef FUZZING 7052bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_select = rand()&0x1; 7062bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_res[0] = rand()&0x1; 7072bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=1;i<len;i++) 7082bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_res[i] = tf_res[i-1] ^ ((rand()&0xF) == 0); 7092bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 7102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return tf_select; 7112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 7122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 7132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianstatic void tf_encode(int start, int end, int isTransient, int *tf_res, int LM, int tf_select, ec_enc *enc) 7142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 7152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int curr, i; 7162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int tf_select_rsv; 7172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int tf_changed; 7182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int logp; 7192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_uint32 budget; 7202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_uint32 tell; 7212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian budget = enc->storage*8; 7222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tell = ec_tell(enc); 7232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian logp = isTransient ? 2 : 4; 7242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Reserve space to code the tf_select decision. */ 7252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_select_rsv = LM>0 && tell+logp+1 <= budget; 7262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian budget -= tf_select_rsv; 7272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian curr = tf_changed = 0; 7282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=start;i<end;i++) 7292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 7302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (tell+logp<=budget) 7312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 7322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ec_enc_bit_logp(enc, tf_res[i] ^ curr, logp); 7332bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tell = ec_tell(enc); 7342bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian curr = tf_res[i]; 7352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_changed |= curr; 7362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 7372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian else 7382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_res[i] = curr; 7392bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian logp = isTransient ? 4 : 5; 7402bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 7412bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Only code tf_select if it would actually make a difference. */ 7422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (tf_select_rsv && 7432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_select_table[LM][4*isTransient+0+tf_changed]!= 7442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_select_table[LM][4*isTransient+2+tf_changed]) 7452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ec_enc_bit_logp(enc, tf_select, 1); 7462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian else 7472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_select = 0; 7482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=start;i<end;i++) 7492bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_res[i] = tf_select_table[LM][4*isTransient+2*tf_select+tf_res[i]]; 7502bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*for(i=0;i<end;i++)printf("%d ", isTransient ? tf_res[i] : LM+tf_res[i]);printf("\n");*/ 7512bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 7522bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 7532bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 7542bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianstatic int alloc_trim_analysis(const CELTMode *m, const celt_norm *X, 7552bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian const opus_val16 *bandLogE, int end, int LM, int C, int N0, 7562bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian AnalysisInfo *analysis, opus_val16 *stereo_saving, opus_val16 tf_estimate, 7572bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int intensity, opus_val16 surround_trim) 7582bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 7592bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int i; 7602bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val32 diff=0; 7612bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int c; 7622bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int trim_index = 5; 7632bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 trim = QCONST16(5.f, 8); 7642bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 logXC, logXC2; 7652bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (C==2) 7662bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 7672bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 sum = 0; /* Q10 */ 7682bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 minXC; /* Q10 */ 7692bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Compute inter-channel correlation for low frequencies */ 7702bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<8;i++) 7712bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 7722bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int j; 7732bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val32 partial = 0; 7742bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (j=m->eBands[i]<<LM;j<m->eBands[i+1]<<LM;j++) 7752bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian partial = MAC16_16(partial, X[j], X[N0+j]); 7762bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian sum = ADD16(sum, EXTRACT16(SHR32(partial, 18))); 7772bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 7782bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian sum = MULT16_16_Q15(QCONST16(1.f/8, 15), sum); 7792bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian sum = MIN16(QCONST16(1.f, 10), ABS16(sum)); 7802bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian minXC = sum; 7812bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=8;i<intensity;i++) 7822bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 7832bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int j; 7842bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val32 partial = 0; 7852bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (j=m->eBands[i]<<LM;j<m->eBands[i+1]<<LM;j++) 7862bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian partial = MAC16_16(partial, X[j], X[N0+j]); 7872bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian minXC = MIN16(minXC, ABS16(EXTRACT16(SHR32(partial, 18)))); 7882bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 7892bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian minXC = MIN16(QCONST16(1.f, 10), ABS16(minXC)); 7902bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf ("%f\n", sum);*/ 7912bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (sum > QCONST16(.995f,10)) 7922bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian trim_index-=4; 7932bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian else if (sum > QCONST16(.92f,10)) 7942bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian trim_index-=3; 7952bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian else if (sum > QCONST16(.85f,10)) 7962bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian trim_index-=2; 7972bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian else if (sum > QCONST16(.8f,10)) 7982bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian trim_index-=1; 7992bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* mid-side savings estimations based on the LF average*/ 8002bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian logXC = celt_log2(QCONST32(1.001f, 20)-MULT16_16(sum, sum)); 8012bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* mid-side savings estimations based on min correlation */ 8022bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian logXC2 = MAX16(HALF16(logXC), celt_log2(QCONST32(1.001f, 20)-MULT16_16(minXC, minXC))); 8032bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef FIXED_POINT 8042bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Compensate for Q20 vs Q14 input and convert output to Q8 */ 8052bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian logXC = PSHR32(logXC-QCONST16(6.f, DB_SHIFT),DB_SHIFT-8); 8062bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian logXC2 = PSHR32(logXC2-QCONST16(6.f, DB_SHIFT),DB_SHIFT-8); 8072bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 8082bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 8092bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian trim += MAX16(-QCONST16(4.f, 8), MULT16_16_Q15(QCONST16(.75f,15),logXC)); 8102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian *stereo_saving = MIN16(*stereo_saving + QCONST16(0.25f, 8), -HALF16(logXC2)); 8112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 8122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 8132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Estimate spectral tilt */ 8142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian c=0; do { 8152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<end-1;i++) 8162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 8172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian diff += bandLogE[i+c*m->nbEBands]*(opus_int32)(2+2*i-end); 8182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 8192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } while (++c<C); 8202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian diff /= C*(end-1); 8212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf("%f\n", diff);*/ 8222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (diff > QCONST16(2.f, DB_SHIFT)) 8232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian trim_index--; 8242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (diff > QCONST16(8.f, DB_SHIFT)) 8252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian trim_index--; 8262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (diff < -QCONST16(4.f, DB_SHIFT)) 8272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian trim_index++; 8282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (diff < -QCONST16(10.f, DB_SHIFT)) 8292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian trim_index++; 8302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian trim -= MAX16(-QCONST16(2.f, 8), MIN16(QCONST16(2.f, 8), SHR16(diff+QCONST16(1.f, DB_SHIFT),DB_SHIFT-8)/6 )); 8312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian trim -= SHR16(surround_trim, DB_SHIFT-8); 8322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian trim -= 2*SHR16(tf_estimate, 14-8); 8332bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifndef DISABLE_FLOAT_API 8342bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (analysis->valid) 8352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 8362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian trim -= MAX16(-QCONST16(2.f, 8), MIN16(QCONST16(2.f, 8), 8372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian (opus_val16)(QCONST16(2.f, 8)*(analysis->tonality_slope+.05f)))); 8382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 8392bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 8402bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 8412bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef FIXED_POINT 8422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian trim_index = PSHR32(trim, 8); 8432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#else 8442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian trim_index = (int)floor(.5f+trim); 8452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 8462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (trim_index<0) 8472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian trim_index = 0; 8482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (trim_index>10) 8492bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian trim_index = 10; 8502bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf("%d\n", trim_index);*/ 8512bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef FUZZING 8522bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian trim_index = rand()%11; 8532bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 8542bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return trim_index; 8552bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 8562bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 8572bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianstatic int stereo_analysis(const CELTMode *m, const celt_norm *X, 8582bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int LM, int N0) 8592bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 8602bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int i; 8612bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int thetas; 8622bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val32 sumLR = EPSILON, sumMS = EPSILON; 8632bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 8642bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Use the L1 norm to model the entropy of the L/R signal vs the M/S signal */ 8652bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<13;i++) 8662bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 8672bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int j; 8682bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (j=m->eBands[i]<<LM;j<m->eBands[i+1]<<LM;j++) 8692bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 8702bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val32 L, R, M, S; 8712bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* We cast to 32-bit first because of the -32768 case */ 8722bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian L = EXTEND32(X[j]); 8732bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian R = EXTEND32(X[N0+j]); 8742bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian M = ADD32(L, R); 8752bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian S = SUB32(L, R); 8762bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian sumLR = ADD32(sumLR, ADD32(ABS32(L), ABS32(R))); 8772bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian sumMS = ADD32(sumMS, ADD32(ABS32(M), ABS32(S))); 8782bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 8792bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 8802bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian sumMS = MULT16_32_Q15(QCONST16(0.707107f, 15), sumMS); 8812bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian thetas = 13; 8822bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* We don't need thetas for lower bands with LM<=1 */ 8832bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (LM<=1) 8842bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian thetas -= 8; 8852bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return MULT16_32_Q15((m->eBands[13]<<(LM+1))+thetas, sumMS) 8862bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian > MULT16_32_Q15(m->eBands[13]<<(LM+1), sumLR); 8872bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 8882bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 8892bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianstatic opus_val16 dynalloc_analysis(const opus_val16 *bandLogE, const opus_val16 *bandLogE2, 8902bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int nbEBands, int start, int end, int C, int *offsets, int lsb_depth, const opus_int16 *logN, 8912bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int isTransient, int vbr, int constrained_vbr, const opus_int16 *eBands, int LM, 8922bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int effectiveBytes, opus_int32 *tot_boost_, int lfe, opus_val16 *surround_dynalloc) 8932bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 8942bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int i, c; 8952bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 tot_boost=0; 8962bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 maxDepth; 8972bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(opus_val16, follower); 8982bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(opus_val16, noise_floor); 8992bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian SAVE_STACK; 9002bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(follower, C*nbEBands, opus_val16); 9012bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(noise_floor, C*nbEBands, opus_val16); 9022bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<nbEBands;i++) 9032bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian offsets[i] = 0; 9042bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Dynamic allocation code */ 9052bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian maxDepth=-QCONST16(31.9f, DB_SHIFT); 9062bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<end;i++) 9072bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 9082bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Noise floor must take into account eMeans, the depth, the width of the bands 9092bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian and the preemphasis filter (approx. square of bark band ID) */ 9102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian noise_floor[i] = MULT16_16(QCONST16(0.0625f, DB_SHIFT),logN[i]) 9112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian +QCONST16(.5f,DB_SHIFT)+SHL16(9-lsb_depth,DB_SHIFT)-SHL16(eMeans[i],6) 9122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian +MULT16_16(QCONST16(.0062,DB_SHIFT),(i+5)*(i+5)); 9132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 9142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian c=0;do 9152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 9162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<end;i++) 9172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian maxDepth = MAX16(maxDepth, bandLogE[c*nbEBands+i]-noise_floor[i]); 9182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } while (++c<C); 9192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Make sure that dynamic allocation can't make us bust the budget */ 9202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (effectiveBytes > 50 && LM>=1 && !lfe) 9212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 9222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int last=0; 9232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian c=0;do 9242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 9252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian follower[c*nbEBands] = bandLogE2[c*nbEBands]; 9262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=1;i<end;i++) 9272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 9282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* The last band to be at least 3 dB higher than the previous one 9292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian is the last we'll consider. Otherwise, we run into problems on 9302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian bandlimited signals. */ 9312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (bandLogE2[c*nbEBands+i] > bandLogE2[c*nbEBands+i-1]+QCONST16(.5f,DB_SHIFT)) 9322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian last=i; 9332bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian follower[c*nbEBands+i] = MIN16(follower[c*nbEBands+i-1]+QCONST16(1.5f,DB_SHIFT), bandLogE2[c*nbEBands+i]); 9342bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 9352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=last-1;i>=0;i--) 9362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian follower[c*nbEBands+i] = MIN16(follower[c*nbEBands+i], MIN16(follower[c*nbEBands+i+1]+QCONST16(2.f,DB_SHIFT), bandLogE2[c*nbEBands+i])); 9372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<end;i++) 9382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian follower[c*nbEBands+i] = MAX16(follower[c*nbEBands+i], noise_floor[i]); 9392bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } while (++c<C); 9402bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (C==2) 9412bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 9422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=start;i<end;i++) 9432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 9442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Consider 24 dB "cross-talk" */ 9452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian follower[nbEBands+i] = MAX16(follower[nbEBands+i], follower[ i]-QCONST16(4.f,DB_SHIFT)); 9462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian follower[ i] = MAX16(follower[ i], follower[nbEBands+i]-QCONST16(4.f,DB_SHIFT)); 9472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian follower[i] = HALF16(MAX16(0, bandLogE[i]-follower[i]) + MAX16(0, bandLogE[nbEBands+i]-follower[nbEBands+i])); 9482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 9492bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } else { 9502bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=start;i<end;i++) 9512bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 9522bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian follower[i] = MAX16(0, bandLogE[i]-follower[i]); 9532bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 9542bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 9552bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=start;i<end;i++) 9562bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian follower[i] = MAX16(follower[i], surround_dynalloc[i]); 9572bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* For non-transient CBR/CVBR frames, halve the dynalloc contribution */ 9582bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if ((!vbr || constrained_vbr)&&!isTransient) 9592bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 9602bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=start;i<end;i++) 9612bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian follower[i] = HALF16(follower[i]); 9622bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 9632bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=start;i<end;i++) 9642bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 9652bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int width; 9662bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int boost; 9672bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int boost_bits; 9682bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 9692bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (i<8) 9702bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian follower[i] *= 2; 9712bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (i>=12) 9722bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian follower[i] = HALF16(follower[i]); 9732bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian follower[i] = MIN16(follower[i], QCONST16(4, DB_SHIFT)); 9742bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 9752bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian width = C*(eBands[i+1]-eBands[i])<<LM; 9762bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (width<6) 9772bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 9782bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian boost = (int)SHR32(EXTEND32(follower[i]),DB_SHIFT); 9792bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian boost_bits = boost*width<<BITRES; 9802bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } else if (width > 48) { 9812bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian boost = (int)SHR32(EXTEND32(follower[i])*8,DB_SHIFT); 9822bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian boost_bits = (boost*width<<BITRES)/8; 9832bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } else { 9842bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian boost = (int)SHR32(EXTEND32(follower[i])*width/6,DB_SHIFT); 9852bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian boost_bits = boost*6<<BITRES; 9862bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 9872bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* For CBR and non-transient CVBR frames, limit dynalloc to 1/4 of the bits */ 9882bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if ((!vbr || (constrained_vbr&&!isTransient)) 9892bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian && (tot_boost+boost_bits)>>BITRES>>3 > effectiveBytes/4) 9902bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 9912bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 cap = ((effectiveBytes/4)<<BITRES<<3); 9922bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian offsets[i] = cap-tot_boost; 9932bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tot_boost = cap; 9942bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian break; 9952bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } else { 9962bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian offsets[i] = boost; 9972bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tot_boost += boost_bits; 9982bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 9992bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 10002bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 10012bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian *tot_boost_ = tot_boost; 10022bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian RESTORE_STACK; 10032bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return maxDepth; 10042bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 10052bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 10062bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 10072bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianstatic int run_prefilter(CELTEncoder *st, celt_sig *in, celt_sig *prefilter_mem, int CC, int N, 10082bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int prefilter_tapset, int *pitch, opus_val16 *gain, int *qgain, int enabled, int nbAvailableBytes) 10092bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 10102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int c; 10112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(celt_sig, _pre); 10122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian celt_sig *pre[2]; 10132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian const CELTMode *mode; 10142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int pitch_index; 10152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 gain1; 10162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 pf_threshold; 10172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int pf_on; 10182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int qg; 10192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian SAVE_STACK; 10202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 10212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mode = st->mode; 10222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(_pre, CC*(N+COMBFILTER_MAXPERIOD), celt_sig); 10232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 10242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian pre[0] = _pre; 10252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian pre[1] = _pre + (N+COMBFILTER_MAXPERIOD); 10262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 10272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 10282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian c=0; do { 10292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian OPUS_COPY(pre[c], prefilter_mem+c*COMBFILTER_MAXPERIOD, COMBFILTER_MAXPERIOD); 10302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian OPUS_COPY(pre[c]+COMBFILTER_MAXPERIOD, in+c*(N+st->overlap)+st->overlap, N); 10312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } while (++c<CC); 10322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 10332bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (enabled) 10342bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 10352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(opus_val16, pitch_buf); 10362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(pitch_buf, (COMBFILTER_MAXPERIOD+N)>>1, opus_val16); 10372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 10382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian pitch_downsample(pre, pitch_buf, COMBFILTER_MAXPERIOD+N, CC, st->arch); 10392bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Don't search for the fir last 1.5 octave of the range because 10402bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian there's too many false-positives due to short-term correlation */ 10412bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian pitch_search(pitch_buf+(COMBFILTER_MAXPERIOD>>1), pitch_buf, N, 10422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian COMBFILTER_MAXPERIOD-3*COMBFILTER_MINPERIOD, &pitch_index, 10432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->arch); 10442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian pitch_index = COMBFILTER_MAXPERIOD-pitch_index; 10452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 10462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian gain1 = remove_doubling(pitch_buf, COMBFILTER_MAXPERIOD, COMBFILTER_MINPERIOD, 10472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian N, &pitch_index, st->prefilter_period, st->prefilter_gain); 10482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (pitch_index > COMBFILTER_MAXPERIOD-2) 10492bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian pitch_index = COMBFILTER_MAXPERIOD-2; 10502bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian gain1 = MULT16_16_Q15(QCONST16(.7f,15),gain1); 10512bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf("%d %d %f %f\n", pitch_change, pitch_index, gain1, st->analysis.tonality);*/ 10522bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->loss_rate>2) 10532bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian gain1 = HALF32(gain1); 10542bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->loss_rate>4) 10552bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian gain1 = HALF32(gain1); 10562bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->loss_rate>8) 10572bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian gain1 = 0; 10582bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } else { 10592bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian gain1 = 0; 10602bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian pitch_index = COMBFILTER_MINPERIOD; 10612bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 10622bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 10632bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Gain threshold for enabling the prefilter/postfilter */ 10642bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian pf_threshold = QCONST16(.2f,15); 10652bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 10662bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Adjusting the threshold based on rate and continuity */ 10672bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (abs(pitch_index-st->prefilter_period)*10>pitch_index) 10682bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian pf_threshold += QCONST16(.2f,15); 10692bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (nbAvailableBytes<25) 10702bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian pf_threshold += QCONST16(.1f,15); 10712bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (nbAvailableBytes<35) 10722bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian pf_threshold += QCONST16(.1f,15); 10732bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->prefilter_gain > QCONST16(.4f,15)) 10742bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian pf_threshold -= QCONST16(.1f,15); 10752bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->prefilter_gain > QCONST16(.55f,15)) 10762bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian pf_threshold -= QCONST16(.1f,15); 10772bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 10782bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Hard threshold at 0.2 */ 10792bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian pf_threshold = MAX16(pf_threshold, QCONST16(.2f,15)); 10802bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (gain1<pf_threshold) 10812bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 10822bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian gain1 = 0; 10832bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian pf_on = 0; 10842bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian qg = 0; 10852bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } else { 10862bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*This block is not gated by a total bits check only because 10872bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian of the nbAvailableBytes check above.*/ 10882bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (ABS16(gain1-st->prefilter_gain)<QCONST16(.1f,15)) 10892bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian gain1=st->prefilter_gain; 10902bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 10912bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef FIXED_POINT 10922bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian qg = ((gain1+1536)>>10)/3-1; 10932bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#else 10942bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian qg = (int)floor(.5f+gain1*32/3)-1; 10952bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 10962bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian qg = IMAX(0, IMIN(7, qg)); 10972bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian gain1 = QCONST16(0.09375f,15)*(qg+1); 10982bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian pf_on = 1; 10992bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 11002bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf("%d %f\n", pitch_index, gain1);*/ 11012bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 11022bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian c=0; do { 11032bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int offset = mode->shortMdctSize-st->overlap; 11042bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->prefilter_period=IMAX(st->prefilter_period, COMBFILTER_MINPERIOD); 11052bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian OPUS_COPY(in+c*(N+st->overlap), st->in_mem+c*(st->overlap), st->overlap); 11062bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (offset) 11072bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian comb_filter(in+c*(N+st->overlap)+st->overlap, pre[c]+COMBFILTER_MAXPERIOD, 11082bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->prefilter_period, st->prefilter_period, offset, -st->prefilter_gain, -st->prefilter_gain, 11092bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->prefilter_tapset, st->prefilter_tapset, NULL, 0); 11102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 11112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian comb_filter(in+c*(N+st->overlap)+st->overlap+offset, pre[c]+COMBFILTER_MAXPERIOD+offset, 11122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->prefilter_period, pitch_index, N-offset, -st->prefilter_gain, -gain1, 11132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->prefilter_tapset, prefilter_tapset, mode->window, st->overlap); 11142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian OPUS_COPY(st->in_mem+c*(st->overlap), in+c*(N+st->overlap)+N, st->overlap); 11152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 11162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (N>COMBFILTER_MAXPERIOD) 11172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 11182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian OPUS_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD, pre[c]+N, COMBFILTER_MAXPERIOD); 11192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } else { 11202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian OPUS_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD, prefilter_mem+c*COMBFILTER_MAXPERIOD+N, COMBFILTER_MAXPERIOD-N); 11212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian OPUS_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD+COMBFILTER_MAXPERIOD-N, pre[c]+COMBFILTER_MAXPERIOD, N); 11222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 11232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } while (++c<CC); 11242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 11252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian RESTORE_STACK; 11262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian *gain = gain1; 11272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian *pitch = pitch_index; 11282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian *qgain = qg; 11292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return pf_on; 11302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 11312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 11322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianstatic int compute_vbr(const CELTMode *mode, AnalysisInfo *analysis, opus_int32 base_target, 11332bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int LM, opus_int32 bitrate, int lastCodedBands, int C, int intensity, 11342bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int constrained_vbr, opus_val16 stereo_saving, int tot_boost, 11352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 tf_estimate, int pitch_change, opus_val16 maxDepth, 11362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int variable_duration, int lfe, int has_surround_mask, opus_val16 surround_masking, 11372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 temporal_vbr) 11382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 11392bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* The target rate in 8th bits per frame */ 11402bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 target; 11412bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int coded_bins; 11422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int coded_bands; 11432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 tf_calibration; 11442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int nbEBands; 11452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian const opus_int16 *eBands; 11462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 11472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian nbEBands = mode->nbEBands; 11482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian eBands = mode->eBands; 11492bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 11502bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian coded_bands = lastCodedBands ? lastCodedBands : nbEBands; 11512bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian coded_bins = eBands[coded_bands]<<LM; 11522bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (C==2) 11532bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian coded_bins += eBands[IMIN(intensity, coded_bands)]<<LM; 11542bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 11552bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian target = base_target; 11562bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 11572bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf("%f %f %f %f %d %d ", st->analysis.activity, st->analysis.tonality, tf_estimate, st->stereo_saving, tot_boost, coded_bands);*/ 11582bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifndef DISABLE_FLOAT_API 11592bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (analysis->valid && analysis->activity<.4) 11602bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian target -= (opus_int32)((coded_bins<<BITRES)*(.4f-analysis->activity)); 11612bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 11622bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Stereo savings */ 11632bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (C==2) 11642bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 11652bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int coded_stereo_bands; 11662bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int coded_stereo_dof; 11672bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 max_frac; 11682bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian coded_stereo_bands = IMIN(intensity, coded_bands); 11692bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian coded_stereo_dof = (eBands[coded_stereo_bands]<<LM)-coded_stereo_bands; 11702bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Maximum fraction of the bits we can save if the signal is mono. */ 11712bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian max_frac = DIV32_16(MULT16_16(QCONST16(0.8f, 15), coded_stereo_dof), coded_bins); 11722bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian stereo_saving = MIN16(stereo_saving, QCONST16(1.f, 8)); 11732bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf("%d %d %d ", coded_stereo_dof, coded_bins, tot_boost);*/ 11742bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian target -= (opus_int32)MIN32(MULT16_32_Q15(max_frac,target), 11752bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian SHR32(MULT16_16(stereo_saving-QCONST16(0.1f,8),(coded_stereo_dof<<BITRES)),8)); 11762bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 11772bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Boost the rate according to dynalloc (minus the dynalloc average for calibration). */ 11782bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian target += tot_boost-(16<<LM); 11792bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Apply transient boost, compensating for average boost. */ 11802bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_calibration = variable_duration==OPUS_FRAMESIZE_VARIABLE ? 11812bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian QCONST16(0.02f,14) : QCONST16(0.04f,14); 11822bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian target += (opus_int32)SHL32(MULT16_32_Q15(tf_estimate-tf_calibration, target),1); 11832bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 11842bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifndef DISABLE_FLOAT_API 11852bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Apply tonality boost */ 11862bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (analysis->valid && !lfe) 11872bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 11882bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 tonal_target; 11892bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian float tonal; 11902bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 11912bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Tonality boost (compensating for the average). */ 11922bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tonal = MAX16(0.f,analysis->tonality-.15f)-0.09f; 11932bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tonal_target = target + (opus_int32)((coded_bins<<BITRES)*1.2f*tonal); 11942bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (pitch_change) 11952bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tonal_target += (opus_int32)((coded_bins<<BITRES)*.8f); 11962bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf("%f %f ", analysis->tonality, tonal);*/ 11972bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian target = tonal_target; 11982bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 11992bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 12002bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 12012bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (has_surround_mask&&!lfe) 12022bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 12032bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 surround_target = target + (opus_int32)SHR32(MULT16_16(surround_masking,coded_bins<<BITRES), DB_SHIFT); 12042bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf("%f %d %d %d %d %d %d ", surround_masking, coded_bins, st->end, st->intensity, surround_target, target, st->bitrate);*/ 12052bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian target = IMAX(target/4, surround_target); 12062bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 12072bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 12082bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 12092bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 floor_depth; 12102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int bins; 12112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian bins = eBands[nbEBands-2]<<LM; 12122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*floor_depth = SHR32(MULT16_16((C*bins<<BITRES),celt_log2(SHL32(MAX16(1,sample_max),13))), DB_SHIFT);*/ 12132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian floor_depth = (opus_int32)SHR32(MULT16_16((C*bins<<BITRES),maxDepth), DB_SHIFT); 12142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian floor_depth = IMAX(floor_depth, target>>2); 12152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian target = IMIN(target, floor_depth); 12162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf("%f %d\n", maxDepth, floor_depth);*/ 12172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 12182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 12192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if ((!has_surround_mask||lfe) && (constrained_vbr || bitrate<64000)) 12202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 12212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 rate_factor; 12222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef FIXED_POINT 12232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian rate_factor = MAX16(0,(bitrate-32000)); 12242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#else 12252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian rate_factor = MAX16(0,(1.f/32768)*(bitrate-32000)); 12262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 12272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (constrained_vbr) 12282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian rate_factor = MIN16(rate_factor, QCONST16(0.67f, 15)); 12292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian target = base_target + (opus_int32)MULT16_32_Q15(rate_factor, target-base_target); 12302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 12312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 12322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 12332bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (!has_surround_mask && tf_estimate < QCONST16(.2f, 14)) 12342bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 12352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 amount; 12362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 tvbr_factor; 12372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian amount = MULT16_16_Q15(QCONST16(.0000031f, 30), IMAX(0, IMIN(32000, 96000-bitrate))); 12382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tvbr_factor = SHR32(MULT16_16(temporal_vbr, amount), DB_SHIFT); 12392bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian target += (opus_int32)MULT16_32_Q15(tvbr_factor, target); 12402bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 12412bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 12422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Don't allow more than doubling the rate */ 12432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian target = IMIN(2*base_target, target); 12442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 12452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return target; 12462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 12472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 12482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianint celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes, ec_enc *enc) 12492bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 12502bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int i, c, N; 12512bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 bits; 12522bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ec_enc _enc; 12532bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(celt_sig, in); 12542bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(celt_sig, freq); 12552bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(celt_norm, X); 12562bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(celt_ener, bandE); 12572bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(opus_val16, bandLogE); 12582bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(opus_val16, bandLogE2); 12592bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(int, fine_quant); 12602bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(opus_val16, error); 12612bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(int, pulses); 12622bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(int, cap); 12632bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(int, offsets); 12642bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(int, fine_priority); 12652bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(int, tf_res); 12662bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(unsigned char, collapse_masks); 12672bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian celt_sig *prefilter_mem; 12682bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 *oldBandE, *oldLogE, *oldLogE2; 12692bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int shortBlocks=0; 12702bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int isTransient=0; 12712bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian const int CC = st->channels; 12722bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian const int C = st->stream_channels; 12732bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int LM, M; 12742bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int tf_select; 12752bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int nbFilledBytes, nbAvailableBytes; 12762bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int effEnd; 12772bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int codedBands; 12782bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int tf_sum; 12792bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int alloc_trim; 12802bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int pitch_index=COMBFILTER_MINPERIOD; 12812bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 gain1 = 0; 12822bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int dual_stereo=0; 12832bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int effectiveBytes; 12842bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int dynalloc_logp; 12852bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 vbr_rate; 12862bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 total_bits; 12872bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 total_boost; 12882bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 balance; 12892bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 tell; 12902bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int prefilter_tapset=0; 12912bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int pf_on; 12922bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int anti_collapse_rsv; 12932bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int anti_collapse_on=0; 12942bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int silence=0; 12952bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int tf_chan = 0; 12962bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 tf_estimate; 12972bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int pitch_change=0; 12982bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 tot_boost; 12992bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val32 sample_max; 13002bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 maxDepth; 13012bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian const OpusCustomMode *mode; 13022bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int nbEBands; 13032bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int overlap; 13042bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian const opus_int16 *eBands; 13052bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int secondMdct; 13062bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int signalBandwidth; 13072bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int transient_got_disabled=0; 13082bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 surround_masking=0; 13092bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 temporal_vbr=0; 13102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 surround_trim = 0; 13112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 equiv_rate = 510000; 13122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(opus_val16, surround_dynalloc); 13132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC_STACK; 13142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 13152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mode = st->mode; 13162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian nbEBands = mode->nbEBands; 13172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian overlap = mode->overlap; 13182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian eBands = mode->eBands; 13192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_estimate = 0; 13202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (nbCompressedBytes<2 || pcm==NULL) 13212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 13222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian RESTORE_STACK; 13232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return OPUS_BAD_ARG; 13242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 13252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 13262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian frame_size *= st->upsample; 13272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (LM=0;LM<=mode->maxLM;LM++) 13282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (mode->shortMdctSize<<LM==frame_size) 13292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian break; 13302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (LM>mode->maxLM) 13312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 13322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian RESTORE_STACK; 13332bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return OPUS_BAD_ARG; 13342bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 13352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian M=1<<LM; 13362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian N = M*mode->shortMdctSize; 13372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 13382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian prefilter_mem = st->in_mem+CC*(st->overlap); 13392bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian oldBandE = (opus_val16*)(st->in_mem+CC*(st->overlap+COMBFILTER_MAXPERIOD)); 13402bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian oldLogE = oldBandE + CC*nbEBands; 13412bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian oldLogE2 = oldLogE + CC*nbEBands; 13422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 13432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (enc==NULL) 13442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 13452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tell=1; 13462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian nbFilledBytes=0; 13472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } else { 13482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tell=ec_tell(enc); 13492bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian nbFilledBytes=(tell+4)>>3; 13502bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 13512bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 13522bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef CUSTOM_MODES 13532bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->signalling && enc==NULL) 13542bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 13552bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int tmp = (mode->effEBands-st->end)>>1; 13562bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->end = IMAX(1, mode->effEBands-tmp); 13572bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian compressed[0] = tmp<<5; 13582bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian compressed[0] |= LM<<3; 13592bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian compressed[0] |= (C==2)<<2; 13602bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Convert "standard mode" to Opus header */ 13612bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (mode->Fs==48000 && mode->shortMdctSize==120) 13622bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 13632bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int c0 = toOpus(compressed[0]); 13642bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (c0<0) 13652bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 13662bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian RESTORE_STACK; 13672bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return OPUS_BAD_ARG; 13682bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 13692bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian compressed[0] = c0; 13702bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 13712bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian compressed++; 13722bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian nbCompressedBytes--; 13732bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 13742bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#else 13752bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian celt_assert(st->signalling==0); 13762bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 13772bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 13782bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Can't produce more than 1275 output bytes */ 13792bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian nbCompressedBytes = IMIN(nbCompressedBytes,1275); 13802bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian nbAvailableBytes = nbCompressedBytes - nbFilledBytes; 13812bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 13822bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->vbr && st->bitrate!=OPUS_BITRATE_MAX) 13832bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 13842bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 den=mode->Fs>>BITRES; 13852bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian vbr_rate=(st->bitrate*frame_size+(den>>1))/den; 13862bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef CUSTOM_MODES 13872bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->signalling) 13882bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian vbr_rate -= 8<<BITRES; 13892bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 13902bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian effectiveBytes = vbr_rate>>(3+BITRES); 13912bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } else { 13922bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 tmp; 13932bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian vbr_rate = 0; 13942bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tmp = st->bitrate*frame_size; 13952bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (tell>1) 13962bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tmp += tell; 13972bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->bitrate!=OPUS_BITRATE_MAX) 13982bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian nbCompressedBytes = IMAX(2, IMIN(nbCompressedBytes, 13992bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian (tmp+4*mode->Fs)/(8*mode->Fs)-!!st->signalling)); 14002bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian effectiveBytes = nbCompressedBytes; 14012bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 14022bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->bitrate != OPUS_BITRATE_MAX) 14032bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian equiv_rate = st->bitrate - (40*C+20)*((400>>LM) - 50); 14042bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 14052bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (enc==NULL) 14062bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 14072bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ec_enc_init(&_enc, compressed, nbCompressedBytes); 14082bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian enc = &_enc; 14092bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 14102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 14112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (vbr_rate>0) 14122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 14132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Computes the max bit-rate allowed in VBR mode to avoid violating the 14142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian target rate and buffering. 14152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian We must do this up front so that bust-prevention logic triggers 14162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian correctly if we don't have enough bits. */ 14172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->constrained_vbr) 14182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 14192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 vbr_bound; 14202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 max_allowed; 14212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* We could use any multiple of vbr_rate as bound (depending on the 14222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian delay). 14232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian This is clamped to ensure we use at least two bytes if the encoder 14242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian was entirely empty, but to allow 0 in hybrid mode. */ 14252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian vbr_bound = vbr_rate; 14262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian max_allowed = IMIN(IMAX(tell==1?2:0, 14272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian (vbr_rate+vbr_bound-st->vbr_reservoir)>>(BITRES+3)), 14282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian nbAvailableBytes); 14292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if(max_allowed < nbAvailableBytes) 14302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 14312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian nbCompressedBytes = nbFilledBytes+max_allowed; 14322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian nbAvailableBytes = max_allowed; 14332bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ec_enc_shrink(enc, nbCompressedBytes); 14342bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 14352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 14362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 14372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian total_bits = nbCompressedBytes*8; 14382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 14392bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian effEnd = st->end; 14402bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (effEnd > mode->effEBands) 14412bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian effEnd = mode->effEBands; 14422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 14432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(in, CC*(N+st->overlap), celt_sig); 14442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 14452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian sample_max=MAX32(st->overlap_max, celt_maxabs16(pcm, C*(N-overlap)/st->upsample)); 14462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->overlap_max=celt_maxabs16(pcm+C*(N-overlap)/st->upsample, C*overlap/st->upsample); 14472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian sample_max=MAX32(sample_max, st->overlap_max); 14482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef FIXED_POINT 14492bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian silence = (sample_max==0); 14502bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#else 14512bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian silence = (sample_max <= (opus_val16)1/(1<<st->lsb_depth)); 14522bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 14532bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef FUZZING 14542bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if ((rand()&0x3F)==0) 14552bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian silence = 1; 14562bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 14572bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (tell==1) 14582bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ec_enc_bit_logp(enc, silence, 15); 14592bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian else 14602bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian silence=0; 14612bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (silence) 14622bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 14632bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*In VBR mode there is no need to send more than the minimum. */ 14642bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (vbr_rate>0) 14652bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 14662bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian effectiveBytes=nbCompressedBytes=IMIN(nbCompressedBytes, nbFilledBytes+2); 14672bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian total_bits=nbCompressedBytes*8; 14682bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian nbAvailableBytes=2; 14692bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ec_enc_shrink(enc, nbCompressedBytes); 14702bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 14712bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Pretend we've filled all the remaining bits with zeros 14722bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian (that's what the initialiser did anyway) */ 14732bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tell = nbCompressedBytes*8; 14742bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian enc->nbits_total+=tell-ec_tell(enc); 14752bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 14762bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian c=0; do { 14772bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian celt_preemphasis(pcm+c, in+c*(N+st->overlap)+st->overlap, N, CC, st->upsample, 14782bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mode->preemph, st->preemph_memE+c, st->clip); 14792bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } while (++c<CC); 14802bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 14812bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 14822bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 14832bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Find pitch period and gain */ 14842bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 14852bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int enabled; 14862bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int qg; 14872bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian enabled = ((st->lfe&&nbAvailableBytes>3) || nbAvailableBytes>12*C) && st->start==0 && !silence && !st->disable_pf 14882bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian && st->complexity >= 5 && !(st->consec_transient && LM!=3 && st->variable_duration==OPUS_FRAMESIZE_VARIABLE); 14892bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 14902bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian prefilter_tapset = st->tapset_decision; 14912bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian pf_on = run_prefilter(st, in, prefilter_mem, CC, N, prefilter_tapset, &pitch_index, &gain1, &qg, enabled, nbAvailableBytes); 14922bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if ((gain1 > QCONST16(.4f,15) || st->prefilter_gain > QCONST16(.4f,15)) && (!st->analysis.valid || st->analysis.tonality > .3) 14932bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian && (pitch_index > 1.26*st->prefilter_period || pitch_index < .79*st->prefilter_period)) 14942bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian pitch_change = 1; 14952bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (pf_on==0) 14962bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 14972bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if(st->start==0 && tell+16<=total_bits) 14982bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ec_enc_bit_logp(enc, 0, 1); 14992bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } else { 15002bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*This block is not gated by a total bits check only because 15012bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian of the nbAvailableBytes check above.*/ 15022bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int octave; 15032bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ec_enc_bit_logp(enc, 1, 1); 15042bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian pitch_index += 1; 15052bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian octave = EC_ILOG(pitch_index)-5; 15062bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ec_enc_uint(enc, octave, 6); 15072bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ec_enc_bits(enc, pitch_index-(16<<octave), 4+octave); 15082bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian pitch_index -= 1; 15092bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ec_enc_bits(enc, qg, 3); 15102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ec_enc_icdf(enc, prefilter_tapset, tapset_icdf, 2); 15112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 15122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 15132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 15142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian isTransient = 0; 15152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian shortBlocks = 0; 15162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->complexity >= 1 && !st->lfe) 15172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 15182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian isTransient = transient_analysis(in, N+st->overlap, CC, 15192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian &tf_estimate, &tf_chan); 15202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 15212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (LM>0 && ec_tell(enc)+3<=total_bits) 15222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 15232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (isTransient) 15242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian shortBlocks = M; 15252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } else { 15262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian isTransient = 0; 15272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian transient_got_disabled=1; 15282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 15292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 15302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(freq, CC*N, celt_sig); /**< Interleaved signal MDCTs */ 15312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(bandE,nbEBands*CC, celt_ener); 15322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(bandLogE,nbEBands*CC, opus_val16); 15332bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 15342bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian secondMdct = shortBlocks && st->complexity>=8; 15352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(bandLogE2, C*nbEBands, opus_val16); 15362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (secondMdct) 15372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 15382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian compute_mdcts(mode, 0, in, freq, C, CC, LM, st->upsample); 15392bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian compute_band_energies(mode, freq, bandE, effEnd, C, M); 15402bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian amp2Log2(mode, effEnd, st->end, bandE, bandLogE2, C); 15412bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<C*nbEBands;i++) 15422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian bandLogE2[i] += HALF16(SHL16(LM, DB_SHIFT)); 15432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 15442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 15452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian compute_mdcts(mode, shortBlocks, in, freq, C, CC, LM, st->upsample); 15462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (CC==2&&C==1) 15472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_chan = 0; 15482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian compute_band_energies(mode, freq, bandE, effEnd, C, M); 15492bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 15502bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->lfe) 15512bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 15522bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=2;i<st->end;i++) 15532bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 15542bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian bandE[i] = IMIN(bandE[i], MULT16_32_Q15(QCONST16(1e-4f,15),bandE[0])); 15552bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian bandE[i] = MAX32(bandE[i], EPSILON); 15562bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 15572bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 15582bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian amp2Log2(mode, effEnd, st->end, bandE, bandLogE, C); 15592bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 15602bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(surround_dynalloc, C*nbEBands, opus_val16); 15612bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for(i=0;i<st->end;i++) 15622bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian surround_dynalloc[i] = 0; 15632bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* This computes how much masking takes place between surround channels */ 15642bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->start==0&&st->energy_mask&&!st->lfe) 15652bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 15662bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int mask_end; 15672bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int midband; 15682bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int count_dynalloc; 15692bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val32 mask_avg=0; 15702bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val32 diff=0; 15712bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int count=0; 15722bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mask_end = IMAX(2,st->lastCodedBands); 15732bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (c=0;c<C;c++) 15742bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 15752bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for(i=0;i<mask_end;i++) 15762bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 15772bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 mask; 15782bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mask = MAX16(MIN16(st->energy_mask[nbEBands*c+i], 15792bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian QCONST16(.25f, DB_SHIFT)), -QCONST16(2.0f, DB_SHIFT)); 15802bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (mask > 0) 15812bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mask = HALF16(mask); 15822bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mask_avg += MULT16_16(mask, eBands[i+1]-eBands[i]); 15832bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian count += eBands[i+1]-eBands[i]; 15842bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian diff += MULT16_16(mask, 1+2*i-mask_end); 15852bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 15862bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 15872bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mask_avg = DIV32_16(mask_avg,count); 15882bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mask_avg += QCONST16(.2f, DB_SHIFT); 15892bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian diff = diff*6/(C*(mask_end-1)*(mask_end+1)*mask_end); 15902bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Again, being conservative */ 15912bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian diff = HALF32(diff); 15922bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian diff = MAX32(MIN32(diff, QCONST32(.031f, DB_SHIFT)), -QCONST32(.031f, DB_SHIFT)); 15932bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Find the band that's in the middle of the coded spectrum */ 15942bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (midband=0;eBands[midband+1] < eBands[mask_end]/2;midband++); 15952bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian count_dynalloc=0; 15962bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for(i=0;i<mask_end;i++) 15972bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 15982bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val32 lin; 15992bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 unmask; 16002bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian lin = mask_avg + diff*(i-midband); 16012bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (C==2) 16022bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian unmask = MAX16(st->energy_mask[i], st->energy_mask[nbEBands+i]); 16032bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian else 16042bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian unmask = st->energy_mask[i]; 16052bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian unmask = MIN16(unmask, QCONST16(.0f, DB_SHIFT)); 16062bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian unmask -= lin; 16072bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (unmask > QCONST16(.25f, DB_SHIFT)) 16082bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 16092bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian surround_dynalloc[i] = unmask - QCONST16(.25f, DB_SHIFT); 16102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian count_dynalloc++; 16112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 16122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 16132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (count_dynalloc>=3) 16142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 16152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* If we need dynalloc in many bands, it's probably because our 16162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian initial masking rate was too low. */ 16172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mask_avg += QCONST16(.25f, DB_SHIFT); 16182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (mask_avg>0) 16192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 16202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Something went really wrong in the original calculations, 16212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian disabling masking. */ 16222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mask_avg = 0; 16232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian diff = 0; 16242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for(i=0;i<mask_end;i++) 16252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian surround_dynalloc[i] = 0; 16262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } else { 16272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for(i=0;i<mask_end;i++) 16282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian surround_dynalloc[i] = MAX16(0, surround_dynalloc[i]-QCONST16(.25f, DB_SHIFT)); 16292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 16302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 16312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mask_avg += QCONST16(.2f, DB_SHIFT); 16322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Convert to 1/64th units used for the trim */ 16332bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian surround_trim = 64*diff; 16342bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf("%d %d ", mask_avg, surround_trim);*/ 16352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian surround_masking = mask_avg; 16362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 16372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Temporal VBR (but not for LFE) */ 16382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (!st->lfe) 16392bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 16402bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 follow=-QCONST16(10.0f,DB_SHIFT); 16412bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val32 frame_avg=0; 16422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 offset = shortBlocks?HALF16(SHL16(LM, DB_SHIFT)):0; 16432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for(i=st->start;i<st->end;i++) 16442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 16452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian follow = MAX16(follow-QCONST16(1.f, DB_SHIFT), bandLogE[i]-offset); 16462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (C==2) 16472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian follow = MAX16(follow, bandLogE[i+nbEBands]-offset); 16482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian frame_avg += follow; 16492bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 16502bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian frame_avg /= (st->end-st->start); 16512bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian temporal_vbr = SUB16(frame_avg,st->spec_avg); 16522bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian temporal_vbr = MIN16(QCONST16(3.f, DB_SHIFT), MAX16(-QCONST16(1.5f, DB_SHIFT), temporal_vbr)); 16532bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->spec_avg += MULT16_16_Q15(QCONST16(.02f, 15), temporal_vbr); 16542bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 16552bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*for (i=0;i<21;i++) 16562bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian printf("%f ", bandLogE[i]); 16572bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian printf("\n");*/ 16582bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 16592bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (!secondMdct) 16602bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 16612bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<C*nbEBands;i++) 16622bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian bandLogE2[i] = bandLogE[i]; 16632bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 16642bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 16652bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Last chance to catch any transient we might have missed in the 16662bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian time-domain analysis */ 16672bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (LM>0 && ec_tell(enc)+3<=total_bits && !isTransient && st->complexity>=5 && !st->lfe) 16682bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 16692bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (patch_transient_decision(bandLogE, oldBandE, nbEBands, st->end, C)) 16702bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 16712bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian isTransient = 1; 16722bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian shortBlocks = M; 16732bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian compute_mdcts(mode, shortBlocks, in, freq, C, CC, LM, st->upsample); 16742bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian compute_band_energies(mode, freq, bandE, effEnd, C, M); 16752bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian amp2Log2(mode, effEnd, st->end, bandE, bandLogE, C); 16762bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Compensate for the scaling of short vs long mdcts */ 16772bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<C*nbEBands;i++) 16782bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian bandLogE2[i] += HALF16(SHL16(LM, DB_SHIFT)); 16792bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_estimate = QCONST16(.2f,14); 16802bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 16812bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 16822bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 16832bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (LM>0 && ec_tell(enc)+3<=total_bits) 16842bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ec_enc_bit_logp(enc, isTransient, 3); 16852bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 16862bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ 16872bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 16882bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Band normalisation */ 16892bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian normalise_bands(mode, freq, X, bandE, effEnd, C, M); 16902bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 16912bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(tf_res, nbEBands, int); 16922bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Disable variable tf resolution for hybrid and at very low bitrate */ 16932bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (effectiveBytes>=15*C && st->start==0 && st->complexity>=2 && !st->lfe) 16942bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 16952bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int lambda; 16962bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (effectiveBytes<40) 16972bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian lambda = 12; 16982bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian else if (effectiveBytes<60) 16992bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian lambda = 6; 17002bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian else if (effectiveBytes<100) 17012bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian lambda = 4; 17022bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian else 17032bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian lambda = 3; 17042bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian lambda*=2; 17052bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_select = tf_analysis(mode, effEnd, isTransient, tf_res, lambda, X, N, LM, &tf_sum, tf_estimate, tf_chan); 17062bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=effEnd;i<st->end;i++) 17072bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_res[i] = tf_res[effEnd-1]; 17082bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } else { 17092bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_sum = 0; 17102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<st->end;i++) 17112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_res[i] = isTransient; 17122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_select=0; 17132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 17142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 17152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(error, C*nbEBands, opus_val16); 17162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian quant_coarse_energy(mode, st->start, st->end, effEnd, bandLogE, 17172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian oldBandE, total_bits, error, enc, 17182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian C, LM, nbAvailableBytes, st->force_intra, 17192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian &st->delayedIntra, st->complexity >= 4, st->loss_rate, st->lfe); 17202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 17212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tf_encode(st->start, st->end, isTransient, tf_res, LM, tf_select, enc); 17222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 17232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (ec_tell(enc)+4<=total_bits) 17242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 17252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->lfe) 17262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 17272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->tapset_decision = 0; 17282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->spread_decision = SPREAD_NORMAL; 17292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } else if (shortBlocks || st->complexity < 3 || nbAvailableBytes < 10*C || st->start != 0) 17302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 17312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->complexity == 0) 17322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->spread_decision = SPREAD_NONE; 17332bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian else 17342bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->spread_decision = SPREAD_NORMAL; 17352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } else { 17362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Disable new spreading+tapset estimator until we can show it works 17372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian better than the old one. So far it seems like spreading_decision() 17382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian works best. */ 17392bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#if 0 17402bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->analysis.valid) 17412bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 17422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian static const opus_val16 spread_thresholds[3] = {-QCONST16(.6f, 15), -QCONST16(.2f, 15), -QCONST16(.07f, 15)}; 17432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian static const opus_val16 spread_histeresis[3] = {QCONST16(.15f, 15), QCONST16(.07f, 15), QCONST16(.02f, 15)}; 17442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian static const opus_val16 tapset_thresholds[2] = {QCONST16(.0f, 15), QCONST16(.15f, 15)}; 17452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian static const opus_val16 tapset_histeresis[2] = {QCONST16(.1f, 15), QCONST16(.05f, 15)}; 17462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->spread_decision = hysteresis_decision(-st->analysis.tonality, spread_thresholds, spread_histeresis, 3, st->spread_decision); 17472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->tapset_decision = hysteresis_decision(st->analysis.tonality_slope, tapset_thresholds, tapset_histeresis, 2, st->tapset_decision); 17482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } else 17492bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 17502bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 17512bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->spread_decision = spreading_decision(mode, X, 17522bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian &st->tonal_average, st->spread_decision, &st->hf_average, 17532bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian &st->tapset_decision, pf_on&&!shortBlocks, effEnd, C, M); 17542bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 17552bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf("%d %d\n", st->tapset_decision, st->spread_decision);*/ 17562bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf("%f %d %f %d\n\n", st->analysis.tonality, st->spread_decision, st->analysis.tonality_slope, st->tapset_decision);*/ 17572bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 17582bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ec_enc_icdf(enc, st->spread_decision, spread_icdf, 5); 17592bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 17602bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 17612bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(offsets, nbEBands, int); 17622bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 17632bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian maxDepth = dynalloc_analysis(bandLogE, bandLogE2, nbEBands, st->start, st->end, C, offsets, 17642bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->lsb_depth, mode->logN, isTransient, st->vbr, st->constrained_vbr, 17652bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian eBands, LM, effectiveBytes, &tot_boost, st->lfe, surround_dynalloc); 17662bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* For LFE, everything interesting is in the first band */ 17672bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->lfe) 17682bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian offsets[0] = IMIN(8, effectiveBytes/3); 17692bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(cap, nbEBands, int); 17702bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian init_caps(mode,cap,LM,C); 17712bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 17722bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian dynalloc_logp = 6; 17732bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian total_bits<<=BITRES; 17742bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian total_boost = 0; 17752bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tell = ec_tell_frac(enc); 17762bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=st->start;i<st->end;i++) 17772bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 17782bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int width, quanta; 17792bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int dynalloc_loop_logp; 17802bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int boost; 17812bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int j; 17822bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian width = C*(eBands[i+1]-eBands[i])<<LM; 17832bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* quanta is 6 bits, but no more than 1 bit/sample 17842bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian and no less than 1/8 bit/sample */ 17852bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian quanta = IMIN(width<<BITRES, IMAX(6<<BITRES, width)); 17862bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian dynalloc_loop_logp = dynalloc_logp; 17872bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian boost = 0; 17882bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (j = 0; tell+(dynalloc_loop_logp<<BITRES) < total_bits-total_boost 17892bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian && boost < cap[i]; j++) 17902bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 17912bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int flag; 17922bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian flag = j<offsets[i]; 17932bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ec_enc_bit_logp(enc, flag, dynalloc_loop_logp); 17942bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tell = ec_tell_frac(enc); 17952bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (!flag) 17962bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian break; 17972bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian boost += quanta; 17982bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian total_boost += quanta; 17992bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian dynalloc_loop_logp = 1; 18002bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 18012bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Making dynalloc more likely */ 18022bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (j) 18032bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian dynalloc_logp = IMAX(2, dynalloc_logp-1); 18042bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian offsets[i] = boost; 18052bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 18062bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 18072bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (C==2) 18082bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 18092bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian static const opus_val16 intensity_thresholds[21]= 18102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 off*/ 18112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 1, 2, 3, 4, 5, 6, 7, 8,16,24,36,44,50,56,62,67,72,79,88,106,134}; 18122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian static const opus_val16 intensity_histeresis[21]= 18132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 5, 6, 8, 8}; 18142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 18152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Always use MS for 2.5 ms frames until we can do a better analysis */ 18162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (LM!=0) 18172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian dual_stereo = stereo_analysis(mode, X, LM, N); 18182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 18192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->intensity = hysteresis_decision((opus_val16)(equiv_rate/1000), 18202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian intensity_thresholds, intensity_histeresis, 21, st->intensity); 18212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->intensity = IMIN(st->end,IMAX(st->start, st->intensity)); 18222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 18232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 18242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian alloc_trim = 5; 18252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (tell+(6<<BITRES) <= total_bits - total_boost) 18262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 18272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->lfe) 18282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian alloc_trim = 5; 18292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian else 18302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian alloc_trim = alloc_trim_analysis(mode, X, bandLogE, 18312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->end, LM, C, N, &st->analysis, &st->stereo_saving, tf_estimate, st->intensity, surround_trim); 18322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ec_enc_icdf(enc, alloc_trim, trim_icdf, 7); 18332bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian tell = ec_tell_frac(enc); 18342bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 18352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 18362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Variable bitrate */ 18372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (vbr_rate>0) 18382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 18392bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 alpha; 18402bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 delta; 18412bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* The target rate in 8th bits per frame */ 18422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 target, base_target; 18432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 min_allowed; 18442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int lm_diff = mode->maxLM - LM; 18452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 18462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Don't attempt to use more than 510 kb/s, even for frames smaller than 20 ms. 18472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian The CELT allocator will just not be able to use more than that anyway. */ 18482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian nbCompressedBytes = IMIN(nbCompressedBytes,1275>>(3-LM)); 18492bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian base_target = vbr_rate - ((40*C+20)<<BITRES); 18502bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 18512bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->constrained_vbr) 18522bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian base_target += (st->vbr_offset>>lm_diff); 18532bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 18542bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian target = compute_vbr(mode, &st->analysis, base_target, LM, equiv_rate, 18552bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->lastCodedBands, C, st->intensity, st->constrained_vbr, 18562bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->stereo_saving, tot_boost, tf_estimate, pitch_change, maxDepth, 18572bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->variable_duration, st->lfe, st->energy_mask!=NULL, surround_masking, 18582bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian temporal_vbr); 18592bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 18602bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* The current offset is removed from the target and the space used 18612bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian so far is added*/ 18622bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian target=target+tell; 18632bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* In VBR mode the frame size must not be reduced so much that it would 18642bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian result in the encoder running out of bits. 18652bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian The margin of 2 bytes ensures that none of the bust-prevention logic 18662bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian in the decoder will have triggered so far. */ 18672bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian min_allowed = ((tell+total_boost+(1<<(BITRES+3))-1)>>(BITRES+3)) + 2 - nbFilledBytes; 18682bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 18692bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian nbAvailableBytes = (target+(1<<(BITRES+2)))>>(BITRES+3); 18702bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian nbAvailableBytes = IMAX(min_allowed,nbAvailableBytes); 18712bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian nbAvailableBytes = IMIN(nbCompressedBytes,nbAvailableBytes+nbFilledBytes) - nbFilledBytes; 18722bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 18732bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* By how much did we "miss" the target on that frame */ 18742bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian delta = target - vbr_rate; 18752bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 18762bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian target=nbAvailableBytes<<(BITRES+3); 18772bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 18782bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*If the frame is silent we don't adjust our drift, otherwise 18792bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian the encoder will shoot to very high rates after hitting a 18802bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian span of silence, but we do allow the bitres to refill. 18812bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian This means that we'll undershoot our target in CVBR/VBR modes 18822bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian on files with lots of silence. */ 18832bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if(silence) 18842bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 18852bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian nbAvailableBytes = 2; 18862bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian target = 2*8<<BITRES; 18872bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian delta = 0; 18882bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 18892bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 18902bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->vbr_count < 970) 18912bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 18922bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->vbr_count++; 18932bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian alpha = celt_rcp(SHL32(EXTEND32(st->vbr_count+20),16)); 18942bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } else 18952bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian alpha = QCONST16(.001f,15); 18962bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* How many bits have we used in excess of what we're allowed */ 18972bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->constrained_vbr) 18982bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->vbr_reservoir += target - vbr_rate; 18992bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf ("%d\n", st->vbr_reservoir);*/ 19002bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 19012bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Compute the offset we need to apply in order to reach the target */ 19022bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->constrained_vbr) 19032bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 19042bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->vbr_drift += (opus_int32)MULT16_32_Q15(alpha,(delta*(1<<lm_diff))-st->vbr_offset-st->vbr_drift); 19052bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->vbr_offset = -st->vbr_drift; 19062bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 19072bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf ("%d\n", st->vbr_drift);*/ 19082bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 19092bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->constrained_vbr && st->vbr_reservoir < 0) 19102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 19112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* We're under the min value -- increase rate */ 19122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int adjust = (-st->vbr_reservoir)/(8<<BITRES); 19132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Unless we're just coding silence */ 19142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian nbAvailableBytes += silence?0:adjust; 19152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->vbr_reservoir = 0; 19162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf ("+%d\n", adjust);*/ 19172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 19182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian nbCompressedBytes = IMIN(nbCompressedBytes,nbAvailableBytes+nbFilledBytes); 19192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /*printf("%d\n", nbCompressedBytes*50*8);*/ 19202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* This moves the raw bits to take into account the new compressed size */ 19212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ec_enc_shrink(enc, nbCompressedBytes); 19222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 19232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 19242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Bit allocation */ 19252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(fine_quant, nbEBands, int); 19262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(pulses, nbEBands, int); 19272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(fine_priority, nbEBands, int); 19282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 19292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* bits = packet size - where we are - safety*/ 19302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian bits = (((opus_int32)nbCompressedBytes*8)<<BITRES) - ec_tell_frac(enc) - 1; 19312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian anti_collapse_rsv = isTransient&&LM>=2&&bits>=((LM+2)<<BITRES) ? (1<<BITRES) : 0; 19322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian bits -= anti_collapse_rsv; 19332bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian signalBandwidth = st->end-1; 19342bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifndef DISABLE_FLOAT_API 19352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->analysis.valid) 19362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 19372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int min_bandwidth; 19382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (equiv_rate < (opus_int32)32000*C) 19392bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian min_bandwidth = 13; 19402bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian else if (equiv_rate < (opus_int32)48000*C) 19412bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian min_bandwidth = 16; 19422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian else if (equiv_rate < (opus_int32)60000*C) 19432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian min_bandwidth = 18; 19442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian else if (equiv_rate < (opus_int32)80000*C) 19452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian min_bandwidth = 19; 19462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian else 19472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian min_bandwidth = 20; 19482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian signalBandwidth = IMAX(st->analysis.bandwidth, min_bandwidth); 19492bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 19502bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 19512bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->lfe) 19522bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian signalBandwidth = 1; 19532bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian codedBands = compute_allocation(mode, st->start, st->end, offsets, cap, 19542bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian alloc_trim, &st->intensity, &dual_stereo, bits, &balance, pulses, 19552bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian fine_quant, fine_priority, C, LM, enc, 1, st->lastCodedBands, signalBandwidth); 19562bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->lastCodedBands) 19572bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->lastCodedBands = IMIN(st->lastCodedBands+1,IMAX(st->lastCodedBands-1,codedBands)); 19582bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian else 19592bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->lastCodedBands = codedBands; 19602bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 19612bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian quant_fine_energy(mode, st->start, st->end, oldBandE, error, fine_quant, enc, C); 19622bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 19632bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Residual quantisation */ 19642bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(collapse_masks, C*nbEBands, unsigned char); 19652bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian quant_all_bands(1, mode, st->start, st->end, X, C==2 ? X+N : NULL, collapse_masks, 19662bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian bandE, pulses, shortBlocks, st->spread_decision, dual_stereo, st->intensity, tf_res, 19672bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian nbCompressedBytes*(8<<BITRES)-anti_collapse_rsv, balance, enc, LM, codedBands, &st->rng); 19682bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 19692bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (anti_collapse_rsv > 0) 19702bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 19712bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian anti_collapse_on = st->consec_transient<2; 19722bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef FUZZING 19732bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian anti_collapse_on = rand()&0x1; 19742bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 19752bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ec_enc_bits(enc, anti_collapse_on, 1); 19762bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 19772bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian quant_energy_finalise(mode, st->start, st->end, oldBandE, error, fine_quant, fine_priority, nbCompressedBytes*8-ec_tell(enc), enc, C); 19782bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 19792bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (silence) 19802bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 19812bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<C*nbEBands;i++) 19822bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian oldBandE[i] = -QCONST16(28.f,DB_SHIFT); 19832bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 19842bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 19852bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef RESYNTH 19862bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Re-synthesis of the coded audio if required */ 19872bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 19882bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian celt_sig *out_mem[2]; 19892bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 19902bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (anti_collapse_on) 19912bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 19922bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian anti_collapse(mode, X, collapse_masks, LM, C, N, 19932bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->start, st->end, oldBandE, oldLogE, oldLogE2, pulses, st->rng); 19942bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 19952bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 19962bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (silence) 19972bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 19982bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<C*N;i++) 19992bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian freq[i] = 0; 20002bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } else { 20012bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* Synthesis */ 20022bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian denormalise_bands(mode, X, freq, oldBandE, st->start, effEnd, C, M); 20032bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 20042bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 20052bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian c=0; do { 20062bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian OPUS_MOVE(st->syn_mem[c], st->syn_mem[c]+N, 2*MAX_PERIOD-N+overlap/2); 20072bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } while (++c<CC); 20082bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 20092bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (CC==2&&C==1) 20102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 20112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<N;i++) 20122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian freq[N+i] = freq[i]; 20132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 20142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 20152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian c=0; do { 20162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian out_mem[c] = st->syn_mem[c]+2*MAX_PERIOD-N; 20172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } while (++c<CC); 20182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 20192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian compute_inv_mdcts(mode, shortBlocks, freq, out_mem, CC, LM); 20202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 20212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian c=0; do { 20222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->prefilter_period=IMAX(st->prefilter_period, COMBFILTER_MINPERIOD); 20232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->prefilter_period_old=IMAX(st->prefilter_period_old, COMBFILTER_MINPERIOD); 20242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian comb_filter(out_mem[c], out_mem[c], st->prefilter_period_old, st->prefilter_period, mode->shortMdctSize, 20252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->prefilter_gain_old, st->prefilter_gain, st->prefilter_tapset_old, st->prefilter_tapset, 20262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mode->window, st->overlap); 20272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (LM!=0) 20282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian comb_filter(out_mem[c]+mode->shortMdctSize, out_mem[c]+mode->shortMdctSize, st->prefilter_period, pitch_index, N-mode->shortMdctSize, 20292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->prefilter_gain, gain1, st->prefilter_tapset, prefilter_tapset, 20302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian mode->window, overlap); 20312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } while (++c<CC); 20322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 20332bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* We reuse freq[] as scratch space for the de-emphasis */ 20342bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian deemphasis(out_mem, (opus_val16*)pcm, N, CC, st->upsample, mode->preemph, st->preemph_memD, freq); 20352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->prefilter_period_old = st->prefilter_period; 20362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->prefilter_gain_old = st->prefilter_gain; 20372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->prefilter_tapset_old = st->prefilter_tapset; 20382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 20392bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 20402bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 20412bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->prefilter_period = pitch_index; 20422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->prefilter_gain = gain1; 20432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->prefilter_tapset = prefilter_tapset; 20442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef RESYNTH 20452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (LM!=0) 20462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 20472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->prefilter_period_old = st->prefilter_period; 20482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->prefilter_gain_old = st->prefilter_gain; 20492bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->prefilter_tapset_old = st->prefilter_tapset; 20502bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 20512bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 20522bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 20532bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (CC==2&&C==1) { 20542bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<nbEBands;i++) 20552bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian oldBandE[nbEBands+i]=oldBandE[i]; 20562bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 20572bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 20582bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (!isTransient) 20592bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 20602bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<CC*nbEBands;i++) 20612bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian oldLogE2[i] = oldLogE[i]; 20622bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<CC*nbEBands;i++) 20632bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian oldLogE[i] = oldBandE[i]; 20642bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } else { 20652bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<CC*nbEBands;i++) 20662bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian oldLogE[i] = MIN16(oldLogE[i], oldBandE[i]); 20672bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 20682bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* In case start or end were to change */ 20692bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian c=0; do 20702bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 20712bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<st->start;i++) 20722bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 20732bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian oldBandE[c*nbEBands+i]=0; 20742bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-QCONST16(28.f,DB_SHIFT); 20752bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 20762bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=st->end;i<nbEBands;i++) 20772bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 20782bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian oldBandE[c*nbEBands+i]=0; 20792bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-QCONST16(28.f,DB_SHIFT); 20802bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 20812bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } while (++c<CC); 20822bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 20832bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (isTransient || transient_got_disabled) 20842bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->consec_transient++; 20852bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian else 20862bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->consec_transient=0; 20872bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->rng = enc->rng; 20882bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 20892bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian /* If there's any room left (can only happen for very high rates), 20902bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian it's already filled with zeros */ 20912bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ec_enc_done(enc); 20922bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 20932bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef CUSTOM_MODES 20942bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (st->signalling) 20952bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian nbCompressedBytes++; 20962bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 20972bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 20982bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian RESTORE_STACK; 20992bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (ec_get_error(enc)) 21002bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return OPUS_INTERNAL_ERROR; 21012bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian else 21022bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return nbCompressedBytes; 21032bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 21042bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 21052bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 21062bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef CUSTOM_MODES 21072bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 21082bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef FIXED_POINT 21092bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianint opus_custom_encode(CELTEncoder * OPUS_RESTRICT st, const opus_int16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes) 21102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 21112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return celt_encode_with_ec(st, pcm, frame_size, compressed, nbCompressedBytes, NULL); 21122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 21132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 21142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifndef DISABLE_FLOAT_API 21152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianint opus_custom_encode_float(CELTEncoder * OPUS_RESTRICT st, const float * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes) 21162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 21172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int j, ret, C, N; 21182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(opus_int16, in); 21192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC_STACK; 21202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 21212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (pcm==NULL) 21222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return OPUS_BAD_ARG; 21232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 21242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian C = st->channels; 21252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian N = frame_size; 21262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(in, C*N, opus_int16); 21272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 21282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (j=0;j<C*N;j++) 21292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian in[j] = FLOAT2INT16(pcm[j]); 21302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 21312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ret=celt_encode_with_ec(st,in,frame_size,compressed,nbCompressedBytes, NULL); 21322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef RESYNTH 21332bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (j=0;j<C*N;j++) 21342bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ((float*)pcm)[j]=in[j]*(1.f/32768.f); 21352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 21362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian RESTORE_STACK; 21372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return ret; 21382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 21392bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif /* DISABLE_FLOAT_API */ 21402bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#else 21412bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 21422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianint opus_custom_encode(CELTEncoder * OPUS_RESTRICT st, const opus_int16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes) 21432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 21442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int j, ret, C, N; 21452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian VARDECL(celt_sig, in); 21462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC_STACK; 21472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 21482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (pcm==NULL) 21492bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return OPUS_BAD_ARG; 21502bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 21512bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian C=st->channels; 21522bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian N=frame_size; 21532bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ALLOC(in, C*N, celt_sig); 21542bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (j=0;j<C*N;j++) { 21552bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian in[j] = SCALEOUT(pcm[j]); 21562bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 21572bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 21582bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ret = celt_encode_with_ec(st,in,frame_size,compressed,nbCompressedBytes, NULL); 21592bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef RESYNTH 21602bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (j=0;j<C*N;j++) 21612bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ((opus_int16*)pcm)[j] = FLOAT2INT16(in[j]); 21622bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 21632bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian RESTORE_STACK; 21642bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return ret; 21652bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 21662bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 21672bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianint opus_custom_encode_float(CELTEncoder * OPUS_RESTRICT st, const float * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes) 21682bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 21692bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return celt_encode_with_ec(st, pcm, frame_size, compressed, nbCompressedBytes, NULL); 21702bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 21712bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 21722bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 21732bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 21742bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif /* CUSTOM_MODES */ 21752bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 21762bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianint opus_custom_encoder_ctl(CELTEncoder * OPUS_RESTRICT st, int request, ...) 21772bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian{ 21782bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian va_list ap; 21792bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian 21802bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian va_start(ap, request); 21812bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian switch (request) 21822bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 21832bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian case OPUS_SET_COMPLEXITY_REQUEST: 21842bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 21852bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int value = va_arg(ap, opus_int32); 21862bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (value<0 || value>10) 21872bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian goto bad_arg; 21882bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->complexity = value; 21892bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 21902bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian break; 21912bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian case CELT_SET_START_BAND_REQUEST: 21922bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 21932bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 value = va_arg(ap, opus_int32); 21942bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (value<0 || value>=st->mode->nbEBands) 21952bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian goto bad_arg; 21962bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->start = value; 21972bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 21982bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian break; 21992bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian case CELT_SET_END_BAND_REQUEST: 22002bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 22012bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 value = va_arg(ap, opus_int32); 22022bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (value<1 || value>st->mode->nbEBands) 22032bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian goto bad_arg; 22042bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->end = value; 22052bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 22062bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian break; 22072bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian case CELT_SET_PREDICTION_REQUEST: 22082bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 22092bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int value = va_arg(ap, opus_int32); 22102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (value<0 || value>2) 22112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian goto bad_arg; 22122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->disable_pf = value<=1; 22132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->force_intra = value==0; 22142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 22152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian break; 22162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian case OPUS_SET_PACKET_LOSS_PERC_REQUEST: 22172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 22182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int value = va_arg(ap, opus_int32); 22192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (value<0 || value>100) 22202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian goto bad_arg; 22212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->loss_rate = value; 22222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 22232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian break; 22242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian case OPUS_SET_VBR_CONSTRAINT_REQUEST: 22252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 22262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 value = va_arg(ap, opus_int32); 22272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->constrained_vbr = value; 22282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 22292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian break; 22302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian case OPUS_SET_VBR_REQUEST: 22312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 22322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 value = va_arg(ap, opus_int32); 22332bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->vbr = value; 22342bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 22352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian break; 22362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian case OPUS_SET_BITRATE_REQUEST: 22372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 22382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 value = va_arg(ap, opus_int32); 22392bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (value<=500 && value!=OPUS_BITRATE_MAX) 22402bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian goto bad_arg; 22412bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian value = IMIN(value, 260000*st->channels); 22422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->bitrate = value; 22432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 22442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian break; 22452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian case CELT_SET_CHANNELS_REQUEST: 22462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 22472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 value = va_arg(ap, opus_int32); 22482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (value<1 || value>2) 22492bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian goto bad_arg; 22502bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->stream_channels = value; 22512bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 22522bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian break; 22532bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian case OPUS_SET_LSB_DEPTH_REQUEST: 22542bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 22552bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 value = va_arg(ap, opus_int32); 22562bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (value<8 || value>24) 22572bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian goto bad_arg; 22582bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->lsb_depth=value; 22592bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 22602bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian break; 22612bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian case OPUS_GET_LSB_DEPTH_REQUEST: 22622bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 22632bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 *value = va_arg(ap, opus_int32*); 22642bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian *value=st->lsb_depth; 22652bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 22662bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian break; 22672bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian case OPUS_SET_EXPERT_FRAME_DURATION_REQUEST: 22682bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 22692bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 value = va_arg(ap, opus_int32); 22702bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->variable_duration = value; 22712bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 22722bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian break; 22732bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian case OPUS_RESET_STATE: 22742bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 22752bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian int i; 22762bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 *oldBandE, *oldLogE, *oldLogE2; 22772bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian oldBandE = (opus_val16*)(st->in_mem+st->channels*(st->overlap+COMBFILTER_MAXPERIOD)); 22782bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian oldLogE = oldBandE + st->channels*st->mode->nbEBands; 22792bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian oldLogE2 = oldLogE + st->channels*st->mode->nbEBands; 22802bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian OPUS_CLEAR((char*)&st->ENCODER_RESET_START, 22812bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_custom_encoder_get_size(st->mode, st->channels)- 22822bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian ((char*)&st->ENCODER_RESET_START - (char*)st)); 22832bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian for (i=0;i<st->channels*st->mode->nbEBands;i++) 22842bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian oldLogE[i]=oldLogE2[i]=-QCONST16(28.f,DB_SHIFT); 22852bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->vbr_offset = 0; 22862bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->delayedIntra = 1; 22872bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->spread_decision = SPREAD_NORMAL; 22882bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->tonal_average = 256; 22892bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->hf_average = 0; 22902bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->tapset_decision = 0; 22912bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 22922bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian break; 22932bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#ifdef CUSTOM_MODES 22942bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian case CELT_SET_INPUT_CLIPPING_REQUEST: 22952bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 22962bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 value = va_arg(ap, opus_int32); 22972bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->clip = value; 22982bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 22992bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian break; 23002bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian#endif 23012bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian case CELT_SET_SIGNALLING_REQUEST: 23022bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 23032bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 value = va_arg(ap, opus_int32); 23042bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->signalling = value; 23052bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 23062bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian break; 23072bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian case CELT_SET_ANALYSIS_REQUEST: 23082bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 23092bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian AnalysisInfo *info = va_arg(ap, AnalysisInfo *); 23102bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (info) 23112bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian OPUS_COPY(&st->analysis, info, 1); 23122bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 23132bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian break; 23142bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian case CELT_GET_MODE_REQUEST: 23152bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 23162bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian const CELTMode ** value = va_arg(ap, const CELTMode**); 23172bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (value==0) 23182bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian goto bad_arg; 23192bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian *value=st->mode; 23202bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 23212bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian break; 23222bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian case OPUS_GET_FINAL_RANGE_REQUEST: 23232bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 23242bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_uint32 * value = va_arg(ap, opus_uint32 *); 23252bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian if (value==0) 23262bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian goto bad_arg; 23272bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian *value=st->rng; 23282bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 23292bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian break; 23302bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian case OPUS_SET_LFE_REQUEST: 23312bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 23322bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_int32 value = va_arg(ap, opus_int32); 23332bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->lfe = value; 23342bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 23352bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian break; 23362bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian case OPUS_SET_ENERGY_MASK_REQUEST: 23372bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian { 23382bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian opus_val16 *value = va_arg(ap, opus_val16*); 23392bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian st->energy_mask = value; 23402bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 23412bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian break; 23422bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian default: 23432bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian goto bad_request; 23442bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian } 23452bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian va_end(ap); 23462bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return OPUS_OK; 23472bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianbad_arg: 23482bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian va_end(ap); 23492bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return OPUS_BAD_ARG; 23502bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanianbad_request: 23512bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian va_end(ap); 23522bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian return OPUS_UNIMPLEMENTED; 23532bd8b54017b5320bc0c1df9bf86f4cdc9f8db242Vignesh Venkatasubramanian} 2354