Mercurial > libavcodec.hg
annotate truespeech.c @ 4166:eced83504436 libavcodec
mp3 header (de)compression bitstream filter
this will make mp3 frames 4 bytes smaller, it will not give you binary identical mp3 files, but it will give you mp3 files which decode to binary identical output
this will only work in containers providing at least packet size, sample_rate and number of channels
bugreports about mp3 files for which this fails are welcome
and this is experimental (dont expect compatibility and dont even expect to be able to decompress what you compressed, hell dont even expect this to work without editing the source a little)
author | michael |
---|---|
date | Fri, 10 Nov 2006 01:41:53 +0000 |
parents | c8c591fe26f8 |
children | 05e932ddaaa9 |
rev | line source |
---|---|
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
1 /* |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
2 * DSP Group TrueSpeech compatible decoder |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
3 * Copyright (c) 2005 Konstantin Shishkov |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
4 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3347
diff
changeset
|
5 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3347
diff
changeset
|
6 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3347
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
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:
3347
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
11 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3347
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
15 * Lesser General Public License for more details. |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
16 * |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
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:
3347
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:
3006
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
20 */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
21 #include "avcodec.h" |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
22 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
23 #include "truespeech_data.h" |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
24 /** |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
25 * @file truespeech.c |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
26 * TrueSpeech decoder. |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
27 */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
28 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
29 /** |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
30 * TrueSpeech decoder context |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
31 */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
32 typedef struct { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
33 /* input data */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
34 int16_t vector[8]; //< input vector: 5/5/4/4/4/3/3/3 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
35 int offset1[2]; //< 8-bit value, used in one copying offset |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
36 int offset2[4]; //< 7-bit value, encodes offsets for copying and for two-point filter |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
37 int pulseoff[4]; //< 4-bit offset of pulse values block |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
38 int pulsepos[4]; //< 27-bit variable, encodes 7 pulse positions |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
39 int pulseval[4]; //< 7x2-bit pulse values |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
40 int flag; //< 1-bit flag, shows how to choose filters |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
41 /* temporary data */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
42 int filtbuf[146]; // some big vector used for storing filters |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
43 int prevfilt[8]; // filter from previous frame |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
44 int16_t tmp1[8]; // coefficients for adding to out |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
45 int16_t tmp2[8]; // coefficients for adding to out |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
46 int16_t tmp3[8]; // coefficients for adding to out |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
47 int16_t cvector[8]; // correlated input vector |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
48 int filtval; // gain value for one function |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
49 int16_t newvec[60]; // tmp vector |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
50 int16_t filters[32]; // filters for every subframe |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
51 } TSContext; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
52 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
53 static int truespeech_decode_init(AVCodecContext * avctx) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
54 { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
55 // TSContext *c = avctx->priv_data; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
56 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
57 return 0; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
58 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
59 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
60 static void truespeech_read_frame(TSContext *dec, uint8_t *input) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
61 { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
62 uint32_t t; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
63 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
64 /* first dword */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
65 t = LE_32(input); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
66 input += 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
67 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
68 dec->flag = t & 1; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
69 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
70 dec->vector[0] = ts_codebook[0][(t >> 1) & 0x1F]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
71 dec->vector[1] = ts_codebook[1][(t >> 6) & 0x1F]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
72 dec->vector[2] = ts_codebook[2][(t >> 11) & 0xF]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
73 dec->vector[3] = ts_codebook[3][(t >> 15) & 0xF]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
74 dec->vector[4] = ts_codebook[4][(t >> 19) & 0xF]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
75 dec->vector[5] = ts_codebook[5][(t >> 23) & 0x7]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
76 dec->vector[6] = ts_codebook[6][(t >> 26) & 0x7]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
77 dec->vector[7] = ts_codebook[7][(t >> 29) & 0x7]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
78 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
79 /* second dword */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
80 t = LE_32(input); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
81 input += 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
82 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
83 dec->offset2[0] = (t >> 0) & 0x7F; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
84 dec->offset2[1] = (t >> 7) & 0x7F; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
85 dec->offset2[2] = (t >> 14) & 0x7F; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
86 dec->offset2[3] = (t >> 21) & 0x7F; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
87 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
88 dec->offset1[0] = ((t >> 28) & 0xF) << 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
89 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
90 /* third dword */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
91 t = LE_32(input); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
92 input += 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
93 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
94 dec->pulseval[0] = (t >> 0) & 0x3FFF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
95 dec->pulseval[1] = (t >> 14) & 0x3FFF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
96 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
97 dec->offset1[1] = (t >> 28) & 0x0F; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
98 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
99 /* fourth dword */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
100 t = LE_32(input); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
101 input += 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
102 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
103 dec->pulseval[2] = (t >> 0) & 0x3FFF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
104 dec->pulseval[3] = (t >> 14) & 0x3FFF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
105 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
106 dec->offset1[1] |= ((t >> 28) & 0x0F) << 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
107 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
108 /* fifth dword */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
109 t = LE_32(input); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
110 input += 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
111 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
112 dec->pulsepos[0] = (t >> 4) & 0x7FFFFFF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
113 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
114 dec->pulseoff[0] = (t >> 0) & 0xF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
115 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
116 dec->offset1[0] |= (t >> 31) & 1; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
117 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
118 /* sixth dword */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
119 t = LE_32(input); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
120 input += 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
121 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
122 dec->pulsepos[1] = (t >> 4) & 0x7FFFFFF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
123 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
124 dec->pulseoff[1] = (t >> 0) & 0xF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
125 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
126 dec->offset1[0] |= ((t >> 31) & 1) << 1; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
127 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
128 /* seventh dword */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
129 t = LE_32(input); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
130 input += 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
131 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
132 dec->pulsepos[2] = (t >> 4) & 0x7FFFFFF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
133 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
134 dec->pulseoff[2] = (t >> 0) & 0xF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
135 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
136 dec->offset1[0] |= ((t >> 31) & 1) << 2; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
137 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
138 /* eighth dword */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
139 t = LE_32(input); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
140 input += 4; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
141 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
142 dec->pulsepos[3] = (t >> 4) & 0x7FFFFFF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
143 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
144 dec->pulseoff[3] = (t >> 0) & 0xF; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
145 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
146 dec->offset1[0] |= ((t >> 31) & 1) << 3; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
147 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
148 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
149 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
150 static void truespeech_correlate_filter(TSContext *dec) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
151 { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
152 int16_t tmp[8]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
153 int i, j; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
154 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
155 for(i = 0; i < 8; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
156 if(i > 0){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
157 memcpy(tmp, dec->cvector, i * 2); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
158 for(j = 0; j < i; j++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
159 dec->cvector[j] = ((tmp[i - j - 1] * dec->vector[i]) + |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
160 (dec->cvector[j] << 15) + 0x4000) >> 15; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
161 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
162 dec->cvector[i] = (8 - dec->vector[i]) >> 3; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
163 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
164 for(i = 0; i < 8; i++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
165 dec->cvector[i] = (dec->cvector[i] * ts_230[i]) >> 15; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
166 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
167 dec->filtval = dec->vector[0]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
168 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
169 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
170 static void truespeech_filters_merge(TSContext *dec) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
171 { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
172 int i; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
173 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
174 if(!dec->flag){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
175 for(i = 0; i < 8; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
176 dec->filters[i + 0] = dec->prevfilt[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
177 dec->filters[i + 8] = dec->prevfilt[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
178 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
179 }else{ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
180 for(i = 0; i < 8; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
181 dec->filters[i + 0]=(dec->cvector[i] * 21846 + dec->prevfilt[i] * 10923 + 16384) >> 15; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
182 dec->filters[i + 8]=(dec->cvector[i] * 10923 + dec->prevfilt[i] * 21846 + 16384) >> 15; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
183 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
184 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
185 for(i = 0; i < 8; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
186 dec->filters[i + 16] = dec->cvector[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
187 dec->filters[i + 24] = dec->cvector[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
188 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
189 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
190 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
191 static void truespeech_apply_twopoint_filter(TSContext *dec, int quart) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
192 { |
3347
82277c821113
Add const to (mostly) char* and make some functions static, which aren't used
diego
parents:
3055
diff
changeset
|
193 int16_t tmp[146 + 60], *ptr0, *ptr1; |
82277c821113
Add const to (mostly) char* and make some functions static, which aren't used
diego
parents:
3055
diff
changeset
|
194 const int16_t *filter; |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
195 int i, t, off; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
196 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
197 t = dec->offset2[quart]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
198 if(t == 127){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
199 memset(dec->newvec, 0, 60 * 2); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
200 return; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
201 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
202 for(i = 0; i < 146; i++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
203 tmp[i] = dec->filtbuf[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
204 off = (t / 25) + dec->offset1[quart >> 1] + 18; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
205 ptr0 = tmp + 145 - off; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
206 ptr1 = tmp + 146; |
3347
82277c821113
Add const to (mostly) char* and make some functions static, which aren't used
diego
parents:
3055
diff
changeset
|
207 filter = (const int16_t*)ts_240 + (t % 25) * 2; |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
208 for(i = 0; i < 60; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
209 t = (ptr0[0] * filter[0] + ptr0[1] * filter[1] + 0x2000) >> 14; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
210 ptr0++; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
211 dec->newvec[i] = t; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
212 ptr1[i] = t; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
213 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
214 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
215 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
216 static void truespeech_place_pulses(TSContext *dec, int16_t *out, int quart) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
217 { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
218 int16_t tmp[7]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
219 int i, j, t; |
3347
82277c821113
Add const to (mostly) char* and make some functions static, which aren't used
diego
parents:
3055
diff
changeset
|
220 const int16_t *ptr1; |
82277c821113
Add const to (mostly) char* and make some functions static, which aren't used
diego
parents:
3055
diff
changeset
|
221 int16_t *ptr2; |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
222 int coef; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
223 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
224 memset(out, 0, 60 * 2); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
225 for(i = 0; i < 7; i++) { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
226 t = dec->pulseval[quart] & 3; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
227 dec->pulseval[quart] >>= 2; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
228 tmp[6 - i] = ts_562[dec->pulseoff[quart] * 4 + t]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
229 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
230 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
231 coef = dec->pulsepos[quart] >> 15; |
3347
82277c821113
Add const to (mostly) char* and make some functions static, which aren't used
diego
parents:
3055
diff
changeset
|
232 ptr1 = (const int16_t*)ts_140 + 30; |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
233 ptr2 = tmp; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
234 for(i = 0, j = 3; (i < 30) && (j > 0); i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
235 t = *ptr1++; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
236 if(coef >= t) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
237 coef -= t; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
238 else{ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
239 out[i] = *ptr2++; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
240 ptr1 += 30; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
241 j--; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
242 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
243 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
244 coef = dec->pulsepos[quart] & 0x7FFF; |
3347
82277c821113
Add const to (mostly) char* and make some functions static, which aren't used
diego
parents:
3055
diff
changeset
|
245 ptr1 = (const int16_t*)ts_140; |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
246 for(i = 30, j = 4; (i < 60) && (j > 0); i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
247 t = *ptr1++; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
248 if(coef >= t) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
249 coef -= t; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
250 else{ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
251 out[i] = *ptr2++; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
252 ptr1 += 30; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
253 j--; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
254 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
255 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
256 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
257 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
258 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
259 static void truespeech_update_filters(TSContext *dec, int16_t *out, int quart) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
260 { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
261 int i; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
262 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
263 for(i = 0; i < 86; i++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
264 dec->filtbuf[i] = dec->filtbuf[i + 60]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
265 for(i = 0; i < 60; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
266 dec->filtbuf[i + 86] = out[i] + dec->newvec[i] - (dec->newvec[i] >> 3); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
267 out[i] += dec->newvec[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
268 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
269 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
270 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
271 static void truespeech_synth(TSContext *dec, int16_t *out, int quart) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
272 { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
273 int i,k; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
274 int t[8]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
275 int16_t *ptr0, *ptr1; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
276 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
277 ptr0 = dec->tmp1; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
278 ptr1 = dec->filters + quart * 8; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
279 for(i = 0; i < 60; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
280 int sum = 0; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
281 for(k = 0; k < 8; k++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
282 sum += ptr0[k] * ptr1[k]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
283 sum = (sum + (out[i] << 12) + 0x800) >> 12; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
284 out[i] = clip(sum, -0x7FFE, 0x7FFE); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
285 for(k = 7; k > 0; k--) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
286 ptr0[k] = ptr0[k - 1]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
287 ptr0[0] = out[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
288 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
289 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
290 for(i = 0; i < 8; i++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
291 t[i] = (ts_5E2[i] * ptr1[i]) >> 15; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
292 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
293 ptr0 = dec->tmp2; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
294 for(i = 0; i < 60; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
295 int sum = 0; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
296 for(k = 0; k < 8; k++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
297 sum += ptr0[k] * t[k]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
298 for(k = 7; k > 0; k--) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
299 ptr0[k] = ptr0[k - 1]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
300 ptr0[0] = out[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
301 out[i] = ((out[i] << 12) - sum) >> 12; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
302 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
303 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
304 for(i = 0; i < 8; i++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
305 t[i] = (ts_5F2[i] * ptr1[i]) >> 15; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
306 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
307 ptr0 = dec->tmp3; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
308 for(i = 0; i < 60; i++){ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
309 int sum = out[i] << 12; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
310 for(k = 0; k < 8; k++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
311 sum += ptr0[k] * t[k]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
312 for(k = 7; k > 0; k--) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
313 ptr0[k] = ptr0[k - 1]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
314 ptr0[0] = clip((sum + 0x800) >> 12, -0x7FFE, 0x7FFE); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
315 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
316 sum = ((ptr0[1] * (dec->filtval - (dec->filtval >> 2))) >> 4) + sum; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
317 sum = sum - (sum >> 3); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
318 out[i] = clip((sum + 0x800) >> 12, -0x7FFE, 0x7FFE); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
319 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
320 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
321 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
322 static void truespeech_save_prevvec(TSContext *c) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
323 { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
324 int i; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
325 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
326 for(i = 0; i < 8; i++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
327 c->prevfilt[i] = c->cvector[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
328 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
329 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
330 static int truespeech_decode_frame(AVCodecContext *avctx, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
331 void *data, int *data_size, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
332 uint8_t *buf, int buf_size) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
333 { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
334 TSContext *c = avctx->priv_data; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
335 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
336 int i; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
337 short *samples = data; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
338 int consumed = 0; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
339 int16_t out_buf[240]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
340 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
341 if (!buf_size) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
342 return 0; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
343 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
344 while (consumed < buf_size) { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
345 truespeech_read_frame(c, buf + consumed); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
346 consumed += 32; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
347 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
348 truespeech_correlate_filter(c); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
349 truespeech_filters_merge(c); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
350 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
351 memset(out_buf, 0, 240 * 2); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
352 for(i = 0; i < 4; i++) { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
353 truespeech_apply_twopoint_filter(c, i); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
354 truespeech_place_pulses(c, out_buf + i * 60, i); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
355 truespeech_update_filters(c, out_buf + i * 60, i); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
356 truespeech_synth(c, out_buf + i * 60, i); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
357 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
358 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
359 truespeech_save_prevvec(c); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
360 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
361 /* finally output decoded frame */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
362 for(i = 0; i < 240; i++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
363 *samples++ = out_buf[i]; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
364 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
365 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
366 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
367 *data_size = consumed * 15; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
368 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
369 return buf_size; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
370 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
371 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
372 AVCodec truespeech_decoder = { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
373 "truespeech", |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
374 CODEC_TYPE_AUDIO, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
375 CODEC_ID_TRUESPEECH, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
376 sizeof(TSContext), |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
377 truespeech_decode_init, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
378 NULL, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
379 NULL, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
380 truespeech_decode_frame, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
381 }; |