1885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Copyright (c) 2007-2008 CSIRO 2885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org Copyright (c) 2007-2009 Xiph.Org Foundation 3885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org Copyright (c) 2008-2009 Gregory Maxwell 4885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org Written by Jean-Marc Valin and Gregory Maxwell */ 5885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* 6885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org Redistribution and use in source and binary forms, with or without 7885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org modification, are permitted provided that the following conditions 8885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org are met: 9885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 10885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org - Redistributions of source code must retain the above copyright 11885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org notice, this list of conditions and the following disclaimer. 12885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 13885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org - Redistributions in binary form must reproduce the above copyright 14885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org notice, this list of conditions and the following disclaimer in the 15885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org documentation and/or other materials provided with the distribution. 16885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 17885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 21885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 22885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 23885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 24885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 25885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 26885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 27885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org*/ 29885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 30885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifndef BANDS_H 31885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define BANDS_H 32885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 33885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "arch.h" 34885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "modes.h" 35885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "entenc.h" 36885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "entdec.h" 37885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "rate.h" 38885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 39885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/** Compute the amplitude (sqrt energy) in each of the bands 40885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @param m Mode data 41885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @param X Spectrum 42e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org * @param bandE Square root of the energy for each band (returned) 43885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org */ 44885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int M); 45885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 46885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/*void compute_noise_energies(const CELTMode *m, const celt_sig *X, const opus_val16 *tonality, celt_ener *bandE);*/ 47885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 48885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/** Normalise each band of X such that the energy in each band is 49885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org equal to 1 50885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @param m Mode data 51885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @param X Spectrum (returned normalised) 52e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org * @param bandE Square root of the energy for each band 53885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org */ 54885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid normalise_bands(const CELTMode *m, const celt_sig * OPUS_RESTRICT freq, celt_norm * OPUS_RESTRICT X, const celt_ener *bandE, int end, int C, int M); 55885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 56885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/** Denormalise each band of X to restore full amplitude 57885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @param m Mode data 58885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @param X Spectrum (returned de-normalised) 59e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org * @param bandE Square root of the energy for each band 60885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org */ 61e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgvoid denormalise_bands(const CELTMode *m, const celt_norm * OPUS_RESTRICT X, 62e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org celt_sig * OPUS_RESTRICT freq, const opus_val16 *bandE, int start, int end, int C, int M); 63885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 64885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define SPREAD_NONE (0) 65885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define SPREAD_LIGHT (1) 66885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define SPREAD_NORMAL (2) 67885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define SPREAD_AGGRESSIVE (3) 68885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 69885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgint spreading_decision(const CELTMode *m, celt_norm *X, int *average, 70885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org int last_decision, int *hf_average, int *tapset_decision, int update_hf, 71885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org int end, int C, int M); 72885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 73885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef MEASURE_NORM_MSE 74885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid measure_norm_mse(const CELTMode *m, float *X, float *X0, float *bandE, float *bandE0, int M, int N, int C); 75885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif 76885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 77885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid haar1(celt_norm *X, int N0, int stride); 78885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 79885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/** Quantisation/encoding of the residual spectrum 80e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org * @param encode flag that indicates whether we're encoding (1) or decoding (0) 81885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @param m Mode data 82e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org * @param start First band to process 83e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org * @param end Last band to process + 1 84885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @param X Residual (normalised) 85e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org * @param Y Residual (normalised) for second channel (or NULL for mono) 86e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org * @param collapse_masks Anti-collapse tracking mask 87e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org * @param bandE Square root of the energy for each band 88e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org * @param pulses Bit allocation (per band) for PVQ 89e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org * @param shortBlocks Zero for long blocks, non-zero for short blocks 90e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org * @param spread Amount of spreading to use 91e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org * @param dual_stereo Zero for MS stereo, non-zero for dual stereo 92e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org * @param intensity First band to use intensity stereo 93e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org * @param tf_res Time-frequency resolution change 94885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org * @param total_bits Total number of bits that can be used for the frame (including the ones already spent) 95e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org * @param balance Number of unallocated bits 96e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org * @param en Entropy coder state 97e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org * @param LM log2() of the number of 2.5 subframes in the frame 98e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org * @param codedBands Last band to receive bits + 1 99e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org * @param seed Random generator seed 100885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org */ 101885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid quant_all_bands(int encode, const CELTMode *m, int start, int end, 102885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org celt_norm * X, celt_norm * Y, unsigned char *collapse_masks, const celt_ener *bandE, int *pulses, 103e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org int shortBlocks, int spread, int dual_stereo, int intensity, int *tf_res, 104885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_int32 total_bits, opus_int32 balance, ec_ctx *ec, int M, int codedBands, opus_uint32 *seed); 105885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 106885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgvoid anti_collapse(const CELTMode *m, celt_norm *X_, unsigned char *collapse_masks, int LM, int C, int size, 107885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org int start, int end, opus_val16 *logE, opus_val16 *prev1logE, 108885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org opus_val16 *prev2logE, int *pulses, opus_uint32 seed); 109885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 110885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgopus_uint32 celt_lcg_rand(opus_uint32 seed); 111885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org 112e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgint hysteresis_decision(opus_val16 val, const opus_val16 *thresholds, const opus_val16 *hysteresis, int N, int prev); 113e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org 114885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif /* BANDS_H */ 115