Mercurial > libavcodec.hg
annotate truespeech.c @ 7354:456957d86106 libavcodec
My commit at r14340 was not the right solution. For a monochromatic
frame, there will be only one centroid and it will be impossible to
find three distinct ones. It is better to just avoid shifting if
there are not three different centroids.
author | vitor |
---|---|
date | Wed, 23 Jul 2008 05:54:34 +0000 |
parents | e943e1409077 |
children | 85ab7655ad4d |
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 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6285
diff
changeset
|
53 static av_cold int truespeech_decode_init(AVCodecContext * avctx) |
3006
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 |
6285 | 60 static void truespeech_read_frame(TSContext *dec, const uint8_t *input) |
3006
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 */ |
4364 | 65 t = AV_RL32(input); |
3006
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 */ |
4364 | 80 t = AV_RL32(input); |
3006
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 */ |
4364 | 91 t = AV_RL32(input); |
3006
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 */ |
4364 | 100 t = AV_RL32(input); |
3006
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 */ |
4364 | 109 t = AV_RL32(input); |
3006
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 */ |
4364 | 119 t = AV_RL32(input); |
3006
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 */ |
4364 | 129 t = AV_RL32(input); |
3006
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 */ |
4364 | 139 t = AV_RL32(input); |
3006
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; |
4594 | 284 out[i] = av_clip(sum, -0x7FFE, 0x7FFE); |
3006
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]; |
4594 | 314 ptr0[0] = av_clip((sum + 0x800) >> 12, -0x7FFE, 0x7FFE); |
3006
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); |
4594 | 318 out[i] = av_clip((sum + 0x800) >> 12, -0x7FFE, 0x7FFE); |
3006
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, |
6285 | 332 const uint8_t *buf, int buf_size) |
3006
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 |
5674
ca944f1db2b3
Add checks on input/output buffers size for some audio decoders
kostya
parents:
4594
diff
changeset
|
336 int i, j; |
3006
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]; |
5674
ca944f1db2b3
Add checks on input/output buffers size for some audio decoders
kostya
parents:
4594
diff
changeset
|
340 int iterations; |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
341 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
342 if (!buf_size) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
343 return 0; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
344 |
5674
ca944f1db2b3
Add checks on input/output buffers size for some audio decoders
kostya
parents:
4594
diff
changeset
|
345 iterations = FFMIN(buf_size / 32, *data_size / 480); |
ca944f1db2b3
Add checks on input/output buffers size for some audio decoders
kostya
parents:
4594
diff
changeset
|
346 for(j = 0; j < iterations; j++) { |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
347 truespeech_read_frame(c, buf + consumed); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
348 consumed += 32; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
349 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
350 truespeech_correlate_filter(c); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
351 truespeech_filters_merge(c); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
352 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
353 memset(out_buf, 0, 240 * 2); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
354 for(i = 0; i < 4; i++) { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
355 truespeech_apply_twopoint_filter(c, i); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
356 truespeech_place_pulses(c, out_buf + i * 60, i); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
357 truespeech_update_filters(c, out_buf + i * 60, i); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
358 truespeech_synth(c, out_buf + i * 60, i); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
359 } |
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 truespeech_save_prevvec(c); |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
362 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
363 /* finally output decoded frame */ |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
364 for(i = 0; i < 240; i++) |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
365 *samples++ = out_buf[i]; |
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 } |
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 *data_size = consumed * 15; |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
370 |
5674
ca944f1db2b3
Add checks on input/output buffers size for some audio decoders
kostya
parents:
4594
diff
changeset
|
371 return consumed; |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
372 } |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
373 |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
374 AVCodec truespeech_decoder = { |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
375 "truespeech", |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
376 CODEC_TYPE_AUDIO, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
377 CODEC_ID_TRUESPEECH, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
378 sizeof(TSContext), |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
379 truespeech_decode_init, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
380 NULL, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
381 NULL, |
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
382 truespeech_decode_frame, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6710
diff
changeset
|
383 .long_name = NULL_IF_CONFIG_SMALL("DSP Group TrueSpeech"), |
3006
4007989367bc
TrueSpeech compatible audio decoder by Konstantin Shishkov
diego
parents:
diff
changeset
|
384 }; |