blob: 5dbf9ce06315b65b5fc598ef6e3f54ed2a8e8b2d [file] [log] [blame]
Jean-Marc Valin8b2ff0d2009-10-17 21:40:10 -04001/* Copyright (c) 2007-2008 CSIRO
2 Copyright (c) 2007-2009 Xiph.Org Foundation
3 Written by Jean-Marc Valin */
Jean-Marc Valin276de722008-02-20 17:45:51 +11004/**
5 @file vq.h
6 @brief Vector quantisation of the residual
7 */
Jean-Marc Valin41af4212007-11-30 18:35:37 +11008/*
9 Redistribution and use in source and binary forms, with or without
10 modification, are permitted provided that the following conditions
11 are met:
Gregory Maxwell71d39ad2011-07-30 00:00:29 -040012
Jean-Marc Valin41af4212007-11-30 18:35:37 +110013 - Redistributions of source code must retain the above copyright
14 notice, this list of conditions and the following disclaimer.
Gregory Maxwell71d39ad2011-07-30 00:00:29 -040015
Jean-Marc Valin41af4212007-11-30 18:35:37 +110016 - Redistributions in binary form must reproduce the above copyright
17 notice, this list of conditions and the following disclaimer in the
18 documentation and/or other materials provided with the distribution.
Gregory Maxwell71d39ad2011-07-30 00:00:29 -040019
Jean-Marc Valin41af4212007-11-30 18:35:37 +110020 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Jean-Marc Valincb05e7c2012-04-20 16:40:24 -040023 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
24 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
Jean-Marc Valin41af4212007-11-30 18:35:37 +110025 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*/
32
33#ifndef VQ_H
34#define VQ_H
35
Jean-Marc Valin9cace642007-12-06 17:44:09 +110036#include "entenc.h"
Jean-Marc Valinfc08d0a2007-12-07 13:26:15 +110037#include "entdec.h"
Jean-Marc Valinba11d782008-04-21 21:59:37 +100038#include "modes.h"
Jean-Marc Valin9cace642007-12-06 17:44:09 +110039
Jean-Marc Valin76674fe2016-08-09 23:22:27 -040040#if (defined(OPUS_X86_MAY_HAVE_SSE2) && !defined(FIXED_POINT))
41#include "x86/vq_sse.h"
42#endif
43
Rhishikesh Agashec9c20352015-10-07 13:55:12 -040044#if defined(MIPSr1_ASM)
45#include "mips/vq_mipsr1.h"
46#endif
47
Jean-Marc Valin76674fe2016-08-09 23:22:27 -040048opus_val16 op_pvq_search_c(celt_norm *X, int *iy, int K, int N, int arch);
49
50#if !defined(OVERRIDE_OP_PVQ_SEARCH)
51#define op_pvq_search(x, iy, K, N, arch) \
52 (op_pvq_search_c(x, iy, K, N, arch))
53#endif
Rhishikesh Agashec9c20352015-10-07 13:55:12 -040054
Gregory Maxwell71d39ad2011-07-30 00:00:29 -040055/** Algebraic pulse-vector quantiser. The signal x is replaced by the sum of
56 * the pitch and a combination of pulses such that its norm is still equal
57 * to 1. This is the function that will typically require the most CPU.
Jean-Marc Valinf55b0ea2013-03-07 18:13:19 -050058 * @param X Residual signal to quantise/encode (returns quantised version)
Jean-Marc Valin26c9e142007-12-31 21:27:54 +110059 * @param N Number of samples to encode
60 * @param K Number of pulses to use
Jean-Marc Valin26c9e142007-12-31 21:27:54 +110061 * @param enc Entropy encoder state
Timothy B. Terriberry21af73e2011-01-19 16:30:03 -080062 * @ret A mask indicating which blocks in the band received pulses
Jean-Marc Valin26c9e142007-12-31 21:27:54 +110063*/
Jean-Marc Valin9eee1062016-01-04 23:29:36 -050064unsigned alg_quant(celt_norm *X, int N, int K, int spread, int B, ec_enc *enc,
Jean-Marc Valin76674fe2016-08-09 23:22:27 -040065 opus_val16 gain, int resynth, int arch);
Jean-Marc Valin41af4212007-11-30 18:35:37 +110066
Jean-Marc Valin26c9e142007-12-31 21:27:54 +110067/** Algebraic pulse decoder
Jean-Marc Valinf55b0ea2013-03-07 18:13:19 -050068 * @param X Decoded normalised spectrum (returned)
Jean-Marc Valin26c9e142007-12-31 21:27:54 +110069 * @param N Number of samples to decode
70 * @param K Number of pulses to use
Jean-Marc Valin26c9e142007-12-31 21:27:54 +110071 * @param dec Entropy decoder state
Timothy B. Terriberry21af73e2011-01-19 16:30:03 -080072 * @ret A mask indicating which blocks in the band received pulses
Jean-Marc Valin26c9e142007-12-31 21:27:54 +110073 */
Timothy B. Terriberry21af73e2011-01-19 16:30:03 -080074unsigned alg_unquant(celt_norm *X, int N, int K, int spread, int B,
Jean-Marc Valinff5f7222011-07-29 18:59:12 -040075 ec_dec *dec, opus_val16 gain);
Jean-Marc Valin41af4212007-11-30 18:35:37 +110076
xiangmingzhuc95c9a02014-04-30 15:48:07 +080077void renormalise_vector(celt_norm *X, int N, opus_val16 gain, int arch);
Jean-Marc Valineea914c2010-09-12 20:11:32 -040078
xiangmingzhuc95c9a02014-04-30 15:48:07 +080079int stereo_itheta(const celt_norm *X, const celt_norm *Y, int stereo, int N, int arch);
Jean-Marc Valin1d27ef82008-07-20 23:30:29 -040080
Jean-Marc Valin41af4212007-11-30 18:35:37 +110081#endif /* VQ_H */