blob: f0b71804cfb039d942f874f0860043661cfd0b5e [file] [log] [blame]
Jean-Marc Valinecb36a32007-12-05 01:31:49 +11001/* (C) 2007 Jean-Marc Valin, CSIRO
2*/
3/*
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions
6 are met:
7
8 - Redistributions of source code must retain the above copyright
9 notice, this list of conditions and the following disclaimer.
10
11 - Redistributions in binary form must reproduce the above copyright
12 notice, this list of conditions and the following disclaimer in the
13 documentation and/or other materials provided with the distribution.
14
15 - Neither the name of the Xiph.org Foundation nor the names of its
16 contributors may be used to endorse or promote products derived from
17 this software without specific prior written permission.
18
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
23 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30*/
31
32#include "modes.h"
33
Jean-Marc Valin36d78e62007-12-13 14:59:30 +110034#define NBANDS 18
Jean-Marc Valin2875f6b2008-01-05 13:32:32 +110035#define PBANDS 8
Jean-Marc Valin95c59ea2008-01-08 16:22:37 +110036#define PITCH_END 74
Jean-Marc Valin36d78e62007-12-13 14:59:30 +110037
Jean-Marc Valinecb36a32007-12-05 01:31:49 +110038#define NBANDS128 15
Jean-Marc Valin2875f6b2008-01-05 13:32:32 +110039#define PBANDS128 8
40#define PITCH_END128 45
Jean-Marc Valinecb36a32007-12-05 01:31:49 +110041
Jean-Marc Valin36d78e62007-12-13 14:59:30 +110042static const float means[15] = {
43 14.8621, 12.6918, 10.2978, 9.5862, 10.3784,
44 10.4555, 9.1594, 9.0280, 8.3291, 8.3410,
45 8.5737, 8.5614, 9.0107, 7.6809, 7.0665};
Jean-Marc Valinecb36a32007-12-05 01:31:49 +110046
Jean-Marc Valin36d78e62007-12-13 14:59:30 +110047static const float means18[18] = {
48 9.9067, 8.4524, 6.8577, 6.3804, 6.1786, 5.9815,
49 6.2068, 6.1076, 5.7711, 5.7734, 5.7935, 5.3981,
50 5.1992, 5.7214, 5.9656, 5.7548, 5.0802, 4.2626};
Jean-Marc Valinecb36a32007-12-05 01:31:49 +110051
Jean-Marc Valin36d78e62007-12-13 14:59:30 +110052static const int decay[15] = {
53 14800, 13800, 12600, 12000, 11000, 10000, 9800, 8400, 8000, 7500, 7000, 7000, 7000, 6000, 6000
54};
Jean-Marc Valinecb36a32007-12-05 01:31:49 +110055
Jean-Marc Valin36d78e62007-12-13 14:59:30 +110056static const int decay18[18] = {
57 14800, 13800, 12600, 12000, 11000, 11000, 10000, 10000, 9800, 8400, 8400, 8000, 7500, 7000, 7000, 7000, 6000, 6000
58};
59
Jean-Marc Valin95c59ea2008-01-08 16:22:37 +110060const int qbank0[NBANDS +2] = {0, 4, 8, 12, 16, 20, 24, 28, 32, 38, 44, 52, 62, 74, 90,112,142,182, 232,256};
61const int pbank0[PBANDS +2] = {0, 4, 8, 12, 16, 24, 38, 62, PITCH_END, 256};
Jean-Marc Valin2875f6b2008-01-05 13:32:32 +110062//const int pbank0[PBANDS +2] = {0, 4, 8, 12, 19, PITCH_END, 128};
Jean-Marc Valinec71aee2008-01-12 23:38:01 +110063const int qpulses0[NBANDS ] = {7, 6, 6, 5, 5, 5, 5, 4, 3, 3, 3, 3, 3, 3, -3, -2, 0, 0};
Jean-Marc Valin36d78e62007-12-13 14:59:30 +110064//const int qpulses0[NBANDS ] = {7, 5, 5, 5, 4, 4, 3, 3, 3, 3, 4, 3, 3, -2, 0, 0, 0, 0};
65
66
67const int qbank1[NBANDS128+2] = {0, 2, 4, 6, 8, 12, 16, 20, 24, 28, 36, 44, 52, 68, 84, 116, 128};
68
Jean-Marc Valin2875f6b2008-01-05 13:32:32 +110069const int qpulses1[NBANDS128] = {7, 5, 5, 5, 4, 5, 4, 5, 5, 4, 2, 0, 0, 0, 0};
Jean-Marc Valina2482ac2008-01-11 11:24:22 +110070const int qpulses2[NBANDS] = {28,25,23,20,18,15, 13, 11, 10, 8,8, 7, 7, -6, -5, -4, -1, -1};
71//const int qpulses2[NBANDS128] = {28,24,20,16,24,20, 18, 12, 10, 10,-7, -4, 1, 1, 1, 1, 1, 1};
Jean-Marc Valin36d78e62007-12-13 14:59:30 +110072const int qpulses2s[NBANDS128] ={38,30,24,20,24,20, 18, 16, 14, 20,-20,-14, -8, -8, -5};
73
Jean-Marc Valina2482ac2008-01-11 11:24:22 +110074const int qpulses4s[NBANDS] ={38,31,25,21,18,16, 14, 12, 14, 12,14,15, 14, 15, 16, 12, 10, 6};
Jean-Marc Valinf8dda662008-01-10 17:02:36 +110075
76//const int qpulses4s[NBANDS128] ={38,35,30,27,24,22, 21, 20, 22, 20,20,20, 20, 20, 14, 12, 12, 12};
77
Jean-Marc Valin2875f6b2008-01-05 13:32:32 +110078const int pbank1[PBANDS128+2] = {0, 2, 4, 6, 8, 12, 20, 28, PITCH_END128, 128};
79//const int pbank1[PBANDS128+2] = {0, 4, 8, 12, 20, PITCH_END128, 128};
Jean-Marc Valin36d78e62007-12-13 14:59:30 +110080
Jean-Marc Valin4fbd18d2008-01-17 14:07:55 +110081#define NALLOCS 7
82int bitalloc0[NBANDS*NALLOCS] =
83 { 5, 4, 4, 4, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0,
84 8, 7, 7, 6, 6, 6, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
85 10, 9, 9, 8, 8, 8, 8, 8, 8, 8, 9, 10, 11, 12, 17, 15, 6, 7,
86 16, 15, 14, 14, 14, 13, 13, 13, 13, 13, 15, 16, 17, 18, 20, 18, 11, 12,
87 26, 25, 24, 22, 20, 18, 19, 19, 25, 22, 25, 30, 30, 35, 35, 35, 35, 25,
88 32, 30, 28, 27, 25, 24, 23, 21, 29, 27, 35, 40, 42, 50, 59, 54, 51, 36,
89 42, 40, 38, 37, 35, 34, 33, 31, 39, 37, 45, 50, 52, 60, 60, 60, 60, 46,
Jean-Marc Valinf51ca492008-01-17 10:58:38 +110090};
Jean-Marc Valina5431bf2008-01-03 20:53:01 +110091
Jean-Marc Valin4fbd18d2008-01-17 14:07:55 +110092
Jean-Marc Valina5431bf2008-01-03 20:53:01 +110093#define NBANDS256 15
Jean-Marc Valin2875f6b2008-01-05 13:32:32 +110094#define PBANDS256 8
95#define PITCH_END256 88
Jean-Marc Valina4833ff2008-01-10 15:34:00 +110096const int qbank3[NBANDS256+2] = {0, 4, 8, 12, 16, 24, 32, 40, 48, 56, 72, 88, 104, 136, 168, 232, 256};
Jean-Marc Valin2875f6b2008-01-05 13:32:32 +110097//const int pbank3[PBANDS256+2] = {0, 8, 16, 24, 40, PITCH_END256, 256};
Jean-Marc Valina4833ff2008-01-10 15:34:00 +110098const int pbank3[PBANDS256+2] = {0, 4, 8, 12, 16, 24, 40, 56, PITCH_END256, 256};
Jean-Marc Valin36d78e62007-12-13 14:59:30 +110099
100const CELTMode mode0 = {
Jean-Marc Valina5431bf2008-01-03 20:53:01 +1100101 128, /**< overlap */
Jean-Marc Valin95c59ea2008-01-08 16:22:37 +1100102 256, /**< mdctSize */
103 1, /**< nbMdctBlocks */
Jean-Marc Valin36d78e62007-12-13 14:59:30 +1100104 1, /**< channels */
105
106 NBANDS, /**< nbEBands */
107 PBANDS, /**< nbPBands */
108 PITCH_END, /**< pitchEnd */
109
110 qbank0, /**< eBands */
111 pbank0, /**< pBands*/
112 qpulses0, /**< nbPulses */
113
114 0.8, /**< ePredCoef */
115 means18, /**< eMeans */
116 decay18, /**< eDecay */
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100117
Jean-Marc Valin4fbd18d2008-01-17 14:07:55 +1100118 7, /**< nbAllocVectors */
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100119 bitalloc0, /**< allocVectors */
Jean-Marc Valin36d78e62007-12-13 14:59:30 +1100120};
121
Jean-Marc Valinaa5bd612007-12-08 00:27:10 +1100122
Jean-Marc Valin6baa8e12007-12-08 00:08:37 +1100123/* Approx 38 kbps @ 44.1 kHz */
Jean-Marc Valinecb36a32007-12-05 01:31:49 +1100124const CELTMode mode1 = {
Jean-Marc Valina5431bf2008-01-03 20:53:01 +1100125 128, /**< overlap */
Jean-Marc Valinecb36a32007-12-05 01:31:49 +1100126 128, /**< mdctSize */
127 2, /**< nbMdctBlocks */
Jean-Marc Valinffa13472007-12-10 16:54:17 +1100128 1, /**< channels */
Jean-Marc Valinecb36a32007-12-05 01:31:49 +1100129
130 NBANDS128, /**< nbEBands */
131 PBANDS128, /**< nbPBands */
132 PITCH_END128,/**< pitchEnd */
133
134 qbank1, /**< eBands */
135 pbank1, /**< pBands*/
Jean-Marc Valin36d78e62007-12-13 14:59:30 +1100136 qpulses1, /**< nbPulses */
137
138 0.7, /**< ePredCoef */
139 means, /**< eMeans */
140 decay, /**< eDecay */
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100141
Jean-Marc Valin4fbd18d2008-01-17 14:07:55 +1100142 7, /**< nbAllocVectors */
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100143 bitalloc0, /**< allocVectors */
Jean-Marc Valinecb36a32007-12-05 01:31:49 +1100144};
Jean-Marc Valin73e51b32007-12-05 17:48:24 +1100145
Jean-Marc Valin6baa8e12007-12-08 00:08:37 +1100146/* Approx 58 kbps @ 44.1 kHz */
147const CELTMode mode2 = {
Jean-Marc Valina2482ac2008-01-11 11:24:22 +1100148 256, /**< overlap */
149 256, /**< mdctSize */
150 1, /**< nbMdctBlocks */
Jean-Marc Valinffa13472007-12-10 16:54:17 +1100151 1, /**< channels */
Jean-Marc Valin6baa8e12007-12-08 00:08:37 +1100152
Jean-Marc Valina2482ac2008-01-11 11:24:22 +1100153 NBANDS, /**< nbEBands */
154 PBANDS, /**< nbPBands */
155 PITCH_END,/**< pitchEnd */
Jean-Marc Valin6baa8e12007-12-08 00:08:37 +1100156
Jean-Marc Valina2482ac2008-01-11 11:24:22 +1100157 qbank0, /**< eBands */
158 pbank0, /**< pBands*/
Jean-Marc Valin36d78e62007-12-13 14:59:30 +1100159 qpulses2, /**< nbPulses */
160
Jean-Marc Valina2482ac2008-01-11 11:24:22 +1100161 0.8, /**< ePredCoef */
162 means18, /**< eMeans */
163 decay18, /**< eDecay */
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100164
Jean-Marc Valin4fbd18d2008-01-17 14:07:55 +1100165 7, /**< nbAllocVectors */
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100166 bitalloc0, /**< allocVectors */
Jean-Marc Valin6baa8e12007-12-08 00:08:37 +1100167};
168
Jean-Marc Valinaa5bd612007-12-08 00:27:10 +1100169const CELTMode mode3 = {
Jean-Marc Valina5431bf2008-01-03 20:53:01 +1100170 128, /**< overlap */
Jean-Marc Valinaa5bd612007-12-08 00:27:10 +1100171 256, /**< mdctSize */
Jean-Marc Valina5431bf2008-01-03 20:53:01 +1100172 1, /**< nbMdctBlocks */
Jean-Marc Valinffa13472007-12-10 16:54:17 +1100173 1, /**< channels */
Jean-Marc Valinaa5bd612007-12-08 00:27:10 +1100174
Jean-Marc Valina5431bf2008-01-03 20:53:01 +1100175 NBANDS256, /**< nbEBands */
176 PBANDS256, /**< nbPBands */
Jean-Marc Valinaa5bd612007-12-08 00:27:10 +1100177 PITCH_END256,/**< pitchEnd */
178
179 qbank3, /**< eBands */
180 pbank3, /**< pBands*/
Jean-Marc Valina5431bf2008-01-03 20:53:01 +1100181 qpulses1, /**< nbPulses */
Jean-Marc Valin36d78e62007-12-13 14:59:30 +1100182
183 0.7, /**< ePredCoef */
184 means, /**< eMeans */
185 decay, /**< eDecay */
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100186
Jean-Marc Valin4fbd18d2008-01-17 14:07:55 +1100187 7, /**< nbAllocVectors */
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100188 bitalloc0, /**< allocVectors */
Jean-Marc Valinaa5bd612007-12-08 00:27:10 +1100189};
190
Jean-Marc Valin4a897682007-12-12 00:45:15 +1100191/* Stereo mode around 120 kbps */
Jean-Marc Valinffa13472007-12-10 16:54:17 +1100192const CELTMode mode4 = {
Jean-Marc Valinf8dda662008-01-10 17:02:36 +1100193 256, /**< overlap */
Jean-Marc Valinfdca84b2008-01-09 10:44:18 +1100194 256, /**< mdctSize */
195 1, /**< nbMdctBlocks */
Jean-Marc Valinffa13472007-12-10 16:54:17 +1100196 2, /**< channels */
197
Jean-Marc Valinf8dda662008-01-10 17:02:36 +1100198 NBANDS, /**< nbEBands */
199 PBANDS, /**< nbPBands */
200 PITCH_END,/**< pitchEnd */
Jean-Marc Valinffa13472007-12-10 16:54:17 +1100201
Jean-Marc Valinf8dda662008-01-10 17:02:36 +1100202 qbank0, /**< eBands */
203 pbank0, /**< pBands*/
204 qpulses4s, /**< nbPulses */
Jean-Marc Valin36d78e62007-12-13 14:59:30 +1100205
Jean-Marc Valinf8dda662008-01-10 17:02:36 +1100206 0.8, /**< ePredCoef */
207 means18, /**< eMeans */
208 decay18, /**< eDecay */
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100209
Jean-Marc Valin4fbd18d2008-01-17 14:07:55 +1100210 7, /**< nbAllocVectors */
Jean-Marc Valinf51ca492008-01-17 10:58:38 +1100211 bitalloc0, /**< allocVectors */
Jean-Marc Valinffa13472007-12-10 16:54:17 +1100212};
213
Jean-Marc Valin36d78e62007-12-13 14:59:30 +1100214const CELTMode const *celt_mode0 = &mode0;
Jean-Marc Valin73e51b32007-12-05 17:48:24 +1100215const CELTMode const *celt_mode1 = &mode1;
Jean-Marc Valin6baa8e12007-12-08 00:08:37 +1100216const CELTMode const *celt_mode2 = &mode2;
Jean-Marc Valinaa5bd612007-12-08 00:27:10 +1100217const CELTMode const *celt_mode3 = &mode3;
Jean-Marc Valinffa13472007-12-10 16:54:17 +1100218const CELTMode const *celt_mode4 = &mode4;