Mercurial > libavcodec.hg
annotate sonic.c @ 9675:2e84b386a8b6 libavcodec
Fix for a problem with inverted sign of output data from ffvorbis decoder.
Now the sign of audio samples in ffvorbis output is the same as in original
uncompressed audio file and this also allows the use of tiny_psnr to compare
ffvorbis with libvorbis/tremor.
author | serge |
---|---|
date | Wed, 20 May 2009 07:24:38 +0000 |
parents | 0dce4fe6e6f3 |
children | 4ebcb6c121e4 |
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 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
5 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
6 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
8 * 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
|
9 * License as published by the Free Software Foundation; either |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
11 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
13 * 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
|
14 * 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
|
15 * 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
|
16 * |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2979
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
20 */ |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
21 #include "avcodec.h" |
9428 | 22 #include "get_bits.h" |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
23 #include "golomb.h" |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
24 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
25 /** |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8590
diff
changeset
|
26 * @file libavcodec/sonic.c |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
27 * 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
|
28 * 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
|
29 * 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
|
30 * |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
31 * TODO: |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
32 * - CABAC put/get_symbol |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
33 * - independent quantizer for channels |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
34 * - >2 channels support |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
35 * - more decorrelation types |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
36 * - more tap_quant tests |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
37 * - 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
|
38 */ |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
39 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
40 #define MAX_CHANNELS 2 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
41 |
2205 | 42 #define MID_SIDE 0 |
43 #define LEFT_SIDE 1 | |
44 #define RIGHT_SIDE 2 | |
45 | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
46 typedef struct SonicContext { |
2205 | 47 int lossless, decorrelation; |
2967 | 48 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
49 int num_taps, downsampling; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
50 double quantization; |
2967 | 51 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
52 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
|
53 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
54 int *tap_quant; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
55 int *int_samples; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
56 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
|
57 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
58 // for encoding |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
59 int *tail; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
60 int tail_size; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
61 int *window; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
62 int window_size; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
63 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
64 // for decoding |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
65 int *predictor_k; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
66 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
|
67 } SonicContext; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
68 |
2979 | 69 #define LATTICE_SHIFT 10 |
70 #define SAMPLE_SHIFT 4 | |
71 #define LATTICE_FACTOR (1 << LATTICE_SHIFT) | |
72 #define SAMPLE_FACTOR (1 << SAMPLE_SHIFT) | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
73 |
2979 | 74 #define BASE_QUANT 0.6 |
75 #define RATE_VARIATION 3.0 | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
76 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
77 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
|
78 { |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
79 if (a < 0) |
2979 | 80 return -( (-a + b/2)/b ); |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
81 else |
2979 | 82 return (a + b/2)/b; |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
83 } |
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 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
|
86 { |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
87 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
|
88 } |
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 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
|
91 { |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
92 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
|
93 } |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
94 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
95 #if 1 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
96 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
|
97 { |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
98 int i; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
99 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
100 for (i = 0; i < entries; i++) |
2979 | 101 set_se_golomb(pb, buf[i]); |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
102 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
103 return 1; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
104 } |
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 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
|
107 { |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
108 int i; |
2967 | 109 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
110 for (i = 0; i < entries; i++) |
2979 | 111 buf[i] = get_se_golomb(gb); |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
112 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
113 return 1; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
114 } |
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 #else |
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 #define ADAPT_LEVEL 8 |
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 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
|
121 { |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
122 int res = 0; |
2967 | 123 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
124 while(x) |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
125 { |
2979 | 126 res++; |
127 x >>= 1; | |
2182
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 return res; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
130 } |
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 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
|
133 { |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
134 int i, bits; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
135 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
136 if (!max) |
2979 | 137 return; |
2182
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 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
|
140 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
141 for (i = 0; i < bits-1; i++) |
2979 | 142 put_bits(pb, 1, value & (1 << i)); |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
143 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
144 if ( (value | (1 << (bits-1))) <= max) |
2979 | 145 put_bits(pb, 1, value & (1 << (bits-1))); |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
146 } |
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 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
|
149 { |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
150 int i, bits, value = 0; |
2967 | 151 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
152 if (!max) |
2979 | 153 return 0; |
2182
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 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
|
156 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
157 for (i = 0; i < bits-1; i++) |
2979 | 158 if (get_bits1(gb)) |
159 value += 1 << i; | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
160 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
161 if ( (value | (1<<(bits-1))) <= max) |
2979 | 162 if (get_bits1(gb)) |
163 value += 1 << (bits-1); | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
164 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
165 return value; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
166 } |
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 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
|
169 { |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
170 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
|
171 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
|
172 int *copy, *bits; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
173 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
174 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
|
175 if (!copy) |
2979 | 176 return -1; |
2967 | 177 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
178 if (base_2_part) |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
179 { |
2979 | 180 int energy = 0; |
2967 | 181 |
2979 | 182 for (i = 0; i < entries; i++) |
183 energy += abs(buf[i]); | |
2967 | 184 |
2979 | 185 low_bits = bits_to_store(energy / (entries * 2)); |
186 if (low_bits > 15) | |
187 low_bits = 15; | |
2967 | 188 |
2979 | 189 put_bits(pb, 4, low_bits); |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
190 } |
2967 | 191 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
192 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
|
193 { |
2979 | 194 put_bits(pb, low_bits, abs(buf[i])); |
195 copy[i] = abs(buf[i]) >> low_bits; | |
196 if (copy[i] > max) | |
197 max = abs(copy[i]); | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
198 } |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
199 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
200 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
|
201 if (!bits) |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
202 { |
2979 | 203 // av_free(copy); |
204 return -1; | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
205 } |
2967 | 206 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
207 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
|
208 { |
2979 | 209 for (j = 0; j < entries; j++) |
210 if (copy[j] >= i) | |
211 bits[x++] = copy[j] > i; | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
212 } |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
213 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
214 // store bitstream |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
215 while (pos < x) |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
216 { |
2979 | 217 int steplet = step >> 8; |
2967 | 218 |
2979 | 219 if (pos + steplet > x) |
220 steplet = x - pos; | |
2967 | 221 |
2979 | 222 for (i = 0; i < steplet; i++) |
223 if (bits[i+pos] != dominant) | |
224 any = 1; | |
2967 | 225 |
2979 | 226 put_bits(pb, 1, any); |
2967 | 227 |
2979 | 228 if (!any) |
229 { | |
230 pos += steplet; | |
231 step += step / ADAPT_LEVEL; | |
232 } | |
233 else | |
234 { | |
235 int interloper = 0; | |
2967 | 236 |
2979 | 237 while (((pos + interloper) < x) && (bits[pos + interloper] == dominant)) |
238 interloper++; | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
239 |
2979 | 240 // note change |
241 write_uint_max(pb, interloper, (step >> 8) - 1); | |
2967 | 242 |
2979 | 243 pos += interloper + 1; |
244 step -= step / ADAPT_LEVEL; | |
245 } | |
2967 | 246 |
2979 | 247 if (step < 256) |
248 { | |
249 step = 65536 / step; | |
250 dominant = !dominant; | |
251 } | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
252 } |
2967 | 253 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
254 // store signs |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
255 for (i = 0; i < entries; i++) |
2979 | 256 if (buf[i]) |
257 put_bits(pb, 1, buf[i] < 0); | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
258 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
259 // av_free(bits); |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
260 // av_free(copy); |
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 return 0; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
263 } |
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 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
|
266 { |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
267 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
|
268 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
|
269 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
|
270 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
|
271 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
272 if (!bits) |
2979 | 273 return -1; |
2967 | 274 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
275 if (base_2_part) |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
276 { |
2979 | 277 low_bits = get_bits(gb, 4); |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
278 |
2979 | 279 if (low_bits) |
280 for (i = 0; i < entries; i++) | |
281 buf[i] = get_bits(gb, low_bits); | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
282 } |
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 // 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
|
285 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
286 while (n_zeros < entries) |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
287 { |
2979 | 288 int steplet = step >> 8; |
2967 | 289 |
2979 | 290 if (!get_bits1(gb)) |
291 { | |
292 for (i = 0; i < steplet; i++) | |
293 bits[x++] = dominant; | |
2967 | 294 |
2979 | 295 if (!dominant) |
296 n_zeros += steplet; | |
2967 | 297 |
2979 | 298 step += step / ADAPT_LEVEL; |
299 } | |
300 else | |
301 { | |
302 int actual_run = read_uint_max(gb, steplet-1); | |
2967 | 303 |
2979 | 304 // av_log(NULL, AV_LOG_INFO, "actual run: %d\n", actual_run); |
2967 | 305 |
2979 | 306 for (i = 0; i < actual_run; i++) |
307 bits[x++] = dominant; | |
2967 | 308 |
2979 | 309 bits[x++] = !dominant; |
2967 | 310 |
2979 | 311 if (!dominant) |
312 n_zeros += actual_run; | |
313 else | |
314 n_zeros++; | |
2967 | 315 |
2979 | 316 step -= step / ADAPT_LEVEL; |
317 } | |
2967 | 318 |
2979 | 319 if (step < 256) |
320 { | |
321 step = 65536 / step; | |
322 dominant = !dominant; | |
323 } | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
324 } |
2967 | 325 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
326 // reconstruct unsigned values |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
327 n_zeros = 0; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
328 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
|
329 { |
2979 | 330 while(1) |
331 { | |
332 if (pos >= entries) | |
333 { | |
334 pos = 0; | |
335 level += 1 << low_bits; | |
336 } | |
2967 | 337 |
2979 | 338 if (buf[pos] >= level) |
339 break; | |
2967 | 340 |
2979 | 341 pos++; |
342 } | |
2967 | 343 |
2979 | 344 if (bits[i]) |
345 buf[pos] += 1 << low_bits; | |
346 else | |
347 n_zeros++; | |
2967 | 348 |
2979 | 349 pos++; |
2182
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 // av_free(bits); |
2967 | 352 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
353 // read signs |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
354 for (i = 0; i < entries; i++) |
2979 | 355 if (buf[i] && get_bits1(gb)) |
356 buf[i] = -buf[i]; | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
357 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
358 // 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
|
359 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
360 return 0; |
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 #endif |
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 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
|
365 { |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
366 int 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 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
|
369 { |
2979 | 370 int j, p, x = state[i]; |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
371 |
2979 | 372 for (j = 0, p = i+1; p < order; j++,p++) |
373 { | |
374 int tmp = x + shift_down(k[j] * state[p], LATTICE_SHIFT); | |
375 state[p] += shift_down(k[j]*x, LATTICE_SHIFT); | |
376 x = tmp; | |
377 } | |
2182
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 } |
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 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
|
382 { |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
383 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
|
384 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
385 #if 1 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
386 int *k_ptr = &(k[order-2]), |
2979 | 387 *state_ptr = &(state[order-2]); |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
388 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
|
389 { |
2979 | 390 int k_value = *k_ptr, state_value = *state_ptr; |
391 x -= shift_down(k_value * state_value, LATTICE_SHIFT); | |
392 state_ptr[1] = state_value + shift_down(k_value * x, LATTICE_SHIFT); | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
393 } |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
394 #else |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
395 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
|
396 { |
2979 | 397 x -= shift_down(k[i] * state[i], LATTICE_SHIFT); |
398 state[i+1] = state[i] + shift_down(k[i] * x, LATTICE_SHIFT); | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
399 } |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
400 #endif |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
401 |
2967 | 402 // don't drift too far, to avoid overflows |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
403 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
|
404 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
|
405 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
406 state[0] = 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 return x; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
409 } |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
410 |
8590 | 411 #if CONFIG_SONIC_ENCODER || CONFIG_SONIC_LS_ENCODER |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
412 // 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
|
413 // 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
|
414 // 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
|
415 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
416 static void modified_levinson_durbin(int *window, int window_entries, |
2979 | 417 int *out, int out_entries, int channels, int *tap_quant) |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
418 { |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
419 int i; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
420 int *state = av_mallocz(4* window_entries); |
2967 | 421 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
422 memcpy(state, window, 4* window_entries); |
2967 | 423 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
424 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
|
425 { |
2979 | 426 int step = (i+1)*channels, k, j; |
427 double xx = 0.0, xy = 0.0; | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
428 #if 1 |
2979 | 429 int *x_ptr = &(window[step]), *state_ptr = &(state[0]); |
430 j = window_entries - step; | |
431 for (;j>=0;j--,x_ptr++,state_ptr++) | |
432 { | |
433 double x_value = *x_ptr, state_value = *state_ptr; | |
434 xx += state_value*state_value; | |
435 xy += x_value*state_value; | |
436 } | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
437 #else |
2979 | 438 for (j = 0; j <= (window_entries - step); j++); |
439 { | |
440 double stepval = window[step+j], stateval = window[j]; | |
441 // xx += (double)window[j]*(double)window[j]; | |
442 // xy += (double)window[step+j]*(double)window[j]; | |
443 xx += stateval*stateval; | |
444 xy += stepval*stateval; | |
445 } | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
446 #endif |
2979 | 447 if (xx == 0.0) |
448 k = 0; | |
449 else | |
450 k = (int)(floor(-xy/xx * (double)LATTICE_FACTOR / (double)(tap_quant[i]) + 0.5)); | |
2967 | 451 |
2979 | 452 if (k > (LATTICE_FACTOR/tap_quant[i])) |
453 k = LATTICE_FACTOR/tap_quant[i]; | |
454 if (-k > (LATTICE_FACTOR/tap_quant[i])) | |
455 k = -(LATTICE_FACTOR/tap_quant[i]); | |
2967 | 456 |
2979 | 457 out[i] = k; |
458 k *= tap_quant[i]; | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
459 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
460 #if 1 |
2979 | 461 x_ptr = &(window[step]); |
462 state_ptr = &(state[0]); | |
463 j = window_entries - step; | |
464 for (;j>=0;j--,x_ptr++,state_ptr++) | |
465 { | |
466 int x_value = *x_ptr, state_value = *state_ptr; | |
467 *x_ptr = x_value + shift_down(k*state_value,LATTICE_SHIFT); | |
468 *state_ptr = state_value + shift_down(k*x_value, LATTICE_SHIFT); | |
469 } | |
2967 | 470 #else |
2979 | 471 for (j=0; j <= (window_entries - step); j++) |
472 { | |
473 int stepval = window[step+j], stateval=state[j]; | |
474 window[step+j] += shift_down(k * stateval, LATTICE_SHIFT); | |
475 state[j] += shift_down(k * stepval, LATTICE_SHIFT); | |
476 } | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
477 #endif |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
478 } |
2967 | 479 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
480 av_free(state); |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
481 } |
8590 | 482 #endif /* CONFIG_SONIC_ENCODER || CONFIG_SONIC_LS_ENCODER */ |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
483 |
7129 | 484 static const int samplerate_table[] = |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
485 { 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
|
486 |
8590 | 487 #if CONFIG_SONIC_ENCODER || CONFIG_SONIC_LS_ENCODER |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
488 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
|
489 { |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
490 switch (samplerate) |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
491 { |
2979 | 492 case 44100: return 0; |
493 case 22050: return 1; | |
494 case 11025: return 2; | |
495 case 96000: return 3; | |
496 case 48000: return 4; | |
497 case 32000: return 5; | |
498 case 24000: return 6; | |
499 case 16000: return 7; | |
500 case 8000: return 8; | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
501 } |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
502 return -1; |
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 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6253
diff
changeset
|
505 static av_cold int sonic_encode_init(AVCodecContext *avctx) |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
506 { |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
507 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
|
508 PutBitContext pb; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
509 int i, version = 0; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
510 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
511 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
|
512 { |
2979 | 513 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
|
514 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
|
515 } |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
516 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
517 if (avctx->channels == 2) |
2979 | 518 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
|
519 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
520 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
|
521 { |
2979 | 522 s->lossless = 1; |
523 s->num_taps = 32; | |
524 s->downsampling = 1; | |
525 s->quantization = 0.0; | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
526 } |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
527 else |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
528 { |
2979 | 529 s->num_taps = 128; |
530 s->downsampling = 2; | |
531 s->quantization = 1.0; | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
532 } |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
533 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
534 // max tap 2048 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
535 if ((s->num_taps < 32) || (s->num_taps > 1024) || |
2979 | 536 ((s->num_taps>>5)<<5 != s->num_taps)) |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
537 { |
2979 | 538 av_log(avctx, AV_LOG_ERROR, "Invalid number of taps\n"); |
539 return -1; | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
540 } |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
541 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
542 // generate taps |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
543 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
|
544 for (i = 0; i < s->num_taps; i++) |
2979 | 545 s->tap_quant[i] = (int)(sqrt(i+1)); |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
546 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
547 s->channels = avctx->channels; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
548 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
|
549 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
550 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
|
551 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
|
552 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
553 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
|
554 if (!s->tail) |
2979 | 555 return -1; |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
556 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
|
557 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
558 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
|
559 if (!s->predictor_k) |
2979 | 560 return -1; |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
561 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
562 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
|
563 { |
2979 | 564 s->coded_samples[i] = av_mallocz(4* s->block_align); |
565 if (!s->coded_samples[i]) | |
566 return -1; | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
567 } |
2967 | 568 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
569 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
|
570 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
571 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
|
572 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
|
573 if (!s->window) |
2979 | 574 return -1; |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
575 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
576 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
|
577 if (!avctx->extradata) |
2979 | 578 return -1; |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
579 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
|
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, version); // version |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
582 if (version == 1) |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
583 { |
2979 | 584 put_bits(&pb, 2, s->channels); |
585 put_bits(&pb, 4, code_samplerate(s->samplerate)); | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
586 } |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
587 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
|
588 if (!s->lossless) |
2979 | 589 put_bits(&pb, 3, SAMPLE_SHIFT); // XXX FIXME: sample precision |
2205 | 590 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
|
591 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
|
592 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
|
593 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
|
594 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
595 flush_put_bits(&pb); |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
596 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
|
597 |
2205 | 598 av_log(avctx, AV_LOG_INFO, "Sonic: ver: %d ls: %d dr: %d taps: %d block: %d frame: %d downsamp: %d\n", |
2979 | 599 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
|
600 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
601 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
|
602 if (!avctx->coded_frame) |
4520
9bf957e669f0
This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents:
3947
diff
changeset
|
603 return AVERROR(ENOMEM); |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
604 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
|
605 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
|
606 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
607 return 0; |
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 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6253
diff
changeset
|
610 static av_cold int sonic_encode_close(AVCodecContext *avctx) |
2182
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 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
|
613 int i; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
614 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
615 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
|
616 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
617 for (i = 0; i < s->channels; i++) |
2979 | 618 av_free(s->coded_samples[i]); |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
619 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
620 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
|
621 av_free(s->tail); |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
622 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
|
623 av_free(s->window); |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
624 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
|
625 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
626 return 0; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
627 } |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
628 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
629 static int sonic_encode_frame(AVCodecContext *avctx, |
2979 | 630 uint8_t *buf, int buf_size, void *data) |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
631 { |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
632 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
|
633 PutBitContext pb; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
634 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
|
635 short *samples = data; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
636 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
637 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
|
638 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
639 // short -> internal |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
640 for (i = 0; i < s->frame_size; i++) |
2979 | 641 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
|
642 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
643 if (!s->lossless) |
2979 | 644 for (i = 0; i < s->frame_size; i++) |
645 s->int_samples[i] = s->int_samples[i] << SAMPLE_SHIFT; | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
646 |
2205 | 647 switch(s->decorrelation) |
648 { | |
2979 | 649 case MID_SIDE: |
650 for (i = 0; i < s->frame_size; i += s->channels) | |
651 { | |
652 s->int_samples[i] += s->int_samples[i+1]; | |
653 s->int_samples[i+1] -= shift(s->int_samples[i], 1); | |
654 } | |
655 break; | |
656 case LEFT_SIDE: | |
657 for (i = 0; i < s->frame_size; i += s->channels) | |
658 s->int_samples[i+1] -= s->int_samples[i]; | |
659 break; | |
660 case RIGHT_SIDE: | |
661 for (i = 0; i < s->frame_size; i += s->channels) | |
662 s->int_samples[i] -= s->int_samples[i+1]; | |
663 break; | |
2205 | 664 } |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
665 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
666 memset(s->window, 0, 4* s->window_size); |
2967 | 667 |
2182
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->tail_size; i++) |
2979 | 669 s->window[x++] = s->tail[i]; |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
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->frame_size; i++) |
2979 | 672 s->window[x++] = s->int_samples[i]; |
2967 | 673 |
2182
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++) |
2979 | 675 s->window[x++] = 0; |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
676 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
677 for (i = 0; i < s->tail_size; i++) |
2979 | 678 s->tail[i] = s->int_samples[s->frame_size - s->tail_size + i]; |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
679 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
680 // generate taps |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
681 modified_levinson_durbin(s->window, s->window_size, |
2979 | 682 s->predictor_k, s->num_taps, s->channels, s->tap_quant); |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
683 if (intlist_write(&pb, s->predictor_k, s->num_taps, 0) < 0) |
2979 | 684 return -1; |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
685 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
686 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
|
687 { |
2979 | 688 x = s->tail_size+ch; |
689 for (i = 0; i < s->block_align; i++) | |
690 { | |
691 int sum = 0; | |
692 for (j = 0; j < s->downsampling; j++, x += s->channels) | |
693 sum += s->window[x]; | |
694 s->coded_samples[ch][i] = sum; | |
695 } | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
696 } |
2967 | 697 |
698 // simple rate control code | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
699 if (!s->lossless) |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
700 { |
2979 | 701 double energy1 = 0.0, energy2 = 0.0; |
702 for (ch = 0; ch < s->channels; ch++) | |
703 { | |
704 for (i = 0; i < s->block_align; i++) | |
705 { | |
706 double sample = s->coded_samples[ch][i]; | |
707 energy2 += sample*sample; | |
708 energy1 += fabs(sample); | |
709 } | |
710 } | |
2967 | 711 |
2979 | 712 energy2 = sqrt(energy2/(s->channels*s->block_align)); |
713 energy1 = sqrt(2.0)*energy1/(s->channels*s->block_align); | |
2967 | 714 |
2979 | 715 // increase bitrate when samples are like a gaussian distribution |
716 // reduce bitrate when samples are like a two-tailed exponential distribution | |
2967 | 717 |
2979 | 718 if (energy2 > energy1) |
719 energy2 += (energy2-energy1)*RATE_VARIATION; | |
2967 | 720 |
2979 | 721 quant = (int)(BASE_QUANT*s->quantization*energy2/SAMPLE_FACTOR); |
722 // av_log(avctx, AV_LOG_DEBUG, "quant: %d energy: %f / %f\n", quant, energy1, energy2); | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
723 |
2979 | 724 if (quant < 1) |
725 quant = 1; | |
726 if (quant > 65535) | |
727 quant = 65535; | |
2967 | 728 |
2979 | 729 set_ue_golomb(&pb, quant); |
2967 | 730 |
2979 | 731 quant *= SAMPLE_FACTOR; |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
732 } |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
733 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
734 // write out coded samples |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
735 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
|
736 { |
2979 | 737 if (!s->lossless) |
738 for (i = 0; i < s->block_align; i++) | |
739 s->coded_samples[ch][i] = divide(s->coded_samples[ch][i], quant); | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
740 |
2979 | 741 if (intlist_write(&pb, s->coded_samples[ch], s->block_align, 1) < 0) |
742 return -1; | |
2182
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 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
745 // 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
|
746 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
747 flush_put_bits(&pb); |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
748 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
|
749 } |
8590 | 750 #endif /* CONFIG_SONIC_ENCODER || CONFIG_SONIC_LS_ENCODER */ |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
751 |
8590 | 752 #if CONFIG_SONIC_DECODER |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6253
diff
changeset
|
753 static av_cold int sonic_decode_init(AVCodecContext *avctx) |
2182
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 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
|
756 GetBitContext gb; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
757 int i, version; |
2967 | 758 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
759 s->channels = avctx->channels; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
760 s->samplerate = avctx->sample_rate; |
2967 | 761 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
762 if (!avctx->extradata) |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
763 { |
2979 | 764 av_log(avctx, AV_LOG_ERROR, "No mandatory headers present\n"); |
765 return -1; | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
766 } |
2967 | 767 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
768 init_get_bits(&gb, avctx->extradata, avctx->extradata_size); |
2967 | 769 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
770 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
|
771 if (version > 1) |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
772 { |
2979 | 773 av_log(avctx, AV_LOG_ERROR, "Unsupported Sonic version, please report\n"); |
774 return -1; | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
775 } |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
776 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
777 if (version == 1) |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
778 { |
2979 | 779 s->channels = get_bits(&gb, 2); |
780 s->samplerate = samplerate_table[get_bits(&gb, 4)]; | |
781 av_log(avctx, AV_LOG_INFO, "Sonicv2 chans: %d samprate: %d\n", | |
782 s->channels, s->samplerate); | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
783 } |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
784 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
785 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
|
786 { |
2979 | 787 av_log(avctx, AV_LOG_ERROR, "Only mono and stereo streams are supported by now\n"); |
788 return -1; | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
789 } |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
790 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
791 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
|
792 if (!s->lossless) |
2979 | 793 skip_bits(&gb, 3); // XXX FIXME |
2205 | 794 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
|
795 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
796 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
|
797 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
|
798 if (get_bits1(&gb)) // XXX FIXME |
2979 | 799 av_log(avctx, AV_LOG_INFO, "Custom quant table\n"); |
2967 | 800 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
801 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
|
802 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
|
803 // 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
|
804 |
2205 | 805 av_log(avctx, AV_LOG_INFO, "Sonic: ver: %d ls: %d dr: %d taps: %d block: %d frame: %d downsamp: %d\n", |
2979 | 806 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
|
807 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
808 // generate taps |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
809 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
|
810 for (i = 0; i < s->num_taps; i++) |
2979 | 811 s->tap_quant[i] = (int)(sqrt(i+1)); |
2967 | 812 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
813 s->predictor_k = av_mallocz(4* s->num_taps); |
2967 | 814 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
815 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
|
816 { |
2979 | 817 s->predictor_state[i] = av_mallocz(4* s->num_taps); |
818 if (!s->predictor_state[i]) | |
819 return -1; | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
820 } |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
821 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
822 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
|
823 { |
2979 | 824 s->coded_samples[i] = av_mallocz(4* s->block_align); |
825 if (!s->coded_samples[i]) | |
826 return -1; | |
2182
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 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
|
829 |
7451
85ab7655ad4d
Modify all codecs to report their supported input and output sample format(s).
pross
parents:
7129
diff
changeset
|
830 avctx->sample_fmt = SAMPLE_FMT_S16; |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
831 return 0; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
832 } |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
833 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6253
diff
changeset
|
834 static av_cold int sonic_decode_close(AVCodecContext *avctx) |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
835 { |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
836 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
|
837 int i; |
2967 | 838 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
839 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
|
840 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
|
841 av_free(s->predictor_k); |
2967 | 842 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
843 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
|
844 { |
2979 | 845 av_free(s->predictor_state[i]); |
846 av_free(s->coded_samples[i]); | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
847 } |
2967 | 848 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
849 return 0; |
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 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
852 static int sonic_decode_frame(AVCodecContext *avctx, |
2979 | 853 void *data, int *data_size, |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
854 AVPacket *avpkt) |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
855 { |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
856 const uint8_t *buf = avpkt->data; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
857 int buf_size = avpkt->size; |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
858 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
|
859 GetBitContext gb; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
860 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
|
861 short *samples = data; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
862 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
863 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
|
864 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
865 // av_log(NULL, AV_LOG_INFO, "buf_size: %d\n", buf_size); |
2967 | 866 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
867 init_get_bits(&gb, buf, buf_size*8); |
2967 | 868 |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
869 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
|
870 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
871 // dequantize |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
872 for (i = 0; i < s->num_taps; i++) |
2979 | 873 s->predictor_k[i] *= s->tap_quant[i]; |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
874 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
875 if (s->lossless) |
2979 | 876 quant = 1; |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
877 else |
2979 | 878 quant = get_ue_golomb(&gb) * SAMPLE_FACTOR; |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
879 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
880 // 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
|
881 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
882 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
|
883 { |
2979 | 884 int x = ch; |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
885 |
2979 | 886 predictor_init_state(s->predictor_k, s->predictor_state[ch], s->num_taps); |
2967 | 887 |
2979 | 888 intlist_read(&gb, s->coded_samples[ch], s->block_align, 1); |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
889 |
2979 | 890 for (i = 0; i < s->block_align; i++) |
891 { | |
892 for (j = 0; j < s->downsampling - 1; j++) | |
893 { | |
894 s->int_samples[x] = predictor_calc_error(s->predictor_k, s->predictor_state[ch], s->num_taps, 0); | |
895 x += s->channels; | |
896 } | |
2967 | 897 |
2979 | 898 s->int_samples[x] = predictor_calc_error(s->predictor_k, s->predictor_state[ch], s->num_taps, s->coded_samples[ch][i] * quant); |
899 x += s->channels; | |
900 } | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
901 |
2979 | 902 for (i = 0; i < s->num_taps; i++) |
903 s->predictor_state[ch][i] = s->int_samples[s->frame_size - s->channels + ch - i*s->channels]; | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
904 } |
2967 | 905 |
2205 | 906 switch(s->decorrelation) |
907 { | |
2979 | 908 case MID_SIDE: |
909 for (i = 0; i < s->frame_size; i += s->channels) | |
910 { | |
911 s->int_samples[i+1] += shift(s->int_samples[i], 1); | |
912 s->int_samples[i] -= s->int_samples[i+1]; | |
913 } | |
914 break; | |
915 case LEFT_SIDE: | |
916 for (i = 0; i < s->frame_size; i += s->channels) | |
917 s->int_samples[i+1] += s->int_samples[i]; | |
918 break; | |
919 case RIGHT_SIDE: | |
920 for (i = 0; i < s->frame_size; i += s->channels) | |
921 s->int_samples[i] += s->int_samples[i+1]; | |
922 break; | |
2205 | 923 } |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
924 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
925 if (!s->lossless) |
2979 | 926 for (i = 0; i < s->frame_size; i++) |
927 s->int_samples[i] = shift(s->int_samples[i], SAMPLE_SHIFT); | |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
928 |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
929 // internal -> short |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
930 for (i = 0; i < s->frame_size; i++) |
5523 | 931 samples[i] = av_clip_int16(s->int_samples[i]); |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
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 } |
7776
dbcdd0165e55
Replace generic CONFIG_DECODERS preprocessor conditionals by more specific
diego
parents:
7451
diff
changeset
|
939 #endif /* CONFIG_SONIC_DECODER */ |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
940 |
8590 | 941 #if CONFIG_SONIC_ENCODER |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
942 AVCodec sonic_encoder = { |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
943 "sonic", |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
944 CODEC_TYPE_AUDIO, |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
945 CODEC_ID_SONIC, |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
946 sizeof(SonicContext), |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
947 sonic_encode_init, |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
948 sonic_encode_frame, |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
949 sonic_encode_close, |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
950 NULL, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6713
diff
changeset
|
951 .long_name = NULL_IF_CONFIG_SMALL("Sonic"), |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
952 }; |
7782
6efb15a24e91
Replace generic CONFIG_ENCODERS preprocessor conditionals by more specific
diego
parents:
7776
diff
changeset
|
953 #endif |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
954 |
8590 | 955 #if CONFIG_SONIC_LS_ENCODER |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
956 AVCodec sonic_ls_encoder = { |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
957 "sonicls", |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
958 CODEC_TYPE_AUDIO, |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
959 CODEC_ID_SONIC_LS, |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
960 sizeof(SonicContext), |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
961 sonic_encode_init, |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
962 sonic_encode_frame, |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
963 sonic_encode_close, |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
964 NULL, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6713
diff
changeset
|
965 .long_name = NULL_IF_CONFIG_SMALL("Sonic lossless"), |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
966 }; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
967 #endif |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
968 |
8590 | 969 #if CONFIG_SONIC_DECODER |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
970 AVCodec sonic_decoder = { |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
971 "sonic", |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
972 CODEC_TYPE_AUDIO, |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
973 CODEC_ID_SONIC, |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
974 sizeof(SonicContext), |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
975 sonic_decode_init, |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
976 NULL, |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
977 sonic_decode_close, |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
978 sonic_decode_frame, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6713
diff
changeset
|
979 .long_name = NULL_IF_CONFIG_SMALL("Sonic"), |
2182
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
980 }; |
113732773bda
new opensource lossy/lossless audio codec based on speech compression techniques (actually based on bonk)
alex
parents:
diff
changeset
|
981 #endif |