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