annotate sonic.c @ 3797:0596dbc4f858 libavcodec

marking AVPaletteControl as deprecated due to thread saftey amongth other issues (it doesnt work if theres any delay between demuxer and decoder)
author michael
date Sat, 30 Sep 2006 18:16:38 +0000
parents 20545fbb6f7c
children c8c591fe26f8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
1 /*
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
2 * Simple free lossless/lossy audio codec
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
3 * Copyright (c) 2004 Alex Beregszaszi
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
4 *
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
9 *
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
13 * Lesser General Public License for more details.
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
14 *
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2979
diff changeset
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
18 */
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
19 #include "avcodec.h"
2398
582e635cfa08 common.c -> bitstream.c (and the single non bitstream func -> utils.c)
michael
parents: 2205
diff changeset
20 #include "bitstream.h"
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
21 #include "golomb.h"
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
22
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
23 /**
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
24 * @file sonic.c
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
25 * Simple free lossless/lossy audio codec
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
26 * Based on Paul Francis Harrison's Bonk (http://www.logarithmic.net/pfh/bonk)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
27 * Written and designed by Alex Beregszaszi
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
28 *
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
29 * TODO:
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
30 * - CABAC put/get_symbol
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
31 * - independent quantizer for channels
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
32 * - >2 channels support
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
33 * - more decorrelation types
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
34 * - more tap_quant tests
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
35 * - selectable intlist writers/readers (bonk-style, golomb, cabac)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
36 */
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
37
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
38 #define MAX_CHANNELS 2
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
39
2205
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
40 #define MID_SIDE 0
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
41 #define LEFT_SIDE 1
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
42 #define RIGHT_SIDE 2
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
43
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
44 typedef struct SonicContext {
2205
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
45 int lossless, decorrelation;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
46
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
47 int num_taps, downsampling;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
48 double quantization;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
49
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
50 int channels, samplerate, block_align, frame_size;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
51
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
52 int *tap_quant;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
53 int *int_samples;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
54 int *coded_samples[MAX_CHANNELS];
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
55
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
56 // for encoding
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
57 int *tail;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
58 int tail_size;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
59 int *window;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
60 int window_size;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
61
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
62 // for decoding
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
63 int *predictor_k;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
64 int *predictor_state[MAX_CHANNELS];
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
65 } SonicContext;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
66
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
67 #define LATTICE_SHIFT 10
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
68 #define SAMPLE_SHIFT 4
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
69 #define LATTICE_FACTOR (1 << LATTICE_SHIFT)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
70 #define SAMPLE_FACTOR (1 << SAMPLE_SHIFT)
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
71
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
72 #define BASE_QUANT 0.6
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
73 #define RATE_VARIATION 3.0
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
74
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
75 static inline int divide(int a, int b)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
76 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
77 if (a < 0)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
78 return -( (-a + b/2)/b );
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
79 else
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
80 return (a + b/2)/b;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
81 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
82
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
83 static inline int shift(int a,int b)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
84 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
85 return (a+(1<<(b-1))) >> b;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
86 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
87
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
88 static inline int shift_down(int a,int b)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
89 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
90 return (a>>b)+((a<0)?1:0);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
91 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
92
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
93 #if 1
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
94 static inline int intlist_write(PutBitContext *pb, int *buf, int entries, int base_2_part)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
95 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
96 int i;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
97
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
98 for (i = 0; i < entries; i++)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
99 set_se_golomb(pb, buf[i]);
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
100
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
101 return 1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
102 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
103
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
104 static inline int intlist_read(GetBitContext *gb, int *buf, int entries, int base_2_part)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
105 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
106 int i;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
107
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
108 for (i = 0; i < entries; i++)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
109 buf[i] = get_se_golomb(gb);
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
110
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
111 return 1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
112 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
113
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
114 #else
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
115
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
116 #define ADAPT_LEVEL 8
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
117
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
118 static int bits_to_store(uint64_t x)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
119 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
120 int res = 0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
121
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
122 while(x)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
123 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
124 res++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
125 x >>= 1;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
126 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
127 return res;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
128 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
129
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
130 static void write_uint_max(PutBitContext *pb, unsigned int value, unsigned int max)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
131 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
132 int i, bits;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
133
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
134 if (!max)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
135 return;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
136
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
137 bits = bits_to_store(max);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
138
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
139 for (i = 0; i < bits-1; i++)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
140 put_bits(pb, 1, value & (1 << i));
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
141
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
142 if ( (value | (1 << (bits-1))) <= max)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
143 put_bits(pb, 1, value & (1 << (bits-1)));
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
144 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
145
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
146 static unsigned int read_uint_max(GetBitContext *gb, int max)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
147 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
148 int i, bits, value = 0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
149
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
150 if (!max)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
151 return 0;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
152
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
153 bits = bits_to_store(max);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
154
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
155 for (i = 0; i < bits-1; i++)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
156 if (get_bits1(gb))
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
157 value += 1 << i;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
158
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
159 if ( (value | (1<<(bits-1))) <= max)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
160 if (get_bits1(gb))
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
161 value += 1 << (bits-1);
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
162
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
163 return value;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
164 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
165
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
166 static int intlist_write(PutBitContext *pb, int *buf, int entries, int base_2_part)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
167 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
168 int i, j, x = 0, low_bits = 0, max = 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
169 int step = 256, pos = 0, dominant = 0, any = 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
170 int *copy, *bits;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
171
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
172 copy = av_mallocz(4* entries);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
173 if (!copy)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
174 return -1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
175
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
176 if (base_2_part)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
177 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
178 int energy = 0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
179
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
180 for (i = 0; i < entries; i++)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
181 energy += abs(buf[i]);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
182
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
183 low_bits = bits_to_store(energy / (entries * 2));
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
184 if (low_bits > 15)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
185 low_bits = 15;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
186
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
187 put_bits(pb, 4, low_bits);
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
188 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
189
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
190 for (i = 0; i < entries; i++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
191 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
192 put_bits(pb, low_bits, abs(buf[i]));
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
193 copy[i] = abs(buf[i]) >> low_bits;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
194 if (copy[i] > max)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
195 max = abs(copy[i]);
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
196 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
197
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
198 bits = av_mallocz(4* entries*max);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
199 if (!bits)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
200 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
201 // av_free(copy);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
202 return -1;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
203 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
204
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
205 for (i = 0; i <= max; i++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
206 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
207 for (j = 0; j < entries; j++)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
208 if (copy[j] >= i)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
209 bits[x++] = copy[j] > i;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
210 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
211
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
212 // store bitstream
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
213 while (pos < x)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
214 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
215 int steplet = step >> 8;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
216
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
217 if (pos + steplet > x)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
218 steplet = x - pos;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
219
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
220 for (i = 0; i < steplet; i++)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
221 if (bits[i+pos] != dominant)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
222 any = 1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
223
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
224 put_bits(pb, 1, any);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
225
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
226 if (!any)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
227 {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
228 pos += steplet;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
229 step += step / ADAPT_LEVEL;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
230 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
231 else
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
232 {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
233 int interloper = 0;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
234
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
235 while (((pos + interloper) < x) && (bits[pos + interloper] == dominant))
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
236 interloper++;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
237
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
238 // note change
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
239 write_uint_max(pb, interloper, (step >> 8) - 1);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
240
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
241 pos += interloper + 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
242 step -= step / ADAPT_LEVEL;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
243 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
244
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
245 if (step < 256)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
246 {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
247 step = 65536 / step;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
248 dominant = !dominant;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
249 }
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
250 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
251
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
252 // store signs
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
253 for (i = 0; i < entries; i++)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
254 if (buf[i])
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
255 put_bits(pb, 1, buf[i] < 0);
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
256
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
257 // av_free(bits);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
258 // av_free(copy);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
259
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
260 return 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
261 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
262
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
263 static int intlist_read(GetBitContext *gb, int *buf, int entries, int base_2_part)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
264 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
265 int i, low_bits = 0, x = 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
266 int n_zeros = 0, step = 256, dominant = 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
267 int pos = 0, level = 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
268 int *bits = av_mallocz(4* entries);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
269
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
270 if (!bits)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
271 return -1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
272
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
273 if (base_2_part)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
274 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
275 low_bits = get_bits(gb, 4);
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
276
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
277 if (low_bits)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
278 for (i = 0; i < entries; i++)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
279 buf[i] = get_bits(gb, low_bits);
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
280 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
281
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
282 // av_log(NULL, AV_LOG_INFO, "entries: %d, low bits: %d\n", entries, low_bits);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
283
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
284 while (n_zeros < entries)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
285 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
286 int steplet = step >> 8;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
287
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
288 if (!get_bits1(gb))
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
289 {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
290 for (i = 0; i < steplet; i++)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
291 bits[x++] = dominant;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
292
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
293 if (!dominant)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
294 n_zeros += steplet;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
295
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
296 step += step / ADAPT_LEVEL;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
297 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
298 else
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
299 {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
300 int actual_run = read_uint_max(gb, steplet-1);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
301
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
302 // av_log(NULL, AV_LOG_INFO, "actual run: %d\n", actual_run);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
303
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
304 for (i = 0; i < actual_run; i++)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
305 bits[x++] = dominant;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
306
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
307 bits[x++] = !dominant;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
308
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
309 if (!dominant)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
310 n_zeros += actual_run;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
311 else
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
312 n_zeros++;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
313
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
314 step -= step / ADAPT_LEVEL;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
315 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
316
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
317 if (step < 256)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
318 {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
319 step = 65536 / step;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
320 dominant = !dominant;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
321 }
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
322 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
323
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
324 // reconstruct unsigned values
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
325 n_zeros = 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
326 for (i = 0; n_zeros < entries; i++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
327 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
328 while(1)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
329 {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
330 if (pos >= entries)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
331 {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
332 pos = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
333 level += 1 << low_bits;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
334 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
335
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
336 if (buf[pos] >= level)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
337 break;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
338
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
339 pos++;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
340 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
341
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
342 if (bits[i])
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
343 buf[pos] += 1 << low_bits;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
344 else
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
345 n_zeros++;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
346
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
347 pos++;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
348 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
349 // av_free(bits);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
350
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
351 // read signs
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
352 for (i = 0; i < entries; i++)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
353 if (buf[i] && get_bits1(gb))
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
354 buf[i] = -buf[i];
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
355
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
356 // av_log(NULL, AV_LOG_INFO, "zeros: %d pos: %d\n", n_zeros, pos);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
357
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
358 return 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
359 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
360 #endif
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
361
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
362 static void predictor_init_state(int *k, int *state, int order)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
363 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
364 int i;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
365
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
366 for (i = order-2; i >= 0; i--)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
367 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
368 int j, p, x = state[i];
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
369
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
370 for (j = 0, p = i+1; p < order; j++,p++)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
371 {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
372 int tmp = x + shift_down(k[j] * state[p], LATTICE_SHIFT);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
373 state[p] += shift_down(k[j]*x, LATTICE_SHIFT);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
374 x = tmp;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
375 }
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
376 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
377 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
378
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
379 static int predictor_calc_error(int *k, int *state, int order, int error)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
380 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
381 int i, x = error - shift_down(k[order-1] * state[order-1], LATTICE_SHIFT);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
382
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
383 #if 1
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
384 int *k_ptr = &(k[order-2]),
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
385 *state_ptr = &(state[order-2]);
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
386 for (i = order-2; i >= 0; i--, k_ptr--, state_ptr--)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
387 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
388 int k_value = *k_ptr, state_value = *state_ptr;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
389 x -= shift_down(k_value * state_value, LATTICE_SHIFT);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
390 state_ptr[1] = state_value + shift_down(k_value * x, LATTICE_SHIFT);
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
391 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
392 #else
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
393 for (i = order-2; i >= 0; i--)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
394 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
395 x -= shift_down(k[i] * state[i], LATTICE_SHIFT);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
396 state[i+1] = state[i] + shift_down(k[i] * x, LATTICE_SHIFT);
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
397 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
398 #endif
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
399
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
400 // don't drift too far, to avoid overflows
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
401 if (x > (SAMPLE_FACTOR<<16)) x = (SAMPLE_FACTOR<<16);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
402 if (x < -(SAMPLE_FACTOR<<16)) x = -(SAMPLE_FACTOR<<16);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
403
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
404 state[0] = x;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
405
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
406 return x;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
407 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
408
3777
20545fbb6f7c add some #ifdef CONFIG_ENCODERS/DECODERS
mru
parents: 3036
diff changeset
409 #ifdef CONFIG_ENCODERS
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
410 // Heavily modified Levinson-Durbin algorithm which
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
411 // copes better with quantization, and calculates the
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
412 // actual whitened result as it goes.
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
413
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
414 static void modified_levinson_durbin(int *window, int window_entries,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
415 int *out, int out_entries, int channels, int *tap_quant)
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
416 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
417 int i;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
418 int *state = av_mallocz(4* window_entries);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
419
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
420 memcpy(state, window, 4* window_entries);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
421
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
422 for (i = 0; i < out_entries; i++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
423 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
424 int step = (i+1)*channels, k, j;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
425 double xx = 0.0, xy = 0.0;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
426 #if 1
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
427 int *x_ptr = &(window[step]), *state_ptr = &(state[0]);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
428 j = window_entries - step;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
429 for (;j>=0;j--,x_ptr++,state_ptr++)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
430 {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
431 double x_value = *x_ptr, state_value = *state_ptr;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
432 xx += state_value*state_value;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
433 xy += x_value*state_value;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
434 }
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
435 #else
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
436 for (j = 0; j <= (window_entries - step); j++);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
437 {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
438 double stepval = window[step+j], stateval = window[j];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
439 // xx += (double)window[j]*(double)window[j];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
440 // xy += (double)window[step+j]*(double)window[j];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
441 xx += stateval*stateval;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
442 xy += stepval*stateval;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
443 }
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
444 #endif
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
445 if (xx == 0.0)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
446 k = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
447 else
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
448 k = (int)(floor(-xy/xx * (double)LATTICE_FACTOR / (double)(tap_quant[i]) + 0.5));
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
449
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
450 if (k > (LATTICE_FACTOR/tap_quant[i]))
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
451 k = LATTICE_FACTOR/tap_quant[i];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
452 if (-k > (LATTICE_FACTOR/tap_quant[i]))
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
453 k = -(LATTICE_FACTOR/tap_quant[i]);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
454
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
455 out[i] = k;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
456 k *= tap_quant[i];
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
457
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
458 #if 1
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
459 x_ptr = &(window[step]);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
460 state_ptr = &(state[0]);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
461 j = window_entries - step;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
462 for (;j>=0;j--,x_ptr++,state_ptr++)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
463 {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
464 int x_value = *x_ptr, state_value = *state_ptr;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
465 *x_ptr = x_value + shift_down(k*state_value,LATTICE_SHIFT);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
466 *state_ptr = state_value + shift_down(k*x_value, LATTICE_SHIFT);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
467 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
468 #else
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
469 for (j=0; j <= (window_entries - step); j++)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
470 {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
471 int stepval = window[step+j], stateval=state[j];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
472 window[step+j] += shift_down(k * stateval, LATTICE_SHIFT);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
473 state[j] += shift_down(k * stepval, LATTICE_SHIFT);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
474 }
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
475 #endif
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
476 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
477
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
478 av_free(state);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
479 }
3777
20545fbb6f7c add some #ifdef CONFIG_ENCODERS/DECODERS
mru
parents: 3036
diff changeset
480 #endif /* CONFIG_ENCODERS */
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
481
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
482 static int samplerate_table[] =
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
483 { 44100, 22050, 11025, 96000, 48000, 32000, 24000, 16000, 8000 };
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
484
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
485 #ifdef CONFIG_ENCODERS
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
486
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
487 static inline int code_samplerate(int samplerate)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
488 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
489 switch (samplerate)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
490 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
491 case 44100: return 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
492 case 22050: return 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
493 case 11025: return 2;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
494 case 96000: return 3;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
495 case 48000: return 4;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
496 case 32000: return 5;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
497 case 24000: return 6;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
498 case 16000: return 7;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
499 case 8000: return 8;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
500 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
501 return -1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
502 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
503
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
504 static int sonic_encode_init(AVCodecContext *avctx)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
505 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
506 SonicContext *s = avctx->priv_data;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
507 PutBitContext pb;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
508 int i, version = 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
509
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
510 if (avctx->channels > MAX_CHANNELS)
2183
6d40885b03ad ffmpeg short conversion got fixed somewhere, no need to workaround it - fixes amplitude bug
alex
parents: 2182
diff changeset
511 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
512 av_log(avctx, AV_LOG_ERROR, "Only mono and stereo streams are supported by now\n");
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
513 return -1; /* only stereo or mono for now */
2183
6d40885b03ad ffmpeg short conversion got fixed somewhere, no need to workaround it - fixes amplitude bug
alex
parents: 2182
diff changeset
514 }
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
515
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
516 if (avctx->channels == 2)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
517 s->decorrelation = MID_SIDE;
2183
6d40885b03ad ffmpeg short conversion got fixed somewhere, no need to workaround it - fixes amplitude bug
alex
parents: 2182
diff changeset
518
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
519 if (avctx->codec->id == CODEC_ID_SONIC_LS)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
520 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
521 s->lossless = 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
522 s->num_taps = 32;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
523 s->downsampling = 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
524 s->quantization = 0.0;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
525 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
526 else
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
527 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
528 s->num_taps = 128;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
529 s->downsampling = 2;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
530 s->quantization = 1.0;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
531 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
532
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
533 // max tap 2048
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
534 if ((s->num_taps < 32) || (s->num_taps > 1024) ||
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
535 ((s->num_taps>>5)<<5 != s->num_taps))
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
536 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
537 av_log(avctx, AV_LOG_ERROR, "Invalid number of taps\n");
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
538 return -1;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
539 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
540
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
541 // generate taps
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
542 s->tap_quant = av_mallocz(4* s->num_taps);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
543 for (i = 0; i < s->num_taps; i++)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
544 s->tap_quant[i] = (int)(sqrt(i+1));
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
545
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
546 s->channels = avctx->channels;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
547 s->samplerate = avctx->sample_rate;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
548
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
549 s->block_align = (int)(2048.0*s->samplerate/44100)/s->downsampling;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
550 s->frame_size = s->channels*s->block_align*s->downsampling;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
551
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
552 s->tail = av_mallocz(4* s->num_taps*s->channels);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
553 if (!s->tail)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
554 return -1;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
555 s->tail_size = s->num_taps*s->channels;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
556
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
557 s->predictor_k = av_mallocz(4 * s->num_taps);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
558 if (!s->predictor_k)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
559 return -1;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
560
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
561 for (i = 0; i < s->channels; i++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
562 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
563 s->coded_samples[i] = av_mallocz(4* s->block_align);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
564 if (!s->coded_samples[i])
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
565 return -1;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
566 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
567
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
568 s->int_samples = av_mallocz(4* s->frame_size);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
569
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
570 s->window_size = ((2*s->tail_size)+s->frame_size);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
571 s->window = av_mallocz(4* s->window_size);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
572 if (!s->window)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
573 return -1;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
574
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
575 avctx->extradata = av_mallocz(16);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
576 if (!avctx->extradata)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
577 return -1;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
578 init_put_bits(&pb, avctx->extradata, 16*8);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
579
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
580 put_bits(&pb, 2, version); // version
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
581 if (version == 1)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
582 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
583 put_bits(&pb, 2, s->channels);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
584 put_bits(&pb, 4, code_samplerate(s->samplerate));
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
585 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
586 put_bits(&pb, 1, s->lossless);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
587 if (!s->lossless)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
588 put_bits(&pb, 3, SAMPLE_SHIFT); // XXX FIXME: sample precision
2205
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
589 put_bits(&pb, 2, s->decorrelation);
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
590 put_bits(&pb, 2, s->downsampling);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
591 put_bits(&pb, 5, (s->num_taps >> 5)-1); // 32..1024
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
592 put_bits(&pb, 1, 0); // XXX FIXME: no custom tap quant table
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
593
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
594 flush_put_bits(&pb);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
595 avctx->extradata_size = put_bits_count(&pb)/8;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
596
2205
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
597 av_log(avctx, AV_LOG_INFO, "Sonic: ver: %d ls: %d dr: %d taps: %d block: %d frame: %d downsamp: %d\n",
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
598 version, s->lossless, s->decorrelation, s->num_taps, s->block_align, s->frame_size, s->downsampling);
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
599
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
600 avctx->coded_frame = avcodec_alloc_frame();
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
601 if (!avctx->coded_frame)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
602 return -ENOMEM;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
603 avctx->coded_frame->key_frame = 1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
604 avctx->frame_size = s->block_align*s->downsampling;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
605
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
606 return 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
607 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
608
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
609 static int sonic_encode_close(AVCodecContext *avctx)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
610 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
611 SonicContext *s = avctx->priv_data;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
612 int i;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
613
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
614 av_freep(&avctx->coded_frame);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
615
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
616 for (i = 0; i < s->channels; i++)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
617 av_free(s->coded_samples[i]);
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
618
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
619 av_free(s->predictor_k);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
620 av_free(s->tail);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
621 av_free(s->tap_quant);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
622 av_free(s->window);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
623 av_free(s->int_samples);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
624
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
625 return 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
626 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
627
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
628 static int sonic_encode_frame(AVCodecContext *avctx,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
629 uint8_t *buf, int buf_size, void *data)
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
630 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
631 SonicContext *s = avctx->priv_data;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
632 PutBitContext pb;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
633 int i, j, ch, quant = 0, x = 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
634 short *samples = data;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
635
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
636 init_put_bits(&pb, buf, buf_size*8);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
637
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
638 // short -> internal
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
639 for (i = 0; i < s->frame_size; i++)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
640 s->int_samples[i] = samples[i];
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
641
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
642 if (!s->lossless)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
643 for (i = 0; i < s->frame_size; i++)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
644 s->int_samples[i] = s->int_samples[i] << SAMPLE_SHIFT;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
645
2205
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
646 switch(s->decorrelation)
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
647 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
648 case MID_SIDE:
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
649 for (i = 0; i < s->frame_size; i += s->channels)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
650 {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
651 s->int_samples[i] += s->int_samples[i+1];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
652 s->int_samples[i+1] -= shift(s->int_samples[i], 1);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
653 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
654 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
655 case LEFT_SIDE:
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
656 for (i = 0; i < s->frame_size; i += s->channels)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
657 s->int_samples[i+1] -= s->int_samples[i];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
658 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
659 case RIGHT_SIDE:
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
660 for (i = 0; i < s->frame_size; i += s->channels)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
661 s->int_samples[i] -= s->int_samples[i+1];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
662 break;
2205
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
663 }
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
664
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
665 memset(s->window, 0, 4* s->window_size);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
666
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
667 for (i = 0; i < s->tail_size; i++)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
668 s->window[x++] = s->tail[i];
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
669
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
670 for (i = 0; i < s->frame_size; i++)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
671 s->window[x++] = s->int_samples[i];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
672
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
673 for (i = 0; i < s->tail_size; i++)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
674 s->window[x++] = 0;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
675
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
676 for (i = 0; i < s->tail_size; i++)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
677 s->tail[i] = s->int_samples[s->frame_size - s->tail_size + i];
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
678
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
679 // generate taps
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
680 modified_levinson_durbin(s->window, s->window_size,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
681 s->predictor_k, s->num_taps, s->channels, s->tap_quant);
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
682 if (intlist_write(&pb, s->predictor_k, s->num_taps, 0) < 0)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
683 return -1;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
684
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
685 for (ch = 0; ch < s->channels; ch++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
686 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
687 x = s->tail_size+ch;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
688 for (i = 0; i < s->block_align; i++)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
689 {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
690 int sum = 0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
691 for (j = 0; j < s->downsampling; j++, x += s->channels)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
692 sum += s->window[x];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
693 s->coded_samples[ch][i] = sum;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
694 }
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
695 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
696
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
697 // simple rate control code
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
698 if (!s->lossless)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
699 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
700 double energy1 = 0.0, energy2 = 0.0;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
701 for (ch = 0; ch < s->channels; ch++)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
702 {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
703 for (i = 0; i < s->block_align; i++)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
704 {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
705 double sample = s->coded_samples[ch][i];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
706 energy2 += sample*sample;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
707 energy1 += fabs(sample);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
708 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
709 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
710
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
711 energy2 = sqrt(energy2/(s->channels*s->block_align));
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
712 energy1 = sqrt(2.0)*energy1/(s->channels*s->block_align);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
713
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
714 // increase bitrate when samples are like a gaussian distribution
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
715 // reduce bitrate when samples are like a two-tailed exponential distribution
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
716
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
717 if (energy2 > energy1)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
718 energy2 += (energy2-energy1)*RATE_VARIATION;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
719
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
720 quant = (int)(BASE_QUANT*s->quantization*energy2/SAMPLE_FACTOR);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
721 // av_log(avctx, AV_LOG_DEBUG, "quant: %d energy: %f / %f\n", quant, energy1, energy2);
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
722
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
723 if (quant < 1)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
724 quant = 1;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
725 if (quant > 65535)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
726 quant = 65535;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
727
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
728 set_ue_golomb(&pb, quant);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
729
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
730 quant *= SAMPLE_FACTOR;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
731 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
732
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
733 // write out coded samples
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
734 for (ch = 0; ch < s->channels; ch++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
735 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
736 if (!s->lossless)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
737 for (i = 0; i < s->block_align; i++)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
738 s->coded_samples[ch][i] = divide(s->coded_samples[ch][i], quant);
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
739
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
740 if (intlist_write(&pb, s->coded_samples[ch], s->block_align, 1) < 0)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
741 return -1;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
742 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
743
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
744 // av_log(avctx, AV_LOG_DEBUG, "used bytes: %d\n", (put_bits_count(&pb)+7)/8);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
745
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
746 flush_put_bits(&pb);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
747 return (put_bits_count(&pb)+7)/8;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
748 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
749 #endif //CONFIG_ENCODERS
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
750
3777
20545fbb6f7c add some #ifdef CONFIG_ENCODERS/DECODERS
mru
parents: 3036
diff changeset
751 #ifdef CONFIG_DECODERS
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
752 static int sonic_decode_init(AVCodecContext *avctx)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
753 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
754 SonicContext *s = avctx->priv_data;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
755 GetBitContext gb;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
756 int i, version;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
757
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
758 s->channels = avctx->channels;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
759 s->samplerate = avctx->sample_rate;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
760
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
761 if (!avctx->extradata)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
762 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
763 av_log(avctx, AV_LOG_ERROR, "No mandatory headers present\n");
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
764 return -1;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
765 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
766
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
767 init_get_bits(&gb, avctx->extradata, avctx->extradata_size);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
768
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
769 version = get_bits(&gb, 2);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
770 if (version > 1)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
771 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
772 av_log(avctx, AV_LOG_ERROR, "Unsupported Sonic version, please report\n");
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
773 return -1;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
774 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
775
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
776 if (version == 1)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
777 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
778 s->channels = get_bits(&gb, 2);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
779 s->samplerate = samplerate_table[get_bits(&gb, 4)];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
780 av_log(avctx, AV_LOG_INFO, "Sonicv2 chans: %d samprate: %d\n",
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
781 s->channels, s->samplerate);
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
782 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
783
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
784 if (s->channels > MAX_CHANNELS)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
785 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
786 av_log(avctx, AV_LOG_ERROR, "Only mono and stereo streams are supported by now\n");
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
787 return -1;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
788 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
789
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
790 s->lossless = get_bits1(&gb);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
791 if (!s->lossless)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
792 skip_bits(&gb, 3); // XXX FIXME
2205
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
793 s->decorrelation = get_bits(&gb, 2);
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
794
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
795 s->downsampling = get_bits(&gb, 2);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
796 s->num_taps = (get_bits(&gb, 5)+1)<<5;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
797 if (get_bits1(&gb)) // XXX FIXME
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
798 av_log(avctx, AV_LOG_INFO, "Custom quant table\n");
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
799
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
800 s->block_align = (int)(2048.0*(s->samplerate/44100))/s->downsampling;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
801 s->frame_size = s->channels*s->block_align*s->downsampling;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
802 // avctx->frame_size = s->block_align;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
803
2205
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
804 av_log(avctx, AV_LOG_INFO, "Sonic: ver: %d ls: %d dr: %d taps: %d block: %d frame: %d downsamp: %d\n",
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
805 version, s->lossless, s->decorrelation, s->num_taps, s->block_align, s->frame_size, s->downsampling);
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
806
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
807 // generate taps
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
808 s->tap_quant = av_mallocz(4* s->num_taps);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
809 for (i = 0; i < s->num_taps; i++)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
810 s->tap_quant[i] = (int)(sqrt(i+1));
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
811
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
812 s->predictor_k = av_mallocz(4* s->num_taps);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
813
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
814 for (i = 0; i < s->channels; i++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
815 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
816 s->predictor_state[i] = av_mallocz(4* s->num_taps);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
817 if (!s->predictor_state[i])
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
818 return -1;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
819 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
820
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
821 for (i = 0; i < s->channels; i++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
822 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
823 s->coded_samples[i] = av_mallocz(4* s->block_align);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
824 if (!s->coded_samples[i])
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
825 return -1;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
826 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
827 s->int_samples = av_mallocz(4* s->frame_size);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
828
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
829 return 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
830 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
831
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
832 static int sonic_decode_close(AVCodecContext *avctx)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
833 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
834 SonicContext *s = avctx->priv_data;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
835 int i;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
836
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
837 av_free(s->int_samples);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
838 av_free(s->tap_quant);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
839 av_free(s->predictor_k);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
840
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
841 for (i = 0; i < s->channels; i++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
842 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
843 av_free(s->predictor_state[i]);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
844 av_free(s->coded_samples[i]);
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
845 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
846
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
847 return 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
848 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
849
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
850 static int sonic_decode_frame(AVCodecContext *avctx,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
851 void *data, int *data_size,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
852 uint8_t *buf, int buf_size)
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
853 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
854 SonicContext *s = avctx->priv_data;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
855 GetBitContext gb;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
856 int i, quant, ch, j;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
857 short *samples = data;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
858
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
859 if (buf_size == 0) return 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
860
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
861 // av_log(NULL, AV_LOG_INFO, "buf_size: %d\n", buf_size);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
862
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
863 init_get_bits(&gb, buf, buf_size*8);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
864
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
865 intlist_read(&gb, s->predictor_k, s->num_taps, 0);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
866
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
867 // dequantize
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
868 for (i = 0; i < s->num_taps; i++)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
869 s->predictor_k[i] *= s->tap_quant[i];
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
870
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
871 if (s->lossless)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
872 quant = 1;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
873 else
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
874 quant = get_ue_golomb(&gb) * SAMPLE_FACTOR;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
875
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
876 // av_log(NULL, AV_LOG_INFO, "quant: %d\n", quant);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
877
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
878 for (ch = 0; ch < s->channels; ch++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
879 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
880 int x = ch;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
881
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
882 predictor_init_state(s->predictor_k, s->predictor_state[ch], s->num_taps);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
883
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
884 intlist_read(&gb, s->coded_samples[ch], s->block_align, 1);
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
885
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
886 for (i = 0; i < s->block_align; i++)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
887 {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
888 for (j = 0; j < s->downsampling - 1; j++)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
889 {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
890 s->int_samples[x] = predictor_calc_error(s->predictor_k, s->predictor_state[ch], s->num_taps, 0);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
891 x += s->channels;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
892 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
893
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
894 s->int_samples[x] = predictor_calc_error(s->predictor_k, s->predictor_state[ch], s->num_taps, s->coded_samples[ch][i] * quant);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
895 x += s->channels;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
896 }
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
897
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
898 for (i = 0; i < s->num_taps; i++)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
899 s->predictor_state[ch][i] = s->int_samples[s->frame_size - s->channels + ch - i*s->channels];
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
900 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
901
2205
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
902 switch(s->decorrelation)
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
903 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
904 case MID_SIDE:
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
905 for (i = 0; i < s->frame_size; i += s->channels)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
906 {
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
907 s->int_samples[i+1] += shift(s->int_samples[i], 1);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
908 s->int_samples[i] -= s->int_samples[i+1];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
909 }
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
910 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
911 case LEFT_SIDE:
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
912 for (i = 0; i < s->frame_size; i += s->channels)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
913 s->int_samples[i+1] += s->int_samples[i];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
914 break;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
915 case RIGHT_SIDE:
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
916 for (i = 0; i < s->frame_size; i += s->channels)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
917 s->int_samples[i] += s->int_samples[i+1];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
918 break;
2205
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
919 }
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
920
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
921 if (!s->lossless)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
922 for (i = 0; i < s->frame_size; i++)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
923 s->int_samples[i] = shift(s->int_samples[i], SAMPLE_SHIFT);
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
924
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
925 // internal -> short
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
926 for (i = 0; i < s->frame_size; i++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
927 {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
928 if (s->int_samples[i] > 32767)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
929 samples[i] = 32767;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
930 else if (s->int_samples[i] < -32768)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
931 samples[i] = -32768;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
932 else
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
933 samples[i] = s->int_samples[i];
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
934 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
935
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
936 align_get_bits(&gb);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
937
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
938 *data_size = s->frame_size * 2;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
939
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
940 return (get_bits_count(&gb)+7)/8;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
941 }
3777
20545fbb6f7c add some #ifdef CONFIG_ENCODERS/DECODERS
mru
parents: 3036
diff changeset
942 #endif
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
943
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
944 #ifdef CONFIG_ENCODERS
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
945 AVCodec sonic_encoder = {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
946 "sonic",
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
947 CODEC_TYPE_AUDIO,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
948 CODEC_ID_SONIC,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
949 sizeof(SonicContext),
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
950 sonic_encode_init,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
951 sonic_encode_frame,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
952 sonic_encode_close,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
953 NULL,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
954 };
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
955
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
956 AVCodec sonic_ls_encoder = {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
957 "sonicls",
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
958 CODEC_TYPE_AUDIO,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
959 CODEC_ID_SONIC_LS,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
960 sizeof(SonicContext),
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
961 sonic_encode_init,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
962 sonic_encode_frame,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
963 sonic_encode_close,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
964 NULL,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
965 };
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
966 #endif
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
967
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
968 #ifdef CONFIG_DECODERS
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
969 AVCodec sonic_decoder = {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
970 "sonic",
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
971 CODEC_TYPE_AUDIO,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
972 CODEC_ID_SONIC,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
973 sizeof(SonicContext),
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
974 sonic_decode_init,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
975 NULL,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
976 sonic_decode_close,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
977 sonic_decode_frame,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
978 };
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
979 #endif