annotate sonic.c @ 2497:69adfbbdcdeb libavcodec

- samples from mplayer ftp in the "adv" profile seem to have profile=2, which isn't the advanced one; and indeed, using adv. profile parser fails. Using normal parser works, and that's what is done - attempt at taking care of stride for NORM2 bitplane decoding - duplication of much code from msmpeg4.c; this code isn't yet used, but goes down as far as the block layer (mainly Transform Type stuff, the remains are wild editing without checking). Unusable yet, and lacks the AC decoding (but a step further in bitstream parsing) patch by anonymous
author michael
date Fri, 04 Feb 2005 02:20:38 +0000
parents 582e635cfa08
children e25782262d7d
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
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
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;
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
46
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;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
49
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
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
67 #define LATTICE_SHIFT 10
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
68 #define SAMPLE_SHIFT 4
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
69 #define LATTICE_FACTOR (1 << LATTICE_SHIFT)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
70 #define SAMPLE_FACTOR (1 << SAMPLE_SHIFT)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
71
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
72 #define BASE_QUANT 0.6
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
73 #define RATE_VARIATION 3.0
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)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
78 return -( (-a + b/2)/b );
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
79 else
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
80 return (a + b/2)/b;
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++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
99 set_se_golomb(pb, buf[i]);
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;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
107
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++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
109 buf[i] = get_se_golomb(gb);
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;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
121
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 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
124 res++;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
125 x >>= 1;
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)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
135 return;
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++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
140 put_bits(pb, 1, value & (1 << i));
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)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
143 put_bits(pb, 1, value & (1 << (bits-1)));
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;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
149
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
150 if (!max)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
151 return 0;
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++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
156 if (get_bits1(gb))
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
157 value += 1 << i;
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)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
160 if (get_bits1(gb))
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
161 value += 1 << (bits-1);
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)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
174 return -1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
175
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 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
178 int energy = 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
179
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
180 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
181 energy += abs(buf[i]);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
183 low_bits = bits_to_store(energy / (entries * 2));
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
184 if (low_bits > 15)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
185 low_bits = 15;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
186
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
187 put_bits(pb, 4, low_bits);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
188 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
189
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 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
192 put_bits(pb, low_bits, abs(buf[i]));
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
193 copy[i] = abs(buf[i]) >> low_bits;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
194 if (copy[i] > max)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
195 max = abs(copy[i]);
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 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
201 // av_free(copy);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
202 return -1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
203 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
204
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 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
207 for (j = 0; j < entries; j++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
208 if (copy[j] >= i)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
209 bits[x++] = copy[j] > i;
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 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
215 int steplet = step >> 8;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
216
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
217 if (pos + steplet > x)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
218 steplet = x - pos;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
219
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
220 for (i = 0; i < steplet; i++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
221 if (bits[i+pos] != dominant)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
222 any = 1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
223
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
224 put_bits(pb, 1, any);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
225
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
226 if (!any)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
227 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
228 pos += steplet;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
229 step += step / ADAPT_LEVEL;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
230 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
231 else
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
232 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
233 int interloper = 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
234
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
235 while (((pos + interloper) < x) && (bits[pos + interloper] == dominant))
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
236 interloper++;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
237
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
238 // note change
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
239 write_uint_max(pb, interloper, (step >> 8) - 1);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
240
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
241 pos += interloper + 1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
242 step -= step / ADAPT_LEVEL;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
243 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
244
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
245 if (step < 256)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
246 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
247 step = 65536 / step;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
248 dominant = !dominant;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
249 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
250 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
251
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++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
254 if (buf[i])
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
255 put_bits(pb, 1, buf[i] < 0);
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)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
271 return -1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
272
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 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
275 low_bits = get_bits(gb, 4);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
276
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
277 if (low_bits)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
278 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
279 buf[i] = get_bits(gb, low_bits);
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 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
286 int steplet = step >> 8;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
287
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
288 if (!get_bits1(gb))
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
289 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
290 for (i = 0; i < steplet; i++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
291 bits[x++] = dominant;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
292
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
293 if (!dominant)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
294 n_zeros += steplet;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
295
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
296 step += step / ADAPT_LEVEL;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
297 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
298 else
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
299 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
300 int actual_run = read_uint_max(gb, steplet-1);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
301
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
302 // av_log(NULL, AV_LOG_INFO, "actual run: %d\n", actual_run);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
303
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
304 for (i = 0; i < actual_run; i++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
305 bits[x++] = dominant;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
306
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
307 bits[x++] = !dominant;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
308
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
309 if (!dominant)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
310 n_zeros += actual_run;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
311 else
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
312 n_zeros++;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
313
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
314 step -= step / ADAPT_LEVEL;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
315 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
316
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
317 if (step < 256)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
318 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
319 step = 65536 / step;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
320 dominant = !dominant;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
321 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
322 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
323
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 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
328 while(1)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
329 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
330 if (pos >= entries)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
331 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
332 pos = 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
333 level += 1 << low_bits;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
334 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
335
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
336 if (buf[pos] >= level)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
337 break;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
338
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
339 pos++;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
340 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
341
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
342 if (bits[i])
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
343 buf[pos] += 1 << low_bits;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
344 else
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
345 n_zeros++;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
346
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
347 pos++;
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);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
350
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++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
353 if (buf[i] && get_bits1(gb))
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
354 buf[i] = -buf[i];
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 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
368 int j, p, x = state[i];
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
369
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
370 for (j = 0, p = i+1; p < order; j++,p++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
371 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
372 int tmp = x + shift_down(k[j] * state[p], LATTICE_SHIFT);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
373 state[p] += shift_down(k[j]*x, LATTICE_SHIFT);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
374 x = tmp;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
375 }
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]),
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
385 *state_ptr = &(state[order-2]);
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 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
388 int k_value = *k_ptr, state_value = *state_ptr;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
389 x -= shift_down(k_value * state_value, LATTICE_SHIFT);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
390 state_ptr[1] = state_value + shift_down(k_value * x, LATTICE_SHIFT);
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 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
395 x -= shift_down(k[i] * state[i], LATTICE_SHIFT);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
396 state[i+1] = state[i] + shift_down(k[i] * x, LATTICE_SHIFT);
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
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
400 // don't drift too far, to avoid overflows
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
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
409 // 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
410 // 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
411 // 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
412
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
413 static void modified_levinson_durbin(int *window, int window_entries,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
414 int *out, int out_entries, int channels, int *tap_quant)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
415 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
416 int i;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
417 int *state = av_mallocz(4* window_entries);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
418
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
419 memcpy(state, window, 4* window_entries);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
420
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
421 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
422 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
423 int step = (i+1)*channels, k, j;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
424 double xx = 0.0, xy = 0.0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
425 #if 1
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
426 int *x_ptr = &(window[step]), *state_ptr = &(state[0]);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
427 j = window_entries - step;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
428 for (;j>=0;j--,x_ptr++,state_ptr++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
429 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
430 double x_value = *x_ptr, state_value = *state_ptr;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
431 xx += state_value*state_value;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
432 xy += x_value*state_value;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
433 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
434 #else
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
435 for (j = 0; j <= (window_entries - step); j++);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
436 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
437 double stepval = window[step+j], stateval = window[j];
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
438 // xx += (double)window[j]*(double)window[j];
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
439 // xy += (double)window[step+j]*(double)window[j];
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
440 xx += stateval*stateval;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
441 xy += stepval*stateval;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
442 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
443 #endif
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
444 if (xx == 0.0)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
445 k = 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
446 else
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
447 k = (int)(floor(-xy/xx * (double)LATTICE_FACTOR / (double)(tap_quant[i]) + 0.5));
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
448
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
449 if (k > (LATTICE_FACTOR/tap_quant[i]))
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
450 k = LATTICE_FACTOR/tap_quant[i];
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
451 if (-k > (LATTICE_FACTOR/tap_quant[i]))
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
452 k = -(LATTICE_FACTOR/tap_quant[i]);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
453
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
454 out[i] = k;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
455 k *= tap_quant[i];
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
456
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
457 #if 1
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
458 x_ptr = &(window[step]);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
459 state_ptr = &(state[0]);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
460 j = window_entries - step;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
461 for (;j>=0;j--,x_ptr++,state_ptr++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
462 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
463 int x_value = *x_ptr, state_value = *state_ptr;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
464 *x_ptr = x_value + shift_down(k*state_value,LATTICE_SHIFT);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
465 *state_ptr = state_value + shift_down(k*x_value, LATTICE_SHIFT);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
466 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
467 #else
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
468 for (j=0; j <= (window_entries - step); j++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
469 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
470 int stepval = window[step+j], stateval=state[j];
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
471 window[step+j] += shift_down(k * stateval, LATTICE_SHIFT);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
472 state[j] += shift_down(k * stepval, LATTICE_SHIFT);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
473 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
474 #endif
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
475 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
476
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
477 av_free(state);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
478 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
479
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
480 static int samplerate_table[] =
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
481 { 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
482
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
483 #ifdef CONFIG_ENCODERS
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 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
486 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
487 switch (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 case 44100: return 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
490 case 22050: return 1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
491 case 11025: return 2;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
492 case 96000: return 3;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
493 case 48000: return 4;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
494 case 32000: return 5;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
495 case 24000: return 6;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
496 case 16000: return 7;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
497 case 8000: return 8;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
498 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
499 return -1;
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
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
502 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
503 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
504 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
505 PutBitContext pb;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
506 int i, version = 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
507
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
508 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
509 {
6d40885b03ad ffmpeg short conversion got fixed somewhere, no need to workaround it - fixes amplitude bug
alex
parents: 2182
diff changeset
510 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
511 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
512 }
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
513
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
514 if (avctx->channels == 2)
2205
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
515 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
516
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
517 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
518 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
519 s->lossless = 1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
520 s->num_taps = 32;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
521 s->downsampling = 1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
522 s->quantization = 0.0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
523 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
524 else
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 s->num_taps = 128;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
527 s->downsampling = 2;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
528 s->quantization = 1.0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
529 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
530
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
531 // max tap 2048
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
532 if ((s->num_taps < 32) || (s->num_taps > 1024) ||
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
533 ((s->num_taps>>5)<<5 != s->num_taps))
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
534 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
535 av_log(avctx, AV_LOG_ERROR, "Invalid number of taps\n");
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
536 return -1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
537 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
538
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
539 // generate taps
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
540 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
541 for (i = 0; i < s->num_taps; i++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
542 s->tap_quant[i] = (int)(sqrt(i+1));
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
543
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
544 s->channels = avctx->channels;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
545 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
546
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
547 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
548 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
549
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
550 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
551 if (!s->tail)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
552 return -1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
553 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
554
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
555 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
556 if (!s->predictor_k)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
557 return -1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
558
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
559 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
560 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
561 s->coded_samples[i] = av_mallocz(4* s->block_align);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
562 if (!s->coded_samples[i])
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
563 return -1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
564 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
565
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
566 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
567
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
568 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
569 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
570 if (!s->window)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
571 return -1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
572
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
573 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
574 if (!avctx->extradata)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
575 return -1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
576 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
577
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
578 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
579 if (version == 1)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
580 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
581 put_bits(&pb, 2, s->channels);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
582 put_bits(&pb, 4, code_samplerate(s->samplerate));
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
583 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
584 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
585 if (!s->lossless)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
586 put_bits(&pb, 3, SAMPLE_SHIFT); // XXX FIXME: sample precision
2205
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
587 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
588 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
589 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
590 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
591
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
592 flush_put_bits(&pb);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
593 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
594
2205
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
595 av_log(avctx, AV_LOG_INFO, "Sonic: ver: %d ls: %d dr: %d taps: %d block: %d frame: %d downsamp: %d\n",
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
596 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
597
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
598 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
599 if (!avctx->coded_frame)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
600 return -ENOMEM;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
601 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
602 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
603
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
604 return 0;
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
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
607 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
608 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
609 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
610 int i;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
611
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
612 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
613
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
614 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
615 av_free(s->coded_samples[i]);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
616
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
617 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
618 av_free(s->tail);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
619 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
620 av_free(s->window);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
621 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
622
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
623 return 0;
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
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
626 static int sonic_encode_frame(AVCodecContext *avctx,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
627 uint8_t *buf, int buf_size, void *data)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
628 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
629 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
630 PutBitContext pb;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
631 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
632 short *samples = data;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
633
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
634 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
635
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
636 // short -> internal
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
637 for (i = 0; i < s->frame_size; i++)
2183
6d40885b03ad ffmpeg short conversion got fixed somewhere, no need to workaround it - fixes amplitude bug
alex
parents: 2182
diff changeset
638 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
639
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
640 if (!s->lossless)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
641 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
642 s->int_samples[i] = s->int_samples[i] << SAMPLE_SHIFT;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
643
2205
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
644 switch(s->decorrelation)
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
645 {
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
646 case MID_SIDE:
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
647 for (i = 0; i < s->frame_size; i += s->channels)
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
648 {
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
649 s->int_samples[i] += s->int_samples[i+1];
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
650 s->int_samples[i+1] -= shift(s->int_samples[i], 1);
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
651 }
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
652 break;
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
653 case LEFT_SIDE:
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
654 for (i = 0; i < s->frame_size; i += s->channels)
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
655 s->int_samples[i+1] -= s->int_samples[i];
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
656 break;
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
657 case RIGHT_SIDE:
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
658 for (i = 0; i < s->frame_size; i += s->channels)
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
659 s->int_samples[i] -= s->int_samples[i+1];
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
660 break;
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
661 }
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
662
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
663 memset(s->window, 0, 4* s->window_size);
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 for (i = 0; i < s->tail_size; i++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
666 s->window[x++] = s->tail[i];
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
667
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
668 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
669 s->window[x++] = s->int_samples[i];
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
670
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
671 for (i = 0; i < s->tail_size; i++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
672 s->window[x++] = 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
673
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
674 for (i = 0; i < s->tail_size; i++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
675 s->tail[i] = s->int_samples[s->frame_size - s->tail_size + i];
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
676
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
677 // generate taps
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
678 modified_levinson_durbin(s->window, s->window_size,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
679 s->predictor_k, s->num_taps, s->channels, s->tap_quant);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
680 if (intlist_write(&pb, s->predictor_k, s->num_taps, 0) < 0)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
681 return -1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
682
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
683 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
684 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
685 x = s->tail_size+ch;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
686 for (i = 0; i < s->block_align; i++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
687 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
688 int sum = 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
689 for (j = 0; j < s->downsampling; j++, x += s->channels)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
690 sum += s->window[x];
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
691 s->coded_samples[ch][i] = sum;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
692 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
693 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
694
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
695 // simple rate control code
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
696 if (!s->lossless)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
697 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
698 double energy1 = 0.0, energy2 = 0.0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
699 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
700 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
701 for (i = 0; i < s->block_align; i++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
702 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
703 double sample = s->coded_samples[ch][i];
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
704 energy2 += sample*sample;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
705 energy1 += fabs(sample);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
706 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
707 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
708
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
709 energy2 = sqrt(energy2/(s->channels*s->block_align));
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
710 energy1 = sqrt(2.0)*energy1/(s->channels*s->block_align);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
711
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
712 // increase bitrate when samples are like a gaussian distribution
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
713 // reduce bitrate when samples are like a two-tailed exponential distribution
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
714
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
715 if (energy2 > energy1)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
716 energy2 += (energy2-energy1)*RATE_VARIATION;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
717
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
718 quant = (int)(BASE_QUANT*s->quantization*energy2/SAMPLE_FACTOR);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
719 // av_log(avctx, AV_LOG_DEBUG, "quant: %d energy: %f / %f\n", quant, energy1, energy2);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
720
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
721 if (quant < 1)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
722 quant = 1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
723 if (quant > 65535)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
724 quant = 65535;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
725
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
726 set_ue_golomb(&pb, quant);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
727
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
728 quant *= SAMPLE_FACTOR;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
729 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
730
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
731 // write out coded samples
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
732 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
733 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
734 if (!s->lossless)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
735 for (i = 0; i < s->block_align; i++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
736 s->coded_samples[ch][i] = divide(s->coded_samples[ch][i], quant);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
737
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
738 if (intlist_write(&pb, s->coded_samples[ch], s->block_align, 1) < 0)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
739 return -1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
740 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
741
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
742 // 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
743
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
744 flush_put_bits(&pb);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
745 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
746 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
747 #endif //CONFIG_ENCODERS
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 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
750 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
751 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
752 GetBitContext gb;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
753 int i, version;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
754
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
755 s->channels = avctx->channels;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
756 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
757
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
758 if (!avctx->extradata)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
759 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
760 av_log(avctx, AV_LOG_ERROR, "No mandatory headers present\n");
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
761 return -1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
762 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
763
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
764 init_get_bits(&gb, avctx->extradata, avctx->extradata_size);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
765
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
766 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
767 if (version > 1)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
768 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
769 av_log(avctx, AV_LOG_ERROR, "Unsupported Sonic version, please report\n");
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
770 return -1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
771 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
772
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
773 if (version == 1)
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 s->channels = get_bits(&gb, 2);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
776 s->samplerate = samplerate_table[get_bits(&gb, 4)];
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
777 av_log(avctx, AV_LOG_INFO, "Sonicv2 chans: %d samprate: %d\n",
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
778 s->channels, s->samplerate);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
779 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
780
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
781 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
782 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
783 av_log(avctx, AV_LOG_ERROR, "Only mono and stereo streams are supported by now\n");
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
784 return -1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
785 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
786
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
787 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
788 if (!s->lossless)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
789 skip_bits(&gb, 3); // XXX FIXME
2205
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
790 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
791
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
792 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
793 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
794 if (get_bits1(&gb)) // XXX FIXME
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
795 av_log(avctx, AV_LOG_INFO, "Custom quant table\n");
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
796
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
797 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
798 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
799 // 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
800
2205
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
801 av_log(avctx, AV_LOG_INFO, "Sonic: ver: %d ls: %d dr: %d taps: %d block: %d frame: %d downsamp: %d\n",
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
802 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
803
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
804 // generate taps
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
805 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
806 for (i = 0; i < s->num_taps; i++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
807 s->tap_quant[i] = (int)(sqrt(i+1));
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
808
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
809 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
810
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
811 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
812 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
813 s->predictor_state[i] = 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
814 if (!s->predictor_state[i])
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
815 return -1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
816 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
817
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
818 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
819 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
820 s->coded_samples[i] = av_mallocz(4* s->block_align);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
821 if (!s->coded_samples[i])
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
822 return -1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
823 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
824 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
825
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
826 return 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
827 }
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 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
830 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
831 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
832 int i;
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 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
835 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
836 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
837
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
838 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
839 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
840 av_free(s->predictor_state[i]);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
841 av_free(s->coded_samples[i]);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
842 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
843
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
844 return 0;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
845 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
846
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
847 static int sonic_decode_frame(AVCodecContext *avctx,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
848 int16_t *data, int *data_size,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
849 uint8_t *buf, int buf_size)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
850 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
851 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
852 GetBitContext gb;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
853 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
854 short *samples = data;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
855
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
856 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
857
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
858 // av_log(NULL, AV_LOG_INFO, "buf_size: %d\n", buf_size);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
859
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
860 init_get_bits(&gb, buf, buf_size*8);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
861
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
862 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
863
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
864 // dequantize
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
865 for (i = 0; i < s->num_taps; i++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
866 s->predictor_k[i] *= s->tap_quant[i];
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
867
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
868 if (s->lossless)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
869 quant = 1;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
870 else
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
871 quant = get_ue_golomb(&gb) * SAMPLE_FACTOR;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
872
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
873 // 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
874
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
875 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
876 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
877 int x = ch;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
878
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
879 predictor_init_state(s->predictor_k, s->predictor_state[ch], s->num_taps);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
880
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
881 intlist_read(&gb, s->coded_samples[ch], s->block_align, 1);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
882
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
883 for (i = 0; i < s->block_align; i++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
884 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
885 for (j = 0; j < s->downsampling - 1; j++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
886 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
887 s->int_samples[x] = predictor_calc_error(s->predictor_k, s->predictor_state[ch], s->num_taps, 0);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
888 x += s->channels;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
889 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
890
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
891 s->int_samples[x] = predictor_calc_error(s->predictor_k, s->predictor_state[ch], s->num_taps, s->coded_samples[ch][i] * quant);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
892 x += s->channels;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
893 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
894
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
895 for (i = 0; i < s->num_taps; i++)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
896 s->predictor_state[ch][i] = s->int_samples[s->frame_size - s->channels + ch - i*s->channels];
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
897 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
898
2205
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
899 switch(s->decorrelation)
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
900 {
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
901 case MID_SIDE:
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
902 for (i = 0; i < s->frame_size; i += s->channels)
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
903 {
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
904 s->int_samples[i+1] += shift(s->int_samples[i], 1);
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
905 s->int_samples[i] -= s->int_samples[i+1];
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
906 }
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
907 break;
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
908 case LEFT_SIDE:
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
909 for (i = 0; i < s->frame_size; i += s->channels)
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
910 s->int_samples[i+1] += s->int_samples[i];
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
911 break;
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
912 case RIGHT_SIDE:
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
913 for (i = 0; i < s->frame_size; i += s->channels)
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
914 s->int_samples[i] += s->int_samples[i+1];
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
915 break;
b90828c162f5 more decorrelation types
alex
parents: 2183
diff changeset
916 }
2182
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
917
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
918 if (!s->lossless)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
919 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
920 s->int_samples[i] = shift(s->int_samples[i], SAMPLE_SHIFT);
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
921
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
922 // internal -> short
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
923 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
924 {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
925 if (s->int_samples[i] > 32767)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
926 samples[i] = 32767;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
927 else if (s->int_samples[i] < -32768)
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
928 samples[i] = -32768;
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
929 else
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
930 samples[i] = s->int_samples[i];
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
931 }
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
932
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
933 align_get_bits(&gb);
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 *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
936
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
937 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
938 }
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 #ifdef CONFIG_ENCODERS
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
941 AVCodec sonic_encoder = {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
942 "sonic",
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
943 CODEC_TYPE_AUDIO,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
944 CODEC_ID_SONIC,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
945 sizeof(SonicContext),
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
946 sonic_encode_init,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
947 sonic_encode_frame,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
948 sonic_encode_close,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
949 NULL,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
950 };
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
951
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
952 AVCodec sonic_ls_encoder = {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
953 "sonicls",
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
954 CODEC_TYPE_AUDIO,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
955 CODEC_ID_SONIC_LS,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
956 sizeof(SonicContext),
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
957 sonic_encode_init,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
958 sonic_encode_frame,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
959 sonic_encode_close,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
960 NULL,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
961 };
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
962 #endif
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
963
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
964 #ifdef CONFIG_DECODERS
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
965 AVCodec sonic_decoder = {
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
966 "sonic",
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
967 CODEC_TYPE_AUDIO,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
968 CODEC_ID_SONIC,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
969 sizeof(SonicContext),
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
970 sonic_decode_init,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
971 NULL,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
972 sonic_decode_close,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
973 sonic_decode_frame,
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
974 };
113732773bda new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff changeset
975 #endif